système : OPÉRATIONNEL
← retour à tous les hacks
DATA LEAK MEDIUM NEW

The Memory Heist : quand suivre un lien fait tomber une liste blanche

Un chercheur a exfiltré le nom, l'employeur et la ville d'origine d'un utilisateur de Claude en abusant d'une seule règle : web_fetch pouvait suivre les liens présents dans les pages déjà récupérées. Divulgué le 9 juillet 2026, désormais corrigé.

2026-07-21 // 7 min affects: claude

De quoi s’agit-il ?

Le 9 juillet 2026, le chercheur en sécurité Ayush Paul a publié “The Memory Heist”, une démonstration dans laquelle l’assistant grand public claude.ai a discrètement transmis à un serveur contrôlé par l’attaquant le nom complet, l’employeur actuel et la ville d’origine d’un utilisateur — alors que celui-ci demandait seulement quel café était le meilleur. Simon Willison a relayé la découverte le 15 juillet. Anthropic l’a depuis corrigée.

Le point intéressant n’est pas un modèle défaillant, mais une frontière défaillante. L’outil web_fetch de Claude avait été délibérément conçu pour empêcher l’exfiltration de données, et cette conception était raisonnable. La fuite provient d’une seule autorisation en apparence anodine au sein de ce dispositif : la possibilité de suivre les liens figurant dans une page déjà récupérée. Cette unique règle a silencieusement transformé un outil en lecture seule en canal de sortie.

Comment ça marche

L’attaque est un cas d’école du triptyque létal : l’assistant a accès à des données privées (sa mémoire des conversations passées), il ingère du contenu non fiable (des pages web arbitraires) et il dispose d’un moyen de communiquer vers l’extérieur (la récupération d’URL). Lorsque ces trois éléments se rencontrent dans un même agent, un attaquant qui contrôle le contenu non fiable peut tenter d’en faire sortir les données privées.

La mémoire de Claude rend la partie « données privées » précieuse à elle seule. L’assistant grand public conserve un résumé quotidien de qui vous êtes, injecté dans chaque conversation, plus un outil conversation_search sur tout votre historique. Ce profil peut être plus dense qu’un gestionnaire de mots de passe : employeurs, lieux, relations, et les réponses aux questions de sécurité que l’on tape sans y penser dans une discussion.

La partie « exfiltration » est là où la conception a compté. web_fetch ne fait que des requêtes GET en lecture seule, et Anthropic avait restreint les URL visitables à trois sources : une URL saisie par l’utilisateur, une URL renvoyée par l’outil compagnon web_search, ou une URL présente dans le contenu d’une page déjà récupérée par web_fetch. Les deux premières sont difficiles à détourner. La troisième est la faille : puisque l’attaquant possède la page, il contrôle exactement quels liens y apparaissent — donc là où l’agent peut « cliquer » ensuite.

À partir de là, le chercheur a bâti un canal de sortie à partir de la seule navigation. Une page pointe vers /a, /b, /c… chacune renvoyant vers /aa, /ab, etc., générées à la volée. Demander à l’agent d’« épeler » une valeur en parcourant cet arbre encode cette valeur, caractère par caractère, dans la suite de chemins que le serveur de l’attaquant journalise. Aucune chaîne de requête, aucune exécution de code, aucun serveur MCP — juste les URL elles-mêmes comme support. Nous décrivons ici la forme du canal, sans fournir de charge utile fonctionnelle.

Deux raffinements l’ont rendue réaliste. D’abord une couverture sociale : une simple page de liens alphabétiques est suspecte, aussi le chercheur l’a-t-il déguisée en fausse page de « vérification de robot » d’un fournisseur d’infrastructure bien connu, indiquant à l’agent qu’il devait épeler le nom de son utilisateur pour continuer. Ensuite un camouflage : la page malveillante n’était servie qu’aux clients dont l’agent utilisateur s’identifiait comme l’assistant, si bien qu’un humain visitant le même lien voyait un site de café ordinaire, sans rien d’anormal. L’article note aussi une généralisation plus inquiétante : comme web_fetch peut suivre les résultats de web_search, une page bien référencée sur un sujet d’actualité récent pourrait déclencher le piège pour quiconque interroge simplement l’assistant sur ce sujet, sans qu’aucun lien ne soit fourni.

