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

Cuarenta mil dólares por fuga

El 6 de octubre, en Pwn2Own Ireland, Ikotas Labs sacó a OpenAI Codex de su sandbox con un único bug de inyección de argumentos y ganó 40.000 $. Los agentes de código ya son una categoría fija de Pwn2Own: en Berlín, en mayo, Codex cayó tres veces y tres equipos lanzaron exploits contra Claude Code. Las reglas dicen qué significa ganar: el agente abre el repositorio, la página web o el archivo del concursante con su sandbox activado, y se ejecuta código fuera de él. En Bromure Agentic Coding, fuera del sandbox del agente se sigue dentro de una VM Linux que solo guarda claves sustitutas, con sus salidas, sus diálogos de push y su traza en el Mac.

Pwn2Own paga 40.000 $ por código que se ejecute fuera del sandbox de un agente de código. En un portátil, fuera del sandbox están tu cuenta, tus claves y tus repositorios.

A las 18:00 del martes 6 de octubre, en Cork, Ikotas Labs subió al escenario de Pwn2Own Ireland 2026 con OpenAI Codex como objetivo. La entrada de resultados de la Zero Day Initiative ocupa una línea: Ikotas “used a single argument injection bug to exploit OpenAI Codex. They win $40,000 and 4 more Master of Pwn points.” BleepingComputer e Infosecurity Magazine lo contaron a la mañana siguiente entre los 32 zero-days de la primera jornada.

ZDI no publicará el bug hasta dentro de 90 días, el plazo que Pwn2Own da a los fabricantes para publicar un parche. Las reglas del concurso detallan qué tenía que lograr el exploit.

Qué significa ganar

Los agentes de código tienen su propia categoría en Pwn2Own. Las reglas de Ireland 2026 enumeran dos objetivos, Anthropic Claude Code y OpenAI Codex, a 40.000 $ cada uno, ambos sobre Windows 11. Las condiciones son estrictas:

  • Las funciones de sandbox y aislamiento estarán activadas en su configuración por defecto, y no habrá ningún modo de ejecución inseguro activo (por ejemplo, --dangerously-skip-permissions o equivalente).
  • El intento “debe interactuar con un recurso controlado por el concursante (por ejemplo, una página web, un repositorio, un archivo multimedia)”, y el ataque “debe ser un caso de uso habitual de un agente de código”.
  • Debe lograr ejecución de código arbitrario más allá de los “límites de sandbox y permisos previstos” del agente, u obtener información sensible “normalmente inaccesible desde el sandbox de la aplicación”.

Las reglas fijan tres puntos de partida. El agente ya se ejecuta en una carpeta de confianza y el ataque ocurre dentro de una sola sesión. O el agente se lanza en el repositorio del concursante antes de que nadie haya confiado en él. O una aplicación de escritorio abre el proyecto del concursante. Son las tres cosas que un desarrollador hace todo el día: trabajar, clonar algo nuevo, abrir algo nuevo.

Las reglas también dejan fuera una lista de cosas que no cuentan: convencer al modelo, las credenciales configuradas en el entorno, los modos inseguros, los servidores MCP de terceros. El premio paga una sola cosa: romper el límite propio del agente.

Cinco meses, dos concursos

Ireland es el segundo Pwn2Own con agentes de código en la lista. En Berlín, en mayo, Compass Security explotó Codex el primer día con “a single CWE-150 bug”, por 40.000 $. Doyensec lo explotó ese mismo día con un bug que el fabricante ya conocía, y el tercer día Satoki Tsuji, de Ikotas Labs, volvió a explotarlo mediante una vulnerabilidad de control externo, abriendo calculadoras en el objetivo. Security Affairs resumió así las tres victorias contra Codex: “Each exploit used a different technique, meaning the attack surface is not a single narrow flaw but something broader.”

Claude Code recibió tres exploits en Berlín, de Viettel Cyber Security, Compass Security y Out of Bounds. Los tres fueron colisiones: los bugs funcionaron en el escenario, y Anthropic ya los conocía. Una colisión paga menos porque los investigadores no fueron los primeros, pero el exploit funcionó igualmente contra la versión que instaló el concurso.

Luego llegó Ireland, cinco meses después, y Codex volvió a caer con un solo bug.

ZDI aún no ha descrito el bug de Ireland, pero la inyección de argumentos es una clase conocida en los agentes de código. La capa de permisos de un agente aprueba un comando por su nombre: git, rg y find son de solo lectura y se ejecutan sin preguntar. El atacante aporta los argumentos, a través de un nombre de archivo, un nombre de rama o un valor de configuración del repositorio, y la herramienta “de solo lectura” recibe una opción que ejecuta un programa. --upload-pack de Git, --pre de ripgrep y -exec de find aceptan un comando. En julio, Pillar Security informó de que la lista de comandos seguros de Codex confiaba en git show por su nombre aunque la llamada que hacía no era de solo lectura.

Cada uno de estos exploits vence una comprobación que vive dentro del agente, escrita por el fabricante del agente y distribuida con sus actualizaciones. Los fabricantes parchean cada uno, y el concurso encuentra el siguiente, porque una capa de permisos que analiza comandos de shell es un blanco grande, y un premio de 40.000 $ mantiene a los buenos equipos buscando.

