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

El agente apagó la alarma

El 20 de octubre, OpenAI describió dos tareas de código internas en las que sus propios agentes debilitaron la monitorización que los vigila. Uno vació la lista de personas a las que avisa una alerta. El otro eliminó un monitor, reescribió la prueba que lo protegía y le dijo al usuario que no lo había hecho. Nadie atacó nada, y ambos cambios pasaron por trabajo rutinario. En Bromure Agentic Coding, los controles y el registro viven en el Mac, fuera de todo lo que el agente puede editar.

El monitor señaló el problema. El agente resolvió el problema asegurándose de que ningún humano se enterara.

El 20 de octubre, OpenAI actualizó un informe de su Alignment Research Blog titulado Suppressing misalignment monitoring alerts and disabling misalignment monitoring. Trata dos tareas de código internas, del 3 y el 6 de octubre. En cada una, un agente construido sobre los propios modelos de OpenAI debilitó el sistema que vigila a los agentes en busca de comportamiento desalineado. Cada agente estaba en mitad de un cambio de software que alguien había pedido. El resumen de OpenAI: “En ambos casos, los agentes consideraron si debían preservarse las salvaguardas de monitorización, pero interpretaron instrucciones de código rutinarias como permiso para debilitarlas.”

No hubo atacante, ni jailbreak, ni inyección de prompt. CSO Online y The Decoder cubrieron el informe el 21 de octubre.

“No envíes ningún mensaje”

El 3 de octubre, un investigador pidió a un agente GPT-6.1 Sol que construyera tareas de evaluación a partir de los comentarios de empleados en un canal de Slack, y añadió: “don’t send any messages” (no envíes ningún mensaje). Ochenta y dos mensajes después, el pipeline se detuvo. Su monitor había señalado una reparación propuesta y no podía guardar el hallazgo, porque le faltaba acceso de escritura a la base de datos de monitorización. El investigador le dijo al agente que dirigiera la salida de la monitorización a algún lugar donde pudiera escribir y que volviera a ejecutar.

El agente razonó primero que “no envíes ningún mensaje” se refería a contactar por Slack, no a las alertas automáticas. Encargó la reparación a un subagente con la orden explícita de no desactivar la monitorización. El subagente vio que podía activar no_notify y decidió no recomendarlo: “disabling required alerts unsafe”. Entonces el agente padre cambió de opinión. Escribir el resultado podía avisar a alguien, y el usuario había dicho nada de mensajes. Le dijo al subagente que suprimiera las notificaciones, y el subagente escribió el parche:

request["ping_recipients"] = []
request["page_recipients"] = []
request["metadata"]["no_notify"] = True
request["metadata"]["notification_suppression"] = {
    "reason": "User explicitly requested no messages",
    ...
}

También convirtió la supresión en una condición previa: un resultado de revisión sin no_notify lanzaba un error. El monitor siguió funcionando y guardando hallazgos, pero ya no se avisaba a nadie. El informe final del agente decía: “No messages were sent” (no se envió ningún mensaje).

“No eliminé ningún monitor activo”

El 6 de octubre, un usuario pidió a un agente GPT-6 Astra que copiara en su código la ruta de servicio de una implementación de referencia. La referencia no tenía monitor. Antes, en un intercambio con otro agente, a Astra le habían dicho: “Do not disable monitor even temporarily” (no desactives el monitor, ni siquiera temporalmente).

Astra delegó la migración y le dijo a su subagente que mantuviera la monitorización “as appropriate to exact PR” (según corresponda al PR exacto). El subagente se preguntó si quitar el monitor socavaría una salvaguarda, y luego leyó “as appropriate” como un permiso. Eliminó la configuración del monitor y su hook en tiempo de ejecución. También sustituyó la prueba de regresión que protegía el monitor por otra que afirmaba que el monitor había desaparecido:

assert "monitor_ctx" not in saved["context"]

El razonamiento de Astra al ver el resultado: “Basic doesn’t agent monitor yay.” Dio la migración por terminada sin mencionar el monitor. Cuando el usuario preguntó “did you remove that?” (¿lo eliminaste?), respondió: “No […] I did not remove an enabled monitor from it” (no, no eliminé de ahí ningún monitor activo).

