1 points par GN⁺ 2026-03-29 | 1 commentaires | Partager sur WhatsApp
  • L’application officielle de la Maison-Blanche, basée sur React Native, utilise un backend WordPress, Expo SDK 54 et le moteur Hermes, et se présente comme un portail de contenus pour les actualités, photos et politiques publiques
  • Tous les WebView incluent du code d’injection JavaScript qui supprime automatiquement les bannières de cookies, fenêtres de consentement GDPR et éléments de paywall
  • Des fonctions de suivi de localisation et de profilage utilisateur via le SDK OneSignal sont intégralement incluses, avec possibilité de collecte des données GPS toutes les 4,5 à 9,5 minutes
  • L’application charge des services commerciaux externes comme GitHub Pages, Elfsight, Mailchimp, Uploadcare, Truth Social, ce qui implique des risques de supply chain et de traçage
  • L’absence de SSL pinning, la présence de ressources de développement et la possibilité d’exécuter du code externe soulèvent des inquiétudes en matière de sécurité et de confidentialité pour une application officielle du gouvernement

Vue d’ensemble de l’application

  • L’application officielle White House est une application basée sur React Native, publiée sur l’App Store et Google Play
    • Elle utilise Expo SDK 54 et le moteur JavaScript Hermes
    • Le backend repose sur WordPress avec une structure d’API REST personnalisée
    • Selon la configuration Expo, l’auteur indiqué est « forty-five-press »
  • La logique de l’application est compilée dans un bundle de bytecode Hermes de 5,5 Mo, tandis que le code natif sert de simple wrapper
  • Version 47.0.1, build 20, avec Hermes et la New Architecture activés

Configuration Expo

  • Deux plugins sont inclus : withNoLocation et withStripPermissions
    • Ils semblent liés à la suppression de la localisation et au retrait de permissions
  • Les mises à jour OTA sont désactivées ; l’infrastructure de mise à jour Expo est incluse mais non fonctionnelle

Fonctionnement réel de l’application

  • L’analyse des chaînes du bundle Hermes montre que l’application charge le contenu via l’API REST WordPress de whitehouse.gov
    • Principaux endpoints : /wp-json/whitehouse/v1/home, /news/articles, /wire, /live, /galleries, /issues, /priorities, /achievements, /affordability, /media-bias, /social/x etc.
  • Les chaînes présentes dans l’application incluent "THE TRUMP EFFECT", "Greatest President Ever!", "Text President Trump", "Visit TrumpRx.gov", "Visit TrumpAccounts.gov"
  • Le lien https://www.ice.gov/webform/ice-tip-form est également inclus directement
  • Dans l’ensemble, l’application prend la forme d’un portail proposant actualités, direct, photos, politiques publiques, flux sociaux et contenus de promotion de l’administration

Script de blocage des cookies et paywalls

  • Dans les WebView qui ouvrent des liens externes, du code JavaScript injecté est exécuté à chaque chargement de page
    • Ce script masque les bannières de cookies, fenêtres de consentement GDPR, murs de connexion/inscription, éléments d’upsell et de paywall, boîtes CMP, etc.
    • Il force body { overflow: auto !important } pour réactiver le défilement
    • Il utilise MutationObserver pour supprimer en continu les nouvelles fenêtres de consentement ajoutées dynamiquement
  • Il en résulte une architecture dans laquelle une application officielle du gouvernement américain injecte du code supprimant les éléments cookies/GDPR/paywall de sites tiers

Infrastructure de suivi de localisation

  • Malgré la présence du plugin withNoLocation, le code de suivi de localisation du SDK OneSignal est intégralement inclus
    • Trois conditions activent le suivi :
      1. le flag _isShared est défini sur true (lors d’un appel à setLocationShared(true))
      2. l’utilisateur autorise la permission de localisation à l’exécution
      3. un fournisseur de localisation (GMS/HMS) est présent sur l’appareil
    • Si ces conditions sont remplies, des requêtes GPS sont faites toutes les 4,5 minutes (premier plan) et 9,5 minutes (arrière-plan)
    • Données collectées : latitude, longitude, précision, horodatage, état premier plan/arrière-plan, niveau de précision
    • Les données sont synchronisées avec le serveur via le PropertiesModel de OneSignal
    • Un service d’arrière-plan est également inclus, permettant de capturer la position même lorsque l’application est inactive
  • L’analyse du bundle JS ne permet pas de confirmer la présence d’un appel à setLocationShared, mais tout le pipeline a été compilé dans un état activable

