ホワイトハウス公式アプリをリバースエンジニアリングしてみた——GPSトラッキング・ペイウォール突破・外部JS読み込みの実態

元記事を読む
キュレーターコメント

「無効化したはずの機能が実は動いている」「公式アプリがペイウォードをスクリプトで破壊している」という二重の衝撃。Android APKリバースエンジニアリングの実践例としても秀逸で、モバイルセキュリティに携わるエンジニアには必読の一本。

概要

ホワイトハウス公式アプリに何が仕込まれていたのか

トランプ政権が「前例のないアクセスを提供する」と謳ってApp Store・Google Playに公開したホワイトハウス公式Androidアプリ。セキュリティ研究者がそのAPKをデコンパイルしたところ、政府公式アプリとは思えない実装が次々と発見された。本記事ではその技術的詳細を整理し、何が問題なのかを考える。

アプリの基本構成

まず技術スタックから。このアプリは以下の構成で作られている。

  • React Native(Expo SDK 54)製、JavaScriptエンジンはHermes
  • バックエンドはWordPress + カスタムREST API(/wp-json/whitehouse/v1/...
  • ビルドした主体は Expo config に記録された forty-five-press というエンティティ
  • APKをADBで取得し、JADXでデコンパイルすることで内部構造を解析

5.5MBのHermesバイトコードバンドルにアプリロジックが詰まっており、ネイティブJava層は薄いラッパーに過ぎない。stringsコマンドやJADXのストリングテーブル解析で、URLやAPIエンドポイント、ハードコードされた文字列が丸ごと取得できる。

発見1:ペイウォール・同意ダイアログ突破スクリプトの自動注入

最も衝撃的な発見がこれだ。アプリ内WebViewで外部リンクを開くたびに、以下のようなJavaScriptが自動注入される。

(function() {
  const selectors = [
    '[class*="cookie"]', '[id*="cookie"]',
    '[class*="gdpr"]', '[class*="consent"]',
    '[class*="paywall"]', '[class*="login-wall"]',
    '[class*="onetrust"]', /* ...他多数 */
  ];
  selectors.forEach(sel => {
    document.querySelectorAll(sel).forEach(el => el.remove());
  });
  document.body.style.overflow = 'auto';
  // MutationObserverで動的追加要素も監視・削除
})();

消去対象は——

  • クッキー同意バナー・GDPRダイアログ
  • OneTrustなどCMP(Consent Management Platform)
  • ログインウォール・サインアップゲート
  • ペイウォール・アップセルプロンプト

さらにMutationObserverで動的に追加される要素も監視・即時削除する徹底ぶり。ネイティブ側ではReact Native WebViewinjectedJavaScriptプロパティを使い、Android のevaluateJavascript()経由で毎ページロード時に実行される。米国政府公式アプリが第三者サイトのGDPR同意UIやペイウォールを自動破壊しているという事実は、法的にも倫理的にも重大な問題だ。

発見2:4.5分ごとのGPS位置情報トラッキング

Expo configにはwithNoLocationwithStripPermissionsという位置情報を無効化するはずのプラグインが設定されている。にもかかわらず、OneSignal SDKのネイティブ位置情報トラッキングコードがAPKに完全コンパイルされたまま残っていた。

// OneSignal LocationManager より
private static final long UPDATE_INTERVAL_MS = 270000; // 4.5分
private static final long FASTEST_INTERVAL_MS = 570000; // 9.5分

トラッキングの発動条件は3段階のゲートで制御されている。

  1. _isSharedフラグがtrue(SharedPreferencesに保存、JS層からsetLocationShared(true)で切り替え可能)
  2. Androidのランタイム位置情報パーミッションが許可済み
  3. Google Play Store上では「フォアグラウンドでの正確な位置情報・おおよその位置情報へのアクセス」を要求すると明記

重要なのは、JSバンドルのストリングテーブルにsetLocationSharedisLocationSharedの両方が存在する点だ。つまりアプリはいつでもこのフラグをオンにできる構造になっている。

発見3:見知らぬ個人のGitHub PagesからJSを読み込み

記事では詳細が省略されているが、ハードコードされたURLの中に個人のGitHub PagesホストのJavaScriptへの参照が含まれていた。政府公式アプリがサードパーティの個人ホスティングリソースに依存することは、サプライチェーン攻撃の格好の標的になりうる。

その他、バンドル内には以下のような文字列もハードコードされている。

  • "THE TRUMP EFFECT" / "Greatest President Ever!"
  • ICEの通報フォームへの直リンク(ice.gov/webform/ice-tip-form)——ニュースアプリに?
  • TrumpRx.gov / TrumpAccounts.gov への誘導

まとめ・所感

今回の解析で浮かび上がったのは、セキュリティ・プライバシー設計が著しく粗い政府公式アプリの実態だ。

  • 位置情報無効化プラグインを設定しながらトラッキングコードが残存
  • 第三者サイトのGDPR同意UIを合法性を無視して自動削除
  • 個人のGitHubリポジトリからJSを読み込むサプライチェーンリスク

リバースエンジニアリングの手法自体は非常に教育的で、ADB+JADX+Hermesバイトコード解析という再現可能なフローが丁寧に示されている。Androidアプリのセキュリティ監査・ペネトレーションテストに興味があるエンジニアは、元記事(thereallo.dev)を読む価値が高い。自分のアプリに同様の問題がないか、WebViewのinjectedJavaScriptやSDKの残存コードを今一度確認してみてほしい。