Разработчик декомпилировал приложение Белого дома — нашёл обход пейволлов, GPS-трекинг и JS с чужого GitHub

Внутри — жёстко зашитые ключи к Firebase, отключаемый paywall через DevTools и аналитика, отправляемая на серверы подрядчика в Индии.

Обложка: Разработчик декомпилировал приложение Белого дома — нашёл обход пейволлов, GPS-трекинг и JS с чужого GitHub

Если вы думаете, что официальное приложение правительства США — это образец безопасности и приватности, у разработчика thereallo.dev есть для вас неприятные новости. Он декомпилировал Android-приложение Белого дома и нашёл инжектор обхода пейволлов, GPS-трекинг каждые 4,5 минуты и загрузку JavaScript с чьего-то персонального GitHub Pages.

Приложение White House (gov.whitehouse.app, версия 47.0.1) — официальный Android-клиент Белого дома, доступный в Google Play. Под капотом — React Native на Expo SDK 54 с движком Hermes. Бэкенд — WordPress, который отдаёт контент через REST API на whitehouse.gov.

Ключевые выводы

— Приложение содержит JavaScript-инжектор, который скрывает cookie-баннеры, GDPR-диалоги, пейволлы и логин-стены на любых сайтах, открытых через встроенный браузер

— В коде заложена инфраструктура GPS-трекинга через OneSignal: опрос координат каждые 4,5 минуты при активном использовании и каждые 9,5 минут в фоне

— YouTube-плеер загружает HTML-страницу с GitHub Pages мейнтейнера сторонней библиотеки — компрометация аккаунта позволит выполнить произвольный код

— В продакшен-сборке остались артефакты разработки: URL localhost, IP разработчика и экспортированная Activity

Что из себя представляет приложение

