世界を動かす技術を、日本語で。

ホワイトハウスの新しいアプリを逆コンパイルしました

概要

  • ホワイトハウス公式アプリの技術解析レポート
  • React Native・Expo・Hermes・WordPress REST APIを利用
  • JavaScript注入によるWeb表示の改変と位置情報追跡機能
  • 多数のサードパーティサービス・外部コードの組み込み
  • セキュリティ・プライバシー・運用上の懸念点を指摘

ホワイトハウス公式アプリの技術構成と挙動

  • React NativeExpo (SDK 54)Hermes JavaScriptエンジン による実装
  • バックエンドは WordPress、独自のREST API(whitehouse/v1名前空間)でコンテンツ配信
  • Expo設定ファイルによると開発元は forty-five-press
  • アプリロジックは 5.5MBのHermesバイトコードバンドル にコンパイル
  • ネイティブ(Java)側はラッパーのみ、バージョン47.0.1、Hermes/新アーキテクチャ有効化
  • withNoLocationwithStripPermissions プラグインが組み込まれているが、後述の挙動に関連

REST APIエンドポイント一覧

  • /wp-json/whitehouse/v1/home:ホーム画面
  • /wp-json/whitehouse/v1/news/articles:ニュース記事
  • /wp-json/whitehouse/v1/wire:"The Wire"ニュースフィード
  • /wp-json/whitehouse/v1/live:ライブ配信
  • /wp-json/whitehouse/v1/galleries:フォトギャラリー
  • /wp-json/whitehouse/v1/issues:政策課題
  • /wp-json/whitehouse/v1/priorities:優先事項
  • /wp-json/whitehouse/v1/achievements:実績
  • /wp-json/whitehouse/v1/affordability:薬価情報
  • /wp-json/whitehouse/v1/media-bias:"Media Bias"セクション
  • /wp-json/whitehouse/v1/social/xX/:Twitterフィードプロキシ

バンドル内のハードコード文字列

  • "THE TRUMP EFFECT"、"Greatest President Ever!"、"Text President Trump"、"Send a text message to President Trump at 45470"、"Visit TrumpRx.gov"、"Visit TrumpAccounts.gov"
  • https://www.ice.gov/webform/ice-tip-form への直接リンク

アプリの主な機能

  • ニュース配信、ライブ配信、ギャラリー、政策ページ、SNS埋め込み、政権プロモーションなどのコンテンツポータル
  • WebView で外部リンクを開く際、毎回JavaScriptスニペットを注入
    • Cookieバナー、GDPR同意、ログイン壁、会員登録壁、ペイウォール等を非表示化
    • bodyのoverflow強制解除、MutationObserverでダイアログ再生成も自動除去

位置情報追跡・プライバシー挙動

  • OneSignal SDK のネイティブ位置情報追跡コードがAPK内に完全実装
  • トラッキング開始には3つの条件
    • _isSharedフラグ(SharedPreferencesで管理、JSレイヤーからsetLocationShared(true)で有効化可)
    • Androidランタイムでの位置情報許可(マニフェスト未記載だが実行時リクエスト)
    • 端末にロケーションプロバイダー(GMS/HMS)が存在
  • 条件成立時、 4.5分間隔(前景)/9.5分間隔(背景)でGPS取得、OneSignalサーバーへ送信
  • 位置情報の記録内容:緯度・経度・精度・タイムスタンプ・アプリ状態・取得方法(GPS/ネットワーク)
  • バックグラウンドサービスによる継続取得も可能
  • withNoLocation プラグインはコード除去に失敗、JSから有効化可能な状態

OneSignalによる詳細なユーザープロファイリング

  • addTag(ユーザーセグメント化)、addSms(電話番号紐付け)、addAliases(クロスデバイス識別)、addOutcomeWithValue / addUniqueOutcome(行動・成果計測)
  • 通知クリック・インアプリメッセージの全ライフサイクルイベント追跡
  • setLocationShared / isLocationShared(位置情報トグル)、setPrivacyConsentRequired / setPrivacyConsentGiven(同意管理)
  • 受信通知・開封/非開封のローカルDB記録
  • 位置情報・通知操作・インアプリクリック・電話番号・タグ・状態変化等がOneSignalサーバーへ送信

