Retour à tous les articles
Publié le · par Renaud Deraison

Ils ont ajouté votre agent à la liste

Gen Digital a publié le 8 septembre une étude montrant que huit familles de voleurs d'informations grand public collectent désormais les données locales des agents de codage IA : jetons d'accès et de rafraîchissement, configurations MCP, bases de conversations, historiques d'invites, traces de projets. Aucune faille de Claude, Cursor ou Codex n'est en cause. Ces voleurs embarquent des règles de collecte pilotées à distance : ajouter le dossier de votre agent n'a été qu'une mise à jour de configuration poussée vers des machines déjà infectées. Bromure Agentic Coding déplace ce dossier dans une VM et le remplit de faux brm-, et garde le jeton de rafraîchissement sur l'hôte, là où l'invité ne peut jamais le détenir.

Votre agent de codage n'a aucun bogue à trouver. Quelqu'un a remarqué où il range ses fichiers, et a poussé une seule nouvelle ligne de configuration vers quelques centaines de milliers de machines déjà compromises.

Le 8 septembre, Jan Rubín, qui dirige l'équipe de recherche sur les menaces de Gen Digital, a publié un court billet au constat sans éclat. Huit familles distinctes de logiciels voleurs d'informations grand public collectent désormais les données locales des agents de codage IA. Ils copient des fichiers. C'est toute la technique.

Les cibles nommées se lisent comme un sondage sur ce que les développeurs ont installé cette année : Claude, Cline, Codex, Continue, Cursor, OpenCode, Kilo. Amatera s'en est pris à Cline et Continue. Remus s'en est pris à Claude, Cursor et OpenCode. CallbackBeaver a ajouté Cursor et Claude, et Gen en a compté plus de 5 000 échantillons sur une fenêtre de trente jours. BeeStealer, STG Stealer, HydraStealer, APEX Stealer et Otter Stealer font tous une version de la même chose. Sur macOS, la variante s'appelle Djinn Stealer, et sa liste est la plus longue : Claude, Codex, Gemini, Cline, OpenCode, Kilo.

Rubín est précis sur ce qu'il décrit. « L'activité ne pointe pas vers une faille nouvellement découverte dans Claude, Cursor ou Codex », écrit-il. « Elle montre plutôt des criminels qui adaptent des voleurs déjà établis pour collecter des fichiers de valeur rangés dans des dossiers locaux prévisibles. »

La liste a gagné une ligne

Le changement n'a presque rien coûté à ses auteurs.

Les voleurs modernes ne codent pas en dur ce qu'ils prennent. Ils sont livrés avec des règles de collecte pilotées à distance : un bloc de configuration listant des dossiers, des noms de fichiers, des bases de données, des extensions et des limites de recherche, récupéré depuis l'infrastructure de l'opérateur. Ajouter une nouvelle cible, comme Cyber Press l'a résumé, signifie que les opérateurs « ajoutent les nouveaux outils d'IA populaires aux listes de collecte du logiciel malveillant en mettant à jour des chemins, des noms de fichiers ou des règles de base de données, sans nécessairement reconstruire le logiciel malveillant ».

C'était une décision produit. Quelqu'un a regardé quels dossiers contiennent désormais quelque chose qui se vend, a écrit quelques chemins dans une configuration, et les machines qui faisaient déjà tourner l'une de ces familles ont commencé à expédier les données des agents dès leur prochain contact. Les opérateurs n'ont réinfecté personne. Le binaire sur le disque n'a pas bougé, la signature de détection non plus.

Gen a enregistré des détections de voleurs d'informations chez 3,3 millions d'utilisateurs protégés uniques au premier semestre 2026, avec des totaux mensuels au-dessus de 500 000. Amatera et Remus à eux seuls sont apparus chez des dizaines de milliers d'utilisateurs en trois mois. C'est à cette population que les opérateurs ont poussé la nouvelle règle.

