La clé avait trop de domiciles
Wiz recense au moins neuf plateformes de développement IA qui ont révélé une intrusion en octobre, la plupart liées à un accès aux identifiants, avec des attaquants qui visaient les variables d'environnement stockées contenant des clés d'IA. La dernière, Northflank, a demandé à ses clients le 30 octobre de considérer chaque variable d'environnement comme déchiffrée, et des utilisateurs ont vu leurs clés d'IA utilisées en quelques heures. Dans Bromure Agentic Coding, la clé avec laquelle votre agent code vit à un seul endroit sur votre Mac, l'agent ne peut pas la recopier sur une plateforme, et la renouveler se fait en un seul collage.
Chaque plateforme dans laquelle vous collez une clé d'IA en garde une copie. En octobre, des attaquants s'en sont pris à ces copies sur neuf plateformes, et Wiz a vu des clés volées testées en moins de 30 minutes.
Le 30 octobre à 11 h 43 UTC, Wiz a signalé une intrusion à Northflank, une plateforme cloud pour déployer applications, bases de données et charges d'IA. Environ deux heures plus tard, la page de statut de Northflank disait à tous ses clients : « Assume all environment variables have been decrypted. Disable/rotate all keys. » (considérez que toutes les variables d'environnement ont été déchiffrées ; désactivez ou renouvelez toutes les clés). À 15 h 12, elle ajoutait : « Multiple users are confirming that their AI keys have been used. » (plusieurs utilisateurs confirment que leurs clés d'IA ont été utilisées). La dernière mise à jour de la journée, à 23 h 38, indiquait : « Users have reported unauthorised use of AI API keys supplied to the Northflank platform. » (des utilisateurs ont signalé une utilisation non autorisée des clés d'API d'IA fournies à la plateforme Northflank). BleepingComputer rapporte que Northflank n'a dit ni comment les attaquants sont entrés, ni combien de clients sont touchés.
Northflank n'était pas la première. Le même jour, les chercheurs de Wiz Benjamin Read et Rami McCarthy publiaient Black October for AI Developer Platforms, qui recense au moins neuf plateformes de développement IA ayant révélé un incident de sécurité au cours du mois. « N'importe quel autre mois, ce serait l'actualité sécurité numéro un », écrivent-ils.
Neuf plateformes en un mois
La liste de Wiz, dans l'ordre :
| Date | Plateforme | Ce que dit l'annonce |
|---|---|---|
| 6 oct. | Fireworks AI | Accès aux identifiants ; signes d'une attaque par « essaim d'agents » |
| 9 oct. | Andromeda | Partie d'une « attaque à l'échelle du secteur » |
| 14 oct. | Zeabur | Accès aux identifiants ; l'entreprise ferme |
| 15 oct. | Lightning AI | Accès aux identifiants |
| 16–17 oct. | OpenCode | Un « système ancien » ; clés de fournisseurs stockées exposées |
| 20 oct. | Railway | « Élévation de privilèges dans notre infrastructure de build » |
| 23 oct. | Warp | Un prestataire tiers ; traces d'agent dérobées |
| 28 oct. | CommandCode | Attribué à la distillation |
| 30 oct. | Northflank | Variables d'environnement présumées déchiffrées |
Wiz n'a trouvé ni vulnérabilité ni dépendance commune aux neuf. Elles partagent une cible. La plupart des incidents remontent à un accès aux identifiants, et les attaquants cherchaient les variables d'environnement stockées, « en particulier celles qui donnent accès à l'IA ». OpenCode et CommandCode ont mis en cause la distillation, où un accès volé aux modèles de pointe sert à entraîner des modèles moins chers. Wiz rattache le reste de la demande au marché de revente qu'il appelle LLMJacking : des clés volées vendues comme accès à prix cassé aux modèles.
Testées en trente minutes, revendues par millions
Wiz a aussi suivi le parcours de deux jeux d'identifiants d'entreprise volés utilisés pour Amazon Bedrock. Wiz n'a pu relier aucun des deux cas à l'intrusion d'une plateforme précise, mais le schéma explique pourquoi les clés d'IA valent qu'on les traque :
- Moins de 30 minutes après l'accès aux identifiants signalé, un seul
appel
InvokeModeldepuis une IP résidentielle a testé les clés. Il demandait Claude Fable 5.1, a échoué, puis s'est rabattu sur Opus 5.5, qui a fonctionné. - Un petit client en Go a ensuite vérifié les clés 14 à 120 fois par jour pour s'assurer qu'elles marchaient toujours.
- Un script
boto3a énuméré les quotas Bedrock et EC2. Le même script, jusqu'à sa chaîne de version, apparaissait dans les deux cas. - Puis est venu le trafic de masse. Le cas A a fait environ 800 000 appels Bedrock en une trentaine d'heures, dont environ 90 % réussis. Le cas B en a fait environ 1,7 million en une treizaine d'heures, dont plus d'un million réussis.
Wiz estime que les deux cas ont « probablement généré plus de 100 000 $ d'utilisation » au prix catalogue. Les schémas de jetons ressemblaient à du trafic d'agents de code revendu : cache de prompts et nombreux utilisateurs finaux derrière un seul revendeur. Wiz relie l'infrastructure qui a touché les clés à des sites de revente de LLM, dont un qui accepte les paiements en USDT.
Voilà le marché qu'alimentent les clés d'IA volées : des gens qui font tourner des agents de code sur la facture de quelqu'un d'autre.
Comment une clé se retrouve à neuf endroits
Un développeur obtient une clé Anthropic et commence à s'en servir. Elle va dans l'agent de code, puis dans le déploiement de prévisualisation pour que la fonction IA de l'application marche, puis dans le job de CI qui lance les évaluations, puis dans un service de notebooks pour essayer un fine-tuning. Chaque collage prend trente secondes et fait marcher quelque chose. On n'y revient jamais.
Les agents de code accélèrent le mouvement. Demandez-en un de « déployer
ça sur Northflank » ou de « configurer le service Railway », et il fait ce
que ferait un développeur : il lit ANTHROPIC_API_KEY dans son
environnement et la passe à la CLI de la plateforme comme variable de
service. Le déploiement marche. La clé vit désormais sur une plateforme de
plus, à côté du mot de passe de la base de données, et aucun humain ne l'y
a tapée.
Puis une plateforme est compromise, et le conseil est toujours le même. Celui de Northflank : « Revoke existing credentials with their issuing providers, generate replacements » (révoquez les identifiants existants auprès de leurs émetteurs, générez-en de nouveaux). Pour cela, il faut d'abord se souvenir de tous les endroits où cette clé est allée.
Le même mois dans Bromure Agentic Coding
Bromure Agentic Coding fait tourner Claude Code, Codex, Grok, Kimi et omp dans des VM Ubuntu sur votre Mac, une VM par machine. L'agent, ses dépôts et chaque commande qu'il lance vivent dans la VM. Les vrais identifiants, et le proxy par lequel passe tout le trafic de la VM, restent sur le Mac.
La clé vit à un seul endroit
Les clés de modèles se saisissent une fois, dans Preferences › Models.
Bromure les stocke dans models.enc, chiffré en AES-GCM sous une clé
maîtresse rangée dans le trousseau Data Protection du Mac, synchronisation
iCloud désactivée. L'application n'envoie, ne synchronise ni ne sauvegarde
nulle part aucun identifiant, magasin de jetons ou matériel de clé.
Bromure n'exploite aucune console qui stocke des clés de fournisseurs : un
attaquant ne trouve rien à compromettre de notre côté.
Dans chaque VM, ANTHROPIC_API_KEY contient un substitut qui commence par
sk-ant-api03-brm-. Claude Code l'accepte, car il a la bonne forme. Quand
l'agent appelle api.anthropic.com, la requête quitte la VM par le proxy
de votre Mac, qui insère la vraie clé et transmet la requête. Le proxy
ajoute la clé pour les hôtes du fournisseur et aucun autre :
anthropic.com pour une clé Anthropic, openai.com pour une clé OpenAI,
et ainsi de suite.
Si vous vous connectez plutôt avec un abonnement Claude, ChatGPT, Grok ou Kimi, les jetons OAuth restent sur le Mac, et c'est le Mac qui les renouvelle. La VM ne détient jamais de jeton de rafraîchissement.
L'agent ne peut pas la disperser
Rejouez maintenant le déploiement. L'agent lance la CLI de la plateforme
et définit ANTHROPIC_API_KEY sur le service, avec la valeur de son
environnement. Cette valeur est le substitut, et la requête qui le porte
part vers l'API de la plateforme.
Le proxy de Bromure inspecte chaque requête sortante, en-têtes et corps, à la recherche de substituts envoyés vers un hôte pour lequel ils n'ont pas été émis. Un substitut de clé Anthropic dans une requête vers l'API d'une plateforme de déploiement en est un. Le proxy bloque la requête avec un HTTP 451 avant qu'un seul octet n'atteigne la plateforme, met la VM en pause et affiche This environment may have been compromised, en nommant l'identifiant, l'hôte auquel il appartient et l'hôte vers lequel il a été envoyé.
Nous avons conçu cette alerte pour les malwares qui volent des clés, et elle se déclenche de la même façon pour un agent qui essaie de rendre service. Votre clé de code n'est pas recopiée sur une plateforme de déploiement sans que vous le voyiez. Si c'est bien la copie que vous voulez, Allow l'envoie vers cet hôte pour le reste de la session. La meilleure solution est de créer pour le service de production une clé à lui, limitée à la production, et de laisser sur votre Mac la clé avec laquelle votre agent code.
Les agents tirent aussi des secrets dans l'autre sens. railway variables
ou le env pull d'une plateforme peuvent déposer un .env de production
dans le dépôt, vraies valeurs comprises. Activez Only allow credentials
Bromure injects dans les Guardrails de la machine, et toute requête
portant un identifiant que Bromure n'y a pas mis est bloquée et déclenche
la même alerte. Une vraie clé que l'agent a téléchargée depuis une
plateforme reste inutilisable dans la VM.
Bedrock sans clé à voler
Les deux cas suivis par Wiz tournaient sur Amazon Bedrock avec des identifiants d'entreprise à longue durée de vie. Dans Bromure, n'importe quel agent peut tourner sur Bedrock, Claude Code nativement et les autres via l'API compatible OpenAI de Bedrock, et aucun n'a besoin d'une clé Bedrock. Laissez vide le champ Bedrock API key, et le Mac signe chaque requête avec les identifiants AWS de la machine.
Ces identifiants peuvent être temporaires. Choisissez SSO / Identity Center dans les identifiants AWS de la machine, et le Mac obtient des identifiants de rôle de courte durée depuis votre cache SSO, en les renouvelant environ cinq minutes avant leur expiration. La VM reçoit une fausse clé secrète qui produit des signatures qu'AWS rejette ; le Mac les retire et signe à nouveau. Aucune variable d'environnement, nulle part, ne contient d'identifiant Bedrock à longue durée de vie que quelqu'un pourrait déchiffrer.
Un collage pour renouveler
Quand une plateforme vous dit de renouveler vos clés, celle de vos agents tient dans un seul champ. Collez la nouvelle clé dans Preferences › Models, et Bromure l'applique environ une seconde et demie après que vous avez fini de taper, sur chaque machine en cours d'exécution qui l'utilise. Chaque agent dont l'identifiant a changé est relancé avec ses options de reprise, et la conversation continue. Les VM ne redémarrent pas, et rien en leur sein n'a besoin d'être modifié, puisque rien en leur sein ne détenait l'ancienne clé.
Si vos clés vivent dans 1Password, les autres clés d'API d'une machine
peuvent être des références op:// plutôt que des valeurs. Bromure les
résout sur le Mac et les résout à nouveau toutes les deux minutes : le
renouvellement de l'élément dans 1Password atteint les machines en cours
d'exécution en quelques minutes, sans redémarrage.
Votre propre registre de chaque utilisation
L'autre conseil de Northflank était de vérifier dans les journaux
d'utilisation et de facturation de votre fournisseur toute activité que
vous n'avez pas lancée. Dans Bromure, chaque substitution est une ligne de
la Security Timeline de votre Mac, sous Credential brokering, avec
un aperçu masqué de la clé et l'hôte, par exemple
sk-a…f9q3 → api.anthropic.com. Les signatures AWS, Bedrock compris,
apparaissent en lignes Credential used avec une clé d'accès masquée.
Quand le tableau de bord du fournisseur montre un pic, vous voyez quels
appels venaient de vos propres machines.
Sur un Mac enrôlé dans Bromure Enterprise Manager, ces mêmes substitutions
remontent vers votre organisation sous forme d'événements
credential.token_swap, avec des aperçus seulement, jamais la clé
elle-même. Un administrateur qui se demande « nos clés ont-elles été
utilisées ailleurs ? » dispose du côté légitime du registre pour tout le
parc.
Une copie, sur le Mac
Les clés de modèles vivent dans models.enc, chiffré sous une clé du trousseau, jamais synchronisé ni envoyé. Aucune console d'éditeur ne les détient.
Des substituts dans la VM
L'ANTHROPIC_API_KEY de l'agent est un substitut. La vraie clé est ajoutée sur le Mac, pour les seuls hôtes du fournisseur.
Pas de copie accidentelle
Un substitut envoyé à une plateforme de déploiement est bloqué avec un 451, la VM se met en pause, et l'alerte nomme la destination.
Identifiants stricts
Avec le mode strict, une vraie clé que l'agent a tirée du fichier env d'une plateforme est bloquée dès qu'elle sert.
Bedrock sur SSO
Le Mac signe les appels Bedrock avec des identifiants Identity Center de courte durée. Aucune clé durable à stocker ni à voler.
Renouveler en un collage
Une nouvelle clé dans Preferences › Models atteint chaque agent en cours d'exécution en quelques secondes. Les VM ne redémarrent pas.
Comptez les copies
Wiz ne sait pas encore si un seul groupe est derrière les neuf incidents, et la plupart des plateformes n'ont pas publié de cause profonde. Chaque plateforme qui stocke votre clé d'IA peut la perdre, et octobre a montré que les voleurs ont désormais des acheteurs qui attendent.
La clé avec laquelle votre agent code est celle que vous voudriez le moins voir sur cette liste. Elle marche avec vos meilleurs modèles et vos limites les plus hautes, et votre agent s'en sert toute la journée. Dans Bromure Agentic Coding, elle reste sur votre Mac. L'agent reçoit un substitut, qu'aucune autre plateforme ne peut utiliser.
Pour l'intrusion dans la console d'OpenCode, l'une des neuf d'octobre, lisez Les clés étaient dans leur console. Pour les traces d'agent volées chez Warp, lisez Le journal de l'agent était dans leur cloud.