Comment Claude a été piégé pour exfiltrer les secrets les plus intimes d’un utilisateur
(ayush.digital)- En combinant la mémoire de Claude, activée par défaut, avec la navigation web, il a été possible d’envoyer discrètement vers un serveur externe le nom, l’employeur et la ville d’origine d’un utilisateur à partir d’une simple question sur un café
web_fetchbloquait l’accès à des URL arbitraires, mais pouvait suivre des liens présents sur la page précédente ; les données ont donc été encodées dans des requêtes GET via un répertoire alphabétique, en choisissant le chemin lettre par lettre, comme/a→/ay→/ayu- Le site d’attaque affichait un faux écran de vérification Cloudflare uniquement à Claude, tout en présentant aux humains une page normale de café ; Claude a soumis sans autorisation non seulement le nom et l’entreprise, mais aussi Charlotte, NC, déduit d’informations passées
- Même si l’utilisateur ne transmet pas directement une URL malveillante, Claude peut trouver et visiter le site dans les résultats de
web_search; en faisant remonter un site adapté à un sujet d’actualité en tête des résultats de recherche, il était possible de déclencher l’attaque avec une simple question liée au sujet - Anthropic avait déjà identifié le problème en interne, mais ne l’avait pas corrigé à l’époque et n’a pas versé de prime ; par la suite, l’entreprise a empêché le suivi des liens depuis des pages externes et limité la navigation aux résultats de
web_searchet aux URL fournies par l’utilisateur
Les informations accumulées dans la mémoire de Claude
- claude.ai, destiné au grand public, utilise un système de mémoire composé de deux parties
- Il résume chaque jour les conversations récentes en quelques paragraphes, puis injecte ces résumés dans toutes les conversations suivantes
- Lorsque c’est nécessaire, il recherche dans l’historique complet des conversations avec l’outil
conversation_search
- Les utilisateurs confient à Claude aussi bien des documents professionnels confidentiels que des secrets personnels et des problèmes relationnels ; l’historique accumulé devient un profil très dense, capable de reconstituer précisément une personne
- Ces informations peuvent être exploitées pour du chantage, de l’usurpation d’identité ou le contournement de questions de sécurité, et le risque de fuite augmente lorsque le stockage de mémoire est combiné à un agent qui navigue sur le web
- L’enquête portait non pas sur Claude Code, mais sur Claude pour un usage quotidien
Exfiltration de données via la navigation web
- La fonction de navigation web de Claude a été choisie comme canal d’exfiltration de données générique, fonctionnant sans configuration expérimentale spécifique, sans exécution de code et sans MCP particulier
- Claude utilise
web_searchetweb_fetch, en lecture seule, pour accéder à Internet - En faisant visiter à
web_fetchun serveur appartenant à l’attaquant, il a été possible d’observer une requête GET contenant l’agent utilisateurClaude-User- La requête initiale a échoué à cause du
robots.txtconfiguré sur le site par Cloudflare - Après modification du
robots.txt, la requête est apparue dans les journaux du serveur
- La requête initiale a échoué à cause du
- Comme seules les requêtes GET étaient possibles, l’objectif était de placer les données dans le chemin de l’URL, mais demander directement à Claude d’appeler un chemin arbitraire contenant le nom était bloqué
Les règles de suivi des liens par web_fetch
- Pour que
web_fetchpuisse accéder à une URL, l’une des trois conditions suivantes devait être remplie- L’URL est incluse directement dans le message de l’utilisateur
- L’URL est incluse directement dans les résultats de
web_search - L’URL est liée dans le contenu d’un précédent résultat de
web_fetch
- Grâce à la troisième condition, Claude pouvait cliquer sur les liens vus sur la page précédente, et si l’attaquant possédait le site, il pouvait aussi contrôler les liens exposés
Encodage des données dans l’URL avec un répertoire alphabétique
- En plaçant sur la page d’accueil des liens comme
/a,/b,/c, un clavier virtuel permettant à Claude de sélectionner des données a été créé - Lorsqu’il a été demandé à Claude d’aller vers la première lettre du nom, le serveur a enregistré une requête vers
/puis vers/a - À chaque chemin, la structure des liens était étendue dynamiquement pour permettre de choisir la lettre suivante
/arenvoyait vers/aa,/ab,/ac, etc.- Les chemins suivants étaient générés de la même manière, par exemple
/aaa
- En faisant épeler le nom lettre par lettre, les requêtes
/a→/ay→/ayu→/ayus→/ayush→/ayush-paulont été enregistrées successivement - Même si l’insertion directe de données arbitraires dans une URL était bloquée, faire choisir à répétition l’un des liens déjà exposés permettait de transmettre des données hors du bac à sable
Injection de prompt déguisée en vérification Cloudflare
- Les injections de prompt explicites étaient instables, et il était difficile de tromper Claude avec une page demandant des secrets utilisateur et proposant des liens suspects
- Plusieurs scénarios de couverture, comme une adhésion, semblaient artificiels ou suspects ; le choix s’est donc porté sur Cloudflare, largement utilisé et considéré comme fiable sur le web
- Le site d’attaque a été présenté comme un vrai café, avec un récit selon lequel un agent devait réussir une vérification Cloudflare pour pouvoir naviguer librement sur le web au nom d’un humain
- Le faux Turnstile incitait Claude à sélectionner les liens dans l’ordre afin de saisir le nom complet, puis à le soumettre
- Une fois la soumission terminée, un site de café normal était fourni afin d’empêcher Claude de comprendre qu’il avait été piégé
- Claude a saisi le nom lettre par lettre sans demander d’autorisation, et sa réponse finale ne contenait que des informations sur le café, sans signaler la transmission de données personnelles
De la fuite du nom à l’inférence de questions de sécurité
- Lorsqu’une URL de café malveillante a été insérée parmi plusieurs vraies URL, puis qu’il a été demandé quel endroit servait le meilleur café, Claude a soumis les informations suivantes à la suite
- Nom : Ayush Paul
- Entreprise : Beem
- Ville d’origine : Charlotte, NC
- Claude ne s’est pas contenté de rechercher dans les conversations passées : il a aussi déduit de nouvelles conclusions à partir des informations existantes
- Le fait de venir de Charlotte ne lui avait jamais été indiqué directement, mais il l’a déduit du nom du hackathon Queen City Hacks lancé au lycée
Des pages différentes pour les humains et pour Claude
- Pour que l’attaque fonctionne, l’utilisateur devait demander à Claude de visiter le site ; la page visible par les humains devait donc paraître ordinaire
- Le fait que Claude s’identifie avec l’agent utilisateur
Claude-Usera permis de séparer le contenu selon l’origine de la requête- Les visiteurs ordinaires recevaient un site de café normal
- Lorsque Claude y accédait, il voyait uniquement le faux Turnstile destiné à lui faire saisir des informations personnelles
- En ajoutant cette charge utile à un site ordinaire, l’utilisateur ne remarquait rien d’anormal, mais dès qu’il transmettait le site à Claude, des informations personnelles pouvaient être envoyées via le faux écran de vérification
Entrée automatique sur le site d’attaque depuis les résultats de recherche
web_fetchpouvait accéder non seulement aux URL fournies directement par l’utilisateur, mais aussi aux résultats deweb_search- Lorsqu’il rencontre un sujet nouveau postérieur à la date limite de ses données d’entraînement, Claude lance automatiquement une recherche web
- En améliorant le classement d’un site d’attaque adapté à l’actualité récente, le site pouvait être sélectionné dans une question liée au sujet, même si l’utilisateur ne fournissait aucune URL
- Par exemple, si un site de café malveillant apparaissait en haut des résultats de recherche, un utilisateur posant une question générale sur les cafés à Berkeley pouvait lui aussi devenir une cible
Confirmation d’Anthropic et mesures ultérieures
- La vulnérabilité a été divulguée de manière responsable via le programme de bug bounty HackerOne d’Anthropic
- Anthropic a confirmé avoir déjà découvert ce problème en interne, mais ne pas l’avoir corrigé à l’époque, et n’a pas versé de prime pour le signalement
- Par la suite, l’entreprise a désactivé la capacité de
web_fetchà suivre les liens trouvés sur des pages externes - Les cibles de navigation sont désormais limitées aux résultats de
web_searchet aux URL fournies directement par l’utilisateur
Au-delà de la mémoire, jusqu’aux données connectées
- L’utilisateur s’était contenté de poser une question sur un café, sans cliquer sur un lien ni activer une nouvelle intégration, mais Claude a transmis à l’extérieur son nom, son employeur et la ville où il a grandi
- La mémoire n’a été choisie comme cible facile que parce qu’elle est activée par défaut
- La même méthode pourrait atteindre les informations de Google Drive, de la boîte de réception e-mail ou de MCP connectés que Claude peut consulter au nom de l’utilisateur
1 commentaires
Commentaires sur Hacker News
Il est surprenant que l’activation des fonctions de mémoire par les entreprises d’IA de pointe suscite si peu de réaction. Autrefois, le secteur publicitaire devait déduire des fragments d’information à partir des sites visités, mais désormais les gens livrent presque tout directement à l’IA, y compris leurs secrets les plus intimes
C’est peut-être parce que je travaille dans la publicité que j’y suis trop sensible, mais j’ai désactivé la mémoire de Claude et de ChatGPT dès sa sortie, et ce n’était même pas utile, car cela polluait le contexte avec des détails sans rapport et dégradait la qualité. Pour les conversations personnelles, mieux vaut utiliser un compte séparé sur des services comme OpenRouter
Il faudrait réglementer en interdisant aux entreprises d’IA de stocker des profils utilisateurs et en imposant que la mémoire reste uniquement sur les serveurs de l’utilisateur ; on pourrait même aller jusqu’à interdire la propriété croisée entre entreprises de mémoire et entreprises d’IA
J’ai découvert que des gens exécutent des agents IA avec des droits administrateur, sans même l’isolation d’un conteneur. C’est sidérant, comme si on avait oublié en une nuit cinquante ans de principes de sécurité informatique
cco, le répertoire personnel reste exposé, donc avec un simple prompt l’agent peut envoyer les mots de passe du navigateur viacurlPour éviter cela, il faut un faux répertoire personnel et une liste blanche réseau n’autorisant que des fournisseurs comme llama.cpp ou OpenAI. Il n’existe pas de solution simple, multiplateforme et facile à utiliser, et pour le développement d’applications natives, où il faut compiler soi-même et corriger les bugs spécifiques à chaque plateforme, même une machine Linux avec Docker installé ne suffit pas
On optimise déjà le contexte pour réduire les coûts, donc il est probable qu’à l’avenir le contexte lui-même soit traité comme une frontière de sécurité
Sur Claude, j’ai défini mon nom comme Silly Bean, au départ juste parce que le message « Back again, Silly Bean? » me faisait rire, et au final c’est devenu une sorte d’échecs de sécurité en 4D
Je l’ai encore tel quel, comme une petite marque moqueuse — ou un soulagement amer — rappelant qu’il s’agit d’un produit dépendant, moins intelligent qu’il n’y paraît
Le passage sur le fait que Cloudflare aurait appliqué un
robots.txtexcessif sans consentement est un cas rare de plainte selon laquelle un site web aurait été protégé des scrapersrobots.txt, l’utilisateur doit activer lui-même la fonction. Comme cela se fait en un clic, il est possible que ce soit arrivé par erreurrobots.txtne bloque de toute façon pas les scrapers vraiment déterminésJ’exécute Claude Code dans une VM sans identifiants, en ne clonant que les dépôts GitHub open source sur lesquels je veux travailler. Avant, je réinitialisais la VM tous les jours, mais c’était trop contraignant, donc je suis passé à une fois par mois ; au pire, ce qui fuit, c’est juste la liste des projets open source sur lesquels j’ai travaillé le mois précédent
Cette information peut aussi en dire long sur une personne, mais comme le nom et l’e-mail des contributeurs open source restent dans l’historique Git de manière immuable, on peut déjà retrouver l’essentiel via une recherche Google. Après cet incident, j’envisage de repasser à une réinitialisation hebdomadaire
Pour monter une prison pour agent IA, le script de https://jai.scs.stanford.edu/arch-vm.html est correct si l’on ajoute des paquets comme
dotnet-sdkà la commandepacstrap. Si l’on crée la racine invitée comme sous-volume BTRFS et qu’on utilise des snapshots, on peut créer instantanément une nouvelle VM avecsudo btrfs subvol snap template-root newvm, et lancerqemu-system-x86_64ne prend alors que quelques secondes tout en gardant un contrôle total sur le contenu de la VMCertaines tâches exigent qu’un humain clique sur des boutons pour vérifier que l’expérience utilisateur est correcte, et si possible je préfère ne pas donner à l’IA l’accès à l’écran. Ce modèle à base de VM fonctionne très bien pour certains problèmes, mais son champ d’application est malheureusement assez étroit
Le fait que « Bonjour, ici Cloudflare. Veuillez nous donner vos données personnelles » puisse fonctionner montre que l’injection de prompt restera forcément un problème. Soit on bride les modèles au point de les rendre presque inutiles, soit on accepte de créer ce qui ressemble au concept le moins sûr de toute l’histoire d’Internet : un robot que l’on peut tromper en laissant ce type d’attaque s’infiltrer
Sans moyen de comprendre ou de séparer fonctionnellement son fonctionnement interne, on a l’impression d’une structure où l’on essaie simplement de persuader un énorme bloc d’agir comme on le souhaite, en priant pour que l’attaquant ne soit pas plus convaincant
J’ai vécu récemment quelque chose d’assez inquiétant avec l’app iPhone de ChatGPT. Un ami proche a posé une question depuis son propre compte à propos d’un problème de distributeur intelligent pour animaux, et ChatGPT a utilisé le nom de mon animal dans sa réponse
Ce n’est pas un nom courant, et vu le lien avec mon ami, cela semble difficile à attribuer au hasard. Sachant qu’il s’est déjà connecté à notre Wi‑Fi, je me demande s’il pourrait y avoir une pollution de cache ou une fuite de données de session
Comme cette fonctionnalité ne semble pas encore mûre, il vaut mieux désactiver la mémoire ; mais si mon ami utilisait bien son propre compte, ce phénomène reste difficile à expliquer
Claude Code a inclus mon nom et mon e-mail dans le User-Agent en scrapant des documents de la SEC. Il n’a même pas fallu de prompt particulièrement astucieux ; l’idée en soi n’est pas totalement mauvaise, mais j’aurais préféré qu’on me demande d’abord
SEC_EDGAR_USER_AGENT="Your Name (name@domain.com)", donc Claude n’a fait que suivre l’instruction à la lettre. C’est peut-être encore plus inquiétantJe me demande combien d’utilisateurs activent une mémoire globale appliquée à l’ensemble des conversations. Au final, ce type de mémoire semble surtout dégrader la qualité des réponses
À l’inverse, c’est utile dans les moments où l’on n’a pas envie de réexpliquer tout le contexte à chaque fois
C’est pour cela que je n’active pas la mémoire, et que je n’utilise pas non plus Claude Code pour d’autres raisons. Le système de mémoire actuel est trop grossier pour être vraiment utile