une poussée de config, pas une campagneopérateur — règles de collectenavigateurs, cookies, portefeuillesSlack, Discord, profils VPNclés ssh, chemins de stockage cloud+ répertoires des agents IAune ligne ajoutée, septembreprochain contactmachines déjà infectées3,3 M d'utilisateurs, S1 2026500 000+ détections par moisbinaire inchangé sur le disqueaucune réinfection nécessaireaucune nouvelle signaturece qui quitte le portablejetons d'accès + rafraîchissementidentifiants de serveur MCPbase de conversationshistorique d'invitesnoms de projets, source en cachedétails de compte et d'abonnementhuit familles, un trimestreAmatera · Remus · CallbackBeaver · BeeStealer · STG · Hydra · APEX · Otter — et Djinn sur macOS
Ajouter les agents de codage IA à la liste de butin n'a coûté aucune nouvelle compilation aux opérateurs. Les voleurs grand public récupèrent auprès de leurs opérateurs des règles de collecte pilotées à distance (dossiers, noms de fichiers, bases de données, extensions). Un opérateur y ajoute les répertoires des agents, et chaque machine déjà infectée se met à les collecter dès son prochain contact. Le binaire sur le disque est inchangé, donc rien sur la machine n'a l'air différent.

Ce qu'il y a dans ce dossier

L'inventaire de Gen sur ce que collectent les règles est précis : « jetons d'accès et de rafraîchissement, identifiants stockés dans les configurations MCP, historiques d'invites, bases de conversations, détails de compte, et traces des projets sur lesquels un développeur a travaillé ».

Cette liste range deux pertes de nature différente sous un même nom.

La première, c'est l'accès. Un jeton d'accès achète une session. Un jeton de rafraîchissement achète des sessions, au pluriel, aussi longtemps qu'il reste valide, parce que quelqu'un l'a conçu pour survivre à la session dont il vient. C'est cette propriété qui en fait un objet de vol, et c'est pourquoi révoquer une session laisse le voleur là où il était. Juste à côté, dans le même dossier, se trouvent les identifiants de votre configuration MCP, qui ouvrent encore autre chose : un service interne, un système de tickets, une base de données derrière un serveur MCP en HTTP.

La seconde perte, c'est du renseignement, et elle est plus récente. Votre historique d'invites est une visite guidée de l'infrastructure de votre employeur. Cyber Press l'a dit sans détour : les historiques d'invites volés révèlent « des noms de dépôts, des noms d'hôtes internes, des détails d'infrastructure, des contrôles de sécurité, des secrets d'API et des plans commerciaux ». Un mardi, vous tapez le nom du service, le nom du cluster, la raison pour laquelle la migration est bloquée, puis vous collez l'extrait qui contient la chaîne de connexion pour demander pourquoi ça échoue sans arrêt. Vous n'avez jamais écrit de modèle de menaces pour votre propre journal de conversation.

Il arrive par un résultat de recherche

Poser le voleur ne demande pas non plus de faille zero-day. En mai, EclecticIQ a documenté une campagne qui a classé de fausses pages d'installation au-dessus des vraies : claudecode.co.com et geminicli.co.com, imitant la documentation de l'éditeur d'assez près pour passer au premier coup d'œil. La page vous tend une ligne PowerShell à copier. Vous l'exécutez et vous obtenez l'outil que vous vouliez, installé au grand jour, pendant qu'une seconde commande cachée tire un voleur sans fichier directement en mémoire. Il éteint ETW et AMSI au passage, puis moissonne les navigateurs, Slack, Teams, Discord, les clients VPN, les clés SSH et les chemins de stockage cloud. Le même acteur a joué le même coup contre Node.js, Chocolatey, KeePassXC et Monero.

La victime, donc, c'est le développeur qui a cherché un agent de codage et cliqué sur le premier résultat. Quatre mois plus tard, ce développeur livre aussi les jetons et l'historique de conversation de l'agent, parce que la règle de collecte a gagné une ligne.

