2 ポイント 投稿者 GN⁺ 2023-06-27 | 1件のコメント | WhatsAppで共有
  • 車両バッテリーの状態を確認する BM2アプリ が、GPS座標だけでなく周辺のWi-Fiや携帯通信基地局の情報まで収集してリモートサーバーへ送信していた
  • データは製品/アプリ開発元 Leagendbm2.quicklynks.com サーバーと、位置情報サービスSDK開発元 AMap のサーバーへ送られており、それぞれAlibaba Cloud香港と北京のホストであることが確認された
  • Google Playで 100K+ ダウンロード のアプリだったが、初期のアプリストアのプライバシー表示は「データ共有なし」「データ収集なし」「送信中の暗号化」など、実際の動作と一致していなかった
  • AndroidではBluetoothスキャンに位置情報権限が必要なため、ユーザーが機器を使うには事実上位置情報権限を許可せざるを得ず、iOSアプリは位置情報権限を拒否してもバッテリーモニター機能が動作した
  • 2023年7月25日のアップデート後、AMap SDK は主要2大アプリストア版から削除されたが、GPS位置データは引き続きAlibaba Cloud香港サーバーへ送信され、iPhoneアプリはユーザーの住所も送信していた

バッテリーモニターアプリが送信した位置データ

  • 対象製品は車載バッテリー端子に接続し、スマートフォンとペアリングして 電圧/パーセント を表示し、クランキングテストを実行するBluetoothバッテリーモニター
  • オーストラリアの家電量販店Jaycar ElectronicsでPowerTechブランド製品を購入して分析したところ、Leagendの Bluetooth 4.0 Battery Monitor をリブランドした製品とみられる
  • 同系統製品はRepcoのCenturyブランド、ZX-1689Li Battery Monitor といった名称でも確認されている
  • Androidアプリ BM2 はGoogle Playで 100K+ ダウンロード と1.55K件のレビューを記録している
  • iPhone向けBM2アプリも、ネットワークトラフィックの確認結果から、リモートサーバーへ 位置データ を送信していた

送信先と収集範囲

  • アプリはバッテリー電圧だけでなく、GPS座標、周辺の携帯通信基地局データ、周辺Wi-Fiアクセスポイント情報を収集していた
  • 当時確認された位置データの送信先は2系統あった
    • Leagend/BM2アプリサーバー: bm2.quicklynks.com, 47.244.125.231, Alibaba Cloud香港
    • AMap SDKサーバー: dualstack-cgicol.amap.com, 106.11.130.194, Alibaba Cloud北京
  • AMapはAlibabaが買収した中国のデジタル地図プロバイダーであり、このSDKはGPSだけでなく携帯電話が収集可能な他の位置関連データも取得していた
  • 2023年7月25日のアップデート以降、主要2大アプリストア版アプリから AMap SDK が削除された
    • 中国本土サーバーへ送られていたGPS、Wi-Fi、基地局データの収集は停止した
    • GPS位置データは引き続きAlibaba Cloud香港サーバーへ送信されている
    • iPhoneアプリはユーザーの 住所 も確認して送信していた

アプリストアのプライバシー表示と実際の動作

  • 2023年6月27日時点で、BM2アプリ開発者はGoogle PlayとApple App Storeのプライバシー表示を更新し、正確な位置データ の収集を明記した
  • それ以前のGoogle Play表示は実際のアプリ動作と一致していなかった
    • 「第三者とのデータ共有なし」: バッテリー統計とともに緯度・経度が quicklynks.com サーバーへ送信され、クラッシュ解析は umeng.com へ、Wi-Fi・基地局・GPS座標はAMapへ送信されていた
    • 「データ収集なし」: 位置データとバッテリー関連データが収集されていた
    • 「送信中の暗号化」: BM2クラウドサーバーへ送られるデータは 暗号化されていないHTTP で送信されていた
  • プライバシーポリシーの詳細文言には「Hong Kong」と「location information」が含まれていた

Androidの権限が生んだ構造的問題

  • Androidアプリは動作のために位置情報権限を要求し、権限を与えないとハードウェア機器を利用できない
  • Android 6.0以降、BluetoothおよびWi-Fiスキャンで周辺の外部機器のハードウェア識別子へアクセスするには ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION 権限が必要になる
  • BM2アプリに本当に必要なのはBLEスキャンだが、広い位置情報権限によってGPS・基地局・Wi-Fiデータへのアクセスまで可能になり、濫用の余地を残していた
  • Android 12以降では BLUETOOTH_SCAN 権限だけでBLEスキャンが可能
  • Googleの文書によれば、ACCESS_FINE_LOCATIONandroid:usesPermissionFlags="neverForLocation" を指定できるが、Bluetoothスキャン結果を物理的位置の推定に使わない場合に限られる

