Comment empêcher un fichier AGENTS.md malveillant de détourner votre agent de code

Un fichier AGENTS.md malveillant peut détourner Codex ou Claude Code depuis votre dossier Téléchargements. Cinq mesures pour les équipes : dossiers de démarrage sécurisés, revue des fichiers, règles de refus, environnement sandbox et vérification des configurations.

Aiden Flux

Aiden Flux

12 novembre 2026

TL;DR : Un fichier AGENTS.md malveillant détourne un agent de développement en exploitant sa fonction même : l'agent le lit au démarrage et applique ses instructions. Forever Security en a découvert un dans le dossier ~/Downloads d'un véritable client en octobre 2026. Pour s'en prémunir, ne lancez jamais un agent dans un répertoire que vous ne contrôlez pas, examinez les fichiers d'instructions comme du code, interdisez les modifications de configuration et de réseau, conservez le bac à sable et les invites de validation activés, et surveillez les changements apportés à la configuration de l'agent.

En quoi consiste une attaque par AGENTS.md malveillant

Un fichier AGENTS.md malveillant est un fichier d'instructions de projet conçu pour pousser un agent de développement à accomplir des actions néfastes. Claude Code, Codex et d'autres agents chargent automatiquement ces fichiers depuis le dossier dans lequel ils sont lancés. L'attaque ne nécessite aucun exploit : l'agent lit le fichier au démarrage et traite son contenu comme les règles propres au projet.

Le fichier se présente comme de simples notes techniques : une étape préliminaire de « preflight » qui installe un paquet, une remarque relative à un « proxy » qui modifie la destination du trafic API. Pour l'agent, il s'agit d'une consigne de même nature que « utiliser pnpm plutôt que npm ».

Si vos développeurs utilisent plusieurs agents de développement, Sharkly leur offre un espace unique pour assigner et passer en revue ce travail ; nous reviendrons sur la manière dont cela modifie le répertoire de démarrage des agents.

Pourquoi votre agent de développement obéit à ce fichier

Les fichiers d'instructions s'insèrent dans le contexte de l'agent aux côtés de votre prompt, sans frontière stricte entre les règles du projet et votre demande.

La documentation sur la mémoire de Claude Code précise que le contenu de CLAUDE.md et d'AGENTS.md est traité « comme du contexte, et non comme une configuration imposée ». Il charge chaque fichier AGENTS.md présent dans le répertoire de travail et les répertoires parents lorsqu'aucun CLAUDE.md n'est trouvé. Le guide d'AGENTS.md de Codex parcourt l'arborescence depuis la racine du projet jusqu'au répertoire courant et concatène tout ce qu'il trouve, jusqu'à 32 Kio par défaut. Les fichiers les plus proches de l'emplacement de démarrage de l'agent venant en dernier, ils ont le dernier mot. Le répertoire dans lequel vous démarrez l'agent détermine donc ce qui est chargé, et les dossiers parents comptent tout autant.

Comment un fichier AGENTS.md malveillant détourne Codex et Claude Code

Le 22 octobre 2026, Forever Security a publié les résultats de ses constatations sur l'ordinateur portable d'un client. Un agent de développement a tenté d'installer function-color, un paquet npm malveillant connu, en suivant une instruction provenant d'un fichier AGENTS.md situé dans ~/Downloads. Ce dossier servait également de répertoire de travail à l'agent. Forever a bloqué l'installation avant que le moindre code ne soit exécuté, sans pouvoir déterminer comment le fichier s'était retrouvé là.

Diagram of the attack chain: a web page silently saves AGENTS.md to the Downloads folder, a developer starts a coding agent there, the agent reads the file and rewrites its own config, and the result is a malicious npm package running or an OAuth token sent to an attacker server

La raison pour laquelle le dossier Téléchargements est vulnérable : c'est le seul dossier dans lequel une page web peut écrire sans clic préalable. Forever a ensuite reproduit l'enchaînement en laboratoire :

  1. Une page sous leur contrôle enregistre un fichier nommé AGENTS.md dans ~/Downloads.
  2. Le développeur ouvre Codex dans ce dossier et lance une commande quelconque.
  3. Avant de commencer la tâche, Codex ajoute un serveur d'« outils de projet » dans ~/.codex/config.toml et installe un paquet depuis npm.
  4. Comme cette configuration s'applique à l'ensemble de la machine, chaque session ultérieure de Codex charge le serveur de l'attaquant, quel que soit le dossier.