サードパーティコード・外部サービスの組み込み

  • YouTube埋め込み :react-native-youtube-iframe経由で lonelycpp.github.io (個人GitHub Pages)からプレイヤーHTMLを読み込み
    • アカウント乗っ取り時、任意のコード実行リスク
  • Elfsight (商用SaaSウィジェット)のJavaScriptをWebViewで直接実行、トラッキング・コード変更のリスク
  • Mailchimp (whitehouse.us10.list-manage.com/subscribe/post-json)でメール登録
  • Uploadcare (ucarecdn.com)から画像配信(UUIDハードコード)
  • Truth Social 埋め込み(静的CDN URL使用)
  • Facebookページプラグイン (iframeでfacebook.com/plugins/page.php経由)
  • いずれも 政府管理インフラではない

セキュリティ・運用上の懸念点

  • 証明書ピンニング未実装、標準Android TrustManagerのみ
    • 悪意あるCA・MITM攻撃時に通信傍受のリスク
  • 開発用アーティファクト混入
    • localhost URL、開発者IP(10.4.4.109)、expo-dev-client/devlauncher/devmenu、Compose PreviewActivity(本来は開発専用)がリリースビルドに含まれる
  • AndroidManifest は通知用途のパーミッション多数(バッジ表示等)、興味深いのはマニフェスト未記載だが実行時リクエストされる位置情報・ストレージ等
  • Google Playストア記載の権限:"共有ストレージの内容変更/削除"、"フォアグラウンドサービス実行"、"他アプリ上への表示"、"起動時自動実行"、"指紋・生体認証利用"等
  • FileProvider 設定で外部ストレージ全体をWebView経由で公開

利用ライブラリ・バイナリ一覧

  • React Native, Expo SDK 54, Hermes, OneSignal, Firebase Cloud Messaging/Analytics, OkHttp, Apollo, Fresco, Glide, Coil, Uploadcare, ExoPlayer, ML Kit, Bouncy Castle, Secure Store, Async Storage, WebView, GSON, Wire, Koin, OpenTelemetry など計68以上
  • ネイティブ.soライブラリ25種(Hermes, React Native core, Reanimated, gesture handler, SVG renderer, image pipeline, barcode scanner等)

総括:公式アプリとしての是非

  • WebViewで外部サイトにJavaScriptを注入し、GDPRバナーやペイウォール等を強制非表示
  • GPSトラッキングパイプラインが完全実装、OneSignalサーバーへ定期送信
  • 個人GitHub PagesやElfsight等、無関係な外部ソースからコードをロード
  • ユーザープロファイリング・トラッキングの徹底
  • 証明書ピンニングや運用上の基本的なセキュリティ対策が不十分
  • 開発用の残留物が本番ビルドに混入

法的には違法ではない可能性が高いが、公式政府アプリとしては極めて不適切な設計・運用体制

Hackerたちの意見

面白いね。でも残念ながら、サイトはほとんど使えないよ。'19 MBPでChrome使ってるけど、スクロールがすごくカクカクする。

