Analyse technique
Google Messages — constats et analyse
Synthèse et gravité
Google Messages (com.google.android.apps.messaging) a été examiné sur un Samsung Galaxy A26 (SM-A266B), sous Android 16, build BP4A.251205.006, avec le paquet messages.android_20260910_03_RC02.phone_samsung_dynamic et le code de version 323089900. Le transport testé était RCS. L'analyse statique porte sur l'APK exact installé, dont l'APK de base a pour SHA-256 9e869a68…ff60b2 et une signature vérifiée comme authentique de Google. Elle est complétée par le comportement observé sur ce seul appareil.
| ID | Constat | CWE | CVSS 3.1 | Gravité |
| F-PREVIEW | Fuite d'IP et de métadonnées via l'aperçu généré sur l'appareil | 200/359 | 4.3 | Moyenne |
| F-UA | La requête d'aperçu utilise un User-Agent usurpé, configuré à distance (intégré à F-PREVIEW) | 451 | — | Contexte |
F-PREVIEW · CWE-200 / CWE-359
Fuite d'IP et de métadonnées via l'aperçu généré sur l'appareil
Moyenne · CVSS 4.3
Description
Lors du traitement d'un message contenant une URL, Google Messages génère l'aperçu par une requête HTTP(S) GET envoyée depuis l'appareil, sans proxy côté serveur. Le serveur du lien reçoit l'IP de sortie actuelle du destinataire, le User-Agent de l'aperçu, Accept-Language et l'heure. Les requêtes suivantes pour une og:image ou un favicon peuvent aussi contenir un User-Agent Dalvik révélant la version d'Android, le modèle de l'appareil et le numéro de build.
Ce qui déclenche réellement la récupération
Ce point doit être décrit précisément, car il détermine la gravité. Le cheminement comporte deux étapes :
- À la réception, la tâche
request_link_preview est planifiée après validation de l'écriture du message en base (dfvl/bcnl → btlr.b()). Pour un nouveau lien, le premier passage peut insérer une ligne d'aperçu deferred et se terminer avant toute requête réseau (btln).
- Quand le chat est ouvert et la conversation devient interactive,
onMessageListInteractive lance un observateur (ahxw → aied). Il surveille les lignes deferred de cette conversation et planifie une seconde tâche avec deferred=true (aieb → btlr.a()), qui peut récupérer le lien une fois les conditions suivantes remplies.
L'observateur s'exécute dans un contexte de coroutines en arrière-plan, sans désinscription visible à la sortie du chat. Cela explique une récupération écran verrouillé et application en arrière-plan après une première ouverture du chat. Le code examiné ne démontre pas une récupération dans une conversation jamais ouverte, et ce rapport ne la revendique pas.
Conditions préalables
- Réglage des aperçus. Les aperçus automatiques doivent être activés (
aqck). Google Messages propose d'afficher tous les aperçus, uniquement ceux des liens web, ou de les désactiver.
- Confiance accordée à l'expéditeur. Il doit satisfaire la condition
btez.m(). Un contact doté d'un lookup_key renseigné est un état accepté, avec deux autres états de participant. Un chemin alternatif, piloté par un paramètre, compte les chargements manuels d'aperçus : le seuil par défaut dans l'APK est de 3, enregistré par participant. La valeur par défaut de enable_link_preview_untrusted_senders est false. Ouvrir le chat ou marquer un message comme lu n'équivaut pas à charger manuellement un aperçu. Les valeurs actives de la configuration distante n'ont pas été lues.
- Schéma de l'URL. L'analyseur accepte uniquement
http/https et réécrit ws:/wss:. Il rejette file:// et content://. Les images passent par le même client limité à HTTP.
Impact établi par les éléments disponibles
Le serveur du lien apprend l'IP de sortie actuelle, le User-Agent, la langue et l'heure de la requête. Les téléchargements d'image ou de favicon peuvent ajouter le modèle, la version du système et le build. L'aperçu étant indexé par identifiant de message et non par URL, un même lien dans un nouveau message provoque une nouvelle récupération. Un expéditeur de confiance peut ainsi constituer une trace approximative du réseau et de la localisation dans le temps. Lors du test archivé de mars, l'appareil utilisait un VPN : l'IP observée était celle de sa sortie, pas une IP résidentielle. Aucun accès à d'autres applications ou services locaux, aucune prise de contrôle de compte et aucune exécution de code n'ont été démontrés ni ne sont revendiqués.
Qui est considéré comme « de confiance » ?
Un contact enregistré n'est pas nécessairement un ami : il peut s'agir d'un magasin, d'un livreur ou d'une banque dont vous avez gardé le numéro. Les expéditeurs professionnels vérifiés, qui envoient des SMS/RCS en masse avec un nom d'entreprise et sans avertissement d'expéditeur inconnu, n'ont pas été testés. Leur éventuelle admissibilité reste une question pour Google. Dans tous les cas, les expéditeurs susceptibles de déclencher une récupération automatique ne se limitent pas à vos proches.
Détail du score CVSS 3.1
AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N → Score de base 4.3 (moyen)
L'impact est la divulgation d'une IP, d'un User-Agent et de métadonnées de l'appareil, soit C:Low, ce qui maintient la gravité au niveau moyen. UI:R reflète le code : la chaîne de récupération dépend de l'ouverture de la conversation. L'ancienne qualification « critique / sans clic » n'est pas justifiable : elle suppose un chemin UI:N avec un chat jamais ouvert que le code ne démontre pas, et un impact C:High que cette fuite n'atteint pas.
Pistes de correction
- Récupérer les aperçus via un proxy de Google, pour que le serveur du lien voie son infrastructure et non l'appareil du destinataire, comme c'est déjà le cas pour d'autres services d'aperçu.
- Si la récupération reste sur l'appareil, exiger une action explicite pour chaque message et empêcher un observateur en arrière-plan de la relancer après fermeture de la conversation.
- Décrire clairement le flux de données dans l'aide relative à la vie privée, afin que « aperçus automatiques » ne soit pas compris comme « aperçus incapables de révéler votre IP ».
Gravité
À propos du score
Le score de base CVSS dépend du vecteur d'attaque, de l'interaction et de l'impact sur la confidentialité, l'intégrité et la disponibilité. Une IP et quelques métadonnées relèvent de C:Low, même si la victime intervient très peu. L'absence de clic ne changerait que la métrique d'interaction, pas l'impact. Ici, le code ne démontre même pas la variante où le chat n'a jamais été ouvert : le vecteur justifié est UI:R, pour un score de base de 4.3.
Ce constat est réel et mérite une correction, avec une gravité moyenne. Un ancien brouillon le qualifiait de critique, en contradiction avec son propre CVSS et l'impact réel d'une fuite d'IP et de métadonnées. Je préfère publier un score défendable qu'un score exagéré.
Portée et limites du constat
Les points suivants ont également été examinés, mais ne font pas partie des effets revendiqués :
- Aucun accès à d'autres applications ni franchissement de leur isolation. Une requête HTTP
GET du client d'aperçu ne lit pas les données d'une autre application. La sandbox Android n'est pas franchie et aucun franchissement n'a été démontré.
- Aucune prise de contrôle de compte ni exécution de code. Les voies possibles de RCE ont été examinées : chargement dynamique, appels à
exec/ProcessBuilder, désérialisation, ponts WebView et analyseur HTML. Aucun chemin accessible depuis un message entrant n'a été trouvé.
- Aucune généralisation. Un seul appareil, une seule version d'Android et une seule configuration RCS ont été testés. Rien ne permet ici d'affirmer que tous les utilisateurs de Google Messages sont concernés.
- Le User-Agent n'est pas un numéro de version. La valeur observée
GoogleMessages/20.2 vient de la configuration distante et n'identifie pas le build.
- Quelques pistes du manifeste ont été relevées : permissions personnalisées déclarées avec une protection
normal et récepteur de débogage exporté sans permission. Elles n'ont pas été testées, ne constituent pas des constats établis et ne sont pas notées.
Vérifier par soi-même
Aucune capture d'écran n'est publiée ici. Le constat repose sur le chemin de code décrit et peut être reproduit avec ses propres appareils et un point de collecte sous son contrôle. Le principe :
- Utilisez une URL que vous contrôlez et qui enregistre chaque requête avec l'IP, le User-Agent et l'heure. webhook.site, RequestBin ou un petit serveur personnel conviennent. Ils fournissent une URL unique et affichent les requêtes en direct. Choisissez un chemin neuf et unique pour chaque message afin d'associer chaque récupération à un seul message.
- Depuis un second compte vous appartenant, enregistré comme contact, envoyez ce lien dans une conversation déjà ouverte auparavant. Le journal reçoit une requête issue de la connexion du téléphone destinataire, avec un User-Agent
GoogleMessages.
- Pour un résultat rigoureux, consignez l'état de verrouillage, Doze et le processus sur la même base de temps que le journal serveur. Effectuez aussi un essai sans VPN pour observer la sortie réelle de la connexion.
Pour éviter ces requêtes, désactivez les aperçus automatiques de liens web dans les réglages. L'option « Afficher uniquement les aperçus de liens web » ne les bloque pas. Un contact enregistré peut obtenir des informations sur votre réseau en vous envoyant un lien.
Chronologie de la divulgation
- 2026-03-14
Signalement au Google Mobile VRP : récupération d'aperçus sur l'appareil révélant l'IP et les métadonnées du destinataire (CWE-200/359), avec journaux HTTP et captures de mon propre appareil et compte (issu.ee/492756092).
- 2026-03-17
Google a évalué puis clôturé le rapport. Aucun engagement de correction n'a suivi.
- 2026-10-29
Nouvel examen par analyse statique de l'APK exact installé. La récupération sur l'appareil et son déclenchement en deux étapes étaient inchangés ; le comportement restait présent.
Ce qui constituerait une correction
Je préfère mettre cette page à jour que la défendre. Elle indiquera « corrigé » lorsque la version distribuée récupérera les aperçus via l'infrastructure de Google, sans exposer l'IP du destinataire, ou exigera une action explicite sur l'appareil sans relance en arrière-plan après fermeture du chat. Un changement limité à un build interne ne suffit pas.
Tous les tests ont été réalisés sur mes appareils et comptes, vers des points de collecte que je contrôle. Aucun appareil, compte ou donnée d'autrui n'était impliqué. Ce rapport ne contient ni logiciel malveillant ni outil d'attaque : la reproduction consiste à envoyer un lien ordinaire vers son propre serveur. Les identifiants sont abrégés.