La clave tenía demasiados hogares
Wiz cuenta al menos nueve plataformas de desarrollo de IA que revelaron intrusiones en octubre, la mayoría ligadas al acceso a credenciales, con atacantes que iban a por las variables de entorno almacenadas que guardan claves de IA. La última, Northflank, pidió a sus clientes el 30 de octubre que dieran por descifrada cada variable de entorno, y varios usuarios vieron sus claves de IA usadas en cuestión de horas. En Bromure Agentic Coding, la clave con la que programa tu agente vive en un solo lugar de tu Mac, el agente no puede copiarla a una plataforma, y rotarla cuesta un pegado.
Cada plataforma en la que pegas una clave de IA guarda una copia. En octubre, los atacantes fueron a por esas copias en nueve plataformas, y Wiz vio claves robadas probadas en menos de 30 minutos.
El 30 de octubre a las 11:43 UTC, Wiz avisó a Northflank, una plataforma en la nube para desplegar aplicaciones, bases de datos y cargas de IA, de una intrusión. Unas dos horas después, la página de estado de Northflank decía a todos sus clientes: «Assume all environment variables have been decrypted. Disable/rotate all keys.» (da por hecho que todas las variables de entorno se han descifrado; desactiva o rota todas las claves). A las 15:12 añadió: «Multiple users are confirming that their AI keys have been used.» (varios usuarios confirman que sus claves de IA se han usado). La última actualización del día, a las 23:38, decía: «Users have reported unauthorised use of AI API keys supplied to the Northflank platform.» (los usuarios han informado del uso no autorizado de claves de API de IA proporcionadas a la plataforma Northflank). BleepingComputer informa de que Northflank no ha dicho cómo entraron los atacantes ni cuántos clientes se han visto afectados.
Northflank no fue la primera. Ese mismo día, los investigadores de Wiz Benjamin Read y Rami McCarthy publicaron Black October for AI Developer Platforms, que cuenta al menos nueve plataformas de desarrollo de IA que revelaron incidentes de seguridad durante el mes. «Cualquier otro mes, esta sería la principal noticia de seguridad», escriben.
Nueve plataformas en un mes
La lista de Wiz, por orden:
| Fecha | Plataforma | Qué dice el comunicado |
|---|---|---|
| 6 oct. | Fireworks AI | Acceso a credenciales; indicios de un ataque de «enjambre de agentes» |
| 9 oct. | Andromeda | Parte de un «ataque a todo el sector» |
| 14 oct. | Zeabur | Acceso a credenciales; la empresa cierra |
| 15 oct. | Lightning AI | Acceso a credenciales |
| 16–17 oct. | OpenCode | Un «sistema heredado»; claves de proveedores almacenadas expuestas |
| 20 oct. | Railway | «Escalada de privilegios en nuestra infraestructura de build» |
| 23 oct. | Warp | Un proveedor externo; trazas de agente sustraídas |
| 28 oct. | CommandCode | Atribuido a destilación |
| 30 oct. | Northflank | Variables de entorno que se dan por descifradas |
Wiz no encontró una vulnerabilidad ni una dependencia común a las nueve. Comparten un objetivo. La mayoría de los incidentes se remontan al acceso a credenciales, y los atacantes buscaban variables de entorno almacenadas, «sobre todo las que dan acceso a IA». OpenCode y CommandCode culparon a la destilación, en la que el acceso robado a modelos punteros sirve para entrenar modelos más baratos. Wiz atribuye el resto de la demanda al mercado de reventa que llama LLMJacking: claves robadas vendidas como acceso rebajado a modelos.
Probadas en treinta minutos, revendidas por millones
Wiz también siguió el rastro de dos juegos de credenciales empresariales robadas usadas para Amazon Bedrock. No pudo vincular ninguno de los dos casos con la intrusión de una plataforma concreta, pero el patrón explica por qué merece la pena cazar claves de IA:
- En menos de 30 minutos desde el acceso a las credenciales notificado,
una sola llamada
InvokeModeldesde una IP residencial probó las claves. Pidió Claude Fable 5.1, falló y recurrió a Opus 5.5, que funcionó. - Después, un pequeño cliente en Go comprobó las claves entre 14 y 120 veces al día para asegurarse de que seguían funcionando.
- Un script de
boto3enumeró las cuotas de Bedrock y EC2. El mismo script, hasta su cadena de versión, apareció en los dos casos. - Luego llegó el tráfico masivo. El caso A hizo unas 800.000 llamadas a Bedrock en unas 30 horas, alrededor del 90 % con éxito. El caso B hizo unos 1,7 millones de llamadas en unas 13 horas, más de un millón con éxito.
Wiz calcula que los dos casos «probablemente generaron más de 100.000 $ de uso» a precio de tarifa. Los patrones de tokens parecían tráfico revendido de agentes de programación: caché de prompts y muchos usuarios finales detrás de un solo revendedor. Wiz relaciona infraestructura que tocó las claves con sitios de reventa de LLM, entre ellos uno que acepta pagos en USDT.
Ese es el mercado al que alimentan las claves de IA robadas: gente que ejecuta agentes de programación a cuenta de otro.
Cómo una clave acaba en nueve sitios
Una desarrolladora consigue una clave de Anthropic y empieza a usarla. Va al agente de programación, luego al despliegue de preview para que funcione la función de IA de la app, luego al job de CI que ejecuta las evaluaciones, luego a un servicio de notebooks para probar un fine-tuning. Cada pegado lleva treinta segundos y hace que algo funcione. Nunca vuelves a ninguno de ellos.
Los agentes de programación lo aceleran. Pídele a uno que «despliegue
esto en Northflank» o que «configure el servicio de Railway» y hará lo que
haría un desarrollador: leer ANTHROPIC_API_KEY de su entorno y pasarla
a la CLI de la plataforma como variable del servicio. El despliegue
funciona. La clave vive ahora en una plataforma más, junto a la
contraseña de la base de datos, y ningún humano la escribió allí.
Luego alguien compromete una plataforma, y el consejo es siempre el mismo. El de Northflank fue «Revoke existing credentials with their issuing providers, generate replacements» (revoca las credenciales existentes ante sus emisores y genera otras nuevas). Para hacerlo, antes tienes que recordar todos los sitios por los que pasó esa clave.
El mismo mes en Bromure Agentic Coding
Bromure Agentic Coding ejecuta Claude Code, Codex, Grok, Kimi y omp en VM Ubuntu en tu Mac, una VM por máquina. El agente, sus repositorios y cada comando que ejecuta viven en la VM. Las credenciales reales, y el proxy por el que pasa todo el tráfico de la VM, se quedan en el Mac.
La clave vive en un solo lugar
Las claves de modelos se introducen una vez, en Preferences › Models.
Bromure las guarda en models.enc, cifrado con AES-GCM bajo una clave
maestra en el Data Protection Keychain del Mac, con la sincronización de
iCloud desactivada. La aplicación no sube, sincroniza ni copia a ningún
sitio ninguna credencial, almacén de tokens ni material de clave. Bromure
no tiene ninguna consola que guarde claves de proveedores, así que un
atacante no encuentra nada que comprometer en nuestro lado.
Dentro de cada VM, ANTHROPIC_API_KEY contiene un sustituto que empieza
por sk-ant-api03-brm-. Claude Code lo acepta, porque tiene la forma
correcta. Cuando el agente llama a api.anthropic.com, la petición sale
de la VM por el proxy de tu Mac, que pone la clave real y reenvía la
petición. El proxy añade la clave para los hosts del propio proveedor y
para ningún otro: anthropic.com para una clave de Anthropic,
openai.com para una de OpenAI, y así sucesivamente.
Si en cambio inicias sesión con una suscripción de Claude, ChatGPT, Grok o Kimi, los tokens OAuth se quedan en el Mac y es el Mac quien los renueva. La VM nunca guarda un refresh token.
El agente no puede esparcirla
Ahora repite el despliegue. El agente ejecuta la CLI de la plataforma y
define ANTHROPIC_API_KEY en el servicio, con el valor de su entorno. Ese
valor es el sustituto, y la petición que lo lleva va a la API de la
plataforma.
El proxy de Bromure examina cada petición saliente, cabeceras y cuerpo, en busca de sustitutos que van a un host para el que no se emitieron. Un sustituto de clave de Anthropic en una petición a la API de una plataforma de despliegue es uno de ellos. El proxy bloquea la petición con un HTTP 451 antes de que un solo byte llegue a la plataforma, pausa la VM y muestra This environment may have been compromised, con el nombre de la credencial, el host al que pertenece y el host al que se envió.
Creamos esa alerta para el malware que roba claves, y salta igual con un agente que intenta ayudar. Tu clave de programación no se copia a una plataforma de despliegue sin que lo veas. Si esa copia es lo que quieres, Allow la envía a ese host durante el resto de la sesión. La mejor solución es emitir para el servicio de producción una clave propia, limitada a producción, y dejar en tu Mac la clave con la que programa tu agente.
Los agentes también traen secretos en sentido contrario. railway variables o el env pull de una plataforma pueden dejar un .env de
producción en el repositorio, con valores reales incluidos. Activa
Only allow credentials Bromure injects en los Guardrails de la
máquina y cualquier petición que lleve una credencial que Bromure no puso
allí queda bloqueada y dispara la misma alerta. Una clave real que el
agente descargó de una plataforma se queda sin usar en la VM.
Bedrock sin clave que robar
Los dos casos que siguió Wiz se ejecutaban en Amazon Bedrock con credenciales empresariales de larga duración. En Bromure, cualquier agente puede ejecutarse en Bedrock, Claude Code de forma nativa y los demás a través de la API compatible con OpenAI de Bedrock, y ninguno necesita una clave de Bedrock. Deja vacío el campo Bedrock API key y el Mac firma cada petición con las credenciales de AWS de la máquina.
Esas credenciales pueden ser temporales. Elige SSO / Identity Center en las credenciales de AWS de la máquina y el Mac obtiene credenciales de rol de corta duración de tu caché de SSO, y las renueva unos cinco minutos antes de que caduquen. La VM recibe una clave secreta falsa que produce firmas que AWS rechaza; el Mac las quita y vuelve a firmar. Ninguna variable de entorno, en ningún sitio, guarda una credencial de Bedrock de larga duración que alguien pueda descifrar.
Rotar cuesta un pegado
Cuando una plataforma te dice que rotes, la clave que usan tus agentes es un solo campo. Pega la clave nueva en Preferences › Models y Bromure la aplica aproximadamente un segundo y medio después de que dejes de escribir, en cada máquina en ejecución que la usa. Cada agente cuya credencial cambió se relanza con sus opciones de reanudación, así que la conversación sigue. Las VM no se reinician, y no hay nada que editar dentro de ellas, porque nada dentro de ellas guardaba la clave antigua.
Si tus claves viven en 1Password, las demás claves de API de una máquina
pueden ser referencias op:// en lugar de valores. Bromure las resuelve
en el Mac y vuelve a resolverlas cada dos minutos, así que rotar el
elemento en 1Password llega a las máquinas en ejecución en un par de
minutos, sin reiniciar.
Tu propio registro de cada uso
El otro consejo de Northflank fue revisar los registros de uso y
facturación del proveedor en busca de actividad que no lanzaste tú. En
Bromure, cada sustitución es una fila en la Security Timeline de tu
Mac, bajo Credential brokering, con una vista previa enmascarada de la
clave y el host, como sk-a…f9q3 → api.anthropic.com. Las firmas de AWS,
Bedrock incluido, aparecen como filas Credential used con una clave de
acceso enmascarada. Cuando el panel del proveedor muestra un pico, puedes
ver qué llamadas salieron de tus propias máquinas.
En un Mac inscrito en Bromure Enterprise Manager, esas mismas
sustituciones llegan a tu organización como eventos
credential.token_swap, con vistas previas solamente, nunca la clave en
sí. Un administrador que tiene que responder «¿se ha usado alguna de
nuestras claves desde otro sitio?» tiene el lado legítimo del registro
para toda la flota.
Una copia, en el Mac
Las claves de modelos viven en models.enc, cifrado bajo una clave del Keychain, nunca sincronizado ni subido. Ninguna consola de un proveedor las guarda.
Sustitutos en la VM
La ANTHROPIC_API_KEY del agente es un sustituto. La clave real se añade en el Mac, solo para los hosts del propio proveedor.
Sin copias accidentales
Un sustituto enviado a una plataforma de despliegue se bloquea con un 451, la VM se pausa y la alerta nombra el destino.
Credenciales estrictas
Con el modo estricto activado, una clave real que el agente sacó del archivo env de una plataforma se bloquea en cuanto se usa.
Bedrock con SSO
El Mac firma las llamadas a Bedrock con credenciales de Identity Center de corta duración. Ninguna clave duradera que guardar o robar.
Rotar con un pegado
Una clave nueva en Preferences › Models llega a cada agente en ejecución en segundos. Las VM no se reinician.
Cuenta las copias
Wiz aún no sabe si un solo grupo estuvo detrás de los nueve incidentes, y la mayoría de las plataformas no ha publicado una causa raíz. Cada plataforma que guarda tu clave de IA puede perderla, y octubre demostró que los ladrones ya tienen compradores esperando.
La clave con la que programa tu agente es la que menos querrías ver en esa lista. Funciona con tus mejores modelos y tus límites más altos, y tu agente la usa todo el día. En Bromure Agentic Coding se queda en tu Mac. El agente recibe un sustituto, que ninguna otra plataforma puede usar.
Sobre la intrusión en la consola de OpenCode, una de las nueve de octubre, lee Las claves estaban en su consola. Sobre las trazas de agente robadas a Warp, lee El registro del agente estaba en su nube.