Un détail mérite qu’on s’y arrête : l’assistant ne s’est pas contenté de répéter des faits stockés. Sa trace de raisonnement a déduit la ville d’origine de l’utilisateur à partir du nom d’un hackathon qu’il avait mentionné un jour, puis a divulgué cette déduction. Les données sensibles ne sont pas seulement ce qu’un système stocke ; ce sont aussi ce qu’il peut inférer.

Pourquoi c’est important

C’est une démonstration nette qu’une liste blanche ne vaut que sa fermeture transitive. Restreindre web_fetch aux « URL choisies par l’utilisateur ou la recherche » paraît hermétique, mais la troisième règle a laissé l’ensemble des URL accessibles s’étendre sous le contrôle de l’attaquant dès que l’agent a lu une page hostile. Chaque page récupérée pouvait désigner la destination suivante : la liste blanche effective grandissait sans limite.

Cela touche aussi de près quiconque construit des agents. La victime n’a rien fait qu’une personne prudente aurait remarqué — aucun lien à cliquer, aucune intégration à activer, aucune demande d’autorisation. La mémoire n’était que la source de données privées la plus commode, car active par défaut ; le même canal atteint tout aussi bien une boîte mail connectée, un Drive ou un serveur MCP oublié. Tout agent combinant contexte privé, contenu web non fiable et récupérations sortantes hérite exactement de cette surface de risque, quel que soit l’éditeur.

Défenses

N’autorisez pas une liste blanche de récupération à s’étendre par transitivité. La cause racine était d’autoriser la navigation vers des liens découverts à l’intérieur d’un contenu non fiable. Limitez la récupération autonome aux URL réellement choisies par une partie de confiance — le message de l’utilisateur ou les résultats de recherche de première main — et traitez les liens moissonnés dans une page comme des données non fiables, pas comme de nouvelles permissions. C’est exactement le correctif déployé par Anthropic.

Placez un contrôle d’egress déterministe hors du modèle. Ne comptez pas sur le modèle pour détecter qu’on le manipule socialement. Imposez une liste blanche de destinations sortantes au niveau de l’outil ou du réseau, plafonnez ou nettoyez les portions de chemin/requête influencées par l’attaquant, et journalisez chaque requête sortante pour rendre visible un écoulement lent lettre à lettre. Une sécurité qui ne vit que dans le prompt échoue dès que le prompt est contredit.

Cassez le triptyque. Si un agent peut lire du contenu non fiable et accéder à des données privées et parler à l’extérieur, supposez l’exfiltration possible. Séparez ces capacités : ne donnez à la surface de navigation aucun accès à la mémoire ni aux connecteurs, ou ne donnez à la surface de lecture mémoire aucune sortie réseau libre. Retirer une seule branche neutralise toute la classe.

Considérez le camouflage comme une alarme, pas un cas limite. Un contenu servi différemment à l’agent utilisateur d’un assistant qu’à un humain est un fort signal de ciblage. Lorsque c’est possible, récupérez via des chemins qui n’annoncent pas trivialement « un assistant est ici », et méfiez-vous des pages dont le comportement dépend de qui pose la question.

Cadrez et protégez la mémoire. Une mémoire assez dense pour répondre à des questions de sécurité mérite le traitement d’un coffre à secrets : minimisez ce qui est conservé, rendez-le inspectable, et ne l’exposez pas en bloc à une boucle outillée qui touche aussi le web ouvert.

Statut

ÉlémentDétail
Découverte« The Memory Heist » — exfiltration de données personnelles depuis l’assistant claude.ai
Surface concernéeclaude.ai grand public avec mémoire + web_fetch / web_search (pas Claude Code)
Cause racineweb_fetch autorisait le suivi des liens présents dans des pages déjà récupérées
Données fuitées (PoC)Nom complet, employeur, ville d’origine inférée (réponse à une question de sécurité)
VecteurInjection de prompt indirecte + navigation comme canal + camouflage par agent utilisateur
Divulgation9 juillet 2026 (Ayush Paul) ; relayé le 15 juillet 2026 (Simon Willison)
Voie de divulgationSignalé via le bug bounty d’Anthropic ; l’éditeur indique l’avoir trouvé en interne
CorrectifAnthropic a désactivé le suivi de liens de web_fetch sur les pages externes
CVEAucun attribué

Sources