Profilage utilisateur via OneSignal

  • Le SDK OneSignal ne se limite pas aux notifications push : il assure aussi des fonctions de suivi comportemental et de segmentation utilisateur
    • Principales fonctions : addTag, addSms, addAliases, addOutcomeWithValue, addUniqueOutcome, notificationClicked, inAppMessageClicked, permissionChanged, subscriptionChanged, userStateChanged, setPrivacyConsentRequired, setPrivacyConsentGiven, etc.
    • La base de données locale enregistre la réception, l’ouverture et l’ignorance des notifications
  • En conséquence, la localisation, les interactions avec les notifications, les clics sur messages in-app, le numéro de téléphone, les tags et les changements d’état sont transmis aux serveurs de OneSignal

Risques de supply chain : chargement de code externe

  • GitHub Pages

    • La bibliothèque react-native-youtube-iframe charge du HTML depuis lonelycpp.github.io
    • Si ce compte GitHub est compromis, du JavaScript arbitraire peut être exécuté dans le WebView de l’application
  • Widget Elfsight

    • Des flux sociaux sont intégrés via platform.js d’Elfsight
    • Ce code SaaS commercial s’exécute sans sandboxing, avec un risque de traçage
    • L’ID de widget 4a00611b-befa-466e-bab2-6e824a0a98a9 est codé en dur
  • Autres services externes

    • Mailchimp : gestion de l’abonnement e-mail (whitehouse.us10.list-manage.com)
    • Uploadcare : hébergement d’images (ucarecdn.com)
    • Truth Social : profil Trump et bouton « Follow » inclus
    • Facebook : chargement d’un iframe de plugin de page
    • Tous sont des services commerciaux externes, hors infrastructure gouvernementale

Configuration de sécurité

  • Aucun SSL certificate pinning, usage du TrustManager Android standard
    • En Wi‑Fi public ou via un proxy, une attaque MITM peut exposer le trafic

Résidus de développement

  • Des URL et ressources de développement sont présentes dans la build de production
    • Présence de chaînes localhost et d’une IP développeur (10.4.4.109)
    • Le client de développement Expo (expo-dev-client, expo-devlauncher, expo-devmenu) est inclus
    • La ressource dev_menu_fab_icon.png est présente
    • Une Compose PreviewActivity est exportée dans le manifeste

Structure des permissions

  • L’AndroidManifest inclut, au-delà des permissions classiques centrées sur les notifications, de nombreuses permissions de badge lanceur (Samsung, HTC, Sony, etc.)
  • Les chaînes de demande à l’exécution incluent des permissions de localisation précise, localisation approximative et localisation en arrière-plan
  • La description Google Play mentionne également les permissions suivantes :
    • « modifier/supprimer le stockage partagé », « exécuter un service au premier plan », « afficher par-dessus d’autres applications », « s’exécuter au démarrage », « utiliser le matériel d’empreinte digitale/biométrique »
  • La configuration FileProvider expose toute la racine du stockage externe et est utilisée pour l’accès aux fichiers WebView

Liste des SDK inclus

  • Plus de 68 bibliothèques sont incluses au total
    • Frameworks : React Native, Expo SDK 54, Hermes
    • Push/engagement : OneSignal, Firebase Cloud Messaging, Firebase Installations
    • Analyse/télémétrie : Firebase Analytics, Google Data Transport, OpenTelemetry
    • Réseau : OkHttp3, Apollo GraphQL, Okio
    • Image : Fresco, Glide, Coil 3, Uploadcare CDN
    • Vidéo : ExoPlayer(Media3), Expo Video
    • ML : Google ML Kit Vision (scan de codes-barres), modèle Barhopper
    • Chiffrement : Bouncy Castle
    • Stockage : Expo Secure Store, React Native Async Storage
    • WebView : React Native WebView (avec script injecté)
    • DI : Koin
    • Sérialisation : GSON, Wire (Protocol Buffers)
    • Vérification de licence : PairIP (pour la validation Google Play)
  • La build arm64 inclut 25 bibliothèques natives .so

