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

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 :

DatePlateformeCe que dit l'annonce
6 oct.Fireworks AIAccès aux identifiants ; signes d'une attaque par « essaim d'agents »
9 oct.AndromedaPartie d'une « attaque à l'échelle du secteur »
14 oct.ZeaburAccès aux identifiants ; l'entreprise ferme
15 oct.Lightning AIAccès aux identifiants
16–17 oct.OpenCodeUn « 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.WarpUn prestataire tiers ; traces d'agent dérobées
28 oct.CommandCodeAttribué à la distillation
30 oct.NorthflankVariables 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 InvokeModel depuis 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 boto3 a é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.

Une clé, collée dans chaque plateforme qui en avait besoinVotre clé d'IAsk-ant-…, OpenAI,accès BedrockPlateforme de déploiementvariable sur un serviceService de buildvariable dans un pipelineConsole d'agent de codeclé fournisseur stockéeNotebooks GPUvariable dans un studioAttaquantvariables déchiffrées,clés testées enmoins de 30 minutesPool de revente~800k et ~1,7M d'appelsdans deux cas Bedrock,plus de 100k $ au tarif
Le Black October, selon Wiz et Northflank. Les développeurs collent leurs clés d'IA dans les plateformes qu'ils utilisent, où elles restent stockées en variables d'environnement. Les attaquants qui atteignent ce stockage prennent les clés, les testent en moins de 30 minutes et vendent l'accès à des pools de revente dont le trafic ressemble à celui d'agents de code. Dans les deux cas Bedrock suivis par Wiz, cela représente environ 2,5 millions d'appels.

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.

Bromure : une seule vraie copie, et des substituts qui ne voyagent pasVM de la machine (Ubuntu)ANTHROPIC_API_KEY=sk-ant-api03-brm-…L'agent appelle le modèlevers api.anthropic.comL'agent déploie l'applipose la clé sur la plateformeProxy sur votre MacHôte dans le périmètre de la cléinsère la vraie clé, transmetSubstitut vers le mauvais hôte451, VM en pause, fuite nomméeapi.anthropic.comreçoit la vraie cléPlateforme de déploiementne reçoit rienmodels.enc sur le Macseule vraie copie, chiffrée, jamais synchronisée
Le même déploiement dans une machine Bromure. L'environnement de l'agent contient un substitut. Les appels vers Anthropic reçoivent la vraie clé, insérée sur le Mac. Quand l'agent tente de définir la clé sur une plateforme de déploiement, le substitut apparaît dans une requête vers le mauvais hôte : le proxy la bloque avec un 451, met la VM en pause et nomme la fuite. La vraie clé n'est stockée qu'une fois, sur le Mac.

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.