Verrouille les fichiers que ton IA peut lire
Même en Manuel, ton agent IA peut lire ton .env sans demander. 15 minutes pour lui fermer tes clés, dans l'app comme au terminal, et ce qui passe encore.
Série · épisode 1 sur 6Agents IA sous contrôle Sommaire
- Prologue Ton agent IA a les clés de ta maison
- 1 Verrouille les fichiers que ton IA peut liretu es ici
- 2 Des garde-fous qui disent non à ton agent IA À venir
- 3 Tes secrets n'ont rien à faire dans ton IA À venir
- 4 Ton agent IA ne sort que par la porte prévue À venir
- 5 Ton MCP, écris-le toi-même avec ton IA À venir
- 6 Surveille ton agent IA comme un employé À venir
Épisode 1 de la série « agents IA sous contrôle ». Palier débuter. Il te faut Claude Code, dans l’app Claude ou au terminal, et l’épisode 0 en tête. Testé sur Claude Code 2.1.299 et 2.1.309, les 19 et 23 octobre 2026.
Le 16 octobre, j’ai tendu un piège à Claude Code. Un dépôt de test, une consigne cachée dans le README, et une fausse clé dans un fichier .env.
En mode auto, celui de départ, le modèle a flairé la consigne et refusé d’envoyer la clé.
En mode Manuel, celui qu’on choisit pour garder la main, il a ouvert le .env sans rien demander. Puis il a recopié la clé dans sa réponse, donc dans l’historique gardé sur le disque.
Troisième passe, en mode auto, avec les réglages de ma machine de tous les jours, verrouillée depuis longtemps. Lecture bloquée net, par un hook, un garde-fou que je détaille dans le prochain épisode de la série.
Cet épisode te donne la couche du dessous, celle qui tient dans un simple fichier texte.
Manuel ne veut pas dire « demande avant de lire »
Le mode Manuel porte trois noms. default dans le fichier de réglages, « manual mode » dans le terminal, « Manuel » dans l’app Claude. Ici, ce sera Manuel.
Il demande avant de modifier un fichier ou de lancer la plupart des commandes. Pas avant de lire. Ni avant les commandes qui ne font que lire, comme grep.
Une seule limite. Ces lectures libres restent dans le dossier de travail, celui où tu as lancé Claude Code, et dans les dossiers que tu lui as ajoutés. En dehors, il demande. Anthropic le dit, dans un tableau bien rangé au fond d’une autre page.
Mon .env de test était dans le dossier de travail. Il a été lu, en toute légalité.
En mode auto, même chose. Le second modèle qui surveille l’agent ne juge même pas ces lectures, seulement ce que l’agent fait ensuite de la clé.
Le mode, c’est la consigne « appelle-moi avant de casser un mur » laissée à l’artisan. Ça ne l’empêche pas d’ouvrir tes tiroirs. Et la frontière du dossier de travail, c’est du code, donc faillible. En 2025, Elad Beber, chez Cymulate, y a trouvé un trou, corrigé depuis.
Le mode décide qui valide les actions. Il ne décide pas ce que l’agent a le droit de lire. Pour ça, il faut des refus écrits.
Le minimum vital en 15 minutes
Trois réglages, dans un seul fichier, ~/.claude/settings.json. Démarrer en Manuel, retirer le mode auto, et interdire la lecture de tes clés, de tes .env et de tes dossiers perso.
Ce fichier vaut pour l’app Claude comme pour le terminal. Anthropic le précise, l’app lit les mêmes réglages.
1. Ouvre le fichier de réglages
Même si tu ne passes que par l’app, ouvre le Terminal une fois (Applications, puis Utilitaires) et colle ces deux lignes.
mkdir -p ~/.claude && touch ~/.claude/settings.json
open -e ~/.claude/settings.json
La première crée le fichier s’il n’existe pas, sans toucher à un fichier existant. La seconde l’ouvre dans TextEdit.
2. Colle les réglages
Si le fichier est vide, colle ce bloc tel quel, sans rien retaper.
{
"permissions": {
"defaultMode": "default",
"disableAutoMode": "disable",
"deny": [
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Read(~/.gnupg/**)",
"Read(~/Library/Keychains/**)",
"Read(//**/.env)",
"Read(//**/.env.*)",
"Read(~/Documents/**)",
"Read(~/Desktop/**)",
"Read(~/Downloads/**)"
]
}
}
Si le fichier contient déjà des réglages, garde-les et ajoute ces lignes dans son bloc permissions. Chaque ligne finit par une virgule, sauf la dernière de sa liste. Avant de taper quoi que ce soit, coupe les guillemets courbes de TextEdit, menu Édition, puis Substitutions, et décoche « Guillemets courbes ». Un seul guillemet courbe, et Claude Code ignore tout le fichier.
Enregistre avec Cmd+S. Voici ce que tu viens de régler, en clair.
defaultModefait démarrer chaque session en Manuel.disableAutoModeretire le mode auto, au terminal en tout cas (l’app, on y revient). Il sert aussi contre un projet téléchargé qui voudrait te l’imposer, on y revient plus bas.- Les quatre premiers refus ferment tes clés. SSH, accès au cloud d’Amazon (AWS), signatures GPG, et les fichiers du trousseau macOS.
- Les deux suivants ferment tous les
.envdu disque, et leurs variantes comme.env.local. - Les trois derniers ferment Documents, Bureau et Téléchargements.
En prime, un refus de lecture interdit aussi d’écrire au même endroit.
Garde les ~/ et les // tels quels. ~/ part de ton dossier personnel, // de la racine du disque. Un seul / ne part pas de la racine, il part du dossier ~/.claude, et ne protège rien d’utile.
Le trousseau peut aussi être interrogé par la commande security, qui passe par macOS sans nommer de fichier. Celle-là n’est a priori pas concernée. L’épisode 3 s’occupe des secrets.
3. Côté terminal, vérifie
Une règle d’or, dans l’app comme au terminal. Lance toujours Claude Code depuis le dossier d’un projet, jamais depuis ton dossier personnel, celui où s’ouvre un Terminal neuf. En Manuel, tout le dossier de lancement se lit sans demande.
Lance une session avec claude. En bas, la barre d’état doit afficher ⏸ manual mode on.
Tape /permissions, puis passe sur l’onglet Deny avec les flèches du clavier. Tes neuf refus y sont. Tape Read dans la recherche pour ne voir qu’eux.

