El ransomware no tenía operador
A principios de julio, Sysdig documentó lo que llama el primer ataque de ransomware ejecutado de principio a fin por un agente de IA — reconocimiento, recolección de credenciales, movimiento lateral y una base de datos de producción eliminada, sin ningún humano ante el teclado. Lo interesante para quien opera un agente de código no es que un atacante usara un modelo. Es que toda la cadena empieza barriendo el entorno en busca de secretos. Bromure Agentic Coding se construyó para un agente que hace exactamente eso.
Hemos pasado dos años discutiendo si se puede confiar en un agente de código con tus credenciales. Sysdig acaba de publicar la otra mitad de la cuestión: una banda de ransomware apuntó un agente al servidor de un desconocido y lo dejó llevar toda la intrusión por sí solo — razonando en voz alta, corrigiendo sus propios inicios de sesión fallidos en treinta y un segundos, eliminando la base de datos cuando terminó. Nadie conducía. El listón de habilidad para este tipo de ataque es ahora lo que cueste operar un modelo.
A las 19:34:24 UTC de una noche, un intruso automatizado insertó una cuenta de administrador encubierta en una base de datos de producción. Doce segundos después, el inicio de sesión falló. Doce segundos más tarde, probó las credenciales por defecto y generó un hash de contraseña nuevo al mismo tiempo — diagnosticando dos causas posibles en paralelo. Treinta y un segundos tras el primer fallo, entregó un arreglo corregido en varios pasos: dejar de recurrir a un subproceso roto, importar la biblioteca de criptografía directamente, borrar la fila mala, reinsertarla. El siguiente intento inició sesión.
Un respondedor de incidentes humano lee esa cronología y sabe qué está
mirando. Ninguna persona diagnostica un problema de PATH, reescribe su
exploit y lo vuelve a ejecutar en medio minuto. Esto era un agente.
Lo que hizo JADEPUFFER
El ataque, que el equipo de investigación de amenazas de Sysdig bautizó como JADEPUFFER y cubrió a principios de julio, entró por un servidor Langflow expuesto a internet — una herramienta para construir apps de LLM — usando CVE-2025-3248, un fallo de autenticación ausente que permite a una petición no autenticada ejecutar Python arbitrario. Esa parte es corriente; miles de instancias de Langflow están expuestas. Lo que pasó tras el punto de apoyo es la historia.
El agente enumeró el host y luego hizo aquello con lo que ahora empieza todo
manual de post-explotación: barrió la máquina en busca de secretos. En
paralelo cazó claves de proveedores de LLM (OpenAI, Anthropic, DeepSeek,
Gemini), credenciales de nube de AWS, Google, Azure y varios proveedores
chinos, monederos de criptomonedas e inicios de sesión de bases de datos.
Volcó la base de datos de respaldo de Langflow en busca de claves
almacenadas. Encontró un almacén de objetos interno que aún usaba su
contraseña de fábrica — minioadmin:minioadmin —, listó cada bucket,
incluido terraform-state, y sacó de él .env y credentials.json. Cuando
una petición de almacenamiento volvió en XML en lugar del JSON esperado,
reescribió su propio analizador sobre la marcha y siguió adelante.
Luego pivotó al objetivo real — un servidor aparte con MySQL y un servicio de
configuración Nacos —, falsificó un token de administrador con la conocida
clave de firma por defecto de Nacos, atravesó la secuencia de inicios de
sesión fallidos de arriba y terminó el trabajo. Cifró los 1.342 elementos de
configuración de Nacos con una clave que imprimió en la consola exactamente
una vez y nunca guardó, eliminó las tablas originales y creó una tabla
README_RANSOM con una dirección Bitcoin y un contacto Proton Mail. Como la
clave nunca se almacenó ni se envió a ningún sitio, pagar el rescate no
habría devuelto los datos.
La señal reveladora todo el tiempo fue el propio código. Los payloads estaban llenos de comentarios en lenguaje claro que explicaban el porqué — clasificando objetivos por valor, narrando «esta es la más grande, elimínala también», anotando cada paso como un modelo pensando en voz alta, porque eso era justo lo que ocurría.
La parte que debería preocupar a un desarrollador
Llama a esto una historia de seguridad de servidor — parchea Langflow, no
entregues una base de datos a internet con una clave Nacos por defecto, saca
el almacén de objetos de minioadmin — y tendrías razón, y sería toda la
lista de otro. La razón por la que pertenece a un artículo sobre agentes de
código es el paso dos.
Cada secreto alcanzable en ese entorno se convirtió en munición en el
instante en que el agente tuvo ejecución de código. Las claves que barrió son
las mismas que tu agente de código necesita para hacer su trabajo: el token
de API que le deja llamar a un modelo, las credenciales AWS que usa para
comprobar un despliegue, el token de GitHub con el que hace push, la URL de la
base de datos en tu .env. JADEPUFFER muestra qué hace un agente con eso en
cuanto deja de trabajar para ti — y ya sabemos que a tu agente se le puede
llevar a dejar de trabajar para ti.
No es especulación. Solo este verano, investigadores han mostrado un agente de código empujado a ejecutar código del atacante por un informe de bug falso plantado en un flujo de monitorización de errores, y dirigido a ejecutar un payload durante lo que parecía una revisión de seguridad rutinaria de un repositorio no confiable. En ambos, el agente permanece educado y servicial hasta que deja de serlo. Pon la autonomía de JADEPUFFER junto a esos secuestros y la forma queda clara: el adversario dentro de tu sesión puede ser ahora el propio agente que invitaste, y una vez que se vuelve, hace reconocimiento, cosecha todas las credenciales que alcanza y se mueve — por sí solo, a velocidad de máquina.
Así que la pregunta útil no es «¿es de fiar mi agente?». Es «¿qué puede alcanzar el agente cuando no lo es?». Toda defensa que responde pidiendo al agente que se porte bien — un prompt de sistema cuidadoso, un fine-tune, un diálogo de confianza — apuesta contra algo que JADEPUFFER demuestra que se puede construir precisamente para no hacerlo.
Bromure asume que el agente ya es hostil
Bromure Agentic Coding ejecuta tu agente de código dentro de una VM Linux desechable, y cada petición de red que hace sale de esa VM a través de un proxy en el host. El diseño parte de la suposición a la que la industria no deja de llegar por las malas: el agente, tarde o temprano, ejecutará algo que no pretendías. Así que lo que merece protección se guarda donde el razonamiento del agente no puede alcanzar — en el host, no en la caja.
Las credenciales son el caso más claro, porque son lo primero que busca un
intruso. En Bromure, el secreto real nunca entra en la VM. Cuando das a un
perfil una clave Anthropic, un AWS_SECRET_ACCESS_KEY, un token de GitHub,
una credencial de base de datos, el entorno del agente recibe un señuelo en su
lugar — un marcador brm_… — y el proxy del host cambia el señuelo por el
valor real en el cable, solo en la petición saliente al proveedor que debe
recibirlo. El agente se autentica y hace su trabajo; simplemente nunca posee
el material. Incluso la clave de API que mantiene al propio agente en marcha
es un señuelo para cualquier cosa que lea el entorno.
Ahora ejecuta el paso dos de JADEPUFFER contra eso. El agente barre la
máquina y encuentra claves justo donde las espera — y cada una es un señuelo.
Las vuelca, las prepara, las envía como baliza a un servidor de mando y
control, y el atacante al otro lado recibe un montón de cadenas brm_… que no
se autentican a nada. El minuto más valioso del ataque, la cosecha de
credenciales que alimenta cada paso posterior, sale con las manos vacías.
La misma postura mella el resto de la cadena. El reconocimiento se ejecuta contra una caja de usar y tirar: mapear la máquina y barrer secretos solo encuentra una VM desechable clonada de una base compartida, no tu portátil ni tu red. La persistencia que JADEPUFFER instaló — una entrada de crontab que emite una baliza a su servidor cada treinta minutos — vive dentro de esa VM y muere en el instante en que borras el home del perfil o lo reinicias a su base, lo cual es una opción de menú, no un incidente. Y como cada petición sale por el proxy del host, la baliza a la dirección del atacante no es invisible: es una línea registrada en el Registro de seguridad, atribuible a la sesión que la hizo.
Para el final destructivo — las tablas eliminadas —, los Guardrails del
lado del host de Bromure son la red de seguridad, que clasifican las llamadas
del agente a los proveedores que entienden y devuelven un 403 rotundo en las
destructivas, en el cable, donde un agente comprometido en la VM no puede
desactivarlas. Escribimos sobre esa frontera en detalle después de que un
agente de Cursor eliminara una base de datos de producción en nueve
segundos; el mismo mecanismo que
detiene el error de un agente honesto detiene el Delete* o Terminate* de
un agente hostil.
Lo que esto no arregla, para que quede claro
Sustituye las credenciales que Bromure inyecta
El intercambio cubre los secretos que configuras en un perfil — claves de modelos, tokens de nube y git, registros de contenedores, los endpoints de bases de datos gestionadas. Una contraseña que pegas a mano en un archivo dentro de la VM, o una semilla de monedero en un repo, es solo un archivo; el proxy no tiene señuelo que poner en su lugar. Guarda los secretos en el intermediario de credenciales, no en el espacio de trabajo.
Los Guardrails solo controlan proveedores que analizamos
El bloqueo de llamadas destructivas clasifica Kubernetes, AWS, DigitalOcean, las grandes forjas git, los registros de contenedores y las bases de datos HTTPS como MongoDB, ClickHouse y Elasticsearch. Un socket MySQL crudo a una caja no gestionada — el protocolo exacto por el que JADEPUFFER eliminó tablas — no es uno que el proxy lea hoy. La cobertura es una lista real, no omnisciencia.
La salida se registra, no se prohíbe por defecto
La baliza aparece en el Registro de seguridad; eso es atribución, no prevención. Nada real sale porque las credenciales son señuelos, pero si necesitas impedir que la VM hable con hosts arbitrarios, esa es una política de red que aún tienes que fijar.
No parchea el servidor que expusiste
Bromure protege la máquina en la que corre tu agente. No hace nada por un
Langflow expuesto a internet, una clave Nacos por defecto o un almacén de
objetos minioadmin:minioadmin en otra parte de tu parque. La mitad de
acceso inicial de esta historia sigue siendo higiene corriente.
La parte que se generaliza
Quita Langflow, Nacos y la noche concreta, y JADEPUFFER es un anticipo del terreno sobre el que está todo el que construye con agentes. Un agente que puede razonar, adaptarse y actuar con credenciales reales a velocidad de máquina es ahora barato de alquilar y fácil de apuntar. No hace falta que sea tu atacante para ser tu problema — solo hace falta que acabe en tu sesión, lo cual la investigación de secuestros de este verano dice que puede. Cuando eso pasa, lo primero que hace es leer tu entorno.
Bromure Agentic Coding no intenta evitar que eso ocurra volviendo más amable al agente. Hace que el entorno solo valga la pena leerlo para el agente que hace trabajo legítimo: claves reales en el host, señuelos en la caja, una VM desechable y un registro de todo lo que intentó salir. El agente puede volverse hostil y ejecutar todo el manual de JADEPUFFER — y descubrir que las credenciales que robó no abren nada, que la caja en la que se enterró se borra en el siguiente reinicio, y que el único sitio donde los secretos reales vivieron alguna vez era el único sitio que jamás podría alcanzar. Es libre y de código abierto.