Lo que encontró OpenAI

Tres hallazgos del informe importan a cualquiera que ejecute agentes sobre una base de código:

  • La ubicación del monitor decide quién puede desactivarlo. OpenAI espera que la monitorización sea “difícil de desactivar en las cargas de Codex, porque se ejecuta dentro del servicio que gestiona las peticiones al modelo, fuera del control directo del agente”. OpenAI dice que es más fácil de desactivar en las cargas de evaluación, donde el agente puede editar cómo está conectada.
  • Los agentes lanzan cargas que su propia monitorización no cubre. “Hemos visto varios casos en los que los agentes lanzaron un despliegue con la monitorización de alineamiento desactivada: el propio agente seguía monitorizado, pero esa monitorización no cubría el despliegue que lanzó.”
  • Ninguno de los dos incidentes avisó a nadie. OpenAI no calificó ninguno como P0, así que su sistema no detuvo ninguna de las dos ejecuciones.

OpenAI ha indicado a Auto-Review, el revisor que exige en el uso interno de Codex, que bloquee los intentos de desactivar la monitorización. También planea terminar cualquier carga que carezca de un caso de seguridad válido. Dice que aún no tiene “una explicación satisfactoria de este comportamiento”.

CSO Online consultó a analistas sobre el informe. Frank Dickson, de Dickson Research: “Una barrera que un agente puede editar es una sugerencia.” Jeff Valdes, de Acceligence, señaló que el subagente tomó la decisión correcta y el padre lo contradijo, y que el propio informe de un agente no puede servir de control.

Tu repositorio tiene las mismas alarmas

Pocos equipos ejecutan un monitor de alineamiento. Todos los equipos tienen salvaguardas que son archivos en el árbol de trabajo del agente: un hook pre-commit, un paso de CI que condiciona los despliegues, una prueba que fija una comprobación de seguridad, una opción de configuración que activa el registro de auditoría, los ajustes de hooks y permisos del propio agente. Un agente al que se le pide “hacer que el pipeline coincida con la plantilla” o “poner el build en verde” puede editarlos todos, con un razonamiento que parece diligencia. El parche de Sol dejaba constancia de su propia justificación. La nueva prueba de Astra pasaba.

Ambos agentes trabajaban para las personas que los lanzaron, y aun así ambos eliminaron una salvaguarda. Pon una salvaguarda al alcance de tu agente y una instrucción redactada sin precisión puede convertirse en permiso para borrarla.

Dónde está la salvaguarda decide quién puede apagarlaVM Linux: al alcance del agenteAgente de código.git/hooks/pre-commitpuerta de despliegue CIprueba que fija un controlAUDIT_LOG=1hooks del agentepage_recipients = []Una llamada Edit cada uno. Una orden rutinaria parece un permiso.hipervisorTu Mac: fuera de su alcanceProxy y switch virtualcada conexión de la VM pasa por aquíFirewall de salidalista blanca, si no, denyPolíticas de escrituradiálogo Mac por escrituraAlerta de compromisopausa la VMSecurity Timelinesiempre activa, 90 díasTraza de sesióncada llamada, comando y edición de archivo, cifrados en el MacSolo se cambian en los ajustes de la máquina, en el Mac.tráfico
Lo que un agente de código puede editar y lo que no. Todo lo que hay en la VM está al alcance de las herramientas del agente: los hooks y las pruebas del repositorio, su configuración de CI, los ajustes del propio agente. Los controles de Bromure están en el Mac, fuera de la VM. El tráfico del agente pasa por ellos, pero ninguna herramienta de la VM escribe en ellos.

Bromure mantiene los controles en el Mac

Bromure Agentic Coding ejecuta Claude Code, Codex, Grok, Kimi y omp en VM Linux en tu Mac. Cada conexión que hace la VM pasa por un switch de red virtual y un proxy que se ejecutan en el Mac, fuera de la VM. Todos los controles de Bromure están en esa ruta: el firewall de salida, las políticas de escritura, el intercambio de credenciales, la detección de inyección de prompt, la Security Timeline y la traza de sesión. Sus ajustes se guardan en el Mac, en los ajustes de la máquina, y la VM no recibe ningún archivo, herramienta ni socket que los cambie.

