Tres de cada cuatro escapes de sandbox que medí no rompen ninguna regla configurada
· 3 min de lectura
Mantengo un sandbox, tartaros (mío), así que estos tests no los escribí yo. Tomé los 168 contratos que tenía el laboratorio el 15 de octubre de 2026, todos de las suites públicas de sandbox-runtime, nono, Codex y bubblewrap, y corrí los tres primeros contra ellos.
Cada contrato tiene un ataque, un control con trabajo legítimo que tiene que seguir funcionando y un efecto que se revisa después en disco. Un ataque solo cuenta si funciona sin sandbox.
| Resultado | sandbox-runtime | nono | Codex |
|---|---|---|---|
| Contenido | 99 | 31 | 74 |
| Escapó | 22 | 33 | 24 |
| Control roto | 4 | 6 | 27 |
| No lo puede expresar | 18 | 78 | 18 |
| No prueba nada | 8 | 7 | 8 |
| No aplica en Linux / falta en el runner | 13 | 13 | 13 |
TABLA 1 · Linux 6.8, 2026-10-15. Hay resultados retenidos mientras sigue abierto un proceso de divulgación coordinada; se publicarán cuando el proveedor lo autorice. «No lo puede expresar» es una función que el sandbox no tiene.
También mandé reportes a los programas de seguridad de los vendors: 4 a sandbox-runtime (uno sigue abierto) y 2 a Codex (uno sigue abierto). Un reporte abierto queda fuera de los resultados publicados hasta que se corrige.
Casi todos los escapes son valores por defecto
De los 79 escapes, 61 prueban algo que ninguna regla configurada pedía, como proteger
.git/hooks dentro de la carpeta donde el agente puede escribir. Es el sandbox tal como viene.
13 son fallas confirmadas de una regla configurada.
De dónde salen los escapes
Escapes por sandbox, según si alguna regla configurada pedía esa protección.
FIG. 1 · 61 de los 79 escapes caen del lado del valor por defecto: el contrato prueba algo que ningún campo de la política pide. El tramo de regla configurada suma los escapes con nota de revisión (5) y los confirmados (13). Una corrida, Linux 6.8, 2026-10-15.
| Tipo de escape | sandbox-runtime | nono | Codex | Total |
|---|---|---|---|---|
| trust-handoff | 7 | 17 | 13 | 37 |
| isolation | 7 | 7 | 5 | 19 |
| filesystem | 1 | 5 | 3 | 9 |
| secrets | 2 | 0 | 1 | 3 |
| network | 5 | 0 | 0 | 5 |
| lifecycle | 0 | 3 | 2 | 5 |
| ipc | 0 | 1 | 0 | 1 |
| Total | 22 | 33 | 24 | 79 |
TABLA 2 · Los 79 escapes por categoría del laboratorio.
En un escape de trust-handoff el agente escribe un hook de git o una configuración del editor
dentro de su carpeta, y tu próximo git commit o tu editor lo ejecuta fuera del sandbox. Nueve
contratos escapan en los tres sandboxes; cinco son de trust-handoff.
Un «bloqueado» no basta
Mirando solo si el ataque falló, los tres sumarían 111, 44 y 109 «bloqueados». En Codex, 27 de los 35 de diferencia son controles rotos: el ataque falló y el trabajo legítimo también.
nono en su propio modelo
Los contratos asumen que todo se puede leer salvo lo que se niega. nono funciona al contrario: concedes el workspace y lo demás no existe, así que 62 de sus 78 «no lo puede expresar» no dicen nada de nono. En una segunda corrida reescribí 22 de esos ataques en su modelo sin cambiar lo que prueban. El resto no tiene equivalente.
| Las 22 variantes | sandbox-runtime | nono | Codex |
|---|---|---|---|
| Contenido | 21 | 17 | 18 |
| Escapó | 0 | 4 | 0 |
| Control roto | 0 | 0 | 3 |
| No prueba nada | 1 | 1 | 1 |
TABLA 3 · Segunda corrida, mismo host. Los 4 escapes de nono: sockets unix que el kernel no media y permisos que se resuelven a través de symlinks.
Después de esta corrida
landrun se sumó el mismo día: 17 de sus 38 escapes son de trust-handoff. tartaros (mío) se midió el 22 de octubre de 2026 contra 188 contratos: 150 contenidos, 3 escapes. Desde el 26 de octubre el corpus tiene 196 contratos. Los contratos, el runner y los resultados actuales están en el laboratorio.
Cómo se midió. 168 contratos (el corpus del laboratorio al 2026-10-15) contra sandbox-runtime 0.0.79, nono 0.80.0 y Codex CLI 0.162.1 en Linux 6.8. Cada ataque se corre primero sin sandbox; cada resultado no contenido se revisó a mano. Los resultados retenidos por divulgación coordinada no se cuentan.
Relacionadas
- Cómo darle permisos a un agente de código sin pasarle tus llaves Cuatro decisiones para correr Claude Code, Codex u otro agente solo: dónde escribe, qué credenciales ve, a qué dominios sale y qué deja escrito que se ejecuta después.
- Si el agente sabe de quién es el archivo, no lo toca, pero lo rodea Qué hacen Claude Code, Codex y opencode cuando el kernel les niega escribir un archivo de otro rol. Con la negación sola, dos de los tres insisten en todas las corridas. Si saben de antemano quién es el dueño, ninguno lo intenta, pero dos de los tres siguen arreglando el bug en sus propios archivos. El mensaje de seisin al negar nunca llegó a mostrarse.