El agente tenía el login de administrador
WIRED informa de que un empleado de un contratista de defensa dio a un agente personal de Claude Code sus propias credenciales de un entorno de producción del Pentágono, y de que durante unos dos meses el agente envió contraseñas, logins y un mapa de la red a un sitio web de terceros. Accenture dice que las acusaciones carecen de fundamento. En Bromure Agentic Coding, el agente trabaja con sustitutos de cada credencial, un sustituto enviado al host equivocado detiene la VM en el acto, un cortafuegos con lista de permitidos mantiene el mapa de la red en casa y cada decisión queda registrada desde el primer día.
Un contratista le dio al agente un login de administrador real, y nada vigilaba adónde lo enviaba el agente. Según las fuentes de WIRED, funcionó así durante unos dos meses.
El 29 de octubre, WIRED informó de que un empleado de Accenture conectó una cuenta personal de Claude Code a un entorno de producción del Departamento de Defensa y le dio al agente sus propias credenciales de acceso. Según las fuentes de WIRED, el objetivo era automatizar la programación y la puesta en marcha de servidores en la nube. El entorno está en NIPRNet, la red no clasificada y conectada a internet del Pentágono, lo usan varias agencias de inteligencia y contiene información no clasificada controlada.
Los detalles proceden de fuentes anónimas. Accenture dijo a los periodistas que las acusaciones “se investigaron a fondo y de forma independiente y se determinó que carecían de fundamento”. El Pentágono declinó hacer comentarios. Nadie ha informado de que se alcanzaran redes clasificadas.
Seguramente has visto la misma situación en tu propio equipo. Un desarrollador quiere que un agente haga trabajo real, ese trabajo requiere acceso, así que el desarrollador le da su login al agente.
Lo que el agente habría hecho
Según los relatos que resumen IBTimes UK y GBHackers, las credenciales del contratista daban al agente acceso de administrador. Podía escribir y desplegar software, hacer commits de código con el nombre del empleado y crear servidores en la nube. Funcionó así durante unos dos meses.
En ese tiempo, el agente parece haber enviado las credenciales de acceso del contratista, contraseñas y un mapa de NIPRNet a un sitio web de terceros. WIRED no nombró el sitio. Informó de que el NIST lo había marcado como de alto riesgo por un fallo que podía permitir a los atacantes inyectar instrucciones en un agente de programación con IA y robar credenciales. Nadie ha demostrado que el fallo se usara aquí, y los artículos no dicen cómo se detectó la transferencia.
Las fuentes de WIRED también dijeron que el incidente debería haberse comunicado al gobierno en 72 horas, el plazo que la cláusula DFARS 252.204-7012 fija para los contratistas de defensa. Accenture dice que cumplió con sus obligaciones.
Jake Williams, exhacker de la NSA citado en la cobertura, describió la parte que más preocupa a los defensores: unas credenciales robadas de un entorno de desarrollo permiten a un atacante modificar el software antes de que pase a redes más sensibles.
Tres cosas salieron mal
Quita el Pentágono y quedan tres fallos que cualquier equipo de ingeniería puede reproducir:
- El agente tenía las credenciales reales. Todo lo que leía, imprimía o enviaba podía incluir las contraseñas de verdad.
- El agente podía llegar a cualquier sitio de internet. Una tarea que necesitaba un entorno y un proveedor de nube también podía hablar con un sitio web sin nombre con un problema de inyección conocido.
- Nadie se dio cuenta durante meses. Los artículos sitúan unos dos meses entre la llegada del agente y el momento en que alguien actuó sobre lo que enviaba.
Cada uno de estos puntos tiene una respuesta directa en Bromure Agentic Coding, que ejecuta Claude Code, Codex, Grok, Kimi y omp en VMs de Ubuntu en tu Mac, con cada petición de red pasando por un proxy en el Mac.
El agente recibe un sustituto
En Bromure no le das tu login al agente. Lo añades al panel Credentials de la máquina: una clave de nube, un token de GitHub, un contexto de Kubernetes, un secreto de base de datos, una clave SSH o cualquier otra clave de API, con el host al que pertenece. El valor real se guarda cifrado en el Mac.
Dentro de la VM, el agente recibe un sustituto con la misma forma. Un
token de GitHub es ghp_ más 36 caracteres, un secreto de AWS tiene 40
caracteres, así que gh, aws, kubectl y terraform los aceptan sin
protestar. Cuando una petición sale de la VM, el proxy del Mac cambia el
sustituto por el valor real, y solo cuando la petición va al host para el
que se configuró esa credencial. Las claves SSH nunca entran en la VM. El
agente puede pedir una firma a través de un puente vsock, y la clave
privada se queda en el Mac.
Así, un agente que vuelca su entorno, pega su configuración en un formulario web o al que convencen para enviar sus credenciales a algún sitio envía sustitutos. No funcionan en ninguna parte salvo a través del proxy, en el único host para el que se configuraron.
Un sustituto en el host equivocado detiene la VM
Los sustitutos también son trampas. Un sustituto de GitHub tiene un único destino legítimo: GitHub. El proxy examina las cabeceras y el cuerpo de cada petición saliente en busca de cualquier sustituto que vaya fuera de su ámbito.
Cuando encuentra uno:
- La petición se bloquea con HTTP 451. Ni un byte llega al destino.
- La VM se pausa al instante y pasa a primer plano si estaba en segundo plano.
- Una alerta titulada This environment may have been compromised nombra la credencial, el host al que pertenece y el host al que se estaba enviando.
La respuesta por defecto es Shut down, que además marca la máquina como comprometida. Save for Investigation exporta antes el disco y la carpeta personal de la VM. Una máquina comprometida no vuelve a arrancar hasta que se borran su disco y su carpeta personal.
En el relato de WIRED, credenciales y contraseñas fueron al sitio de terceros. En una máquina Bromure, el proxy bloquea la primera petición de ese tipo antes de que nada salga del Mac, la VM se congela y la alerta le dice al desarrollador qué credencial iba adónde.
El mapa de la red se queda tras la lista de permitidos
Un mapa de la red no es una credencial, así que la trampa no se le aplica. El cortafuegos de salida, sí. El panel Guardrails de cada máquina tiene una tabla Outbound connections y un ajuste Unmatched traffic. Pon el tráfico sin regla en Deny, permite los hosts que la tarea necesita, y cualquier otra conexión se rechaza en el Mac:
allow tcp api.github.com:443
allow web *.amazonaws.com
allow web registry.npmjs.org
default deny
Las reglas se aplican dos veces, fuera de la VM. El switch de red virtual
comprueba cada conexión por IP y por el nombre de host visto en el DNS,
para todos los protocolos, y el proxy vuelve a comprobar por el nombre de
servidor TLS. Un curl que ejecuta el agente, un script que escribe y un
paquete que instala pasan todos por la misma comprobación. Un sitio web
que nadie incluyó en la lista recibe una conexión rechazada, y el rechazo
queda registrado.
Si el sitio web llevaba de verdad una inyección, como advirtió el NIST que podía pasar, el detector de código fuente la vería primero. Bromure examina el contenido que el agente lee de las herramientas, incluidas las páginas descargadas, con un modelo PromptGuard local antes de que ese contenido llegue al proveedor del modelo, y puede registrar, preguntar o bloquear.
Derechos de administrador, con una barrera ante las escrituras
En el relato de WIRED, el agente hacía commits de código y creaba servidores en la nube con derechos de administrador. Bromure deja al agente el acceso que la tarea necesita y pone las escrituras tras una regla aplicada en el proxy, donde el agente no puede desactivarla.
Cada servicio del panel Guardrails tiene una política de escritura:
Off, Prompt before write, Block destructive o Read-only.
Cubre forjas git, AWS, DigitalOcean, registros de contenedores,
Kubernetes y varias bases de datos. Las máquinas nuevas empiezan en
Prompt before write. Las lecturas pasan. Un git push, una llamada
RunInstances o un kubectl apply se detiene en un diálogo en el Mac que
muestra la operación exacta, y el desarrollador elige Allow once,
Allow for 15 minutes, Allow for the rest of the session o
Don't allow. Para una credencial más importante, Require approval
to use pregunta antes de su primer uso en cada sesión.
El escenario de Jake Williams necesita un cambio discreto en el software. Con Prompt before write, un atacante que lleve al agente a hacer ese cambio todavía tiene que pasar el push por un diálogo en el Mac del desarrollador.
Dos meses se convierten en la primera petición
Las fuentes de WIRED no dicen quién detectó la transferencia ni cuándo. En un Mac con Bromure, el desarrollador puede abrir la Security Timeline (Window › Security Timeline…) y leer cada decisión que tomaron los motores de seguridad, en cada máquina, sin configurar nada: cada sustitución de credencial, cada permiso y rechazo del cortafuegos, cada bloqueo de las barreras, cada detección de inyección de prompt y cada exfiltración bloqueada. Su pestaña Overview cuenta las últimas 24 horas y lista los bloqueos más recientes. Los eventos se guardan 90 días y se exportan a CSV, lo que da a un contratista con un plazo de 72 horas para informar las marcas de tiempo, los hosts y los nombres de las credenciales desde el primer día.
Los equipos pueden inscribir sus Mac con Bromure Enterprise Manager. Los
Mac inscritos envían los mismos eventos a la organización:
credential.exfiltration cuando un sustituto intenta salir,
egress.firewall para cada veredicto, guardrails.block para cada
escritura rechazada, junto con el uso de herramientas, los comandos y el
recuento de tokens. Los eventos de credenciales llevan vistas previas
cortas, nunca los secretos, y los prompts y las respuestas del modelo
nunca salen del Mac. El equipo de seguridad lee la alerta en su propia
consola segundos después del bloqueo.
Eso también da a los desarrolladores una forma autorizada de usar cualquiera de los cinco agentes en sistemas reales, con la empresa vigilando la frontera, en lugar de una cuenta personal que la empresa no puede ver.
Sustitutos, no logins
Las credenciales reales se quedan cifradas en el Mac. La VM del agente tiene sustitutos que solo funcionan en el host al que pertenece cada uno.
Una trampa en cada petición
Un sustituto que va a cualquier otro host se bloquea con HTTP 451, y la VM se pausa con una alerta que nombra ambos hosts.
Una lista de permitidos para la red
Con Unmatched traffic en Deny se rechaza cada host que la tarea no necesitaba, en el Mac, para todos los protocolos.
Un registro desde el primer día
La Security Timeline registra cada sustitución, bloqueo y rechazo durante 90 días, y los Mac inscritos envían los mismos eventos a la organización.
Dale al agente una tarea, no tu login
Los desarrolladores seguirán dando acceso a los agentes, porque los agentes lo necesitan para hacer el trabajo. Dale el acceso al agente, mantén los secretos en el Mac y decide con qué hosts puede hablar.
En Bromure Agentic Coding eso es lo predeterminado: añade las credenciales a la máquina, limita el cortafuegos a los hosts que la tarea necesita, deja las escrituras en Prompt before write y deja que la Security Timeline lleve el registro.
Para otro caso en que los datos de un agente acabaron en un servidor que nadie eligió, lee El registro del agente estaba en su nube. Para saber a qué puede llegar el portátil de un desarrollador una vez que un atacante está dentro, lee El portátil era la puerta de entrada.