2016年7月31日日曜日

完成:外部機器を用いたスマホの位置偽装

以下の方法で位置偽装を行った
前回引っかかった問題について解決したためここにまとめる

なお、ゲーム等では位置偽装はBAN対象であるため使用しないこと

精度がイマイチなのでゲームとかはroot取って偽装した方がマシだと思う


概要:
wifiアクセスポイント(以下AP)を用いた位置測定方法に対して任意位置の偽装を行う
偽装したい場所のAP環境を再現することで測位を誤認させる

GPSおよび基地局測位が有効だと矛盾が生じるため、かならずwifi『のみ』の測位であること
外部機器を用いたアプローチで実現するため、偽装用アプリの使用やroot化等は行わない


必要なもの:
・スマホ
偽装を行うスマホ本体
できるだけwifi受信感度が『弱い』ものが好ましい(後述)
GPSは非搭載でもよい
今回はAndroid機で実験しており、iOS機でどうなるかは不明

・偽装対象のアプリ
GPSオフかつSIM無しでも動作すること

・複数台のwifiAP
必ずMACアドレスが変更可能であること
数は多ければ多いほどよい
今回はESP-WROOM-02を用いた
ソースコードはサンプルにわずかに手を入れる程度なので割愛

・アルミテープ
厚みのあるアルミ箔に接着剤がついたもの
ホームセンターなどで購入可能
準備できなければ銅箔テープやアルミホイルでもよい

・wifi測定用のアプリと実行環境
周囲のwifi環境を調べるスマホ用アプリケーション(Wifi Analyzerなど)
APの電波強度とMACアドレスが調べられる機能があること
適当なスマホにインストールして測定可能な環境を構築しておくこと
PC用アプリとノートPCを使ってもよい


実現方法:
1.偽装したい場所の調査(フィールドワーク)
偽装したい場所に行き、アプリを用いて周囲のAP環境の測定を行う
各APについて以下の情報を取得する
・SSID(APの名前)
・MACアドレス(BSSID)
・電波強度
精度を上げるならば測定位置を中心に10m程度移動して複数回測定すること

2.APの精査
測定したAPを精査して環境再現に用いるAPを選ぶ
以下の条件で絞り込みを行うこと
・電波強度が強いものを選ぶこと
電波強度が強いほどその場所から近いAPといえる
・同じ機器からは一つのみ選択
連番のMACアドレスは同じ機器のマルチSSIDに対して振られたもの
・モバイルルータは弾くこと
モバイルルータには位置情報の結びつけが無いため避ける
SSID名から類推すること
・店舗のAPを選ぶこと
店舗のフリーAPはその場所との結びつきが強く、位置測位に用いるのに向いている

