Aller au contenu principal

Prévenir les fuites avec les AI Hooks

Les AI Hooks intègrent ggshield aux outils de codage IA que vos développeurs utilisent déjà. Lorsqu'un prompt ou un appel d'outil contient un secret, ggshield bloque l'action avant qu'elle n'atteigne le modèle et indique au développeur ou à l'agent ce qu'il faut supprimer. Lorsqu'un secret n'apparaît que dans la sortie d'un outil, ce qu'une commande shell ou une réponse MCP peut produire de façon imprévisible, l'action a déjà été exécutée. Certains assistants permettent à ggshield de retenir cette sortie afin que le modèle ne la voie jamais ; sur les autres, ggshield déclenche une notification bureau pour que le développeur sache qu'il doit procéder à une rotation. Consultez ce que chaque assistant prend en charge.

Pourquoi les AI Hooks sont importants sur les endpoints des développeurs​

Le scan des endpoints inventorie les identifiants déjà présents sur une machine. Les AI Hooks empêchent les nouveaux d'en sortir.

Les développeurs qui utilisent des outils de codage IA divulguent des secrets à un taux environ deux fois supérieur au taux de référence. Un agent chargé de déboguer un déploiement défaillant lit le fichier .env ou ~/.aws/credentials et transmet le contenu à un fournisseur de modèle. Il n'y a ni commit, ni push, ni pull request, donc aucun des points de contrôle qui protègent vos dépôts et votre CI ne se déclenche jamais.

Les hooks agissent au moment de l'interaction, ce qui vous apporte plusieurs choses :

  • La prévention plutôt que le nettoyage. Un secret intercepté dans un prompt ou un appel d'outil n'atteint jamais un tiers, il n'y a donc aucune rotation à planifier ni aucun fournisseur de modèle à interroger sur la conservation. Il en va de même pour la sortie d'un outil sur les assistants qui permettent à ggshield de la retenir.
  • Une correction sur laquelle le développeur peut agir. Chaque blocage indique le secret détecté et ce qu'il faut supprimer, afin que le développeur ou l'agent puisse corriger le contenu et réessayer immédiatement.
  • Aucun agent supplémentaire à déployer. Les hooks réutilisent le binaire ggshield que vous installez déjà pour le scan. Ils ne s'exécutent que lorsque l'outil IA les appelle, il n'y a donc aucun processus résident sur la machine.

Ce que les hooks scannent​

ggshield s'enregistre sur trois étapes d'une interaction IA :

  • Soumission du prompt : le prompt est scanné avant d'atteindre le modèle, et bloqué s'il contient un secret.
  • Avant l'utilisation d'un outil : les lectures de fichiers, les commandes shell et les appels MCP sont scannés avant que l'agent ne les exécute, et bloqués s'ils contiennent un secret.
  • Après l'utilisation d'un outil : l'outil a déjà été exécuté, donc ce que ggshield peut faire dépend de l'assistant. Là où l'assistant le permet, la sortie est retenue et le modèle ne voit jamais le secret. Partout ailleurs, le développeur reçoit une notification bureau et le secret doit être considéré comme exposé.

La détection utilise le même moteur que tous les autres scans ggshield, couvrant plus de 600 types de secrets.

Ce que chaque assistant prend en charge​

Les deux premières étapes se comportent presque partout de la même manière : un secret dans un prompt, dans une commande ou dans un fichier sur le point d'être lu est bloqué avant d'atteindre le modèle. C'est à la troisième étape que les assistants diffèrent, car le remplacement de la sortie d'un outil est une fonctionnalité que l'assistant doit proposer, ce que la plupart ne font pas.

Assistantggshield minimumSecret dans un promptSecret dans une commande ou une lecture de fichierSecret dans la sortie d'un outil
Claude Code1.49.0BloquéBloquéRetenue pour les commandes shell et les lectures de fichiers, notification uniquement pour MCP et les autres outils
Cursor1.49.0, 1.55.0 sur WindowsBloquéBloquéNotification uniquement
VS Code1.51.0BloquéBloquéNotification uniquement
Copilot CLI1.52.0BloquéBloquéNotification uniquement
Codex1.53.0BloquéBloquéRetenue pour tous les outils
Mistral Vibe1.54.0, avec Vibe 2.21 ou ultérieurBloquéBloquéRetenue pour tous les outils
Junie CLI1.55.0BloquéBloquéNon disponible : Junie n'exécute aucun hook post-outil
Kiro CLI1.55.0BloquéBloquéNotification uniquement
Kiro IDE1.55.0Détecté, non bloquéBloquéNotification uniquement

Là où la sortie est retenue, l'assistant lit le message ggshield à la place de la sortie de l'outil, de sorte que le secret n'atteint jamais le fournisseur de modèle et qu'il n'est pas nécessaire de procéder à sa rotation. Le message suggère plutôt comment garder le secret hors de la prochaine sortie, par exemple en le déplaçant vers un gestionnaire de secrets ou en ne partageant pas le fichier avec l'agent. La commande elle-même a tout de même été exécutée, donc tout effet qu'elle a eu sur vos systèmes, comme un appel d'API ou une entrée dans un journal d'accès, s'est tout de même produit. La rétention nécessite ggshield 1.55.0 ou ultérieur.

