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

Le stealer a emporté les substituts

Le 15 octobre, Symantec a révélé qu’Aoki, un infostealer apparu cette année, s’attaque désormais aux identifiants des agents de code : .claude.json, le config.toml et les fichiers .env de Codex, les jetons de GitHub Copilot, Cursor, Gemini, JetBrains AI Assistant et Kiro, et les clés AWS. Dans Bromure Agentic Coding, chacun de ces fichiers contient un substitut, les connexions et les clés restent chiffrées sur le Mac, et un substitut envoyé au serveur d’un stealer met la machine en pause.

La liste du stealer commence désormais par votre agent de code. Il veut .claude.json, la config de Codex et les fichiers .env qui l’accompagnent.

Un infostealer visait autrefois les cookies du navigateur, les mots de passe enregistrés, les portefeuilles crypto et les jetons Discord. Aoki prend toujours tout cela. Ses versions récentes cherchent aussi les fichiers que votre agent de code garde dans votre dossier personnel.

La Threat Hunter Team de Symantec a décrit ce changement le mercredi 15 octobre, dans Aoki: Infostealer Targets AI Coding Assistant Credentials. Infosecurity Magazine l’a relayé le même jour. Aoki, aussi appelé Aokigahara d’après une chaîne de sa routine de déchiffrement, est apparu plus tôt cette année. Symantec écrit que « les versions antérieures du malware ne ciblaient pas les fichiers liés à l’IA ». Le dernier échantillon, si.

Ce que prend Aoki

Symantec énumère les fichiers d’agent visés par le dernier échantillon :

  • .claude.json et les cookies de Claude desktop.
  • Les cookies de ChatGPT.
  • Le config.toml et les fichiers .env de Codex.
  • La base d’état locale de Cursor, qui « peut mettre en cache le contexte des conversations et des extraits de code ».
  • Les jetons de GitHub Copilot, Cursor, Google Gemini, JetBrains AI Assistant et Kiro.
  • Les identifiants AWS.

Le reste de la liste est le butin habituel d’un infostealer : plus de quarante navigateurs, environ quatre-vingt-dix extensions de portefeuille, des portefeuilles de bureau, des gestionnaires de mots de passe, Telegram, Discord, des clients FTP et VPN. Aoki cherche aussi tout fichier dont le nom contient secret, privatekey, keystore, mnemonic, passphrase ou backup. Symantec note que « le malware n’a pas de liste de commandes de porte dérobée ». Il collecte ce qu’il trouve et l’envoie par POST à un point d’accès /gate sur son serveur de commande et de contrôle.

Symantec explique pourquoi les fichiers d’agent valent la peine : « Comme les données de carte bancaire, une clé d’IA volée se monnaie directement. » L’acheteur consomme à vos frais sur votre compte, une pratique appelée LLMjacking. Ces mêmes jetons « peuvent permettre aux attaquants d’agir sous l’identité d’un utilisateur légitime » et donnent accès aux dépôts, aux comptes cloud et aux pipelines CI/CD reliés au compte.

Symantec ne dit pas comment Aoki arrive sur une machine. Sur le portable d’un développeur équipé d’un agent de code, la porte d’entrée évidente est un paquet. L’agent en installe des dizaines chaque jour de son propre chef, et une dépendance malveillante dotée d’un script postinstall s’exécute avec les permissions de l’agent dès que npm install se termine.

La même liste dans une machine Bromure

Dans Bromure Agentic Coding, l’agent tourne dans une VM Linux sur votre Mac. Les vrais identifiants n’entrent jamais dans cette VM. Le Mac les garde dans un coffre chiffré et écrit dans la VM des substituts qui ont la forme des vrais, pour que chaque outil les accepte. Un proxy sur le Mac remplace chaque substitut par la vraie valeur au moment de l’envoi, et seulement pour les requêtes destinées à l’hôte auquel appartient l’identifiant.

Placez un stealer muni de la liste d’Aoki dans cette VM et suivez-le, point par point.

.claude.json et la clé Claude

Claude Code dans la VM fonctionne avec sk-ant-api03-brm-…, une clé substitut. Si vous vous êtes connecté avec un abonnement Claude, les jetons OAuth ont été capturés sur le Mac pendant la connexion et stockés, chiffrés, dans claude-subscription.enc. L’hôte rafraîchit le jeton d’accès environ cinq minutes avant son expiration et l’injecte dans les requêtes destinées à Anthropic. La VM ne détient jamais de jeton de rafraîchissement : ni .claude.json ni aucun autre fichier du dossier personnel ne contient d’identifiant Claude valide à voler.

config.toml, auth.json et .env de Codex