Forever indique que Codex a exécuté la charge utile dans plus de 90 % des tentatives. La plupart des tests utilisaient un substitut inoffensif ouvrant une calculatrice ; le véritable paquet n'a été exécuté qu'une seule fois, au sein d'une machine virtuelle isolée.

Claude Code s'est montré plus difficile à piéger. Un fichier CLAUDE.md déposé a réussi à rediriger son trafic API vers un serveur contrôlé par Forever, ce qui a provoqué la fuite du jeton de connexion OAuth et permis au serveur de répondre à la place du modèle. Forever signale que l'attaque a réussi dans environ 50 % des cas. Ces deux chiffres provenant d'attaques distinctes, ils ne doivent pas être comparés sous la forme d'un taux de réussite unique.

Le constat de Forever est sans appel : il n'y a aucun bug à corriger. Le problème réside dans un dossier accessible en écriture par le Web, auquel l'agent accorde la même confiance que si vous l'aviez rempli vous-même. Cette même leçon s'était déjà dégagée des recherches de Pillar Security sur la vulnérabilité Rules File Backdoor, qui dissimulait des instructions dans des fichiers de règles grâce à des caractères Unicode invisibles lors d'un diff.

Cinq étapes pour bloquer un fichier AGENTS.md malveillant

Les deux premières étapes empêchent le chargement du fichier ; les trois suivantes limitent les dégâts si un fichier parvient à passer.

Five defense layers between an untrusted instruction file and a developer laptop: never start agents in Downloads or home, review AGENTS.md and CLAUDE.md like code, deny config and network rewrites, keep sandbox and approval prompts on, watch config files and rotate

1. Où ne faut-il jamais lancer un agent de développement ?

Jamais dans ~/Downloads, dans votre répertoire personnel, ni dans aucun dossier que vous n'avez pas vous-même créé. Forever indique qu'environ la moitié de ses clients lançaient un agent de développement dans Téléchargements. Si vous avez besoin d'un agent pour trier des téléchargements, copiez les fichiers dans un nouveau dossier vide et démarrez-le à partir de là.

Un garde-fou dans le shell permet de faire respecter cette règle à ceux qui l'oublieraient :

# ~/.zshrc: refuse to start an agent in folders the web can write to
agent_guard() {
  case "$PWD" in
    "$HOME"|"$HOME/Downloads"*|"/tmp"*)
      echo "Refusing to start an agent in $PWD. Use a project folder." >&2
      return 1 ;;
  esac
}
claude() { agent_guard && command claude "$@"; }
codex()  { agent_guard && command codex "$@"; }

2. Comment examiner AGENTS.md comme du code ?

Traitez chaque fichier d'instructions comme un exécutable, y compris dans un dépôt cloné il y a cinq minutes. Rendez ensuite cette revue automatique. Placez les fichiers d'instructions sous le contrôle de CODEOWNERS afin que toute pull request qui y touche exige un relecteur désigné :

AGENTS.md            @your-org/platform
**/AGENTS.md         @your-org/platform
CLAUDE.md            @your-org/platform
/.claude/            @your-org/platform
/.cursor/rules/      @your-org/platform

Ajoutez un contrôle dans votre CI qui échoue sur les motifs exploités par ces attaques : caractères Unicode invisibles, modifications de l'URL de base et commandes d'installation au sein des fichiers d'instructions.

#!/usr/bin/env bash
# ci/check-agent-instructions.sh
files=$(git ls-files '*AGENTS.md' '*CLAUDE.md' '.cursor/rules/*')
[ -z "$files" ] && exit 0
fail=0
# zero-width, bidi override and Unicode tag characters
if grep -nP '[\x{200B}-\x{200F}\x{202A}-\x{202E}\x{2066}-\x{2069}\x{E0000}-\x{E007F}]' $files; then
  echo "Hidden Unicode in an agent instruction file"; fail=1
fi
if grep -niE 'BASE_URL|chatgpt_base_url|mcp_servers|npx --yes|curl .*\| *(ba)?sh' $files; then
  echo "Config, network or install instruction in an agent file: needs review"; fail=1