ネットワークトラフィックで確認された内容

  • Mitmproxy のWireGuardモードを使ってモバイルアプリのトラフィックを確認した
  • BM2はHTTPSを使っていないため、証明書のインストールなしでもAndroidとiOSで 緯度・経度の送信 を確認できた
  • アプリがバッテリーモニター機器に接続した後、http://bm2.quicklynks.com:8080/api/bm2/userDevice/upload?POST リクエストを送る
  • リクエストには緯度・経度フィールドに加え、バッテリー電圧サンプル、ハードウェアMACアドレス、nicknameserialNo が含まれていた
  • 当時のDNSおよびIP情報の照会結果では bm2.quicklynks.com47.244.125.231 と確認され、IP情報は香港Sham Shui PoのAlibaba系ASを示していた

AMap SDKが扱っていた位置シグナル

  • AMap SDKはGPS、Wi-Fi、携帯通信基地局データを収集していた
  • 携帯通信データには Cell Global Identity が含まれる
    • MCC: Mobile Country Code
    • MNC: Mobile Network Code
    • MCC + MNC: PLMN、携帯通信事業者識別
    • LAC: 地域内の基地局グループ
    • CI: 地域内の基地局送受信機識別
    • 4Gでは TAC が使われる
  • Wi-Fiデータには BSSID MACアドレスと SSID アクセスポイント名が含まれる
  • AMapデータはディスクに書き込まれたりインターネットへ送信されたりする前に、暗号化されたシリアライズ済みバイナリblob の形で処理されていた
  • 位置データは一時的なAESキーで暗号化され、そのAESキーは公開RSAキーで再暗号化される
    • この方式は証明書ピンニングに依存していない
    • アプリの改変や対応するRSA秘密鍵がない限り、中間者によるネットワーク検査で内容を見るのは難しい

ハードウェアとテスト環境

  • ハードウェア内部は単純で、電圧レギュレーターとTexas Instruments CC2541 Bluetooth Low Energy MCUが中心
  • CC2541 CPUは8ビットIntel 8051ベースで、後継のCC系はARM Cortexアーキテクチャを採用している
  • CC系SoCは専用のオンチップデバッグインターフェースをサポートしており、JTAGやSWDは見当たらない
  • 機器はOTAアップデートをサポートしており、firmwareをHTTPで返すRESTエンドポイントがpart 3で文書化されている
  • 電流検出用の shunt やその他の電流測定回路は見当たらず、ハードウェア構成は非常に単純
  • テストは小型の鉛蓄電池12V、BM2バッテリーモニター、root化したAndroid端末で実施された
  • AMapの位置データは物理的な移動が検知された場合にのみメモリからデータベースへ記録されるため、FridaObjection を使ってランタイム計測を行った

動的・静的分析手順

  • GPS座標はFridaで android.location.Location.getLatitudegetLongitude をフックして任意の値に置き換えられる
  • ObjectionWallbreaker プラグインで、アプリのヒープメモリ内にあるGPS、通信事業者基地局、Wi-Fiデータのインスタンスを確認した
  • APKは端末上で adb shell pm path によりパスを取得して抽出し、JADX でデコンパイルした
  • AndroidManifest.xml には FINE_LOCATION のほか、CAMERAIMAGE_CAPTUREACTION_VIDEO_CAPTUREMODIFY_AUDIO_SETTINGSRECORD_AUDIO といった権限も見られたが、これらの機能が使われているかは追加調査が必要
  • アプリのエントリーポイントは com.stub.StubApp で、qihoo.util の商用パッカーが使われていた
  • frida-dexdump で実行中メモリから元のDalvik実行バイトコードをダンプし、dex2jar とJADXで読めるJavaコードへ変換した
  • BM2アプリ本体には追加の難読化はなかったが、amap 位置情報サービスSDKは難読化されており、JADXのdeobfuscation機能で一部のクラス名を復元した

