Segurança do Loop Autônomo|INEMA.CLUB-PRO

Aula 6 · 20 min

Sandbox de rede e de arquivos

Regra e hook leem o comando; o sandbox não lê nada: o sistema operacional simplesmente não deixa o processo escrever fora da pasta nem abrir a rede. Mas sandbox também falha em silêncio. Nesta aula você prova, com quatro tentativas de fuga, o que segura na sua máquina, e vê duas travas que não seguraram nesta.

Começar a aula
Caixa de luvas de laboratório em acrílico e aço com uma placa de circuito dentro, sobre bancada escura.

Nesta aula você vai

  1. 1Arquivos e rede: as duas fronteiras do sandbox
  2. 2prova-isolamento.sh: quatro sondas, um veredito
  3. 3Duas travas que não seguraram aqui: systemd --user e Claude sem socat
  4. 4O que o sandbox não cobre: ler fora da pasta

Objetivo: provar na sua máquina que o sandbox bloqueia escrita fora da pasta e rede, em vez de confiar na flag.

01Quatro tentativas de fuga

Clique em cada sonda.

Clique em cada bloco do diagrama para ver o que ele faz.

Relato de fonte secundária: a Help Net Security registra sandbox e allowlist falhando em 2026 no Cursor e no Codex CLI. A conclusão prática é provar a trava, não pedir mais confirmação.

02Ensaio: a mesma prova com quatro travas

Sem trava, sandbox do Codex nos perfis :read-only e :workspace, e systemd-run com PrivateNetwork e ProtectHome. Nenhum modelo.

Terminal · quatro travas
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: $?"
Exemplo do repositório
## 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. O systemd aceitou as flags e rodou sem elas; o journal registrou "PrivateNetwork=yes is configured, but the kernel does not support or we lack privileges for network namespace, proceeding without".

03Codex, Claude Code e o que cada um isola

Pela doc de cada um, lida em 19/10/2026.

1. Codex

codex exec -s read-only ou -s workspace-write roda os comandos do modelo num sandbox (no Linux, bubblewrap com filtro seccomp, diz a doc do codex sandbox). A doc recomenda workspace-write para trabalho local sem supervisão e reserva o --yolo para runner já isolado.

codex sandbox -P [perfil] -- [comando] roda um comando seu no sandbox, sem modelo: é o que o ensaio usa. Os perfis :read-only e :workspace foram observados no 0.163.0.

04Claude Code: sandbox com falha explícita

Nesta máquina falta o socat. Com failIfUnavailable, o Claude Code recusa iniciar antes de qualquer chamada ao modelo (não gasta cota).

Terminal · pedir sandbox e exigir que exista
cd /tmp/ensaio-seg/iso
claude --settings '{"sandbox":{"enabled":true,"failIfUnavailable":true}}' -p "responda só: ok" --tools ""
echo "saída: $?"
Exemplo do repositório
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. Sem o failIfUnavailable, pela doc, a mesma sessão teria rodado os comandos sem sandbox.

05Prática

As quatro travas na sua máquina e a trava do seu loop.

E15 · Prova das quatro travas

10 min

Rode o ensaio. Anote quais travas deram OK na sua máquina; o resultado do systemd pode ser diferente do daqui.

Pronto quando: "sem trava" termina em ISOLAMENTO: FURADO (2 fuga(s)) e saída: 1; "codex sandbox :workspace" em escreve-dentro ABERTO, ISOLAMENTO: OK e saída: 0.

E16 · Claude Code falha alto

10 min

Rode o bloco do Claude Code. Se recusar iniciar, instale as dependências que o erro pede e rode de novo.

Pronto quando: sem as dependências: refusing to start without a working sandbox e saída: 1; com elas: saída: 0.

E17 · A trava do seu loop

10 min

Rode o prova-isolamento.sh com o mesmo wrapper que o seu loop usa para chamar o agente (o mesmo -s do Codex, o mesmo systemd-run). Anote a data e o resultado no mapa ("prova_isolamento"), para a aula 8.

Pronto quando: bash $P [wrapper do seu loop] --; echo $? → ISOLAMENTO: OK e 0.

06Teste da aula

Pergunta 1 de 4

O systemd aceitou PrivateNetwork=yes sem erro. A rede está cortada?competência

07Em três frases

Prove, não confieQuatro tentativas de fuga dizem se a trava está de pé na sua máquina.
Falhe altofailIfUnavailable no Claude Code; -s explícito no Codex.
Ler continua abertoSegredo fora do alcance e rede cortada, juntos.

Para ir além

Aula anteriorPróxima aula