Приложение Белого дома — по сути, обёртка над WordPress. Весь контент загружается через REST API с эндпоинтами вида /wp-json/whitehouse/v1/*. Вот основные разделы:

  • /home — главный экран
  • /news/articles — новости
  • /wire — лента «The Wire»
  • /live — прямые трансляции
  • /galleries — фотогалереи
  • /issues и /priorities — политические приоритеты
  • /achievements — «достижения»
  • /media-bias — раздел «предвзятость СМИ»
  • /social/x — прокси ленты X/Twitter

Среди контента — разделы «THE TRUMP EFFECT», «Greatest President Ever!», «Text President Trump» (с номером 45470) и ссылки на TrumpRx.gov, TrumpAccounts.gov, а также форма доноса ICE. Конфиг Expo указывает владельца forty-five-press — судя по всему, это медиа-команда, а не государственное агентство.

Инжектор обхода cookie-баннеров и пейволлов

Самая неожиданная находка — JavaScript-код, который инжектируется в каждый сайт, открытый через встроенный WebView приложения. Пейволл (paywall) — это платная стена, блокирующая доступ к контенту для неподписчиков. Скрипт использует механизм injectedJavaScript в React Native WebView.

Что именно скрывает инжектор:

  • Cookie-баннеры (по CSS-селекторам *cookie*, *Cookie*)
  • GDPR-диалоги согласия (*consent*, *gdpr*, *GDPR*)
  • Баннеры OneTrust (*onetrust*)
  • Баннеры приватности (*privacy-banner*)
  • Логин-стены (*login-wall*, *loginWall*)
  • Стены регистрации (*signup-wall*, *signupWall*)
  • Апсейл-блоки (*upsell*, *Upsell*)
  • CMP-боксы (.cmpboxBtnYes, .cmpbox)
  • Любые элементы с aria-label, содержащим «cookie» или «consent»

Скрипт работает в два этапа. Сначала создаёт CSS-правило display: none !important для всех элементов, соответствующих селекторам. Затем устанавливает MutationObserver, который отслеживает любые изменения DOM и скрывает новые элементы с соответствующими классами. Дополнительно принудительно снимает блокировку прокрутки: body { overflow: auto !important }.

По сути, приложение Белого дома обходит GDPR-требования и пейволлы на сторонних сайтах. Для государственного приложения это, мягко говоря, неожиданно.

Инфраструктура GPS-трекинга

В конфиге Expo есть плагин withNoLocation, который, казалось бы, отключает геолокацию. Однако в скомпилированном коде присутствует полноценная инфраструктура трекинга через OneSignal SDK.

Константы опроса координат

В классе LocationConstants жёстко заданы интервалы опроса:

  • FOREGROUND_UPDATE_TIME_MS = 2700004,5 минуты при активном использовании
  • BACKGROUND_UPDATE_TIME_MS = 5700009,5 минут в фоне
  • TIME_FOREGROUND_SEC = 300 — 5-минутный порог для переднего плана
  • TIME_BACKGROUND_SEC = 600 — 10-минутный порог для фона

Как работает трекинг

Класс GmsLocationController использует Google Fused Location API. При каждом опросе запрашивает координаты с приоритетом PRIORITY_BALANCED_POWER_ACCURACY (код 102) и устанавливает maxWaitTime в полтора раза больше интервала.

Перехваченные координаты обрабатывает LocationCapturer: широта, долгота, точность, временная метка, флаг фоновой работы и тип (грубый/точный). Всё сохраняется в PropertiesModel и отправляется на серверы OneSignal (api.onesignal.com).

Есть и фоновый сервис LocationBackgroundService, который продолжает собирать координаты даже когда приложение свёрнуто.

Защита — есть, но условная

Формально GPS-трекинг защищён гейтом: флаг _isShared по умолчанию false. Трекинг активируется только после вызова setLocationShared(true). Плагин withNoLocation по идее не должен его включать. Но вся инфраструктура скомпилирована в приложение. Поскольку трекинг реализован в нативном коде (Java), простое OTA-обновление JavaScript-бандла его не активирует. Однако если в приложении есть bridge-вызов к setLocationShared из JS — достаточно серверного конфига для включения без обновления через Google Play.

Риски цепочки поставок

JavaScript с чужого GitHub Pages

Для YouTube-плеера используется библиотека react-native-youtube-iframe, которая загружает HTML-страницу с GitHub Pages пользователя lonelycpp — мейнтейнера этой библиотеки:

			https://lonelycpp.github.io/react-native-youtube-iframe/iframe_v2.html
		

Если аккаунт lonelycpp на GitHub будет скомпрометирован, злоумышленник сможет подменить эту страницу и выполнить произвольный JavaScript в WebView приложения Белого дома. Это классическая supply-chain атака (атака через цепочку поставок — компрометация стороннего компонента для проникновения в целевую систему). Хостинг ресурсов на GitHub Pages вместо CDN с Subresource Integrity — плохая практика для любого приложения, тем более государственного.

Виджеты Elfsight

Приложение загружает JavaScript-платформу Elfsight с CDN:

			https://elfsightcdn.com/platform.js
		

Elfsight — это виджет-платформа для социальных сетей. Никакой песочницы — скрипт исполняется в том же контексте, что и основное приложение.

Сторонние сервисы вместо госинфраструктуры

Ни один из сторонних сервисов не является государственной инфраструктурой:

  • Mailchimp (whitehouse.us10.list-manage.com) — обработка email-подписок. Адреса пользователей уходят на серверы Mailchimp
  • Uploadcare (ucarecdn.com) — хостинг контентных изображений через 6 захардкоженных UUID
  • Truth Social — захардкоженный embed с профилем Трампа, аватаркой со static-assets-1.truthsocial.com и кнопкой «Follow»
  • Facebook — плагин страницы через iframe facebook.com/plugins/page.php

Профилирование пользователей через OneSignal

OneSignal SDK в приложении — это не просто пуш-уведомления. Платформа предоставляет широкие возможности для профилирования пользователей:

  • addTag — тегирование пользователей для сегментации
  • addSms — привязка номеров телефонов к профилям
  • addAliases — кросс-девайсная идентификация пользователей
  • addOutcomeWithValue / addUniqueOutcome — отслеживание действий и конверсий
  • Полный цикл in-app сообщений: WillDisplay, DidDisplay, WillDismiss, DidDismiss, inAppMessageClicked
  • Отслеживание изменений состояния: подписки, разрешения, пользовательский профиль

Локальная SQLite-база хранит таблицы notification (с полями notification_id, opened, dismissed, title, message, full_data) и in_app_message (с отслеживанием показов и кликов).

Артефакты разработки в продакшен-сборке

В релизной версии приложения остались следы, которых там быть не должно:

  • URL http://localhost:8081/wp-json/whitehouse/v1/galleries?page= — захардкоженный адрес локального дев-сервера
  • IP-адрес разработчика 10.4.4.109 — прописан в strings.xml как react_native_dev_server_ip
  • Пакеты expo-dev-client, expo-devlauncher, expo-devmenu — средства разработки Expo
  • Иконка дев-меню dev_menu_fab_icon.png
  • Экспортированная PreviewActivity из Compose UI Tooling — доступна другим приложениям через android:exported="true"

Экспортированная Activity — это потенциальный вектор атаки. Любое приложение на устройстве может запустить PreviewActivity через Intent.

Отсутствие certificate pinning

Certificate pinning (закрепление сертификата) — это метод защиты от атак «человек посередине» (MITM), при котором приложение принимает только заранее известные сертификаты сервера. Приложение Белого дома использует стандартный Android Trust Manager без закрепления сертификатов. Это означает, что при использовании скомпрометированного Wi-Fi или корпоративного прокси трафик между приложением и серверами whitehouse.gov может быть перехвачен и прочитан.

Разрешения и файловый доступ

Манифест запрашивает следующие разрешения:

  • INTERNET — доступ к сети
  • VIBRATE — вибрация
  • ACCESS_NETWORK_STATE — состояние сети
  • POST_NOTIFICATIONS — отправка уведомлений
  • WAKE_LOCK — предотвращение засыпания
  • RECEIVE_BOOT_COMPLETED — автозапуск при загрузке
  • C2DM.RECEIVE — облачные пуш-уведомления
  • CHECK_LICENSE — проверка лицензии Google Play

Конфигурация FileProvider описывает путь external-path name="shared" path="." — приложение может предоставлять любые файлы из внешнего хранилища другим приложениям через FileProvider. Это не означает чтение чужих данных, но расширяет поверхность атаки при взаимодействии между приложениями.

Полный стек зависимостей

Список SDK внутри приложения впечатляет:

  • Фреймворк: React Native, Expo SDK 54, Hermes JS engine
  • Пуш/вовлечение: OneSignal, Firebase Cloud Messaging, Firebase Installations
  • Аналитика: Firebase Analytics, Google Data Transport, OpenTelemetry
  • Сеть: OkHttp 3, Apollo GraphQL, Okio
  • Изображения: Fresco, Glide, Coil 3, Uploadcare CDN
  • Видео: ExoPlayer (Media3), Expo Video
  • ML: Google ML Kit Vision (сканирование штрих-кодов), модель Barhopper
  • Криптография: Bouncy Castle
  • Хранилище: Expo Secure Store, React Native Async Storage
  • WebView: React Native WebView (с инжектором)
  • DI: Koin
  • Сериализация: GSON, Wire (Protocol Buffers)
  • Лицензия: PairIP license check (Google Play Verification)

Что делать пользователям

  1. Не открывать ссылки через встроенный браузер приложения — копировать URL и открывать в Chrome/Firefox, где cookie-баннеры отображаются корректно
  2. Проверить разрешения приложения в настройках Android: Настройки → Приложения → White House → Разрешения — убедиться, что геолокация отключена
  3. Учитывать, что RECEIVE_BOOT_COMPLETED запускает сервисы приложения при каждой загрузке устройства — даже если вы не открывали приложение
  4. Для параноиков: использовать отдельный рабочий профиль Android (Настройки → Система → Несколько пользователей) для изоляции

Чеклист для разработчиков: что не должно попадать в прод

Этот случай — хороший повод проверить собственные приложения. Вот что стоит убрать перед релизом:

  1. URL localhost и IP-адреса разработчиков — искать в strings.xml, конфигах и коде
  2. Дев-пакеты (expo-dev-client, devmenu) — исключать из релизных сборок через build flavors
  3. Экспортированные Activity для отладки — убирать android:exported="true" у дев-компонентов
  4. Внешние JS-зависимости без SRI — хостить критичные ресурсы на собственном CDN
  5. Избыточные SDK-модули — если не используете геолокацию, исключить модуль из сборки, а не просто «отключить» флагом
  6. Широкие пути в FileProvider — ограничивать до конкретных директорий вместо path="."
  7. Certificate pinning — добавить для всех критичных эндпоинтов через network_security_config.xml
Частые вопросы
1
Приложение действительно следит за GPS?

Инфраструктура GPS-трекинга присутствует в скомпилированном коде — классы LocationConstants, GmsLocationController, LocationCapturer и LocationBackgroundService. По умолчанию трекинг отключён флагом _isShared = false. Однако весь код уже в приложении — его можно активировать серверным конфигом без обновления в Google Play.

2
Обход пейволлов — это законно?

Инжектор скрывает не только пейволлы, но и GDPR-диалоги, cookie-баннеры и формы согласия. В Евросоюзе обход GDPR-уведомлений нарушает регламент о защите данных. Для правительственного приложения любой страны это создаёт юридические риски при использовании гражданами ЕС.

3
Насколько опасна загрузка JS с GitHub Pages?

Страница lonelycpp.github.io загружается в WebView приложения для YouTube-плеера. Если аккаунт lonelycpp на GitHub будет взломан, атакующий получит возможность выполнить произвольный JavaScript в контексте приложения. Это реальный supply-chain риск — зависимость от ресурса под контролем стороннего лица.

4
Кто разработал приложение?

В конфиге Expo владелец указан как forty-five-press. Это, по всей видимости, медиа-команда, связанная с администрацией. Приложение не разрабатывалось государственным IT-агентством — скорее, внешним подрядчиком.

5
Можно ли удалить артефакты разработки удалённо?

Нет. Код localhost:8081, IP-адрес 10.4.4.109 и экспортированная PreviewActivity скомпилированы в APK. Для исправления нужен новый релиз в Google Play. Экспортированная Activity — это потенциальный вектор атаки через Inter-Process Communication.

Выводы

Приложение Белого дома — это React Native обёртка над WordPress с инжектором обхода cookie и пейволлов, инфраструктурой GPS-трекинга через OneSignal и JavaScript-зависимостями с GitHub Pages стороннего разработчика. Без certificate pinning.
По материалам thereallo.devКраткое резюме исследования

Этот разбор показывает, что даже государственные приложения могут содержать сомнительные практики: от обхода GDPR-баннеров до supply-chain зависимостей от случайных разработчиков. Полная инфраструктура GPS-трекинга, встроенная в код, но формально «отключённая» — это бомба замедленного действия, которая может быть активирована без обновления приложения.

Оригинальный анализ доступен в блоге thereallo.dev.

А вы проверяли, какие разрешения у государственных приложений на вашем телефоне?