système : OPÉRATIONNEL
← retour à tous les hacks
SUPPLY CHAIN CRITICAL NEW

Plugin4Shell : un contournement du SHA-pinning transforme la mise à jour auto en RCE

AIR Security (17 sept. 2026) a trouvé une faille zero-click qui permet à une mise à jour de plugin de substituer silencieusement du code malveillant dans Claude Code, Codex, Copilot et Gemini CLI.

2026-09-25 // 6 min affects: claude-code, codex, github-copilot, gemini-cli

De quoi s’agit-il ?

Les 17-18 septembre 2026, les chercheurs Or Nevo, Dor Granat et Niv Hoffman, chez AIR Security, ont publié Plugin4Shell, une faille d’exécution de code à distance zero-click dans la logique d’installation de plugins de quatre agents de codage IA très répandus : Claude Code (Anthropic), Codex (OpenAI), GitHub Copilot (Microsoft) et Gemini CLI (Google). La découverte remonte à mai 2026, la divulgation aux éditeurs à juin 2026 : la publication publique respecte donc le délai standard de plus de 90 jours de divulgation responsable. AIR Security la présente comme l’une des premières vulnérabilités de chaîne d’approvisionnement documentées propres à l’écosystème des agents IA.

La faille ne touche ni les poids du modèle ni les prompts. Elle vise le SHA-pinning : la pratique, utilisée par les places de marché de plugins de ces quatre agents, qui consiste à figer une extension installée sur le hash de commit exact validé par un relecteur — précisément pour qu’une mise à jour ultérieure non relue ne puisse pas modifier en silence ce qui est réellement installé.

Comment ça marche

Les quatre agents échouent au même contrôle de fond, de deux manières différentes, toutes deux liées à la façon dont git checkout résout les noms.

Pour Claude Code, Codex et GitHub Copilot, l’agent extrait un plugin via son hash de commit à 40 caractères, mais ne vérifie jamais que l’arbre de travail obtenu correspond réellement à ce commit. Or Git, lorsqu’une branche et un commit portent le même nom, privilégie la référence de branche. Un attaquant qui contrôle le dépôt du plugin peut donc créer une branche littéralement nommée d’après le hash validé, la faire pointer vers un code entièrement différent, et la définir comme branche par défaut du dépôt — le checkout se résout alors silencieusement vers la branche malveillante, tandis que le pin paraît toujours respecté pour quiconque audite la fiche de la place de marché.

Gemini CLI rompt la même garantie par un chemin qui lui est propre : il récupère le commit épinglé dans FETCH_HEAD, mais le checkout peut être redirigé vers une branche portant ce nom plutôt que vers l’objet réellement récupéré, ce qui annule complètement l’épinglage.

La chaîne d’attaque ne requiert aucune interaction de la victime : (1) un attaquant publie un plugin anodin qui passe la relecture de la place de marché et se fait épingler ; (2) des utilisateurs l’installent ; (3) l’attaquant publie une mise à jour d’apparence routinière, et la place de marché ré-épingle sur le nouveau commit ; (4) l’attaquant crée une branche du même nom, pointant vers du code malveillant, et la définit par défaut ; (5) la mise à jour automatique en arrière-plan de chaque installation — comportement par défaut de Claude Code et Codex — relance le checkout défaillant et récupère le code de l’attaquant sans qu’un utilisateur ait cliqué quoi que ce soit.

Exemple de prompt

Un prompt défensif à donner à votre agent de codage avant qu’il n’applique des mises à jour de plugins. Il revérifie l’épinglage après le checkout au lieu de se fier à la fiche de la place de marché, et la branche hostile est caviardée — ce qui compte, c’est l’écart à repérer, pas un montage fonctionnel.

# Defensive check — before an agent applies a plugin update
For each installed plugin, report: pinned commit hash, the hash actually
checked out (git rev-parse HEAD), and the default branch of its repository.
Flag any plugin where:
  - the checked-out HEAD differs from the pinned hash
  - a branch name equals a 40-char commit hash, e.g. [branch named like a hash]
  - the update came in through background auto-update with no review
Do not install, update, or run anything. Output the verification table only.

Pourquoi c’est important

Les places de marché de plugins pour agents de codage ont hérité du modèle de confiance des registres de paquets, mais le point d’application du contrôle se trouve au mauvais endroit : comme le formule AIR Security, l’épinglage est résolu à l’intérieur de l’agent, si bien qu’aucun contrôle côté place de marché ne peut se substituer à une implémentation correcte — le correctif doit être livré dans le binaire de l’agent lui-même. Un plugin qui « a passé la relecture » donne un faux sentiment de pérennité si rien ne revérifie l’épinglage au moment du checkout. Les mises à jour s’appliquant automatiquement et silencieusement, la fenêtre d’exposition couvre toute machine faisant tourner un agent vulnérable avec des plugins installés, pas seulement les utilisateurs qui ont choisi de mettre à jour. Les agents de codage tournent en outre avec des privilèges locaux élevés — accès au système de fichiers, exécution de commandes, identifiants présents dans l’environnement —, si bien que du code substitué de cette façon hérite de la même portée que n’importe quelle autre action de l’agent.

Défenses

  • Mettre à jour immédiatement là où un correctif existe : Claude Code 2.1.179 (juin 2026) et Codex 0.146.0 (12 août 2026) corrigent tous deux la faille de checkout sous-jacente.
  • GitHub Copilot n’a reçu aucun correctif à la date de publication — considérez les plugins Copilot installés comme non vérifiés et évitez d’en installer de nouveaux depuis des éditeurs peu familiers tant que Microsoft n’a pas livré de correctif.
  • Gemini CLI est déprécié, sans correctif prévu ; Google oriente les utilisateurs vers Antigravity, qui n’utilise pas le même mécanisme de SHA-pinning de place de marché.
  • Désactiver la mise à jour automatique des plugins en arrière-plan lorsque votre agent le permet, et relire manuellement les plugins avant d’appliquer une mise à jour.
  • Si vous maintenez votre propre mécanisme d’épinglage de plugins ou d’extensions pour un framework d’agent, vérifiez le hash de commit réel de l’arbre extrait après le checkout, et pas seulement que la commande de checkout référençait le bon pin — et rejetez tout dépôt où un nom de branche entre en collision avec un hash de commit dont vous dépendez.
  • Traitez les places de marché de plugins comme un élément de votre chaîne d’approvisionnement logicielle : appliquez-leur la même rigueur d’épinglage de registre et de provenance (commits signés, branches protégées, pas de branche par défaut renommable par un attaquant) que celle que vous appliqueriez à une dépendance npm ou PyPI.

Status

AspectDétail
Source principaleAIR Security, Plugin4Shell, publié les 17-18 septembre 2026
ChercheursOr Nevo, Dor Granat, Niv Hoffman (AIR Security)
Découverte → divulgation → publicationMai 2026 → juin 2026 → septembre 2026
AffectésClaude Code (Anthropic), Codex (OpenAI), GitHub Copilot (Microsoft), Gemini CLI (Google)
AnthropicCorrigé — Claude Code 2.1.179 (juin 2026)
OpenAICorrigé — Codex 0.146.0 (12 août 2026)
MicrosoftNon corrigé à la date de publication
GoogleAucun correctif prévu — Gemini CLI déprécié, migration vers Antigravity recommandée

Sources