La regla y el hook leen el comando; el sandbox no lee nada: el sistema operativo simplemente no deja que el proceso escriba fuera de la carpeta ni abra la red. Pero el sandbox también falla en silencio. En esta clase pruebas, con cuatro intentos de fuga, qué aguanta en tu máquina, y ves dos trabas que no aguantaron en esta.
3Dos trabas que no aguantaron aquí: systemd --user y Claude sin socat
4Lo que el sandbox no cubre: leer fuera de la carpeta
Objetivo: probar en tu máquina que el sandbox bloquea la escritura fuera de la carpeta y la red, en vez de confiar en la flag.
01 · Cuatro intentos de fuga
Haz clic en cada sonda.
ISOLAMENTO: OK solo con escribe-fuera y red BLOQUEADOS
Haz clic en cada bloque del diagrama para ver qué hace.
Relato de fuente secundaria: Help Net Security registra sandbox y allowlist fallando en 2026 en Cursor y en Codex CLI. La conclusión práctica es probar el bloqueo, no pedir más confirmación.
02 · Ensayo: la misma prueba con cuatro trabas
Sin traba, sandbox de Codex en los perfiles :read-only y :workspace, y systemd-run con PrivateNetwork y ProtectHome. Ningún modelo.
## sem trava
escreve-dentro ABERTO
escreve-fora ABERTO
rede ABERTO
le-segredo ABERTO
aviso: lê arquivos fora da pasta; tire segredos do alcance ou corte a rede
ISOLAMENTO: FURADO (2 fuga(s))
saída: 1
## codex sandbox :read-only
escreve-dentro BLOQUEADO
escreve-fora BLOQUEADO
rede BLOQUEADO
le-segredo ABERTO
aviso: lê arquivos fora da pasta; tire segredos do alcance ou corte a rede
aviso: nem a pasta de trabalho é gravável (bom para revisar, não para executar)
ISOLAMENTO: OK
saída: 0
## codex sandbox :workspace
escreve-dentro ABERTO
escreve-fora BLOQUEADO
rede BLOQUEADO
le-segredo ABERTO
aviso: lê arquivos fora da pasta; tire segredos do alcance ou corte a rede
ISOLAMENTO: OK
saída: 0
## systemd-run PrivateNetwork + ProtectHome
escreve-dentro ABERTO
escreve-fora ABERTO
rede ABERTO
le-segredo ABERTO
aviso: lê arquivos fora da pasta; tire segredos do alcance ou corte a rede
ISOLAMENTO: FURADO (2 fuga(s))
saída: 1
codex-cli 0.163.0, systemd 255. El systemd aceptó las flags y corrió sin ellas; el journal registró "PrivateNetwork=yes is configured, but the kernel does not support or we lack privileges for network namespace, proceeding without".
En este Ubuntu, kernel.apparmor_restrict_unprivileged_userns=1 impide que el systemd del usuario cree los namespaces. Codex solo funciona aquí porque bubblewrap recibió un perfil AppArmor propio (01/10/2026). En otra máquina puede ser al revés: por eso la prueba corre en la tuya.
03 · Codex, Claude Code y qué aísla cada uno
Según la doc de cada uno, leída el 19/10/2026.
1. Codex
codex exec -s read-only o -s workspace-write corre los comandos del modelo en un sandbox (en Linux, bubblewrap con filtro seccomp, dice la doc de codex sandbox). La doc recomienda workspace-write para trabajo local sin supervisión y reserva --yolo para un runner ya aislado.
codex sandbox -P [perfil] -- [comando] corre un comando tuyo en el sandbox, sin modelo: es lo que usa el ensayo. Los perfiles :read-only y :workspace se observaron en la 0.163.0.
2. Claude Code
sandbox.enabled pone los comandos de Bash dentro de una frontera del sistema: escritura limitada y red solo por un proxy con lista de dominios. En Linux depende de bubblewrap y socat.
El sandbox cubre comandos de shell; las herramientas de archivo, MCP y los hooks corren fuera de él (doc). Para ellas, valen las reglas de la clase 4.
3. Fallar fuerte
Por defecto, si el sandbox de Claude Code no logra arrancar, corre los comandos sin sandbox. Con sandbox.failIfUnavailable: true, se niega a iniciar.
En el loop, activa failIfUnavailable: una traba ausente tiene que detener el loop, no dejarlo correr abierto.
Doc de Claude Code"By default, if the sandbox can't start because a dependency is missing or the platform is unsupported, Claude Code runs commands without sandboxing."
04 · Claude Code: sandbox con falla explícita
En esta máquina falta socat. Con failIfUnavailable, Claude Code se niega a iniciar antes de cualquier llamada al modelo (no gasta cuota).
Terminal · pedir sandbox y exigir que exista
cd /tmp/ensaio-seg/iso
claude --settings '{"sandbox":{"enabled":true,"failIfUnavailable":true}}' -p "responda só: ok" --tools ""
echo "saída: $?"
Ejemplo del repositorio
Error: sandbox required but unavailable: sandbox is enabled but dependencies are missing: socat not installed · install missing tools (e.g. apt install bubblewrap socat) or see https://code.claude.com/docs/en/sandboxing
sandbox.failIfUnavailable is set — refusing to start without a working sandbox.
saída: 1
Claude Code 2.1.303. Sin failIfUnavailable, según la doc, la misma sesión habría corrido los comandos sin sandbox.
Instala bubblewrap y socat (el propio error sugiere apt install bubblewrap socat) y corre de nuevo: la sesión arranca y responde. Después, pídele a Claude que corra las sondas de prova-isolamento.sh, una a la vez, y confirma BLOQUEADO en escreve-fora y rede.
05 · Práctica
Las cuatro trabas en tu máquina y la traba de tu loop.
E15 · Prueba de las cuatro trabas
10 min
Corre el ensayo. Anota qué trabas dieron OK en tu máquina; el resultado de systemd puede ser distinto del de aquí.
Listo cuando: "sem trava" termina en ISOLAMENTO: FURADO (2 fuga(s)) y saída: 1; "codex sandbox :workspace" en escreve-dentro ABERTO, ISOLAMENTO: OK y saída: 0.
E16 · Claude Code falla fuerte
10 min
Corre el bloque de Claude Code. Si se niega a iniciar, instala las dependencias que pide el error y corre de nuevo.
Listo cuando: sin las dependencias: refusing to start without a working sandbox y saída: 1; con ellas: saída: 0.
E17 · La traba de tu loop
10 min
Corre prova-isolamento.sh con el mismo wrapper que usa tu loop para llamar al agente (el mismo -s de Codex, el mismo systemd-run). Anota la fecha y el resultado en el mapa ("prova_isolamento"), para la clase 8.
Listo cuando:bash $P [wrapper de tu loop] --; echo $? → ISOLAMENTO: OK y 0.
06 · Prueba de la clase
Pregunta 1 de 4
systemd aceptó PrivateNetwork=yes sin error. ¿La red está cortada?competencia
Correcto
El systemd del usuario siguió sin el namespace y solo lo registró en el journal. Una flag aceptada no es una traba en pie: el intento de fuga es lo que decide.
No es esa
El systemd del usuario siguió sin el namespace y solo lo registró en el journal. Una flag aceptada no es una traba en pie: el intento de fuga es lo que decide.Repasar: Ensayo: la misma prueba con cuatro trabas
Pregunta 2 de 4
¿Qué hace Claude Code, por defecto, si el sandbox no logra arrancar?competencia
Correcto
Por defecto sigue sin sandbox. sandbox.failIfUnavailable: true hace que se niegue a iniciar, que es lo que un loop sin supervisión necesita.
En el perfil :workspace, el agente logra leer un secreto en ~/.config. ¿Qué hacer?
Correcto
Leer no filtra si no hay salida. Con la red cortada por el mismo sandbox y el secreto fuera de alcance, la tríada no se cierra.
No es esa
Leer no filtra si no hay salida. Con la red cortada por el mismo sandbox y el secreto fuera de alcance, la tríada no se cierra.Repasar: Cuatro intentos de fuga
Pregunta 4 de 4
¿Cuál es la diferencia entre el sandbox y la regla deny de la clase 4?
Correcto
find -delete, python3 -c o un script que borra pasan por una regla de texto; no pasan por un sistema de archivos de solo lectura.