Lição 3 de 6 · 15 min · Verificado em 10 de Outubro de 2026
Segurança a fundo: sandbox, cadeia de dependências e auditoria
No fim desta lição vais conseguir:
- Explicar o que uma sandbox isola: a pasta, a rede e o resto do sistema
- Escolher o modo de sandbox e de permissões certo no Codex e no Claude Code
- Defender um projecto de pacotes falsos com versões fixas, leitura do que se instala e o pip-audit
- Deixar um registo do que o agente fez, para poderes auditar depois
O Rui faz o site da escola nas horas vagas. Pediu ao agente para «pôr a funcionar o envio de PDFs». O agente instalou três pacotes, o envio funcionou e o Rui fez commit. Um dos nomes tinha uma letra trocada em relação a um pacote conhecido. Ninguém reparou. Este caso é inventado, mas o padrão existe e tem nome.
Nada disto é motivo para pânico. É motivo para três hábitos: saber onde o agente pode mexer, saber o que entra no projecto e saber, depois, o que aconteceu.
O conceito: permissões, sandbox e registo
As permissões decidem quando o agente pergunta. A sandbox decide o que os comandos dele conseguem fazer, mesmo quando ninguém pergunta. São camadas diferentes, e queres as duas.
Uma sandbox isola três coisas:
- a pasta: onde pode escrever;
- a rede: se pode ligar-se à internet, e a que sítios;
- o sistema: o que consegue ler do resto do computador, como chaves e configurações.
O registo é a terceira camada: quando algo corre mal, é o que te diz o quê, quando e porquê.
Como se faz hoje: Codex
Isto é como está a 6 de Outubro de 2026; se o ecrã for diferente, procura o botão com o mesmo nome. Guia: learn.chatgpt.com/docs/agent-approvals-security.
O Codex tem duas peças. A sandbox (--sandbox) tem três modos: read-only, workspace-write e danger-full-access. A aprovação (--ask-for-approval) diz quando pergunta: on-request pergunta quando precisa de sair dos limites, never nunca pergunta.
O habitual é workspace-write com on-request: escreve na pasta, sem rede, e pergunta antes de sair. Mesmo assim, as pastas .git e .codex dentro do projecto ficam só de leitura. Se uma tarefa precisar mesmo de rede, liga-a no ficheiro de configuração com network_access = true, na secção [sandbox_workspace_write]. /permissions muda o modo e /status mostra o que está activo.
Como se faz hoje: Claude Code
Os modos de permissão são: Manual (default), acceptEdits, plan, auto, dontAsk e bypassPermissions. As regras deny bloqueiam em todos eles. Guia: code.claude.com/docs/en/permission-modes.
A sandbox vem desligada. Liga-a com /sandbox. Guia: code.claude.com/docs/en/sandboxing. Com ela ligada:
- os comandos só escrevem na pasta do projecto e em pastas temporárias;
- a rede passa por um filtro, e a lista de sítios permitidos começa vazia;
- os comandos ainda lêem quase todo o computador. Para fechar pastas como
~/.ssh, usafilesystem.denyRead.
A sandbox aplica-se aos comandos (Bash). Ler, editar e ir à web seguem as regras de permissão. No Windows sem WSL2 não há sandbox; no Linux precisa de dois programas, bubblewrap e socat.
Cuidado
Os modos sem perguntas nem sandbox (bypassPermissions no Claude Code, danger-full-access com never no Codex) são só para máquinas virtuais ou contentores descartáveis, como na lição 1/06. Ligar um modo destes «só desta vez» no teu computador é exactamente o momento em que corre mal.
A cadeia de dependências
Cada pip install traz código de outra pessoa, que corre com os teus direitos. Dois riscos aparecem muito:
- Typosquatting: alguém publica um pacote com um nome quase igual a um conhecido e espera por um erro de escrita.
- Nomes inventados: o modelo às vezes sugere um pacote que não existe. Se alguém registar esse nome mais tarde com código malicioso, o próximo que seguir a sugestão instala-o. Há quem chame a isto «slopsquatting».
As defesas são simples:
- Lê o que o agente instala. Põe
"Bash(pip install *)"na listaaskdo.claude/settings.json, para ele perguntar sempre. A regra é literal: não apanhapython -m pip install,pip3 installnemuv pip install. Acrescenta uma regra por cada forma que o agente usar, ou pede-lhe que instale sempre compip install. - Instala só o que conheces. Pacote novo? Abre a página dele no PyPI: o nome exacto, o projecto ligado, o histórico de versões.
- Fixa as versões.
python -m pip freeze > requirements.txtgrava cada pacote com==. Para ir mais longe, o pip aceita--require-hashes. - Audita. O
pip-auditcompara as tuas dependências com uma base de vulnerabilidades conhecidas:
python -m pip install pip-audit
pip-audit -r requirements.txt
Se não encontrar nada, diz «No known vulnerabilities found» e sai com código 0; se encontrar, sai com 1. Por isso cabe num workflow de CI, como na lição 02.
Dica
O pip-audit só conhece problemas já registados. Um pacote falso publicado ontem passa-lhe ao lado. Ler o que se instala continua a ser a primeira defesa.
Registo e auditoria
- O Git é o primeiro registo. Commits pequenos, um por mudança. O
git log --statmostra o que mudou em cada um. - Um hook guarda os comandos. Este exemplo do guia oficial, no
.claude/settings.json, junta cada comando Bash a um ficheiro. Precisa do programajq.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"
}
]
}
]
}
}
- No Codex, o
codex exec --jsonescreve cada passo em linhas JSON, que podes guardar num ficheiro.
Dica
As conversas do Claude Code ficam no teu computador e são apagadas ao fim de algum tempo; a definição cleanupPeriodDays muda o prazo. Se precisares de guardar um registo, não contes com elas: usa o hook.
E a regra da lição 1/06 não muda: segredos nunca no pedido nem no repositório.
Exercício
Numa pasta descartável, experiencias/seguranca, com Git:
Como sei que ficou bem o agente pediu autorização antes de instalar, o requirements.txt tem == em cada linha, o pip-audit deu um resultado (limpo ou com uma lista) e o registo mostra os comandos que o agente correu.
Se não deu
- O agente instalou sem perguntar: confirma as aspas e a vírgula da regra e abre uma sessão nova; o
/permissionsmostra se foi lida. Vê também o comando no registo: se foipython -m pip installoupip3 install, a regra não o cobre; acrescenta uma regra para essa forma. - O registo está vazio: falta o
jq, ou o hook não foi lido. O/hooksmostra os hooks activos. pip-audit: command not found: o ambiente virtual onde o instalaste não está activo.
Vídeos
No troço indicado: porque deixar um agente de IA correr directamente no sistema é arriscado (instalar coisas, ler e exfiltrar ficheiros, prompt injection) e como o isolar num contentor Docker sem root.
Ataques à cadeia de abastecimento no npm e como os travar: SLSA, verificação de vulnerabilidades conhecidas, SBOM e Cosign.
Testa o que aprendeste
Correcções a esta lição (1)
- : Depois de uma segunda revisão externa: a regra `Bash(pip install *)` é literal e não apanha `python -m pip install`, `pip3 install` nem `uv pip install`; a lição e o «Se não deu» dizem-no.