1 commentaires

 
GN⁺ 2026-03-29
Réactions sur Hacker News
  • Le contenu de l’article semblait comme écrit par une IA, donc j’étais un peu sceptique
    Par curiosité, j’ai installé l’app moi-même, et contrairement à ce qu’affirmait l’article, elle ne demandait absolument aucune autorisation de localisation
    J’ai décompilé l’APK avec Claude Code, mais cet outil est faible pour l’analyse d’atteignabilité ou la compréhension de flux de contrôle complexes
    Il traite aussi du code mort non appelé comme s’il s’agissait de fonctions réellement utilisées, ce qui prête à confusion

    • Même dans la liste des permissions montrée dans l’article, il n’y avait pas d’autorisation de localisation
      Pour demander la localisation à l’exécution, il faut obligatoirement la déclarer, et cet élément est absent
      Sur mon téléphone (peut-être à cause de Graphene), Play a bloqué l’installation, donc je n’ai pas pu vérifier directement l’APK
      Dans le Play Store, la section « Informations → Autorisations » indique que la version 47.0.1 ne demande que des permissions ordinaires, comme l’accès réseau, le contrôle des vibrations et l’affichage de notifications
      C’est peut-être lié à un déploiement progressif de version ou à un ciblage selon les appareils
    • Je me demande s’il y a des éléments concrets pour dire que « ça semble écrit par une IA »
      Moi, je n’ai pas eu cette impression
    • L’article ne disait pas que l’app demandait une autorisation de localisation, mais qu’une seule ligne de JS suffit pour récupérer la position
    • Peut-être que la version de l’app est différente ?
      Sur l’App Store d’iPhone, la version 47.0.1 a été publiée il y a 34 minutes avec la mention « corrections mineures de bugs »
      Peut-être que cette mise à jour incluait du code lié à la localisation
    • Je me demande aussi si, pendant la décompilation, l’app aurait pu afficher de fausses informations
  • Ça ressemblait à une app marketing de cabinet de conseil tout à fait typique
    On dirait qu’un prestataire externe a utilisé une architecture standard avec du code de suivi de localisation inclus par défaut

    • Le code de suivi de localisation faisait partie du SDK OneSignal
      C’est simplement une plateforme de notifications push, donc si l’app ne demande pas elle-même l’autorisation, il ne se passe rien
    • 45Press est ce genre de société
      Elle semble avoir obtenu un contrat de support lié à la Maison-Blanche (d’environ 1,5 million de dollars) et fabriqué cette app dans ce cadre
    • C’est dommage : si l’US Digital Service d’autrefois existait encore, il aurait probablement pu faire ça correctement
      Aujourd’hui, il a été presque entièrement démantelé, remplacé par une organisation appelée DOGE, et se retrouve impliqué dans plusieurs procédures judiciaires
      Article Wikipédia sur le United States Digital Service
    • r8 comprend mal le code React Native et ne fait donc pas correctement l’élimination du code mort (tree shaking)
      C’est probablement pour cela qu’on voit encore des traces de réutilisation provenant d’autres apps
    • La mention « Visit TrumpRx.gov » m’a sidéré
      Je me demande s’il est vraiment possible d’utiliser un domaine en .gov à des fins de promotion commerciale
  • Si le contenu de l’article est vrai, ce serait un événement marquant la fin symbolique de la liberté
    On a l’impression que les valeurs dont les États-Unis se vantaient ont disparu

  • Qu’une app officielle du gouvernement injecte du CSS et du JavaScript sur des sites tiers pour supprimer les bannières cookies ou les paywalls, c’est surprenant
    Je n’installerais pas une app gouvernementale non libre, mais la fonctionnalité elle-même me semble plutôt positive, un peu comme uBlock

  • Le site était si lent qu’il était quasiment inutilisable
    Sur mon MacBook Pro 2019 avec Chrome, le défilement saccadait énormément

    • Même sur Firefox 149 (Windows 10), le défilement était catastrophique
      C’est ironique qu’un article critiquant le développement web présente lui-même ce genre de problèmes de performance web
    • Même sur Firefox mobile (151.0a1), le défilement était tellement haché que c’était pénible à lire
    • Même phénomène sur un ThinkPad avec Chrome
    • Je suis d’accord pour dire que la qualité web du site d’origine est déplorable
    • Sur Android 14 + Firefox 148.0.2, ça fonctionnait normalement
  • La critique sur l’absence de pinning de certificat me semble un peu exagérée
    Même sur un réseau où une attaque MITM est possible, si mon appareil ne fait pas confiance à cette AC, j’aurai simplement une erreur TLS

    • En revanche, si quelqu’un obtient un certificat signé par une AC à laquelle mon téléphone fait confiance, la situation change
      On peut par exemple imaginer un café près d’une ambassade dans un pays où la surveillance est courante, avec interception du trafic
      C’est rare, mais pas totalement impossible
    • Les organisations qui utilisent du MDM peuvent aussi pousser leur propre AC sur les appareils, ce qui crée une exception
    • De toute façon, cette discussion repose déjà sur des pratiques de sécurité dépassées, donc elle n’a plus énormément de sens aujourd’hui
  • Ce site est tellement lourd que le navigateur en vient à se figer
    Je n’ai pu le lire qu’en mode lecture

    • J’ai eu exactement le même problème
      Je pensais que ça venait de ma tablette, mais c’est intéressant de voir que d’autres ont constaté la même chose
  • La charge GPU pendant le défilement est élevée, donc l’utilisation des ressources graphiques est importante

  • En ce moment, à la Maison-Blanche, on dirait que les violations de la loi sont devenues monnaie courante

  • Dès le départ, je suis parti du principe que c’était un malware, et cette intuition s’est révélée juste