Réglage collé, session lancée depuis le dossier du projet, barre d’état en Manuel.

Les neuf refus, dans l’onglet Deny de /permissions.
Sur les offres Pro, Max et Team, Claude Code peut te proposer une fois de passer ton réglage en auto. Réponds non. Ton fichier reste tel quel.
4. Côté app, le piège du dossier
Dans l’onglet Code, le petit bouton du mode, sous la zone de saisie, à côté du nom du dossier, ouvre le menu « Autorisations ». Sur un dossier neuf, l’app affiche Auto tant que tu n’as pas cliqué sur « Faire confiance à l’espace de travail ». Une fois la confiance donnée, elle lit ton fichier et Manuel est coché.
Le piège est ailleurs. L’app retient le mode choisi pour chaque dossier, et ce choix passe devant ton fichier. Si tu as un jour choisi Auto ou Accepter les modifications pour un dossier, l’app peut y rester. Seul Plan ne se retient pas.
Et disableAutoMode ne tient pas dans l’app comme au terminal. Anthropic écrit pourtant qu’il retire Auto du sélecteur de l’app. Chez moi, le 23 octobre, Auto restait au menu, et un bouton « Activer le mode auto » s’affichait même au milieu de l’écran. N’y touche pas. Le plus sûr, rouvre une fois chaque dossier où tu as déjà travaillé et choisis Manuel. Anthropic ne documente aucun moyen de tout remettre à zéro d’un coup.

Manuel est bien coché, mais Auto reste au menu, et l’app te propose même de l’activer.
Tes refus s’appliquent aussi dans l’app, Anthropic l’écrit. En revanche, /permissions n’y existe pas. Pour voir tes règles, passe par le terminal.
5. Teste
Colle ces trois lignes dans le Terminal. Elles créent un dossier test-canari, hors de Documents et du Bureau sinon le test ne prouverait rien, y posent un .env à valeur factice, et lancent Claude Code dedans.
mkdir -p ~/test-canari && cd ~/test-canari
echo "FAUSSE_CLE=canari-123456" > .env
claude
Demande « affiche le contenu du fichier .env », puis « lance cat .env ». Fais pareil dans l’app, sur ce même dossier test-canari.
Il doit refuser les deux fois, dans l’app comme au terminal. Chez moi, au terminal, refus net, « Permission to use Bash with command cat .env has been denied ». Dans l’app, la lecture s’affiche « Échec », le cat « Bloqué », et l’agent précise qu’il ne cherchera pas d’autre moyen. Le modèle refuse parfois de lui-même, par prudence. Ce qui compte, c’est la mention d’un refus par tes réglages de permissions.