3.再現用APの準備
前項で精査したAP情報を用いてAPを立てる
この際、SSIDはコピーせずに適当な名前を付けること
(測位には用いられないため/実在するAPのSSIDを用いることは避ける
MACアドレスのみを用いて再現を行う
再現用APはインターネットに接続しなくてもよい
また、MACアドレス照会に返答する以外の機能は不要
立てるAPは多いほどよい
外部からAPにアクセスされないように極力電波強度を下げること

4.スマホへの加工
スマホのwifi受信感度を『下げる』加工をする
これは周囲のAPの電波をなるべく掴ませないようにするため
周囲のAPの情報から正しい測位をされてしまうことを防ぐ
再現用APは至近距離から電波を出せるので受信感度を下げても問題ない

スマホのwifiモジュール付近にアルミテープを包むように貼る
(wifiモジュールの配置はスマホの上部であることが多い)
実際に受信感度が下がることをwifi設定画面等で確認すること

5.効果のプレ確認
googleマップアプリを用いて位置情報が偽装されているかを確認する
マップアプリは偽装検知が緩い(もしくは無い)ため確認に向いている
ここでうまく偽装できてないようならば他のアプリでも無理
APの精査をやりなおすか再現用APを増やすこと

6.アプリの動作確認
目的のアプリで位置情報が偽装されているかを確認する
失敗する場合はAPの精査をやりなおすか再現用APを増やすこと


TIPS:
・自宅に無線AP名を『~_nomap』に変更すること
googleの測位データベースから除外するため

・偽装はできるだけ近場にすること
どれだけ受信感度を下げても周囲のAPを完全にシャットアウトはできない
このため偽装中に突然本来の位置を測位してしまう場合がある
遠隔地に偽装していた場合は長距離テレポートがサーバ側に検知されてしまう
一方、測位を数100mずらす程度ならば検知されても誤差として処理される希望が持てる

・アルミテープ最強伝説
最初はアルミホイルを使っていたがうまくいかなかった
アルミテープは隙間なく目張りできるので作業しやすく効果が高い



続続:スマホの位置情報偽装について調べたメモ


以下、前回から追加調査を行ったメモ
ニセAPを作る方法を掘り下げている

現在、部分的には成功しているが実用には至っていない

偽装方法の概要:
偽装したい場所のWifiアクセスポイント(以下AP)環境を再現する
Wifiを用いた位置測定APIを騙すことで位置情報の偽装を行う

偽装の手順:
1.偽装したい場所でWifi環境の測定を行う
スマホに市販のWifi測定アプリをインストールする(Wifi Analyzerなど)
偽装したい場所に行き、アプリを用いてWifi環境の測定を行う
各APについて以下の情報を取得する
 ・電波強度
 ・MACアドレス

2.偽APを立てる
前項で取得したAPから電波強度が強いものをピックアップする
同じ機器と思われるAPから複数ピックアップするのは避けること(MACアドレスが連番)
ピックアップしたAPのMACアドレスを付加した偽APを立てる
偽APの数は多ければ多いほど良い
このとき、外部から掴まれないように極力電波強度を下げる
また、適宜パスワードを設定すること
偽APはMACアドレスをチェックする以外では用いられないのでスタンドアロンで良い

以上で一応位置測定APIを騙すことができる
ただし、周囲のAPの数が多い場合はそれに負けてしまう
成功したように見えても次の測位では周囲のAP情報に基づき本来の位置に戻ってしまう

偽APにより他人の測位に影響を与える可能性があることを考えると筋が悪い方法といえる
掘り下げるかどうかは悩むところ
偽APをごっそり増やしてみる?

2016年7月30日土曜日

続:スマホの位置情報偽装について調べたメモ


以下、前回から追加調査を行った結果のメモ
スマホに対する位置偽装を前提とする

位置情報偽装方法のメリットデメリット:

1.開発者用の機能を利用する
いわゆる疑似ロケーションを使う方法
原則Androidのみ
位置情報の偽装に意味があるアプリケーションではほぼキックされる
疑似ロケーションを隠す方法もあるがrootを取る必要がある

2.位置情報取得APIをフック
これもroot前提
rootをとれば相当のことができるがリスクを考えれば避けたい

3.BluetoothタイプGPSのフリをする
前回の調査結果は古い情報であった
現行Androidでは外部GPSはサポートされていない
一部アプリケーションではSPP経由の情報を取得して使用可能
ただし疑似ロケーションをONにしなければならず、位置偽装としては1.と変わらない

iOSでは正式サポートされているものの、iOS間のプロトコルは非公開
単純にSPPで位置情報を投げつけてもiOSはその情報を拾わない

4.APのフリをする
これはいけそう、というか手元のテストでは偽装できた
ポイントは複数のニセAPを用いること
単一のニセAPではいくら出力が強くても周りの正常なAPに負ける
これは位置情報検出APIの仕様が複数APを必要とするためだと思われる

滑らかな移動の再現はかなり難しい
アプリ側がある程度のショートテレポートを許容していないと無理

周囲の正常なAPの情報も拾われているため、厳密な偽装検知を行うアプリにはバレるかも

ニセAPの出力が高すぎると周囲にも誤情報をバラまくため酷いことになる
また、ニセAPの情報でGoogle側のデータベースが更新されてしまう恐れがある