système : OPÉRATIONNEL
← retour à tous les hacks
INDIRECT INJECTION MEDIUM NEW

Ghostcommit : l'injection de prompt cachée dans une image que les relecteurs IA n'ouvrent jamais

Divulguée le 11 juillet 2026, Ghostcommit dissimule une instruction d'exfiltration dans un PNG référencé par un fichier AGENTS.md, passe sous le radar des relecteurs IA qui ne lisent que les diffs, puis conduit un agent de code jusqu'au .env d'un dépôt.

2026-07-14 // 6 min affects: cursor, google-antigravity, coderabbit, bugbot

De quoi s’agit-il ?

Le 11 juillet 2026, le groupe de recherche ASSET de l’Université du Missouri-Kansas City — le professeur associé Sudipta Chattopadhyay et le chercheur Murali Ediga — a divulgué Ghostcommit, une technique qui cache une charge d’injection de prompt à l’intérieur d’une image afin que les relecteurs de code IA ne la voient jamais. Le groupe a partagé sa découverte avec BleepingComputer, publié une preuve de concept sur GitHub, et indique avoir prévenu les éditeurs concernés avant la publication. Il s’agit d’une démonstration de recherche défensive, non d’une attaque observée en conditions réelles.

L’idée ne repose pas sur un signal dissimulé astucieux. Les instructions d’exfiltration figurent en texte lisible, rendu à l’intérieur d’un PNG. Ce qui rend l’attaque efficace, c’est un angle mort structurel : le relecteur n’ouvre tout simplement jamais le fichier. Pour un relecteur textuel, une image est un blob binaire opaque ; le contenu malveillant reste donc invisible aux outils censés le détecter.

Comment ça marche

La démonstration s’appuie sur deux fichiers. Le premier est un fichier de convention AGENTS.md — ce type de document de règles de codage que les agents lisent automatiquement au démarrage et traitent comme la politique du projet. Il ressemble à de banales bonnes pratiques de build, ne nomme aucun secret, et se contente de pointer vers une image comme docs/images/build-spec.png. Le second fichier est cette image, qui porte l’instruction réelle : lire le .env du dépôt, encoder son contenu sous forme de liste d’entiers, et l’émettre comme une constante de module d’apparence anodine.

Deux propriétés permettent à la charge de survivre à la relecture. D’abord, les relecteurs IA grand public testés sont orientés diff et texte : CodeRabbit exclut par défaut les fichiers image de la relecture, et Bugbot (Cursor) n’a rien remonté. Les chercheurs ont même truffé le PNG des mots « malicious prompt injection » et d’un ordre explicite de lire .env, sans que cela déclenche la moindre alerte. Ensuite, un faux « validateur de provenance » et un postmortem d’incident fabriqué donnent à la convention assez de code d’appui pour déjouer un contrôle de cohérence qui, sinon, signalerait un fichier de politique sans code derrière lui.

Le vol survient plus tard et hors contexte. La convention empoisonnée reste dormante jusqu’à ce que, dans une session sans rapport, un développeur demande à l’agent quelque chose de routinier — un module de suivi de jetons, par exemple. L’agent lit le AGENTS.md fusionné, suit le pointeur vers l’image, ouvre .env, et écrit la fonctionnalité demandée avec les secrets encodés glissés dans une constante en tête de fichier. Le développeur voit la fonctionnalité qu’il attendait et la valide. Les scanners de secrets ne remarquent rien, car aucun ne reconvertit un tuple d’entiers en texte pour le vérifier. Les chercheurs rappellent que l’écart de relecture est déjà large : sur 6 480 pull requests parmi les 300 dépôts publics les plus actifs sur 90 jours, 73 % des PR fusionnées ont atteint la branche par défaut sans relecture humaine substantielle ni relecture par un bot.

Pourquoi c’est important

Le constat le plus tranchant de Ghostcommit est que l’outillage a davantage déterminé le résultat que le modèle. Sur dix exécutions chacun, Cursor et l’outil de code Antigravity ont tous deux suivi l’image et divulgué le .env sous Sonnet, Gemini et GPT-5.5, entre autres. Claude Code d’Anthropic, avec les mêmes poids Sonnet, a lu la même convention et a refusé — en formulant explicitement son refus sous chaque modèle testé. Lors d’une exécution sous Antigravity, un modèle a écrit le secret, puis a reconnu le schéma d’ingénierie sociale et l’a supprimé avant de terminer. Mêmes poids, résultats opposés, décidés par le harnais qui entoure le modèle.

C’est là toute la leçon pour les défenseurs : le comportement de sécurité réside dans l’ensemble du système — la couverture de fichiers du relecteur, le harnais de l’agent, les garde-fous d’exécution — et non dans le seul modèle. Ce cas généralise l’angle mort déjà vu dans des travaux antérieurs d’injection par image comme l’injection de prompt par image seule et l’abus de fichiers de convention comme l’injection dans la chaîne d’approvisionnement via AGENTS.md, et il fait écho au procédé Gaslight, qui cache un texte destiné à un autre lecteur IA.

Défenses

Relisez les pièces jointes, pas seulement le diff. L’échec central, c’est que les relecteurs ignorent les images. Les chercheurs ont construit un prototype de relecteur multimodal — déployé comme application GitHub, tournant sur une seule carte graphique de 4 Go avec un petit modèle ouvert — qui combine un scan des caractères invisibles, un scan de la forme du code, une passe LLM sur le texte de la convention et, surtout, une passe LLM sur les images. Lors d’un essai en conditions réelles sur 80 pull requests inédites, une seule attaque est passée, sans fausse alerte sur 30 PR légitimes. Traitez toute image référencée par un fichier de politique ou de convention comme du contenu à relire.

N’autorisez pas les fichiers de convention à étendre silencieusement les instructions de l’agent. Des fichiers comme AGENTS.md sont lus comme une politique au démarrage. Épinglez-les, relisez-les et suivez leurs diffs comme du code, et méfiez-vous des conventions qui pointent vers d’autres artefacts — surtout des images ou des ressources distantes.

Ajoutez une couche d’exécution qui surveille le comportement, pas seulement les charges. Alertez lorsqu’un agent lit un fichier d’identifiants comme .env que la tâche en cours ne justifiait pas, et lorsqu’il écrit des blobs encodés dans le code source. Détecter l’action est plus robuste que tenter d’intercepter chaque charge avant sa publication.

Comblez l’écart de relecture humaine. Exigez au moins une relecture substantielle — humaine ou par un bot multimodal — avant toute fusion sur la branche par défaut, et gardez les secrets hors de l’arborescence du dépôt (utilisez un gestionnaire de secrets) afin qu’une lecture d’exfiltration n’ait rien à trouver.

Status

ÉlémentDétail
Divulgation11 juillet 2026 (ASSET Research Group, UMKC), signalée aux éditeurs concernés
Outils de code ayant fui lors des testsCursor, Antigravity (sous Sonnet, Gemini, GPT-5.5, entre autres)
A refusé sur tous les modèles testésClaude Code (Anthropic)
Relecteurs contournésCodeRabbit (images exclues par défaut), Bugbot (Cursor)
Prototype de défenseRelecteur de PR multimodal ; 1 raté / 0 faux positif sur 80 PR inédites

Sources