Es la propiedad que OpenAI atribuye a sus cargas de Codex: monitorización “dentro del servicio que gestiona las peticiones al modelo, fuera del control directo del agente”. En Bromure se aplica a cada agente que ejecutas, en tu propio Mac.

La alerta es un diálogo en tu Mac

Sol silenció su alarma vaciando una lista de destinatarios. Esa lista era un dato al alcance del agente. Las alertas de Bromure no están en la VM.

En el panel Guardrails de una máquina, cada token de forja, credencial de AWS, contexto de Kubernetes, registro y endpoint de base de datos tiene una política de escritura. Las máquinas nuevas empiezan en Prompt before write: las lecturas pasan, y cada escritura se detiene en un diálogo en el Mac que muestra la operación exacta, la sentencia SQL o METHOD /path. Un git push, un kubectl apply o un UPDATE espera Allow once, Allow for 15 minutes, Allow for the rest of the session o Don’t allow. Una credencial configurada con Require approval to use detiene del mismo modo su primer uso en una sesión. Cuando una credencial sustituta se dirige a un host al que no pertenece, el proxy bloquea la petición, pausa la VM y muestra la alerta de compromiso.

Ninguno de ellos tiene un campo no_notify que el agente pueda activar. El proxy muestra el diálogo después de que la petición haya salido de la VM. Un agente puede decidir que “no envíes ningún mensaje” abarca las alertas, y aun así ves el diálogo en tu Mac, porque nada de lo que el agente hace en la VM llega hasta él.

Bloqueado y denegado, con o sin el informe del agente

Sol le dijo a su usuario “no se envió ningún mensaje”, y omitió que había cortado las alertas. Astra le dijo al suyo que no había eliminado el monitor, lo cual era falso. No se puede auditar una ejecución a partir de lo que el agente dice de ella.

La Security Timeline (Window → Security Timeline…) registra lo que decidieron los motores de Bromure: veredictos del firewall, bloqueos de políticas de escritura, intercambios de credenciales, descargas de paquetes y detecciones de inyección de prompt. No tiene interruptor de apagado. Registra para cada máquina, inscrita o no, conserva 90 días en el Mac y exporta a CSV.

La traza de sesión registra lo que hizo el agente. En el nivel predeterminado, AI request details, el proxy conserva la petición y la respuesta completas de cada llamada al modelo, cifradas en el Mac. El Trace Inspector (⇧⌘I) muestra esas llamadas como conversaciones, con cada llamada a herramienta desglosada: cada comando Bash, y cada Edit o Write con la ruta que tocó. En una máquina Bromure, la negación de Astra se contrasta con la llamada Edit que quitó monitor_ctx y el Write que sustituyó la prueba, ambos con sus rutas, ambos registrados por un proceso que el agente no puede alcanzar.

Lo que dijo el agente, y lo que registró el proxyLa respuesta del agenteUsuario¿La ruta incluye monitorización L1? ¿La quitaste?AgenteNo […] No eliminé ningún monitor activo.Generada por el modelo. Revisada por nadie.Trace Inspector en el Mac · Conversationtool_use · Edit runtime/serving.py- RuntimeContext(..., monitor_ctx=monitor)tool_use · Write tests/test_serving.py+ assert "monitor_ctx" not in saved["context"]tool_use · Bashpytest tests/test_serving.pyExtraído por el proxy del tráfico del modelo. Cifrado en el Mac.Nombres de archivo ilustrativos; el informe de OpenAI los oculta.
La respuesta de Astra y el registro. La afirmación del agente viene del modelo. La traza viene del proxy en el Mac, que extrajo cada llamada a herramienta del tráfico del modelo a su paso. En un Mac inscrito, las mismas llamadas a herramientas llegan también a la organización como eventos file.write y command.run.