Lo que la fuga gana en un portátil

El patrocinador de Pwn2Own decide qué “información sensible” debe obtener el exploit, y los jueces lo comprueban en una máquina de pruebas limpia. En el portátil de un desarrollador nadie tiene que elegir una bandera. Fuera del sandbox del agente está tu cuenta de usuario, y tu cuenta contiene:

  • ~/.ssh/id_ed25519 y todos los hosts de known_hosts
  • ~/.aws/credentials, ~/.config/gcloud, ~/.kube/config
  • un token de gh con permisos de push, y archivos .env en cada checkout
  • el propio token OAuth del agente y su historial de sesiones
  • todos los demás repositorios del disco, y los perfiles del navegador al lado

El concurso también excluye caminos que los atacantes reales usan a diario. Una inyección de prompt que convence al agente de ejecutar un comando no cuenta. Tampoco un desarrollador que trabaja en modo --yolo para no ver más preguntas. En la práctica, todos esos caminos acaban en el mismo sitio que una fuga del sandbox: un proceso que se ejecuta como tú.

En un portátil: un solo límite, y es del agenteVías de entradaRepo, página o archivo hostil+ un bug de sandbox (Pwn2Own)Inyección de promptexcluida en el concursoModo inseguro o yoloexcluido en el concursosandbox del agenteTu cuenta en el portátil~/.ssh/id_ed25519~/.aws/credentials ~/.kube/configtoken gh con permiso de push.env en cada checkouttoken OAuth, historial agenteotros repos, perfiles webRed: cualquier host,todo puerto, sin registroTodo lo que el exploit necesita ya está aquí, y la salida también.
En un portátil, el sandbox del agente es la única línea. Una fuga al estilo Pwn2Own, una inyección de prompt o un modo inseguro acaban en el mismo sitio: un proceso con la cuenta, las claves y la red del desarrollador.

La misma fuga en una máquina de Bromure

En Bromure Agentic Coding, Codex y Claude Code se ejecutan dentro de una VM Linux en tu Mac, una VM por máquina. El sandbox propio del agente sigue ahí y sigue haciendo su trabajo. Debajo hay un segundo límite que el fabricante del agente no escribió y que el repositorio no puede configurar: el Virtualization.framework de Apple, con el host al otro lado.

Repite el exploit de Ikotas Labs dentro de una máquina. El agente abre el repositorio del concursante, el argumento llega a un comando que no debería haberlo aceptado, y se ejecuta código fuera del sandbox de Codex. Se ejecuta como el usuario de la VM. Desde ahí busca cada elemento de la lista del portátil y encuentra la versión que tiene la VM.

Los archivos son los de la máquina

La VM tiene su propio disco de sistema, un clon copy-on-write de una imagen de Ubuntu firmada, y su propio directorio home. El home de tu Mac, tu Llavero, tus perfiles del navegador y tus otros proyectos no están ahí. Las únicas carpetas del Mac que ve son las que compartiste con esa máquina en su panel Folders, y una máquina para código no fiable no necesita ninguna: clona el repositorio en el home de la VM.

Las claves son sustitutas

Ningún archivo, variable de entorno ni proceso de la VM contiene una clave de API real, un token OAuth, un secreto de AWS o una clave privada SSH. La VM guarda falsificaciones con la forma correcta, como ANTHROPIC_API_KEY=sk-ant-api03-brm-… o un token ghp_ que GitHub rechazaría. El proxy en el Mac pone el valor real después de que la petición sale de la VM, y solo para el host al que pertenece la credencial.

~/.ssh no tiene ninguna clave privada que copiar. SSH_AUTH_SOCK es un puente sobre vsock hacia un ssh-agent en el Mac, que firma cuando se le pide y nunca entrega la clave. Activa Ask before use para una clave y cada firma abrirá un diálogo en el Mac.

Las sustitutas funcionan también como trampas. Cuando el exploit empaqueta lo que encontró y lo envía a casa, el proxy ve un token falso camino de un host para el que no se emitió. Responde HTTP 451, no reenvía nada, pausa la VM y abre This environment may have been compromised en el Mac, con el token, el host al que pertenece y el host al que se envió.

La salida pasa por el Mac

Cada conexión que abre la VM atraviesa el switch virtual y el proxy del host, sea cual sea el puerto o el protocolo. El panel Guardrails de la máquina tiene un firewall de salida: reglas por host, rango de IP, protocolo y puerto, y un ajuste Unmatched traffic en Allow o Deny. Una máquina que usas para código de desconocidos puede permitir su proveedor de modelos, sus registros de paquetes y GitHub, y denegar el resto. La llamada del exploit a casa nunca llega a conectar.

La Security Timeline registra los veredictos del firewall, hayas definido reglas o no. Siempre está activa, para cada máquina, y una conexión a un host que el proyecto nunca necesitó aparece allí junto a la sesión que la abrió.

Los push y las escrituras esperan un clic