1件のコメント

 
GN⁺ 2023-06-27
Hacker News のコメント
  • BLE 車載バッテリーモニターをリバースエンジニアリングしてみた結果。このアプリは Google Play だけでダウンロード数が10万件を超えている。
    調べてみると、GPS、携帯電話基地局のセル ID、Wi-Fi ビーコンのデータを香港と中国本土のサーバーへ継続的に送っていた。Google と Apple のアプリストアページには、個人データを収集したり第三者へ送信したりしないと書かれている。
    接続デバイスのアプリを分析しようとしている人への、いくつかのヒントになればと思う。

    • BM6 の派生版もあるようで、こちらでは個人アカウントを作成して車両追跡が可能だと明記されている。
      https://www.amazon.de/dp/B0BLG9Z462
      画像の3枚目をクリックすると比較表が出てくるが、BM6 だけの特別機能であるかのように見せているものの、実際には単なるアプリ機能にすぎない点が興味深い。
      デバイスの QR コード [0] はこのアプリを指している: https://play.google.com/store/apps/details?id=com.dc.bm6
      そこで https://link.quicklynks.com/bm3.htmlhttps://link.quicklynks.com/bm4.html のような他の URL も確認したところ、後者は https://www.leagend.com/ にリダイレクトされ、この YouTube チャンネルを運営している: https://www.youtube.com/channel/UCqkvyOFP5cXQ02f3h1Ns42Q
      [0] http://link.quicklynks.com/bm6.html
    • さらに悪いことに、最後に確認した時点では Android でBLE デバイス接続に位置情報の権限が必要だった。BLE スキャンで位置を推定できるかららしい。
    • 車のバッテリー監視アプリがなぜ10万人に必要なのか分からない。計器盤にすでに表示されているのに、このアプリが何を追加してくれるのか疑問だ。
      スマホのバッテリーまで常に消耗させながら、計器盤がすでに知らせてくれる内容をスマホ画面で見ることに、それだけの価値があるのかも分からない。固定式バッテリーなら、普通にアナログ電圧計のダイヤルを使えばいいのではと思う。
      最近は、アプリなしで動くスタンドアロン機器を見つけるのが難しすぎる。たとえば、アプリなしで本体ボタンから色を選べる LED ランプを探すのも大変で、1つ見つけはしたが、アプリなしで色を循環させることは依然としてできなかった。
      人々がこういうくだらないものを好んでいなければ、まともな電子製品をまた見つけるのはもっと簡単だったはずだ。
  • Android で、ユーザーがアプリの 1) 起動時の実行 2) バックグラウンド実行を止められない理由が分からない。少なくともユーザー承認が必要な権限であるべきではないかと思う。
    こういう形でデータを吸い上げるアプリのかなりの数を止められるはずで、Google も共犯だと思う。

    • LineageOS は以前、アプリに偽データを渡す独立した権限システムで、これ以上のことができていたし、アプリが文句を言うこともできなかった。Google がその機能を削除させた。
    • モバイルはこの点で、90年代や00年代のデスクトップ体験よりずっとひどい。明らかな後退のように感じるし、少なくとも Windows 98 では StartUp フォルダから項目を削除することはできた。
    • 求めているものは GrapheneOS に近そうだ。
      https://grapheneos.org/
    • 最近 Android で、数時間おきに「アプリ X が位置情報を求めたため位置情報をオンにしました」のような通知を出すアプリに遭遇した。
      アプリが位置情報の有効化を要求できることは知っているが、アプリが一方的にオンにできることに驚いたし、それを止める方法も見つけられなかった。
      こうした理由から、どのスマホも信頼しにくいと感じる。
    • iOS には、アプリごとにオン・オフできるバックグラウンドアプリ更新設定がある。
  • こうした事例があるからこそ、デジタルプライバシーとそれを守る法律のための戦いをやめてはいけない。
    「隠すことがない」かどうかの問題ではなく、第三者が明示的な認識と同意なしに監視し、個人データを売れないようにする問題だ。
    今は全面的なデータ戦争の真っただ中にあり、強く抵抗しなければならない。

  • 悪意ある行為者に実質的に何の代償もないのに、こういうことが標準のようになってしまっているのが腹立たしい。
    この記事を見て、GrapheneOS を使っていてよかったと感じた。ここ数か月、日常用として使っているが、すべてのアプリはインストール時にネットワーク権限を明示的に許可または拒否される。
    こういうローカルアプリには絶対にネットワーク権限を与えないし、いつも気味悪く感じていたキーボードアプリにも与えていない。

    • 権限を隠しておき、ユーザーが最も信頼しにくい相手をほぼ全面的に信じるように仕向ける方式なので、こうしたことが標準になり、積極的に助長されている。
      笑えるレベルではなく、ユーザーのプライバシーと安全に露骨に敵対している。
    • GrapheneOS に移ろうか悩んでいるが、Google のスマホでしか動作しない点がためらわれる。他の Android 代替 OS は互換性がずっと低そうに見えるが、自分が疑い深すぎるのかとも思う。
    • どのアプリが起動時に実行され、どのアプリがバックグラウンドで実行できるのかを制御できるのか気になる。
  • OSは、インターネットアクセスをユーザーが許可または取り消せる権限にすべき。Androidには昔そういうものがあった気がするし、iOSにはモバイルデータ通信以外にはなかったように思う。
    Bluetoothを使うと主張するデバイスを買ったのに、実際にはインターネットアクセスが必要なら返品する。

    • Androidの許可/取り消し式の権限は、後から追加された仕組み。昔はストアでインストールする前に、すべての権限をまとめて受け入れる必要があり、インターネットアクセスもその一つだった。
      同意しなければアプリを入手できなかった。一部の権限はいまでもその方式で、多くの権限は許可/取り消し方式に変わった。
      インターネットアクセスはいまでも権限ではあるが、Google Playがもう尋ねなくなったので、すべてのアプリが持てる。ただしmanifestで要求していなければ動作しない。
    • Androidで特定アプリのインターネットアクセスを遮断するためにNetGuardを使ったことがある。
      https://netguard.me/
    • アプリが送受信するネットワークリクエストを見られるとよい。
      初心者にはドメインを表示し、Appleが何らかの方法で許可リストに入れたドメインなら緑色で表示できる。許可リストにもブロックリストにもないなら黄色で表示するか、色が紛らわしいなら名前だけ見せてもよい。
      ブロックリストにある宛先へリクエストするアプリは、追加審査までApp Storeで止めればよい。
      上級ユーザーはタップしてペイロードやヘッダーなどの詳細を見られるようにするとよい。この機能は本当に必要で、追加するのもそれほど難しくなさそうに見える。
    • 一番おかしな部分。すべての権限のうち本当に重要なのは、実質的に全ファイルアクセスとネットワークアクセスの2つだけ。アプリのストレージ外のデータを読んだり書いたりできないなら、Bluetooth権限があろうとなかろうと何の問題があるのかと思う。
    • ユーザーが直接許可する権限ではないが、サンドボックス化されたmacOSアプリにはネットワークアクセス用のentitlement[1]がある。AppleはMac App Storeで販売されるすべてのアプリにサンドボックス化を義務付けている。
      [1]: https://developer.apple.com/documentation/bundleresources/en...
  • アプリストア提供者は「個人データは収集されず、第三者にも送信されません」のような文言をそもそもなくすべきだと思う。
    代わりに「このアプリにはネットワーク関連の権限があり、任意のデータを任意の場所へ送信できます」または「アプリ制作者は第三者にデータを渡さないと主張していますが、当社にはそれを検証する方法がまったくありません」と警告すべき。
    現実的に、AppleやGoogleには何が第三者なのか分からない。中国や香港のサーバーがファーストパーティかもしれないし、誰に分かるというのか。アプリ制作者以外には誰にも分からない。

    • 中国に関わるデジタル・電子技術に触れるなら、利用可能なあらゆる個人情報、位置情報、その他のデータが抽出・収集され、中国共産党がアクセスできると見るのが妥当。
      中国共産党は特定個人のデータにはそれほど関心がないかもしれないが、集計データには非常に大きな関心を持つ。また、長年かけて収集した米国政府職員数百万人分のデータのように、特定の標的と結び付いたときに非常に有用になる [0][1]。
      開かれた貿易と交流が中国の民主主義と自由につながるという「偉大な実験」は完全に失敗した。結果的には、世界的拡張を狙う冷酷な独裁をさらに強くしただけだった。中国と取引すべきではない。
      [0] https://en.wikipedia.org/wiki/Office_of_Personnel_Management...
      [1] https://www.nbcnews.com/tech/security/china-spent-years-coll...
  • 監視する装置も結局、監視対象そのものをゆっくり消耗させるという点に気付くべき。最終的にはモニターをまた積極的に監視しなければならない羽目になる。
    このBLEデバイスは車のバッテリーをゆっくり、しかし確実に消耗させる。いつか警告を送ってきたらバッテリーを充電しなければならないが、そのうち警告を送ることすらやめるだろう。
    そのうえスマホのデータも吸い上げて中国へ送り、スマホのバッテリーも消耗させる。祝日に贈る最悪のプレゼントとしてこれ以上のものは思い浮かびにくく、まれに見る三重の消費者脅威だ。

    • 一般的な70Ahの車載バッテリーなら、このモニターの1mAの消費電流でバッテリーを放電させるには8年かかる。「残り25%」の警告を受けたら、再充電まであと2年しかないということになる。
      真面目に言うと、自己放電のほうがこのモニターよりおおよそ一桁大きい。
  • Androidには、実機で偽のGPSデータを与えられる機能が必要。理由もなくGPSを要求するアプリに役立つだろう。
    懐中電灯アプリをオンにするのにGPSが必要なら問題ない。現在地はキリマンジャロ山だ。

    • Androidは位置情報関連の権限が必要だとユーザーに警告する。問題はBluetoothスキャンにこの権限が必要で、アプリ開発者がそれを悪用して別の位置データまで収集すること。
      アプリ開発者はポップアップで「Bluetoothを動作させるには許可を押してください」といった形でユーザーに説明しようともする。
    • 開発者向け設定にmock location機能がある。自分の理解では、「偽の位置データ」を提供するアプリをダウンロードして選択すると、そのアプリの実装どおりに偽の位置を提供する。
  • ここまで来ると、こうしたデバイスが大量のデータを収集して本社へ送っていると仮定するのが妥当。TP-Linkルーターもすべてを中国へ送っていたとしても驚かない。
    ただし中国だけに限った話ではなく、いま使っているiPhoneもすべてのキー入力と位置データを米国へ送っている可能性がある。

    • そういうふうに「そうだと仮定する」考え方はあまり好きではない。たとえばTP-Linkルーターがデータを送り返しているなら、本物の諜報技術が使われていない限り、公開インターネット上のパケットとして送るはずだ。それは検証可能。
      TP-Linkルーターがすべてをリモートサーバーへ送っていると疑うなら、トラフィックを監視すればよい。
  • プライバシーとデータ収集にこだわることを友人たちに笑われたときは、まさにこういう事例を見せています。
    悪意のある理由でこうしたことをしていると信じる根拠はありませんが、実際には知る術がありません。おそらく単なる無知や無能なのかもしれません。

    • これを文書化した動機の一つは、認識を高め、ほかの人にも家の中のデバイスやアプリが何をしているのか見てみるよう促すためです。
      デバイスメーカーが収集する位置データの量は相当なものです。もし収益化しているのなら、エンドユーザーに開示していない状態でも悪意があると見なせるのか気になります。
      アプリが使用している AMap SDK は、さらに多くの位置データを収集します。ここでは位置情報サービスと地図ソフトウェアの精度を高める目的である可能性が高いと感じており、それ自体を悪意あるものとは見ていません。
      ただし、こうした挙動がユーザーや開発者に開示されていなかったなら話は別です。サイトは中国語なのですが [1]、詳細な規約まで読んで確認する人がいるのかも分かりません。
      [1] https://lbs.amap.com/api/lightweight-android-sdk/download
    • 意図が悪意あるものに見えないからといって、問題ないわけではありません。隠すことがなかったのなら、なぜデータ収集を最初から正直に明かさなかったのかも問題です。
      以前、あらゆるウェブサイトの Facebook「Like」ボタンを無害だと思っていたら、同意なしにどれほど広範に追跡されていたのかを知ったことを思い出します。
      中国の典型的なやり方は、表向き無害に見える方法で意図的にデータを集めるか、後で悪用できるセキュリティ上の抜け穴を意図的に大きく開けたままにしておくことです。見つかると「申し訳ありません、すぐに修正します」と言います。
      さらに悪いのは、こうした行動に何の結果も伴わない点です。Google、EU、FTC のうち誰かが罰金を科すべきです。
    • 人々が深く考えずに自分のデータを差し出すのは、コモンズの悲劇の特殊な事例、あるいはその反転のように見えます。もちろんすべての場所に当てはまるわけではありませんが、最も無邪気なユーザーに合わせて適応するには代償があります。