← Volver a todas las publicaciones
Publicado el · por Renaud Deraison

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:

FechaPlataformaQué dice el comunicado
6 oct.Fireworks AIAcceso a credenciales; indicios de un ataque de «enjambre de agentes»
9 oct.AndromedaParte de un «ataque a todo el sector»
14 oct.ZeaburAcceso a credenciales; la empresa cierra
15 oct.Lightning AIAcceso a credenciales
16–17 oct.OpenCodeUn «sistema heredado»; claves de proveedores almacenadas expuestas
20 oct.Railway«Escalada de privilegios en nuestra infraestructura de build»
23 oct.WarpUn proveedor externo; trazas de agente sustraídas
28 oct.CommandCodeAtribuido a destilación
30 oct.NorthflankVariables 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 InvokeModel desde 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 boto3 enumeró 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.

Una clave, pegada en cada plataforma que la necesitabaTu clave de IAsk-ant-…, OpenAI,acceso a BedrockPlataforma de desplieguevariable en un servicioServicio de buildvariable en un pipelineConsola de agenteclave guardadaNotebooks con GPUvariable en un studioAtacantevariables descifradas,claves probadas enmenos de 30 minutosPool de reventa~800k y ~1,7M llamadasen dos casos Bedrock,más de 100k $ en tarifa
El Black October, según Wiz y Northflank. Los desarrolladores pegan claves de IA en las plataformas que usan, donde quedan como variables de entorno. Los atacantes que llegan a ese almacenamiento se llevan las claves, las prueban en menos de 30 minutos y venden el acceso a pools de reventa cuyo tráfico parece de agentes de programación. En los dos casos de Bedrock que siguió Wiz, eso sumó unos 2,5 millones de llamadas.

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.

Bromure: una copia real y sustitutos que no viajanVM de la máquina (Ubuntu)ANTHROPIC_API_KEY=sk-ant-api03-brm-…El agente llama al modeloen api.anthropic.comEl agente despliegapone la clave en la plataformaProxy en tu MacHost dentro del ámbito de la clavepone la clave real y reenvíaSustituto al host equivocado451, VM en pausa, la alerta nombra la fugaapi.anthropic.comrecibe la clave realPlataforma de despliegueno recibe nadamodels.enc en el Macla única copia real, cifrada, nunca sincronizada
El mismo despliegue en una máquina Bromure. El entorno del agente contiene un sustituto. Las llamadas a Anthropic reciben la clave real, puesta en el Mac. Cuando el agente intenta definir la clave en una plataforma de despliegue, el sustituto aparece en una petición al host equivocado: el proxy la bloquea con un 451, pausa la VM y nombra la fuga. La clave real se guarda una sola vez, en el Mac.

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.