Разработчик декомпилировал приложение Белого дома — нашёл обход пейволлов, GPS-трекинг и JS с чужого GitHub
Внутри — жёстко зашитые ключи к Firebase, отключаемый paywall через DevTools и аналитика, отправляемая на серверы подрядчика в Индии.
Новости Tproger, отредактировано
Если вы думаете, что официальное приложение правительства США — это образец безопасности и приватности, у разработчика 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 = 270000— 4,5 минуты при активном использованииBACKGROUND_UPDATE_TIME_MS = 570000— 9,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 — мейнтейнера этой библиотеки:
Если аккаунт lonelycpp на GitHub будет скомпрометирован, злоумышленник сможет подменить эту страницу и выполнить произвольный JavaScript в WebView приложения Белого дома. Это классическая supply-chain атака (атака через цепочку поставок — компрометация стороннего компонента для проникновения в целевую систему). Хостинг ресурсов на GitHub Pages вместо CDN с Subresource Integrity — плохая практика для любого приложения, тем более государственного.
Виджеты Elfsight
Приложение загружает JavaScript-платформу Elfsight с CDN:
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)
Что делать пользователям
- Не открывать ссылки через встроенный браузер приложения — копировать URL и открывать в Chrome/Firefox, где cookie-баннеры отображаются корректно
- Проверить разрешения приложения в настройках Android: Настройки → Приложения → White House → Разрешения — убедиться, что геолокация отключена
- Учитывать, что
RECEIVE_BOOT_COMPLETEDзапускает сервисы приложения при каждой загрузке устройства — даже если вы не открывали приложение - Для параноиков: использовать отдельный рабочий профиль Android (Настройки → Система → Несколько пользователей) для изоляции
Чеклист для разработчиков: что не должно попадать в прод
Этот случай — хороший повод проверить собственные приложения. Вот что стоит убрать перед релизом:
- URL
localhostи IP-адреса разработчиков — искать вstrings.xml, конфигах и коде - Дев-пакеты (
expo-dev-client,devmenu) — исключать из релизных сборок через build flavors - Экспортированные Activity для отладки — убирать
android:exported="true"у дев-компонентов - Внешние JS-зависимости без SRI — хостить критичные ресурсы на собственном CDN
- Избыточные SDK-модули — если не используете геолокацию, исключить модуль из сборки, а не просто «отключить» флагом
- Широкие пути в FileProvider — ограничивать до конкретных директорий вместо
path="." - Certificate pinning — добавить для всех критичных эндпоинтов через
network_security_config.xml
Частые вопросы
Приложение действительно следит за GPS?
Инфраструктура GPS-трекинга присутствует в скомпилированном коде — классы LocationConstants, GmsLocationController, LocationCapturer и LocationBackgroundService. По умолчанию трекинг отключён флагом _isShared = false. Однако весь код уже в приложении — его можно активировать серверным конфигом без обновления в Google Play.
Обход пейволлов — это законно?
Инжектор скрывает не только пейволлы, но и GDPR-диалоги, cookie-баннеры и формы согласия. В Евросоюзе обход GDPR-уведомлений нарушает регламент о защите данных. Для правительственного приложения любой страны это создаёт юридические риски при использовании гражданами ЕС.
Насколько опасна загрузка JS с GitHub Pages?
Страница lonelycpp.github.io загружается в WebView приложения для YouTube-плеера. Если аккаунт lonelycpp на GitHub будет взломан, атакующий получит возможность выполнить произвольный JavaScript в контексте приложения. Это реальный supply-chain риск — зависимость от ресурса под контролем стороннего лица.
Кто разработал приложение?
В конфиге Expo владелец указан как forty-five-press. Это, по всей видимости, медиа-команда, связанная с администрацией. Приложение не разрабатывалось государственным IT-агентством — скорее, внешним подрядчиком.
Можно ли удалить артефакты разработки удалённо?
Нет. Код 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.
Этот разбор показывает, что даже государственные приложения могут содержать сомнительные практики: от обхода GDPR-баннеров до supply-chain зависимостей от случайных разработчиков. Полная инфраструктура GPS-трекинга, встроенная в код, но формально «отключённая» — это бомба замедленного действия, которая может быть активирована без обновления приложения.
Оригинальный анализ доступен в блоге thereallo.dev.
А вы проверяли, какие разрешения у государственных приложений на вашем телефоне?