Seguridad del Loop Autónomo|INEMA.CLUB-PRO

Clase 6 · 20 min

Sandbox de red y de archivos

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.

Comenzar la clase
Caja de guantes de laboratorio en acrílico y acero con una placa de circuito dentro, sobre una mesa oscura.

En esta clase vas a

  1. 1Archivos y red: las dos fronteras del sandbox
  2. 2prova-isolamento.sh: cuatro sondas, un veredicto
  3. 3Dos trabas que no aguantaron aquí: systemd --user y Claude sin socat
  4. 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.

01Cuatro intentos de fuga

Haz clic en cada sonda.

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.

02Ensayo: 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.

Terminal · cuatro trabas
P=~/projetos/loop-r-eng-seguranca-v72/kit/prova-isolamento.sh
W=/tmp/ensaio-seg/iso; mkdir -p $W
echo "## sem trava"; bash $P; echo "saída: $?"
echo "## codex sandbox :read-only"; bash $P codex sandbox -P :read-only -C $W --; echo "saída: $?"
echo "## codex sandbox :workspace"; bash $P codex sandbox -P :workspace -C $W --; echo "saída: $?"
echo "## systemd-run PrivateNetwork + ProtectHome"
bash $P systemd-run --user --pipe --wait --quiet -p PrivateNetwork=yes -p ProtectHome=read-only --
echo "saída: $?"
Ejemplo del repositorio
## 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".

03Codex, 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.

04Claude 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.

05Prá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.

06Prueba de la clase

Pregunta 1 de 4

systemd aceptó PrivateNetwork=yes sin error. ¿La red está cortada?competencia

07En tres frases

Pruébalo, no confíesCuatro intentos de fuga te dicen si la traba está en pie en tu máquina.
Falla fuertefailIfUnavailable en Claude Code; -s explícito en Codex.
Leer sigue abiertoSecreto fuera de alcance y red cortada, juntos.

Para ir más allá

Clase anteriorSiguiente clase