意味は違うけど、Firefox 148.0.2(ビルド #2016148295)では問題なく動いてるよ。15542f265e9eb232f80e52c0966300225d0b1cb7 GV: 148.0.2-20260309125808 AS: 148.0.1 OS: Android 14

スクロールがすごくもたついてて、モバイルで見るのがイライラする(FF 151.0a1)

俺のThinkPadのChromeでもそうなるよ。

そのページ、俺のFirefox 149 Windows 10でもスクロールがすごく悪いよ。アプリのウェブ開発面を主に批判してる記事から来てるのに、皮肉だね!

同意する、元の記事のウェブサイトはちょっとひどいね。

「公式のホワイトハウスのAndroidアプリには、クッキーやペイウォールをバイパスするインジェクターがあって、GPSを4.5分ごとに追跡(バックグラウンドでは9.5分ごと)して、ある人のGitHub PagesからJavaScriptを読み込むんだ(“lonelycpp”ってアカウントで、iframeビューページを読み込む)。一般的なReact Nativeアプリとしてはそんなにおかしくないけど、公式のアメリカ政府から出てるとなると、サプライチェーン攻撃に対してかなりオープンだよね。あと、誰も政府に自分の位置情報を継続的に教えるべきじゃない。公式の政府がウェブビューにJavaScriptを注入してクッキーバナーや同意フォームをオーバーライドしてるのは、ちょっとクレイジーだよ。これって、ウェブサイトの利用規約に対する法的同意の一部だからね。でも、法的同意は彼らの得意分野じゃないのかな。」

バナーはEUのページ訪問者向けじゃない?アメリカにはこれに関する法律はないと思うけど、あるのかな?

コンサルタントの標準的なマーケティングアプリって感じだね。多分、誰かを雇って開発させたんだろうし、その会社は位置情報追跡コードとかを含む標準的なアプリアーキテクチャを使ったんだと思う。

最初からマルウェアだと思ったよ。うん。

証明書ピンニングがないっていう議論は、MITMがTLSトラフィックを傍受してるネットワークにいるからって、デバイスがプロキシが使ってるランダムなCAを信頼するわけじゃないってことを見落としてるみたい。TLSエラーが出るだけだよね?

MDMを使って自分たちのCAをデバイスにプッシュしてる組織の一員なら、そうじゃないよ。

あなたのスマホが信頼するCAによって署名された証明書を発行できる人がいれば、そうはならないよ。例えば、特定の北アフリカの国の大使館の近くのカフェにいると想像してみて。その国は広範囲にわたるスパイ活動で知られていて、そのカフェのトラフィックをハイジャックすることに決めたとしたら。あるいは、内閣のほとんどがその国のプロパガンダ/ロビー団体から(公式に)給料をもらっている国に住んでいるとしたら。あるいは、合法的な監視が陪審の承認なしに、どの警官でもできる国に住んでいるとしたら。あまり一般的ではないかもしれないけど、頻繁に起こることだよ。

いい仕事だね。必要ならICEが君の居場所を把握して連れ去ることができるってことか。

この記事の書き方にはちょっと疑問を感じるな。ほとんどAIが書いたみたいだし。好奇心からアプリをダウンロードしてみたけど、記事に書いてあるように位置情報の許可を求めるところはなかったよ。Claude CodeはAPKをデコンパイルするのは得意だけど、リーチャビリティ分析や複雑な制御フローの理解にはあまり向いてないみたい。完全に無駄なコードを、よく呼ばれる関数と同じくらい重要視してる。

どのバージョン使ってる?iPhoneのアプリストアから見ると、バージョン47.0.1 - マイナーなバグ修正 - 34分前に出たみたいだけど、親が投稿したのは18分前だから、もしかしたら「マイナーなバグ修正」の一環で位置情報の件がパッチ当てられたのかも?

記事に書いてあるように位置情報の許可を求めるところはなかった この記事はアプリが位置情報を要求するとは言ってないよ。単一のJSコールでできるって主張してるだけ。

彼らが示している権限のスニペットには、位置情報が含まれていないし、そこに宣言しない限り、実行時に位置情報をリクエストすることもできないんだ。自分でこれを確認したいけど、Playが俺のスマホにインストールできないから、APKを手に入れることができない。グラフェンを使ってるからかな…?でも、どんな制限があるのかは分からないし、他の理由かもしれない(ハードウェアベースならPixel 9aにしてはちょっと変だけど)。--- 追記 --- 具体的に言うと、俺のPlayストアの「情報 -> 権限」にはこんな感じで表示されてる:バージョン47.0.1は、他のアクセスをリクエストするかもしれない:起動時に実行、Google Playライセンスチェック、ネットワーク接続の表示、電話をスリープさせない、通知を表示、com.google.android.c2dm.permission.RECEIVE、振動の制御、完全なネットワークアクセス。これはかなり普通に見えるし、位置情報は含まれていないと思う。Playは実行時の位置情報リクエストを含むはずなんだけど。もしかしたら、バージョンのロールアウトが行われているか、デバイスタイプのターゲティングがあるのかも?

アメリカ政府の公式アプリが、サードパーティのウェブサイトにCSSやJavaScriptを注入して、クッキー同意ダイアログやGDPRバナー、ログインゲート、ペイウォールを取り除いてるんだ。だから、ユーザーにとって実際に役立つことをしてるってことだね!もっと進んで、ブラウザのリーダーモードみたいになってくれたらいいのに。

45と47の言及は、トランプの大統領番号への「イースターエッグ」なのかな?つまり、45代大統領(forty-five-press)と47代大統領(Version 47.x.x)、それにテキストメッセージのホットライン(45470)みたいな。

これは政府のアプリで、ランダムな人のGitHub Pagesからコードを読み込んでる。しかも、そのランダムな人には代名詞まである。つまり、そのコードは「ウィーク」ってことだね。

ここ5年くらいの間、ほとんどのウェブサイトやアプリのデフォルト設定は、ユーザーに代名詞を追加することを促してきたから、避けるのが難しいんだ。俺のiPhoneですら、新しい連絡先を追加する時にその人の代名詞を追加するように求めてくる。なんでSiriがそれを知る必要があるのかは分からないけど、そうなってる。一つのウェブサイトでは、貢献者としてサインアップするためには「プロフィールを完成させる」必要があって、そこには必須の代名詞が含まれてる。多分、AppleのPMが働いているような職場では、これを更新するのが役立つかもしれないね。