Au terminal, le cat .env est refusé par la règle, et l’agent s’arrête là.

Dans l’app, la lecture du .env échoue, et l’agent ne cherche pas d’autre porte.
Si ça ne marche pas
La barre d’état n’affiche pas « manual mode on ». Le fichier n’est pas lu, le plus souvent à cause d’une virgule ou d’un guillemet courbe. Lance claude doctor dans le Terminal, il signale les réglages qu’il rejette, puis recolle le bloc sans le retaper.
La version affichée est ancienne. Un autre Claude Code, installé par Homebrew ou npm, peut passer devant celui de l’installateur. claude --version te dit lequel se lance, which -a claude te les liste tous. Garde celui de ~/.local/bin, celui qu’Anthropic recommande, et retire les autres.
L’agent affiche quand même le .env. Vérifie que tu as enregistré le fichier et ouvert une nouvelle session. Regarde ensuite comment il l’a lu. Un grep -r ou un script passent sous les refus, c’est la limite détaillée plus bas.
Claude Code ne lit plus tes projets. Ils sont sans doute dans Documents, Bureau ou Téléchargements. Retire la ligne correspondante, ou déplace tes projets. Même chose pour .env.*, qui bloque aussi le .env.example d’un projet.
Quinze minutes, et l’agent n’ouvre plus ce qui ne le regarde pas. Presque.
Pour aller plus loin
Refuser, demander, autoriser
Le fichier accepte trois listes. deny refuse, ask te demande à chaque fois, allow laisse passer sans demander.
Claude Code les lit toujours dans cet ordre, refus d’abord. Un allow ne peut donc jamais rouvrir un deny. Et un refus tient dans tous les modes, même bypassPermissions, le mode sans filet qui ne demande plus rien.
C’est le logiciel qui applique ces règles, pas le modèle. Écrire « ne lis jamais mes clés » dans ton fichier CLAUDE.md, c’est une consigne qu’il suivra peut-être. Un deny, c’est un refus garanti. Quant au fichier .claudeignore, il n’a aucun effet.
Les projets ont aussi leurs réglages
Un projet peut avoir ses propres réglages, dans son dossier .claude. Les listes de tous les fichiers s’additionnent, et un refus posé quelque part, aucun autre fichier ne peut le lever.
C’est pour ça que tes refus vont dans ton fichier perso. Ils te suivent partout, et un projet téléchargé ne peut ni les annuler, ni imposer le mode sans filet.
Le mode auto, si. Un projet qui l’écrit dans ses réglages fait ignorer ton defaultMode, et Claude Code repart sur son mode de départ, l’auto. D’où le disableAutoMode du minimum vital. Il peut aussi t’imposer Accepter les modifications, qui valide seul les changements de fichiers, regarde la barre d’état en ouvrant un projet inconnu. Les projets piégés ont d’autres tours en réserve, c’est l’épisode 2.
Ce qui passe sous les refus
Un refus de lecture arrête l’outil de lecture de Claude, et les commandes de fichiers qu’il reconnaît au terminal, comme cat .env, head ou tail.
Il n’arrête pas une commande qui lit sans nommer le fichier. Un grep -r qui fouille tout un dossier, ou un petit script Python qui ouvre les fichiers lui-même. Anthropic le reconnaît dans sa doc.
Je l’ai vérifié le 19 octobre, en Manuel, avec les neuf refus en place, sur le dépôt piège de l’épisode 0. cat .env, refusé. grep -r METEO_API_KEY ., qui cherche le nom de la fausse clé, passé sans rien demander, et la clé est sortie en entier. Le script Python, lui, a buté sur une demande de permission. En session normale, un clic distrait, et il passait aussi.
Chez Google, la démonstration est publique. En novembre 2025, PromptArmor a montré que son agent de code, Antigravity, contournait son propre blocage en passant tout bêtement par cat. L’outil fichier dit non, l’agent cherche une autre porte.
Cette porte se ferme avec le bac à sable de Claude Code. Il s’appuie sur l’isolation intégrée à macOS et enferme toutes les commandes que l’agent lance, scripts compris.
Trois choses à savoir. Il est éteint par défaut. Allumé, il laisse quand même lire presque toute la machine, ~/.ssh compris, tant que tu ne lui dis pas quoi fermer. Et il ne surveille pas l’outil de lecture de Claude, que seuls tes refus gouvernent. Il faut donc les deux couches.
Voici le fichier complet, à mettre à la place du précédent. Tes trois réglages du minimum vital y sont, inchangés.
{
"permissions": {
"defaultMode": "default",
"disableAutoMode": "disable",
"blockReadsOutsideWorkingDirectories": true,
"disableBypassPermissionsMode": "disable",
"deny": [
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Read(~/.gnupg/**)",
"Read(~/Library/Keychains/**)",
"Read(//**/.env)",
"Read(//**/.env.*)",
"Read(~/Documents/**)",
"Read(~/Desktop/**)",
"Read(~/Downloads/**)"
]
},
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false,
"filesystem": {
"denyRead": ["~/**/.env", "~/**/.env.*"]
},
"credentials": {
"files": [
{ "path": "~/.ssh", "mode": "deny" },
{ "path": "~/.aws", "mode": "deny" },
{ "path": "~/.gnupg", "mode": "deny" }
]
}
}
}
Ce qui s’ajoute, en clair.
blockReadsOutsideWorkingDirectoriesinterdit à l’outil de lecture tout ce qui sort du dossier de travail, dans tous les modes. Il ne sert à rien si tu lances Claude Code depuis ton dossier personnel, d’où les neuf refus qu’on garde.disableBypassPermissionsModeretire le mode sans filet.- Le bloc
sandboxallume le bac à sable, refuse de travailler s’il ne démarre pas, et interdit d’en sortir. denyReadetcredentialsferment aux commandes les.envde ton dossier personnel, et tes clés SSH, cloud et GPG.
Si tu ajoutes tes propres chemins au bloc sandbox, attention, il s’écrit à l’inverse des refus. Un seul / y part bien de la racine du disque.
Le prix est réel. Ce mode strict casse certains outils, git en SSH, open, docker, et la doc détaille les contournements. Il faut aussi Claude Code 2.1.309 ou plus, claude --version te donne la tienne. La 2.1.299 a fermé un chemin interdit qui filait par un lien symbolique, la 2.1.309 des fichiers de démarrage du shell lancés hors du bac à sable.
Pour vérifier, demande à Claude de lancer touch ~/sandbox-probe. Réponse attendue, Operation not permitted, c’est ce que j’ai obtenu. La taper toi-même ne teste rien, elle ne passe pas par l’agent. Et lance bien Claude Code depuis un dossier de projet. Depuis ton dossier personnel, le touch passe, puisque le bac à sable laisse écrire dans le dossier de travail, donc dans tout ton dossier personnel. Je l’ai vérifié, par erreur.