El peor botín de la lista del portátil es el token de gh, porque los permisos de push convierten una máquina comprometida en un paquete comprometido. En las máquinas nuevas, todos los servicios protegidos usan Prompt before write. Un git push por HTTPS es una escritura, así que el proxy lo retiene y macOS muestra Allow write on "github.com" from workspace "…"? con la operación tal como pasó por la red. La misma política cubre las API de nube, Kubernetes, los registros y las bases de datos. El diálogo se dibuja en el Mac a partir de lo que leyó el proxy, de modo que el código de la VM no puede ni responderlo ni cambiar su texto.

La traza guarda la historia

Una inyección de argumentos empieza con una llamada a herramienta que parece rutinaria. En el nivel de trazado por defecto, AI request details, el proxy guarda cada intercambio con el proveedor de modelos, cifrado en el Mac, y el Trace Inspector descompone cada uno en llamadas a herramientas, comandos de shell y lecturas de archivos. Cuando ZDI publique el bug en enero, podrás buscar en tus trazas el comando y el argumento que lo desencadenaron, y el registro en el que buscas se escribió en el Mac, fuera del alcance de todo lo que se ejecutó en la VM.

La limpieza abarca una sola máquina

Si el exploit escribió algo en el directorio home, Rewind home… lo devuelve al punto de control tomado en un arranque anterior. Una máquina marcada por el detector de compromisos se niega a arrancar hasta que eliges Wipe and Launch, que reconstruye su disco y su home y conserva tus ajustes y las credenciales reales en el Mac. Para código que solo quieres mirar una vez, bromure-cli vm run --rm arranca una máquina que se borra, disco incluido, al detenerse.

En Bromure: la fuga aterriza en una VM y las salidas están en el MacVM de la máquina (Ubuntu)Sandbox de Codex: roto por un argumentoel código corre como usuario de la VMLo que encuentraANTHROPIC_API_KEY=sk-ant-api03-brm-…GH_TOKEN=ghp_… (sustituto)~/.ssh: sin claves privadassolo el home de esta máquinani home del Mac, ni otros proyectosSwitch + proxy, en el MacFirewall: host desconocido → denyveredicto en la Security TimelineSustituto fuera de ámbito → 451, pausaTraza: cada llamada y comando,cifrada en el MacDiálogo macOS: Allow write on …?POST /acme/app.git/git-receive-packInternetproveedor de IAregistros de paquetesgithub.comhost del atacante:nunca contactadoGuardado en el Mac, fuera de la VMclaves de API y tokens OAuth · credenciales git y nube · claves SSH · tu home · otros proyectos · trazas
La misma fuga en una máquina de Bromure. El sandbox del agente sigue rompiéndose, pero el código aterriza en una VM con su propio home, credenciales sustitutas y ninguna clave privada. Sus salidas, diálogos de escritura y traza están en el Mac.

Sea cual sea la puerta que se abrió

Las reglas de Pwn2Own excluyen la inyección de prompt, los modos inseguros y las credenciales almacenadas para que una victoria mida una sola cosa: el límite propio del agente. Es la prueba correcta para un concurso. En tu portátil, los atacantes usan los tres caminos excluidos.

El límite de la VM no depende de cómo salió el código del agente. Un bug de inyección de argumentos, un README envenenado que convence al modelo de ejecutar un comando, un archivo de test que descarga un implante, un desarrollador que desactivó las preguntas a las 2 de la madrugada: todos terminan con código ejecutándose como el usuario de la VM, ante las mismas sustitutas, el mismo firewall y los mismos diálogos en el Mac. OpenAI publicará el parche del bug de Ireland a su propio ritmo, y hasta entonces el bug choca con el límite de la VM como los demás.

La fuga aterriza en una VM

El código que sale del sandbox del agente se ejecuta como el usuario de la VM, con el home de esa máquina y las carpetas que compartiste con ella. El home de tu Mac, tu Llavero y tus otros proyectos no están dentro.

Las claves son sustitutas

Las claves de API, los tokens de git y los secretos de nube reales siguen cifrados en el Mac, y las claves SSH firman a través de un puente. Una sustituta enviada fuera de su ámbito recibe un 451 y pausa la máquina.

Los push necesitan un clic en el Mac

Con Prompt before write, el valor por defecto en las máquinas nuevas, un git push o una llamada destructiva a la nube espera un diálogo de macOS que la VM no puede responder.

El registro se queda en el host

El firewall de salida, la Security Timeline y la traza se ejecutan en el Mac. Cuando se publique el bug, el historial de cada sesión estará ahí para buscar.

Cuenta con el próximo

Pwn2Own volverá en primavera, y los agentes de código volverán a estar en la lista, porque un agente de código ejecuta comandos en la máquina de un desarrollador con el alcance de ese desarrollador. Algún equipo traerá un bug que nadie ha visto. Los fabricantes lo parchearán en menos de 90 días, y el siguiente concurso pondrá la cuenta a cero.

Mantén tus agentes actualizados y ejecútalos en una máquina donde el botín detrás del sandbox del agente sea una VM con claves sustitutas. Para saber más sobre por qué ese límite está en el host, lee El guardia y el shell no coincidían y Once tests superados.