Codex reçoit un ~/.codex/auth.json prérempli contenant un faux JWT dont l’expiration est très lointaine, pour que le client n’essaie pas de le rafraîchir. La vraie connexion ChatGPT reste sur le Mac, dans codex-subscription.enc. Une clé d’API OpenAI apparaît dans la VM sous la forme sk-brm-….

Un .env de projet importé avec Import env file… dans le panneau Credentials de la machine revient avec les mêmes noms de variables, chaque valeur étant un substitut brm_… limité aux hôtes que vous choisissez. Votre code lit STRIPE_KEY comme il l’a toujours fait, et le stealer lit brm_….

GitHub, AWS et SSH

~/.git-credentials et GH_TOKEN contiennent un substitut ghp_ de 40 caractères, comme le vrai. Il n’y a pas de ~/.aws/credentials. ~/.aws/config pointe vers un utilitaire credential_process qui fournit au SDK AWS le vrai identifiant de clé d’accès avec une fausse clé secrète de 40 caractères, et le Mac re-signe chaque requête en route vers AWS. Un stealer qui copie la sortie de l’utilitaire obtient une clé secrète qui ne produit que des InvalidSignatureException.

La recherche par mot-clé de privatekey ou id_ed25519 ne trouve rien. Dans la VM, SSH_AUTH_SOCK est un pont vers un agent de signature sur le Mac, et les octets de la clé privée ne le traversent jamais.

Les cookies

Aoki veut les cookies de Claude desktop et de ChatGPT. La VM de la machine n’a ni application de bureau ni profil de navigateur à lire. Quand vous vous connectez à Claude ou à ChatGPT pour Bromure, la page de connexion s’ouvre dans le navigateur de votre Mac et les jetons atterrissent dans le coffre. L’agent navigue avec un Chromium qui tourne dans sa propre VM annexe jetable, distincte de la VM de la machine : un stealer dans la VM de l’agent ne peut pas atteindre le profil du navigateur.

La liste d’un stealer, dans une machine BromureVM de l’agentFichier ouvert par le stealerCe qu’il y trouve~/.claude.json, ANTHROPIC_API_KEYsk-ant-api03-brm-… (substitut)~/.codex/auth.json, config.tomlfaux JWT, sk-brm-….env du projetSTRIPE_KEY=brm_…~/.git-credentials, GH_TOKENghp_… (substitut)identifiants AWSvrai ID de clé + faux secret~/.ssh/id_*aucune clé (pont de signature)Le Mac, hors de la VMCoffre chiffré (AES-GCM)clé maîtresse dans le trousseauData Protection, sans iCloudclaude-subscription.enccodex-subscription.encmodels.encsecrets d’espace, clés SSHLes jetons de rafraîchissement restent ici.Le proxy n’insère la vraie valeurque pour l’hôte auquel elle appartient.POST https://dobeqnesmot.cc/gatecorps : sk-ant-api03-brm-…, ghp_…, brm_…Proxy du Mac : substituts vers le mauvais hôte451, rien de transmis, VM en pause
La liste d’Aoki, déroulée dans une machine Bromure. Chaque fichier de la liste existe et contient un substitut. Quand le stealer envoie son butin à /gate, le proxy du Mac repère des substituts en route vers un hôte pour lequel ils n’ont jamais été émis, répond 451 et met la VM en pause.

L’envoi vers /gate

Aoki termine en envoyant son butin par POST à /gate. Symantec cite dobeqnesmot[.]cc, hjazfioe[.]surf et neihite[.]cc. Dans une machine Bromure, cette requête doit sortir par le proxy du Mac, car le proxy est le seul chemin de la VM vers le réseau.

Le proxy inspecte chaque requête sortante, en-têtes et corps, à la recherche de substituts envoyés ailleurs que vers l’hôte pour lequel ils ont été émis. Une valeur sk-ant-api03-brm-… n’a qu’une famille de destinations légitime, Anthropic. Un substitut ghp_ appartient à GitHub. Dans un POST vers un domaine .cc, ils ne peuvent signifier qu’une exfiltration. Le proxy répond HTTP 451 et ne transmet rien. La VM se met aussitôt en pause, et le Mac affiche This environment may have been compromised, avec une ligne par substitut divulgué : un aperçu du jeton, le nom de l’identifiant, l’hôte auquel il appartient et l’hôte visé par le stealer.

C’est vous qui décidez de la suite. Save for Investigation exporte le disque de la VM, son dossier personnel et les dossiers partagés dans un dossier de votre choix, puis éteint la machine. Shut down l’arrête et la marque comme compromise. Une machine compromise ne redémarre qu’après Wipe and Launch, qui remplace le disque et le dossier personnel et conserve vos jetons, vos clés SSH et vos réglages. Votre connexion Claude, votre jeton GitHub et vos clés AWS n’ont jamais été dans la VM : le stealer n’a rien copié qu’il faille renouveler.

