Un fichier texte posé dans le dossier Téléchargements d’un client a poussé son agent de codage à installer un paquet npm malveillant. Les chercheurs de Forever Security ont reproduit l’attaque sur Codex et Claude Code, sans la moindre faille à corriger.

Forever Security surveille les risques liés aux agents d’IA. Fin octobre, la société a arrêté en pleine session l’agent de codage d’un client, au moment précis où il tentait d’installer « function-color », un paquet npm malveillant resté sous les radars pendant près de deux ans. L’ordre ne venait ni d’une dépendance ni d’un dépôt de code, mais d’un fichier AGENTS.md posé dans le dossier ~/Downloads, qui servait aussi de répertoire de travail à l’agent. Personne n’avait déposé ce fichier, et personne ne savait comment il était arrivé là. Mystère et boule de gomme.
Protégez votre entreprise gratuitement pendant 30 jours
Découvrez Bitdefender Ultimate Small Business Security et protégez votre activité contre les cybermenaces. Aucune coordonnée bancaire requise.
Une page web dépose le fichier dans vos Téléchargements sans un clic
Un fichier AGENTS.md contient les consignes qu’un agent de codage suit sur un projet, des outils à utiliser à la façon de lancer les tests. Codex le lit au démarrage et exécute ce qu’il y trouve. Tout le piège tient là, parce que ~/Downloads reste le seul dossier qu’une page web peut remplir toute seule, sans clic et sans autorisation. « Le dossier Téléchargements a quelque chose de particulier. C’est le seul dans lequel le web peut écrire de lui-même », écrivent les chercheurs dans leur analyse de l’attaque. Chrome, Edge et Firefox enregistrent leurs téléchargements à cet endroit sans demander où ranger chaque fichier, et une page peut y déposer un AGENTS.md à l’insu de l’utilisateur. Une démonstration vérifiée par Bleeping Computer a bien récupéré un fichier au contenu inoffensif.
Un exécutable venu du web ne s’ouvre pas sans votre accord, un système d’exploitation y veille depuis longtemps. Le Markdown, lui, ne s’exécute jamais, donc aucun garde-fou ne s’applique. Entre les mains d’un agent, ces instructions finissent malgré tout exécutées. Le danger grossit avec une autre habitude, celle de laisser les agents naviguer. Dans les mesures de Forever Security, un quart des sessions ouvrent un vrai navigateur, et la moitié des clients lancent au moins parfois un agent dans leur dossier Téléchargements. Chez eux, Claude Code a démarré plus de 1 300 fois depuis cet emplacement. L’agent va parfois chercher tout seul le fichier qui le retourne, et personne ne voit rien.
Un paquet installé sur Codex et un jeton volé sur Claude Code
Les chercheurs ont rejoué le fichier du client tel quel, dans une machine virtuelle isolée. Vous ouvrez Codex dans le dossier, vous lui demandez n’importe quoi, et avant de s’atteler à votre tâche, il ajoute à sa configuration un serveur « project tools » puis installe le paquet depuis npm. « Codex vient d’exécuter le code de l’attaquant, en une seule session », résument Gal Weizman et Omer Samet, qui relèvent un taux de réussite de plus de 90 %. Le fichier, un document de 13 Ko aux allures de guide d’ingénierie, écrit dans ~/.codex/config.toml, la configuration de toute la machine. Chaque session suivante charge alors le serveur du pirate, dans n’importe quel dossier.
Claude Code s’est montré plus coriace, et l’attaque a dû changer d’objectif. Un fichier CLAUDE.md pousse l’agent à rediriger son trafic API vers un serveur contrôlé par les chercheurs, via la variable ANTHROPIC_BASE_URL glissée dans un fichier de réglages. Chaque requête emporte alors le jeton OAuth de Claude, de quoi se faire passer pour la victime auprès de la vraie API. Le serveur pirate répond ensuite à la place du modèle et renvoie des commandes que le client exécute. Claude Code est allé au bout de la chaîne dans environ la moitié des essais. Du côté d’OpenAI et d’Anthropic, il n’y a rien à corriger. « Un agent qui suit l’AGENTS.md de son dossier fait exactement ce pour quoi il a été conçu », rappellent les chercheurs. Les deux éditeurs conseillent de lancer l’agent depuis le dossier du projet concerné, jamais depuis Téléchargements, et de garder les validations et le bac à sable actifs. Pour les TPE et PME, un développeur qui lance un agent sans ce cadre ouvre à lui seul un nouveau point d’entrée aux pirates.
- Agent dans le terminal
- Compréhension du projet
- Intégration à Git avancée
- Tâches complètes de bout en bout
- Agents parallèles et isolés
- Revue Git intégrée
Un fichier AGENTS.md ou CLAUDE.md sert souvent de “mémo de projet” que certains agents de codage traitent comme une source d’instructions opérationnelles (outils à activer, commandes à lancer, règles de travail). Le Markdown n’exécute rien par lui-même, mais l’agent peut interpréter son contenu comme des directives, puis lancer des actions via le shell, un gestionnaire de paquets (npm) ou des “tools” internes. Le risque vient donc de la chaîne “texte → interprétation par l’agent → exécution par l’environnement”, sans que le système d’exploitation ne voie un binaire suspect à bloquer. C’est une forme d’injection par contexte : le fichier est inoffensif pour un humain, mais devient actif via la logique de l’agent. Plus l’agent a d’autorisations (réseau, écriture de config, exécution de commandes), plus l’impact potentiel est élevé.
Les navigateurs autorisent le téléchargement de fichiers vers l’emplacement par défaut (souvent Téléchargements) sans demander à chaque fois un dossier de destination, notamment si l’option “toujours demander où enregistrer” est désactivée. Une page peut donc déclencher un ou plusieurs téléchargements et faire apparaître un fichier dans ce dossier, même si l’utilisateur ne s’attend pas à y trouver des fichiers “de configuration”. Cela ne lance pas un exécutable, mais suffit à placer un document que l’agent lira automatiquement s’il utilise Téléchargements comme répertoire de travail. Le dossier Téléchargements devient alors une zone de “dépôt” indirecte accessible depuis le web, ce qui est problématique si des outils locaux y cherchent des fichiers de directives. L’attaque repose moins sur une faille du navigateur que sur l’hypothèse dangereuse qu’un dossier alimenté par Internet peut servir de base de confiance pour un agent.
Une variable de type ANTHROPIC_BASE_URL sert à changer l’URL du serveur API contacté par le client, ce qui permet en pratique de le faire parler à un proxy ou à un faux endpoint contrôlé par un tiers. Si le client envoie son jeton OAuth dans les en-têtes (par exemple “Authorization”), ce jeton peut être récupéré par le serveur intermédiaire, puis réutilisé pour se faire passer pour l’utilisateur auprès du service légitime. Au-delà du vol d’identifiants, le proxy peut aussi renvoyer des réponses API “fausses mais plausibles”, et influencer les actions locales du client (commandes, modifications de fichiers) si celui-ci exécute des instructions issues des réponses. C’est une variante d’attaque de type détournement de point de terminaison (endpoint hijacking), qui vise la couche de configuration plutôt qu’une vulnérabilité cryptographique. Les protections efficaces sont la validation stricte des endpoints autorisés, l’isolation des secrets et des confirmations explicites avant toute action à impact.