Ce qui reste sur le disque dépend de l'assistant. Claude Code écrit le message ggshield dans sa transcription de session à la place de la sortie. Codex et Mistral Vibe écrivent tout de même la sortie brute dans leurs propres fichiers de session, les fichiers de rollout sous ~/.codex/sessions/ et le journal de session Vibe, où aucun hook ne peut l'atteindre. Cette copie est locale, donc à elle seule elle ne justifie pas une rotation, mais supprimez le fichier de session si vous ne voulez pas que le secret y soit conservé en clair.

Là où seule une notification est possible, la sortie a déjà été fournie à l'assistant. Considérez le secret comme exposé et procédez à sa rotation.

Trois assistants nécessitent une remarque :

  • Junie n'est pris en charge qu'en tant que Junie CLI. Junie au sein d'un IDE JetBrains fonctionne via ACP, qui n'invoque aucun hook, donc rien n'y est scanné.
  • Kiro CLI ne lit la configuration du hook qu'en mode v3. Démarrez-le avec kiro-cli --v3 ; les autres sessions prennent leurs hooks depuis la configuration de l'agent à la place et le hook installé ne s'applique pas.
  • Kiro IDE ne peut pas bloquer un prompt. ggshield détecte le secret, mais le prompt atteint tout de même le modèle. Considérez le secret comme exposé et procédez à sa rotation.

Pour la configuration outil par outil, l'apparence du message de blocage pour un développeur et la manière de gérer les faux positifs, consultez Scan de secrets pour les outils de codage IA.

Ce qu'un hook envoie​

La détection se produit du côté de GitGuardian, donc le contenu de l'interaction est scanné par l'API, de la même manière que ggshield scanne un commit ou un push. Les hooks signalent également chaque appel d'outil MCP, avec le nom de l'outil et du serveur ainsi que les arguments transmis par l'agent. C'est ce qui alimente votre vue d'activité MCP et ce qui reporte la décision d'autorisation ou de refus à l'outil.

Les scans de machine fonctionnent dans l'autre sens et conservent la détection sur l'endpoint. Pour le détail complet des deux, consultez Traitement des données et confidentialité.

Déployer les AI Hooks sur l'ensemble de votre parc​

Les hooks ne protègent une machine qu'une fois qu'ils y sont configurés, et demander à chaque développeur d'y adhérer laisse des lacunes précisément là où vous avez besoin de couverture. Déployez-les plutôt via votre MDM, aux côtés du reste d'Endpoint Protection.

Le scan nécessite un token chaque fois qu'un hook se déclenche, et comme les hooks s'exécutent dans la session du développeur lui-même plutôt que dans votre tâche MDM, ce token doit être celui du développeur. Injectez un token de compte de service admin à l'exécution pour installer les hooks, puis connectez le développeur afin que le hook scanne sous son appartenance : consultez l'étape 4 et l'étape 5.

Pour configurer une seule machine, exécutez une commande en tant qu'utilisateur connecté :

ggshield machine setup

machine setup configure le hook pour chaque assistant de codage IA qu'il détecte, et ignore ceux qui ne sont pas installés. Il installe également les hooks git pre-commit et pre-push et plante un honeytoken, alors ajoutez --no-git-hooks ou --no-honeytokens si vous voulez uniquement les AI Hooks. Pour sélectionner ou exclure des assistants spécifiques, utilisez --agent ou --exclude-agent avec l'un des claude-code, codex, copilot, cursor, junie, kiro, vibe et vscode.

machine setup nécessite ggshield 1.53.0 ou ultérieur. La version minimale du hook de chaque assistant est indiquée dans Ce que chaque assistant prend en charge. Sur les versions antérieures, installez un assistant à la fois avec ggshield install -t <assistant> -m global, ce qui fonctionne toujours mais est déprécié.

Vérifier que les hooks sont actifs​

Sur une machine échantillon, en tant qu'utilisateur connecté, exécutez :

ggshield machine doctor

machine doctor est en lecture seule et indique, pour chaque assistant qu'il trouve sur la machine, si le hook est installé. Il vérifie également que le token atteint GitGuardian et porte les scopes dont vos protections ont besoin, et il se termine avec un code non nul si une vérification échoue, afin que vous puissiez l'exécuter comme script d'audit MDM. Chaque vérification échouée affiche sa propre correction.

Les deux volets de cette vérification sont importants. Comme les hooks échouent en mode ouvert (fail open), une machine avec des hooks installés mais sans identifiants fonctionnels apparaît au développeur comme une machine sans rien à bloquer, hormis l'avertissement indiquant que le contenu n'a pas été scanné.

Pour confirmer de bout en bout, collez un identifiant de test dans un prompt et vérifiez que l'outil affiche le message de blocage ggshield.

Revenir en arrière​

Désactiver la tâche de configuration MDM empêche les nouvelles machines de recevoir des hooks, mais laisse en place les configurations déjà présentes sur le disque. Pour les supprimer, effacez les entrées ggshield de la configuration des hooks de l'outil :

OutilConfiguration des hooks
Claude Code~/.claude/settings.json
Cursor~/.cursor/hooks.json
Codex~/.codex/hooks.json
Copilot CLI et VS Code~/.copilot/hooks/hooks.json
Mistral Vibe~/.vibe/hooks.toml
Kiro~/.kiro/hooks/ggshield.json
Junie~/.junie/config.json