Le même balayage, dans un espace de travail Bromure

Bromure Agentic Coding fait tourner chaque agent de codage dans une VM Linux à virtualisation matérielle sur votre Mac et garde tous les vrais secrets du côté hôte de cette frontière. Reprenez la liste de collecte de Gen point par point et passez-la sur un espace de travail. Supposez que le voleur gagne sur l'hôte, lise la règle, et parte chercher chaque chose.

Jetons d'accès et de rafraîchissement. Si vous utilisez un abonnement Claude ou ChatGPT plutôt qu'une clé d'API, la connexion n'a jamais lieu dans votre VM de travail. Bromure démarre une VM d'enregistrement jetable, sans dossier de travail monté et sans table de substitution d'identifiants, y exécute le vrai claude login, capture sur l'hôte les jetons OAuth obtenus, les chiffre, et détruit la VM. Ensuite, l'invité tourne en mode clé d'API avec un identifiant bidon déterministe : une fausse ANTHROPIC_API_KEY pour Claude, un ~/.codex/auth.json semé d'un faux JWT à expiration très lointaine pour Codex, afin que le client n'essaie jamais de le rafraîchir lui-même. C'est l'hôte qui rafraîchit, environ cinq minutes avant l'expiration, une fois pour chaque VM en cours d'exécution. Le manuel énonce la conséquence sans détour : l'invité ne détient jamais de jeton de rafraîchissement.

Identifiants stockés dans les configurations MCP. Le bearer MCP reçoit le même traitement, et le panneau de réglages le dit. Le vrai jeton d'un serveur MCP en transport HTTP reste sur l'hôte, la configuration que lit l'agent reçoit un espace réservé brm-mcp_…, et le proxy substitue la vraie valeur sur le fil, avec une portée exacte-ou-sous-domaine limitée à l'hôte de ce serveur et à rien d'autre. Le champ du panneau MCP porte la légende Jamais envoyé à la VM — substitué par le proxy.

Tout le reste qui ressemble à une clé. Chaque identifiant que vous configurez est remplacé dans la VM par un faux qui préserve la structure, dérivé de la vraie valeur et d'un sel propre à l'installation, si bien qu'il garde la forme qu'attendent les validateurs et reste stable d'une session à l'autre : sk-ant-api03-brm-…, sk-brm-…, xai-brm-…, brm-k8s-…, brm-docker-…, brm-db-…. Le canal de substitution ne va que dans un sens. L'hôte peut écrire des faux dans l'invité ; il n'existe aucun appel par lequel l'invité redemande une vraie valeur, et l'agent dans la VM refuse d'écrire tout identifiant qui ne porte pas le préfixe brm-.

Bases de conversations, historiques d'invites, références de projets, source en cache. Ceux-là sont réels et durables, parce que le travail de code a besoin d'un état durable. Ils vivent dans le dossier personnel persistant de la VM de l'espace de travail, un par espace de travail, derrière l'hyperviseur, et non dans le dossier personnel macOS que nomme la règle de collecte. Une règle qui dit « copier le répertoire de configuration de l'agent depuis le profil utilisateur » trouve un profil utilisateur sans agent dedans.

Le magasin de l'hôte lui-même. Ce que garde l'hôte est chiffré au repos en AES-GCM sous une clé maîtresse de 256 bits propre à l'installation, qui vit dans le trousseau macOS Data Protection, cantonnée à l'identité de signature de l'application, avec la synchronisation iCloud désactivée. L'application n'envoie et ne synchronise rien. Copiez le dossier Application Support, ou restaurez-en une sauvegarde Time Machine : sans l'entrée de trousseau de ce Mac, vous avez du chiffré.