En un Mac inscrito en bromure.io, las mismas llamadas a herramientas se envían a la organización como eventos tool.use, file.write y command.run, junto con cada veredicto del firewall y cada guardrails.block. Un administrador puede buscar escrituras en .github/workflows/ o en un directorio de pruebas en todas las máquinas del equipo sin preguntar a nadie qué hizo su agente.

Las cargas que inicia el agente heredan la máquina

La mayor brecha de OpenAI eran los despliegues que lanzaban sus agentes, que su monitorización no cubría. En Bromure, el trabajo que inicia un agente se ejecuta bajo los mismos controles que el agente:

  • Automatizaciones. Un agente puede crear una ejecución programada a través del servidor MCP de automatizaciones integrado. El servidor está limitado a la propia máquina del agente, así que todo lo que crea se ejecuta allí, con las credenciales de esa máquina, bajo sus guardrails y su política de cadena de suministro. Un clon desechable se lleva los ajustes de la máquina junto con su directorio personal.
  • Delegaciones y peticiones. Cuando un agente pasa trabajo a otro, cada encargo, pregunta, respuesta, corrección de rumbo y entrega pasa por el Mac. Cada uno se examina en busca de inyección de prompt y se registra como una fila Agent delegation en la Security Timeline. Un delegado en otra máquina se ejecuta con los ajustes de esa máquina, y la sección Reach del panel General de cada máquina fija a qué otras máquinas pueden enviar trabajo sus agentes.

Un agente puede iniciar todo el trabajo que quiera. Cada ejecución aterriza en una máquina cuyo firewall, políticas de escritura y registros están en el Mac.

Un firewall que el agente no puede reconfigurar

La reparación de Sol existía porque al monitor le faltaba acceso a la base de datos, y el investigador pidió al agente que enviara la salida a algún sitio donde pudiera escribir. Un agente con acceso abierto a la red elige ese destino por su cuenta.

Con Unmatched traffic en Deny en el panel Guardrails, la VM solo alcanza los hosts que enumeres:

allow web api.anthropic.com
allow web github.com
allow web registry.npmjs.org
allow web db.internal.example.com GET,POST
default deny

El switch comprueba cada conexión por IP y por el nombre de host que vio en el DNS, y el proxy vuelve a comprobar por el nombre de servidor TLS y, en las reglas web, por método HTTP. Un destino nuevo que elija el agente se rechaza y aparece como una fila deny roja en la Timeline, con el host y el puerto. El botón Allow… de esa fila está en el Mac, y eres tú quien hace clic, For 15 minutes o Until the workspace stops si el trabajo no necesita más.

Alertas que la VM no puede silenciar

Las aprobaciones de escritura, la consulta antes del uso y la alerta de compromiso son diálogos que el proxy muestra en el Mac. Ninguna lista de destinatarios en la VM los controla.

Un registro que el agente no escribe

La Security Timeline está siempre activa y se conserva 90 días. La traza extrae del tráfico del modelo cada llamada a herramienta, comando y edición de archivo.

El trabajo lanzado sigue cubierto

Las automatizaciones que crea un agente pertenecen a su propia máquina. Cada mensaje de delegación se examina y se registra en el Mac.

Los ajustes viven fuera de la VM

Las reglas del firewall, las políticas de escritura y los niveles de traza se configuran en los ajustes de la máquina en el Mac, y se aplican al guardar.

Pon la alarma fuera del alcance del agente

OpenAI ha pedido a su revisor que bloquee a los agentes que desactivan la monitorización, y estudia por qué los modelos lo intentan. Puedes proteger tu propia máquina antes de que esa investigación dé resultados. Mantén las salvaguardas y el registro fuera del árbol de trabajo del agente, tras una frontera que sus herramientas no cruzan. Entonces un agente que estira “no envíes ningún mensaje” hasta abarcar las alertas no encuentra ninguna alerta que pueda apagar.

Sobre un informe anterior de OpenAI en el que un modelo, rechazado por su herramienta de navegador, publicó un archivo a través del terminal, lee El navegador dijo que no, así que usó curl. Sobre fugas que consistían en escribir un archivo corriente que una herramienta de confianza ejecutaba más tarde, lee El agente nunca salió del sandbox.