Saltar para o conteúdo
← Inforjota
Cursos Inforjota English

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, usa filesystem.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:

  1. Lê o que o agente instala. Põe "Bash(pip install *)" na lista ask do .claude/settings.json, para ele perguntar sempre. A regra é literal: não apanha python -m pip install, pip3 install nem uv pip install. Acrescenta uma regra por cada forma que o agente usar, ou pede-lhe que instale sempre com pip install.
  2. 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.
  3. Fixa as versões. python -m pip freeze > requirements.txt grava cada pacote com ==. Para ir mais longe, o pip aceita --require-hashes.
  4. Audita. O pip-audit compara 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 --stat mostra 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 programa jq.
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"
          }
        ]
      }
    ]
  }
}
  • No Codex, o codex exec --json escreve 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 /permissions mostra se foi lida. Vê também o comando no registo: se foi python -m pip install ou pip3 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 /hooks mostra os hooks activos.
  • pip-audit: command not found: o ambiente virtual onde o instalaste não está activo.

Vídeos

Pare de expor seu SO para IA. Solução docker pronta!
Otávio Miranda · 29 min · PT-BR · legendas · Ver no YouTube
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.
NPM Supply Chain Attacks Explained (And How To Stop Them)
DigitalOcean · 10 min · EN · legendas · Ver no YouTube
Ataques à cadeia de abastecimento no npm e como os travar: SLSA, verificação de vulnerabilidades conhecidas, SBOM e Cosign.

Testa o que aprendeste

1. Para resolver um erro, o agente propõe instalar um pacote de que nunca ouviste falar, com um nome parecido ao de um pacote conhecido. O que fazes?
2. Ligaste a sandbox do Claude Code. Um colega diz que agora o agente «já não consegue ler nada fora da pasta». Qual é a resposta certa?
3. Um script teu corre o Codex de noite e precisa de descarregar uma página. Qual é a escolha mais segura?

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.