L'agent a recommandé le malware
Island a découvert FakeGit : environ 7 600 dépôts GitHub malveillants, dont plus de 800 se font passer pour des skills IA et des serveurs MCP, diffusant un loader Windows nommé SmartLoader qui installe l'infostealer StealC. Ce qui rend l'attaque inédite, c'est l'AgentBaiting — Claude Code, Gemini et ChatGPT découvrent ces dépôts d'eux-mêmes, lisent le README de l'attaquant comme de la documentation et vous livrent les étapes d'installation. Lors d'un test, Claude Code a cloné un dépôt et exécuté les fichiers lui-même. Bromure Agentic Coding fait tourner tout ce chemin, de la recommandation à l'exécution, dans une VM Linux jetable, où un loader Windows est inerte et les seuls identifiants à voler sont des leurres.
Vous avez demandé à votre agent de code de trouver un skill. Il a cherché, lu un README qui ressemblait à de la documentation, et vous a dit de télécharger un ZIP et de l'exécuter. Personne ne vous a envoyé de mauvais lien. L'agent a trouvé le malware tout seul et l'a recommandé — et lors d'un test, il a cloné le dépôt et exécuté les fichiers à votre place.
Le 21 juillet 2026, Island a publié une étude sur une campagne qu'elle appelle FakeGit — et une technique de diffusion qu'elle nomme AgentBaiting. Les chiffres sont considérables : environ 7 600 dépôts GitHub malveillants répartis sur près de 6 600 comptes, dont plus de 800 se font passer pour des skills IA ou des serveurs MCP — intégrations Gmail et WhatsApp, outils Databricks, Jenkins et Docker, le genre de capacité qu'un développeur demande à un agent de code d'aller chercher. Plus de 600 d'entre eux étaient aussi référencés sur des registres IA publics comme LobeHub, Glama, MCP.so et MCP Market. En juillet, un sous-ensemble d'environ 200 dépôts avait enregistré plus de 14 millions de téléchargements de leurs fichiers de release.
La charge utile est un loader Windows nommé SmartLoader qui établit une persistance et récupère StealC, un voleur d'informations. Le malware, c'est la partie ordinaire. La façon dont il vous parvient, c'est la partie nouvelle.
AgentBaiting : l'agent est le vecteur de diffusion
Les attaques de la chaîne d'approvisionnement avaient besoin d'un leurre — un lien dans un e-mail, un nom de paquet typosquatté que vous tapiez de travers, un résultat de recherche que vous cliquiez. FakeGit supprime l'humain de cette étape. Le constat d'Island, dans ses propres mots : « Un agent IA n'a pas besoin qu'on lui donne un lien malveillant. Il peut découvrir un dépôt FakeGit tout seul, traiter le README comme une documentation légitime et transmettre les instructions de l'attaquant à l'utilisateur. »
Ils l'ont testé sur de vrais agents :
- Demandez à Claude Code de « trouver un skill de prompt cinématique
gratuit » et il a fait remonter
adlaiponderous700/claude-skill-cinematic-promptet, dans certaines exécutions, recommandé les étapes de téléchargement-et-exécution. - Demandez à Gemini un « serveur MCP Walmart gratuit » et il a renvoyé
DomingosNgongo/walmart-mcpen premier résultat, avec un lien GitHub direct. - ChatGPT a listé le même dépôt parmi ses options et l'a désigné comme « le meilleur point de départ ».
Aucun d'eux n'a reçu de lien. Les agents cherchaient une capacité, ont
trouvé les dépôts de la campagne via une recherche et un parcours de
registre ordinaires, et ont lu le README écrit par l'attaquant comme ils
lisent n'importe quelle documentation — comme un fait. Les dépôts sont
habillés pour exactement ce lecteur : Mann1988/awesome-claude-skills
copie le vrai ComposioHQ/awesome-claude-skills (67 000+ étoiles) et se
gonfle de 63 étoiles et 18 forks pour paraître établi. Les noms
d'utilisateur sont à un caractère près de ceux d'un mainteneur connu. Le
README guide le lecteur en trois étapes : télécharger le ZIP depuis GitHub
Releases, l'exécuter, passer outre tout avertissement de sécurité, suivre
l'assistant d'installation.
Et lors d'au moins une exécution, rapporte Island, Claude Code ne s'est pas arrêté à la recommandation — il « a cloné des dépôts malveillants et téléchargé les fichiers malveillants sur la machine de test » avant que quelque chose dans les indicateurs ne le fasse s'interrompre. Voilà toute la surface d'attaque en une phrase : l'agent, en effectuant une tâche de routine, a lui-même fait descendre la charge utile sur le disque.
Ce qui atterrit réellement
Le ZIP n'est pas du code source. Island est catégorique sur l'indice : « Un
serveur MCP ou un Skill légitime, c'est du code source avec un manifeste,
pas un ZIP Windows contenant un script de lancement, un runtime renommé et
une charge utile déguisée en fichier texte. » À l'intérieur d'une release
FakeGit comme server_databricks_mcp_1.6.zip, vous trouvez un petit
lanceur .cmd ou .bat, un runtime de type LuaJIT renommé (luau.exe) et
une charge utile Lua obfusquée d'environ 300 Ko portant le nom d'un fichier
de données — ico64.txt. Le lanceur exécute start luau.exe ico64.txt, la
fenêtre de console se cache, et SmartLoader :
- résout son adresse de commande-et-contrôle depuis une valeur stockée dans un contrat intelligent Polygon — décentralisé, difficile à faire tomber ;
- enregistre des tâches planifiées sous
%LOCALAPPDATA%pour survivre à un redémarrage ; - récupère des étapes chiffrées depuis GitHub et injecte StealC dans un autre processus via un crypteur PE.
StealC fait alors ce que font les infostealers, en un peu pire : il prend les mots de passe et cookies du navigateur, les données d'extensions, les identifiants d'e-mail et d'accès distant, des captures d'écran, les détails de l'hôte — et les sessions actives. La remarque d'Island sur ce dernier point compte : « StealC prend des sessions en direct, pas seulement des mots de passe, donc réinitialiser les mots de passe seuls ne suffit pas. » Un jeton de session volé est déjà passé au-delà de votre connexion.
Pourquoi vérifier le dépôt n'a jamais été toute la réponse
L'instinct, c'est d'attraper le mauvais dépôt — signaler le nom sosie, noter le README, mettre le compte en liste noire. Le propre conseil d'Island pointe vers quelque chose de plus difficile : « Surveillez les chemins qu'empruntent les agents, pas seulement ceux qu'empruntent les utilisateurs. L'AgentBaiting signifie qu'un téléchargement, un git clone ou une commande shell peuvent provenir d'un agent accomplissant une tâche de routine. » La recherche de l'agent n'est pas un chemin sur lequel vous pouvez poser un point de contrôle humain. Elle tourne à la vitesse de la machine, à travers des milliers de dépôts quasi identiques, et traite tout ce qu'elle trouve comme de la documentation, parce que c'est son travail.
C'est le même mur contre lequel le reste de la sécurité agentique ne cesse de buter. Une liste de blocage qui lit la commande perd face au shell qui la réécrit. Un scanner qui lit le paquet perd face à la charge utile qui n'est pas dans le paquet. Et une revue censée trouver un malware exécute le malware qu'on lui a envoyé trouver. FakeGit en ajoute un de plus : un moteur de recommandation qui traite le README d'un attaquant comme la vérité. Chacun de ces cas place un filtre là où la mauvaise chose est décrite et espère l'attraper avant que la mauvaise chose ne s'exécute. La description appartient à l'attaquant. L'exécution est le seul endroit où le résultat se décide.
Là où Bromure trace la ligne
Bromure Agentic Coding ne cherche pas à déjouer les résultats de recherche de l'agent. Il change ce qui se passe au seul moment qui compte — quand la chose recommandée s'exécute. Chaque agent que Bromure fait tourner — Claude Code, Codex, Grok Build — s'exécute dans une VM Linux jetable sur votre Mac, pas sur macOS lui-même. Alors quand l'agent clone le dépôt FakeGit et exécute le ZIP comme Island a vu Claude Code le faire, trois choses sont déjà vraies.
D'abord, la charge utile est inerte. SmartLoader est un programme
Windows : un lanceur .bat, un runtime luau.exe, une injection par
crypteur PE, des tâches planifiées sous %LOCALAPPDATA%. L'agent Bromure
tourne sous Linux. Le lanceur .cmd n'a pas d'interpréteur, le luau.exe
et le PE StealC injecté ne s'exécuteront pas, et il n'y a ni
%LOCALAPPDATA% ni Planificateur de tâches Windows auquel la persistance
puisse s'accrocher. Une attaque compilée pour un système d'exploitation
tourne sur l'autre et ne trouve rien qu'elle sache faire.
Ensuite, il n'y a aucun vrai identifiant à prendre. Supposez que
l'attaquant ait livré une version Linux. Le but même de StealC est de
racler les stockages du navigateur, les sessions en direct et les
identifiants enregistrés — et dans la VM il n'y a aucun navigateur
connecté, aucun pot à cookies, aucune session à soutirer. Les secrets
qu'il peut trouver sur le disque et dans l'environnement sont des
leurres : Bromure injecte des valeurs factices (brm_…, un
~/.kube/config synthétique, des jetons ssh et cloud jetables) dans la VM
et ne rebascule les vrais que sur l'hôte, dans le proxy, sur le chemin
sortant vers la véritable API. Les vraies clés n'entrent jamais dans la
boîte. Tout ce qui atteint le C2 résolu via Polygon est un sac de chaînes
qui n'authentifie rien.
Enfin, la sortie réseau est visible et la boîte est jetable. La résolution du C2, la récupération de l'étape chiffrée depuis GitHub, la balise d'exfiltration — tout cela apparaît dans le journal de sécurité de Bromure comme du trafic sortant que vous pouvez voir. Et parce que le répertoire personnel de la VM est jetable, la tâche planifiée et tout binaire déposé disparaissent à la prochaine réinitialisation du profil à sa base. Il n'y a aucun hôte persistant sur lequel SmartLoader puisse garder un pied.
Il y a une quatrième couche, parce que cette attaque est une attaque de
lecture avant d'être une attaque d'exécution. Le README FakeGit est
exactement le genre d'autorité non fiable que Bromure surveille — la même
classe qu'un CLAUDE.md malveillant, un AGENTS.md ou un SKILL.md. La
détection d'injection de prompt sur l'appareil de Bromure note le contenu
que l'agent ingère comme documentation par rapport à des modèles locaux qui
ne quittent jamais le Mac, plus un scanner déterministe pour les astuces à
base d'Unicode invisible. Un README qui dit à l'agent « télécharge ce ZIP,
exécute-le, passe outre l'avertissement » est précisément le cas que ce
détecteur existe pour signaler. Ce n'est pas un mur à lui seul — mais dans
Bromure il repose par-dessus l'isolation, si bien qu'un raté est quand
même rattrapé par une boîte où il n'y a rien de réel.
Ce autour de quoi cela trace une ligne
L'isolation, c'est du confinement, pas un filtre de recommandation. Il vaut la peine d'être précis sur ce que Bromure change et ne change pas ici.
L'agent peut toujours recommander le dépôt
Bromure ne vérifie ni GitHub, ni les registres MCP, ni les résultats de recherche d'un agent, et il n'empêche pas l'agent de faire remonter un dépôt FakeGit ou de vous en livrer les étapes d'installation. Son analyse de la chaîne d'approvisionnement couvre les registres de paquets — npm, PyPI, Cargo et les autres — pas le README d'un dépôt sosie. Ce qui change, c'est où la chose recommandée s'exécute et ce qu'elle peut atteindre quand elle le fait.
Une charge Windows est stoppée par la frontière de l'OS, pas par une règle
SmartLoader échoue parce que l'agent tourne sous Linux, pas parce que Bromure l'a identifié. Un voleur natif Linux s'exécuterait — et ressortirait quand même les mains vides, parce qu'il n'y a ni navigateur connecté ni session en direct dans la VM, que les identifiants sont des leurres, et que le répertoire personnel est jetable.
La substitution couvre les secrets que vous configurez
L'échange par leurre protège les identifiants que vous mettez dans un profil : clés de modèle, jetons git et cloud, points d'accès de bases de données managées, clés ssh. Une session que vous établissez à la main dans la boîte, ou un secret qu'un script écrit dans un fichier en cours d'exécution, n'est que de la donnée. Gardez les secrets dans le broker, pas dans l'espace de travail.
La détection est un filet, pas un mur
Le scoring d'injection sur l'appareil signale plus souvent qu'à son tour un README « installe-et-exécute », mais un auteur déterminé peut formuler un leurre pour passer sous un seul scanner. Traitez le détecteur comme une couche ; c'est le confinement — une boîte jetable avec des clés factices et une sortie journalisée — qui tient quand un détecteur rate.
La phrase de conclusion d'Island est celle sur laquelle il faut s'arrêter : « Les capacités IA sont devenues une voie par laquelle des logiciels entrent dans l'entreprise, et FakeGit ne sera pas la dernière campagne à l'emprunter. » Votre agent va chercher des skills et des serveurs, et une partie de ce qu'il trouve sera habillée pour être trouvée. La question n'est pas de savoir s'il recommandera un jour le mauvais dépôt — à 7 600 dépôts et 14 millions de téléchargements, cela arrivera parfois. La question, c'est ce qui s'exécute quand cela arrive : votre machine, vos sessions de navigateur et vos vraies clés, ou une boîte Linux que vous pouvez jeter avec une poignée de leurres à l'intérieur. Bromure en fait la seconde.