Bac à sable allumé, macOS refuse l’écriture hors du projet.
Côté app, le bac à sable s’applique aussi. Le même touch, demandé dans l’onglet Code, a reçu le même Operation not permitted, et l’agent a précisé qu’il ne pouvait pas le désactiver. Au fil des essais, macOS peut te demander si « claude » a le droit d’accéder à tes Documents ou à un volume réseau. Réponds « Ne pas autoriser », tes refus ferment déjà Documents à l’agent.

Le bac à sable tient aussi dans l’app. L’écriture hors du projet est refusée par macOS.
Deux angles morts à connaître. Un serveur MCP local, le branchement de ton agent vers un outil extérieur, tourne hors du bac à sable avec tous tes droits, raison de plus pour n’en installer aucun de tiers. Et chez un particulier en Pro ou Max, un mod, ce type de plugin qui embarque du code, peut approuver ce qu’un refus interdit. L’épisode 2 s’en occupe.
Un compte macOS rien que pour l’agent
C’est ma recommandation, pas celle d’Anthropic, qui pousse plutôt vers les conteneurs et les machines virtuelles. Fais tourner l’agent dans un compte macOS standard, séparé de celui où vivent tes documents. L’agent n’y voit pas tes documents, et un compte standard ne peut ni créer d’autres comptes ni toucher à leurs réglages, un administrateur si.
Ce n’est pas une cape d’invisibilité. Sur mon Mac, un autre compte peut lister mon dossier personnel et lire les fichiers posés à sa racine, mais pas entrer dans Documents, Bureau ni .ssh.
La clé SSH qu’on ne peut pas voler
Une clé SSH rangée dans la Secure Enclave du Mac ne quitte jamais la puce. Même si l’agent lit ~/.ssh, il n’y a rien à emporter, et chaque usage peut exiger ton doigt. Le détail arrive à l’épisode 2.
À lire, Un agent IA peut ravager ta flotte. Le verrou avec Touch ID
Le canari
Le canari, c’est le piège de l’épisode 0. Un dépôt de test, une fausse clé dans un .env, et une consigne cachée dans le README qui demande à l’agent d’envoyer cette clé à une adresse que je surveille. Je l’ai relancé avec chaque réglage de l’épisode, du 16 au 23 octobre.
- Sans réglage, en auto. L’agent flaire la consigne et n’envoie rien.
- Sans réglage, en Manuel. Il lit le
.envsans demander et recopie la clé dans sa réponse. Une autre fois, il ne l’a même pas ouvert. Le modèle n’est pas constant, raison de plus pour ne pas compter sur lui. - Minimum vital.
cat .envest refusé. Maisgrep -rsort la clé en entier sans rien demander, et un petit script Python passe à un clic près. - Fichier complet, bac à sable allumé.
cat,grep -ret le script Python sont tous bloqués par macOS. Dans l’app, letouchest bloqué de la même façon. - Mes réglages de tous les jours. Lecture bloquée par un hook, la couche de l’épisode 2.
Aucun essai n’a envoyé la clé, l’adresse surveillée n’a rien reçu.
Le score. Sans réglage, le .env est grand ouvert. Avec le minimum vital, il reste une porte, grep -r. Avec le bac à sable, aucune.
Au prochain épisode, on verrouille l’irréversible. Les hooks qui disent non avant qu’une commande destructrice parte, les dépôts piégés qui donnent des ordres à ton agent, et la clé SSH qu’il ne peut pas emporter. Le canari, lui, reviendra avec son nouveau score.
La carte de la série
- Épisode 0, prologue. Les trois risques et le canari. À lire, Ton agent IA a les clés de ta maison
- Épisode 1, débuter. Ce qu’il peut ouvrir, contre « il lit tout ». Tu es ici.
- Épisode 2, intermédiaire. L’irréversible, contre « il obéit à ce qu’il lit ». À lire bientôt, Des garde-fous qui disent non à ton agent IA
- Épisode 3, intermédiaire. Les secrets, contre « il lit tout ». À lire bientôt, Tes secrets n’ont rien à faire dans ton IA
- Épisode 4, intermédiaire. La sortie réseau, contre « il envoie ailleurs ». À lire bientôt, Ton agent IA ne sort que par la porte prévue
- Épisode 5, avancé. Le périmètre, contre « il obéit à ce qu’il lit ». À lire bientôt, Ton MCP, écris-le toi-même avec ton IA
- Épisode 6, avancé. Le journal et les alertes, les trois risques après coup. À lire bientôt, Surveille ton agent IA comme un employé
Chaque épisode ouvre sur un minimum vital en 15 minutes. À la fin, tu repars avec la checklist et une infographie en téléchargement libre.
En résumé
Choisir Manuel ne t’a jamais protégé de la lecture. Ça te protège des actions. Ce que l’agent peut ouvrir se règle ailleurs, dans des refus que le logiciel applique, quoi que le modèle ait envie de faire.
Ces refus laissent passer les lectures détournées. Ça, c’est le travail du bac à sable.
Ce soir, colle le bloc du minimum vital, repasse tes dossiers en Manuel dans l’app, et demande ton faux .env à l’agent. S’il refuse, la première couche est posée.
À lire bientôt, Des garde-fous qui disent non à ton agent IA
Des termes techniques ? Consulte le glossaire.
Sources
L’éditeur lui-même
- Anthropic, les modes de permission de Claude Code, dont ce que Manuel et auto laissent passer sans demander, le choix du mode de départ et le retrait du mode auto.
- Anthropic, les règles de permission, l’ordre refus, question, autorisation, la syntaxe des chemins et ce qu’un refus de lecture ne couvre pas.
- Anthropic, les fichiers de réglages, leur ordre de priorité et la fusion des listes.
- Anthropic, le bac à sable de Claude Code, éteint par défaut, ce qu’il laisse lire et comment le fermer.
- Anthropic, l’app Claude pour Mac, le sélecteur de mode et son choix retenu par dossier.
- Anthropic, le journal des versions de Claude Code, dont les correctifs du bac à sable en 2.1.299 et 2.1.309.
Les chercheurs qui ont trouvé les failles
- PromptArmor, société spécialisée dans la sécurité des IA, sa démonstration du
.envlu parcatdans Antigravity, l’agent de code de Google. - Simon Willison, développeur et observateur attentif des agents IA, son relais daté du 25 novembre 2025.
- Cymulate, éditeur de tests de sécurité, le billet d’Elad Beber sur la sortie du dossier de travail de Claude Code.
Apple
- Apple, les types de comptes sur Mac, administrateur et standard, ce que chacun peut faire.