Vous pouvez aussi bloquer l’envoi avant même l’inspection. Dans le panneau Guardrails de la machine, réglez Unmatched traffic sur Deny sous Outbound connections et listez les hôtes dont la machine a besoin. Une connexion vers un domaine .cc inconnu est alors refusée, et la Security Timeline affiche une ligne rouge Firewall pour elle.

Si le stealer emballe son butin de sorte que l’inspection ne puisse pas lire les substituts, le serveur à l’autre bout reçoit quand même des valeurs qui ne s’authentifient nulle part. Un substitut ne fonctionne que s’il passe par le proxy de votre Mac en route vers l’hôte pour lequel il a été émis.

Avant que le stealer s’exécute

La voie d’entrée la plus probable dans la VM d’un agent est un paquet que l’agent a installé. Le panneau Supply Chain de la machine vérifie chaque téléchargement sur le Mac avant que la VM ne le voie :

  • Le délai de publication, activé par défaut avec un minimum de deux jours, masque les versions de paquets plus récentes que le seuil. Une version détournée et retirée en quelques heures n’atteint jamais npm install.
  • Le retrait des scripts d’installation, si vous l’activez, supprime les hooks preinstall, install, postinstall et prepare de chaque archive npm en transit, le moyen habituel par lequel un malware npm s’exécute à l’installation.
  • OSV, socket.dev ou Depi bloquent les versions faisant l’objet d’avis de sécurité connus et les paquets signalés comme malveillants ou comme typosquats, avec un 451 dont le gestionnaire de paquets affiche le motif tel quel.

Chaque téléchargement apparaît dans la Security Timeline : après un incident, vous retrouvez le paquet qui a fait entrer le stealer.

Si le stealer tourne sur le Mac

La liste de fichiers d’Aoki indique aussi ce qu’un stealer trouve sur le Mac lui-même, et une installation de Bromure n’y ajoute rien. Bromure n’importe pas les connexions des CLI Claude ou Codex de votre Mac et n’en a pas besoin : les agents tournent dans la VM, et leurs connexions vivent dans le coffre. Tout ce qui, sous ~/Library/Application Support/BromureAC/, contient un secret est du texte chiffré AES-GCM. La clé maîtresse se trouve dans le trousseau Data Protection, limitée à l’identité de signature de Bromure, et ne se synchronise jamais. Un stealer qui copie le dossier emporte des blobs chiffrés.

Symantec pointe la base locale de Cursor parce qu’elle met en cache le contexte des conversations et du code. Le journal de ce qu’a fait l’agent dans Bromure, la trace de session, est chiffré au repos avec la même clé de coffre, et il ne conserve des remplacements de jetons qu’un aperçu du premier et du dernier caractère. Aucun vrai secret n’apparaît dans une trace, chiffrée ou non.

Chaque fichier de la liste contient un substitut

.claude.json, auth.json et config.toml de Codex, les valeurs .env importées, les identifiants git et la config AWS portent tous des substituts. Les jetons de rafraîchissement et les clés privées SSH n’entrent jamais dans la VM.

L’envoi arrête la machine

Le proxy repère des substituts en route vers un hôte pour lequel ils n’ont pas été émis, répond 451, met la VM en pause et nomme chaque identifiant divulgué.

Rien à renouveler

Wipe and Launch remplace le disque et le dossier personnel et conserve vos clés. Le stealer a emporté des valeurs qui ne fonctionnent qu’à travers le proxy de votre Mac.

La porte est surveillée

Le délai de publication, le retrait des scripts d’installation et les contrôles de réputation s’exécutent sur le Mac avant qu’un paquet n’atteigne la VM, et chaque téléchargement est journalisé.

La liste va s’allonger

Selon Symantec, les capacités d’Aoki « semblent encore en cours de développement actif », et d’autres stealers copieront sa liste. Aoki a ajouté les fichiers d’agent parce que les clés et les connexions d’agent volées se vendent. Faites tourner vos agents dans une machine Bromure, et l’acheteur récupère un lot de substituts qu’aucun serveur n’acceptera hors du proxy de votre Mac.

Pour la version quotidienne du même problème, où l’agent lui-même copie un secret dans sa transcription, lisez Le jeton est resté dans la transcription. Pour un ver qui visait les mêmes fichiers depuis un paquet npm compromis, lisez Révoquer le jeton, c’était le déclencheur.