la règle de collecte, passée dans un espace de travailce que la règle demandece qu'elle trouvejetons d'accès + rafraîchissementune clé bidon ; aucun jeton de rafraîchissement dans la VMl'hôte rafraîchit ~5 min avant l'expiration, pour toutes les VMconfiguration MCPbrm-mcp_…le vrai bearer substitué sur le fil, pour cet hôte seulclés d'API, identifiants cloudsk-ant-api03-brm-… · brm-k8s-… · brm-db-…bonne forme, mauvaise valeur, inerte hors de leur portéebase de conv., historique d'invitesréels, durables — et dans le home de la VM, pas le vôtrele chemin de la règle nomme un dossier que votre Mac n'a pas
La liste de collecte de Gen Digital, point par point, passée sur un espace de travail Bromure Agentic Coding. Les jetons d'abonnement sont côté hôte et rafraîchis côté hôte, donc l'invité ne détient jamais de jeton de rafraîchissement. Le bearer MCP dans la configuration de l'agent est un espace réservé brm-mcp. Les clés d'API sont des faux qui préservent la structure. La base de conversations et l'historique d'invites sont réels, et ils se trouvent dans le home persistant de la VM plutôt que dans le dossier personnel macOS que vise la règle.

Quand le balayage a lieu dans la VM

Un voleur peut aussi arriver par l'autre bout : tiré par l'agent lui-même, via une dépendance ou une instruction empoisonnée, et exécuté dans l'espace de travail. Le balayage réussit alors, et il collecte des faux. C'est à l'envoi que ça casse.

Chaque faux a une seule famille de destinations légitimes, la portée d'hôte pour laquelle il a été frappé, alors le proxy inspecte chaque requête sortante, en-têtes et corps, avec un automate d'Aho-Corasick assez peu coûteux pour tourner sur tout, à la recherche d'un faux qui partirait là où il n'a rien à faire. En cas de correspondance, il refuse la requête avec un HTTP 451 sans transmettre un octet, met la VM en pause sur-le-champ, et lève une alerte proposant Arrêter, Conserver pour investigation (exporter d'abord le disque, le dossier personnel et les dossiers partagés pour l'analyse), ou Continuer à vos risques. L'événement atterrit en ligne rouge Credential brokering dans la Security Timeline, l'application marque l'espace de travail comme compromis, et le lancement suivant exige Effacer et lancer.

Le proxy signale aussi les secrets non substitués et d'allure réelle dans le trafic sortant : les valeurs Bearer et x-api-key à préfixes connus comme sk-ant-, ghp_ ou AKIA, et les jetons opaques de vingt caractères ou plus. Ils apparaissent dans le Trace Inspector et dans bromure-cli trace leaks. Ils signifient d'ordinaire que quelqu'un a collé un vrai secret dans la VM à la main, ce qui est la seule manière de défaire la frontière depuis l'intérieur.

L'accessibilité est le troisième contrôle. Chaque espace de travail porte un pare-feu de sortie ordonné couvrant l'action, le protocole, l'hôte ou le CIDR, les ports, et pour le trafic web les verbes HTTP un par un, avec un contrôle segmenté pour le trafic non apparié. Les nouveaux espaces de travail autorisent ce qu'aucune règle ne couvre. Réglez-le sur Refuser, listez ce dont le travail a besoin, et l'hôte de C2 d'un voleur n'est pas sur la liste. Deux composants hors de l'invité l'appliquent : le commutateur réseau virtuel apparie chaque flux par IP de destination et par nom d'hôte capté dans le DNS, et le proxy apparie à nouveau par nom de serveur TLS. Vos modifications de règles atteignent les sessions en cours sans redémarrage.