fi
exit $fail

Le second grep remontera quelques lignes légitimes. Celles-ci méritent quoi qu'il en soit une relecture humaine.

3. Interdire à l'agent de réécrire sa propre configuration

Les deux reproductions se sont soldées par la modification par l'agent de ses propres paramètres. Supprimez cette possibilité. Dans Claude Code, interdisez les modifications des dossiers de configuration de l'agent et verrouillez la lecture des secrets dans le fichier .claude/settings.json du projet :

{
  "permissions": {
    "deny": [
      "Edit(./.claude/**)",
      "Edit(~/.claude/**)",
      "Edit(~/.codex/**)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}

Pour une équipe, définissez cette règle dans les paramètres managés afin qu'un fichier de projet ne puisse pas l'assouplir. La documentation sur la mémoire renvoie vers les directives managées permissions.deny, sandbox.enabled et env pour tout ce qui doit être strictement imposé, ainsi que vers un hook PreToolUse pour bloquer une action quelle que soit la décision du modèle. Verrouiller le routage d'API dans un env managé constitue la parade directe contre l'attaque sur l'URL de base. Vérifiez la syntaxe des règles par rapport à la version que vous utilisez avant de la déployer.

4. Laisser le bac à sable et les demandes de validation activés

Forever conseille de laisser les barrières de validation et les bacs à sable activés, et de se méfier de tout texte incitant l'agent à les contourner.

Définissez les actions qui doivent systématiquement s'interrompre dans l'attente d'une validation humaine : installations de paquets, modifications de la configuration de l'agent et appels réseau vers de nouveaux hôtes. Notre article sur les barrières de validation pour les agents de développement précise où placer ces points d'arrêt, et l'article sur les permissions des agents de développement présente le modèle d'autorisations sous-jacent.

5. Surveiller la configuration de l'agent et révoquer les identifiants en cas d'alerte

Forever indique très précisément où regarder. Dans ~/.codex/config.toml, un bloc [mcp_servers.*] suspect ou une directive chatgpt_base_url modifiée. Dans le fichier .claude/settings.json d'un projet, une variable ANTHROPIC_BASE_URL, un proxy ou un endpoint que vous n'avez pas configuré.

grep -nE '^\[mcp_servers\.|chatgpt_base_url' ~/.codex/config.toml
grep -rnE 'ANTHROPIC_BASE_URL|_PROXY|base_url' ~/.claude/settings.json .claude/settings*.json 2>/dev/null
npm ls -g --depth=0 2>/dev/null | grep -i function-color

Si un élément suspect apparaît, partez du principe que le jeton a fuité et procédez à sa révocation. Un jeton OAuth dérobé correspond à une session active, pas à une simple requête interceptée. Si function-color est présent, considérez cet ordinateur comme compromis. Pour un nettoyage complet, notre checklist pour les fuites de secrets par les agents de développement désigne un responsable pour chaque étape de rotation des clés.

Comment Sharkly s'intègre dans cette démarche

Sharkly n'analyse pas les fichiers d'instructions et ne remplace pas les autorisations natives de l'agent ; conservez bien les cinq étapes. La solution modifie en revanche le répertoire de démarrage de vos agents ainsi que les personnes habilitées à en décider.

Dans Sharkly, un Agent s'exécute sur une machine (Computer) que vous avez connectée, et chaque Agent possède un Default working directory défini dans ses paramètres. En choisissant « Use temporary directory », chaque exécution de Task bénéficie d'un répertoire dédié et d'un worktree git tout neuf du dépôt associé. Avec « Specified directory », les exécutions utilisent les chemins locaux configurés que vous avez définis. La documentation sur le répertoire de travail détaille ces deux modes.

Sharkly Agent settings: the Default working directory field, where you choose a temporary directory with a fresh git worktree per run or a specified directory

Le choix du dossier ne relève donc plus du terminal d'un développeur, mais d'un paramètre vérifié et validé. En mode temporaire, un Agent démarre dans un checkout propre de son dépôt associé, et non dans n'importe quel dossier resté ouvert sur la machine. La gestion des dépôts est restreinte aux personnes disposant des droits d'administration de l'espace ou de l'organisation. Les instructions d'agent, injectées à chaque exécution, constituent un endroit idéal pour réitérer des consignes strictes telles que « ne jamais modifier les fichiers de configuration de l'agent ».

Les résultats sont ensuite rattachés à la tâche (Task), où l'équipe peut les examiner, conformément à ce qui est décrit dans notre guide sur la revue de code généré par IA à l'aide de preuves tangibles au niveau de la tâche.

Conclusion

Un fichier AGENTS.md malveillant fonctionne parce que les agents obéissent par conception aux fichiers d'instructions, et que le Web peut en déposer un dans un dossier auquel vous faites confiance. C'est une vulnérabilité que l'on colmate par couches successives, et non avec un correctif.

Commencez dès aujourd'hui par l'étape 5 sur chaque poste de développeur, car elle vous permettra de savoir si vous avez déjà un problème. Ensuite, si votre équipe utilise plusieurs agents de développement, configurez Sharkly avec un Computer et un Agent en mode temporaire, de manière à ce que chaque exécution démarre depuis un worktree sain.

FAQ

Un fichier AGENTS.md malveillant peut-il détourner Claude Code ?

Oui. Claude Code lit AGENTS.md lorsqu'aucun fichier CLAUDE.md n'est présent dans le répertoire de travail ou ses parents. La démonstration réalisée par Forever sur Claude Code utilisait un fichier CLAUDE.md piégé qui réacheminait le trafic API et a permis de dérober le jeton OAuth dans environ la moitié de ses tests.

S'agit-il d'une faille qu'OpenAI ou Anthropic vont corriger ?

Forever estime qu'il n'y a rien à corriger, car les agents se comportent exactement comme prévu. Cette menace doit être gérée par une bonne hygiène des dossiers, des revues systématiques et une gestion rigoureuse des autorisations.

Comment repérer des instructions cachées dans un fichier AGENTS.md ?

Consultez le fichier brut, et non sa version rendue, et scrutez la présence de caractères de largeur nulle, de basculements de direction (bidi override) et de balises Unicode. Le script de CI présenté plus haut échoue en présence de ces trois anomalies.

Un bac à sable neutralise-t-il un fichier AGENTS.md malveillant ?

Il limite les dégâts, mais n'empêche pas le chargement du fichier. Un bac à sable et des demandes de validation peuvent stopper l'installation ou l'écriture dans la configuration réclamée par le fichier. Associez-les à des règles d'interdiction ciblant les dossiers de configuration de l'agent.

Que faire si je découvre un fichier AGENTS.md piégé ?

Ne lancez aucun agent dans ce répertoire ou à proximité. Vérifiez les fichiers de configuration de l'agent pour repérer d'éventuels nouveaux serveurs MCP ou de nouvelles URL de base, contrôlez la présence de function-color, puis renouvelez les jetons de l'agent ainsi que toutes les clés auxquelles il pouvait avoir accès en lecture.

À explorer aussi

Gemini 4 Carbon et Hydrogen : associer un agent planificateur à des workers rapides

Gemini 4 Carbon et Hydrogen : associer un agent planificateur à des workers rapides

Associez Gemini 4 Carbon et Hydrogen au sein de votre équipe d'agents : un planificateur Carbon définit les sous-tâches, des workers Hydrogen et un vérificateur développent et testent, et les tâches bloquées sont renvoyées au planificateur.

13 novembre 2026

Gemini 4 Hydrogen pour les agents de code : le modèle rapide que les agents de votre équipe peuvent faire tourner toute la journée

Gemini 4 Hydrogen pour les agents de code : le modèle rapide que les agents de votre équipe peuvent faire tourner toute la journée

Gemini 4 Hydrogen pour les agents de développement : 1,50 $ / 7,50 $ par million de tokens, une offre gratuite, quatre niveaux de réflexion. Quelles tâches lui confier, quand passer à Carbon.

13 novembre 2026

Comment router les tâches des agents IA avec l'API Gemini Decisions

Comment router les tâches des agents IA avec l'API Gemini Decisions

Aiguillez les tâches de vos agents IA grâce à l'API Gemini Decisions : un seul appel suffit pour déterminer quel agent mobiliser, évaluer la complexité et vérifier si une intervention humaine est requise, puis un seuil de confiance tranche entre attribution automatique et validation humaine.

12 novembre 2026