l'état est dans votre dossier personnelun chemin prévisible, lisible par tout ce qui tourne sous vousle répertoire de l’agentjeton d'accès · jeton de rafraîchissementjetons bearer MCPbase de conversationshistorique d'invites · noms de projetsle voleur résident lit la règle, copie le dossierle binaire n'a pas changé ; seule la liste de cheminsenvoyéun accès renouvelable, plus une carte du parcl'état est dans une VM, et ce sont des leurresvotre home macOS n'a aucun répertoire d'agent à nommerVM de l'espace de travail — home persistantclé bidon · aucun jeton de rafraîchissementbrm-mcp_… · brm-k8s-… · brm-db-…base de conversations et historique, derrière l'hyperviseurles vrais chiffrés sur l'hôte, AES-GCM, clé du trousseauvsock 8443 — la seule sortieproxy hôte — consulté à chaque requêtepare-feu de sortie · hôte, port, verbe HTTPsubstitution · vraie valeur pour un seul hôteune ligne de trace par requête, chez vousleurre hors portée → HTTP 451, VM en pause, ligne de timeline
Deux endroits où garder l'état d'un agent. Sur un Mac ordinaire, les jetons, les identifiants MCP et l'historique de conversation sont dans un dossier prévisible du profil utilisateur, celui-là même que nomme la règle de collecte, et tout ce qui tourne sous votre compte peut le lire. Dans un espace de travail Bromure Agentic Coding, le même état se trouve dans le home persistant d'une VM, les identifiants qu'il contient sont des faux brm-, et la seule route vers l'extérieur est le port vsock 8443 vers un proxy hôte qui vérifie le pare-feu, substitue les identifiants et refuse tout faux qui sortirait de sa portée.

Si vous installez vos agents par copier-coller

Vérifiez d'où ils viennent. La campagne d'EclecticIQ a classé claudecode.co.com et geminicli.co.com au-dessus des vraies pages et a tendu aux visiteurs une ligne PowerShell qui installait le véritable outil tout en tirant un voleur en mémoire. Si cela décrit une installation que vous avez faite, traitez la machine entière comme exposée : révoquez les sessions d'abonnement plutôt que de renouveler une seule clé, changez tous les jetons de votre configuration MCP, et relisez votre propre historique d'invites comme le ferait un attaquant. Les noms d'hôtes et de dépôts qu'il contient sont la partie que vous ne pouvez pas renouveler.

Les deux réglages qui réduisent la cible

Enregistrez votre abonnement Claude ou ChatGPT depuis l'éditeur d'espace de travail, pour que les jetons OAuth soient capturés sur l'hôte et que l'invité tourne sur une clé bidon. Ouvrez ensuite Guardrails, réglez Trafic non apparié sur Refuser, et listez ce dont le travail a besoin : allow web api.github.com, allow web registry.npmjs.org, default deny. Lancez bromure-cli trace hostnames my-workspace après une session pour voir chaque hôte atteint par l'agent, avec les comptes.

Le butin suit l'adoption

Les voleurs apprennent les dossiers dans un ordre prévisible. Les profils de navigateur, puis les portefeuilles de cryptomonnaie, puis les jetons Discord et Slack, puis les profils VPN. Chacun est entré dans les règles de collecte un an ou deux après que la chose à laquelle il appartenait est devenue normale. Ce décalage, c'est le temps qu'il faut pour qu'assez de machines aient le dossier pour que la ligne de configuration vaille la peine d'être écrite.

Les agents de codage ont franchi ce seuil cette année, au prix d'entrée d'une mise à jour de configuration, chez huit familles, en un seul trimestre. Aucun correctif ne referme ça, parce que rien n'est cassé. Le dossier est là où il doit être, contenant ce qu'il doit contenir, sur une machine qui fait aussi tourner votre navigateur et votre courrier.

Ce qui change l'issue, c'est de rendre le dossier moins précieux que la peine de le copier. Mettez l'état de l'agent de l'autre côté d'un hyperviseur, remplissez ses fichiers d'identifiants de valeurs de la bonne forme et du mauvais nombre, et gardez les vraies sur l'hôte, là où se fait le rafraîchissement.

Votre agent de codage est une application normale qui range des fichiers normaux à un endroit normal, et c'est pour ça qu'il s'est retrouvé sur la liste. Décidez ce que ces fichiers ont le droit de valoir, avant que la prochaine famille ne mette sa configuration à jour. Installez Bromure Agentic Coding et laissez-les copier les leurres.