Como testar seu agente de IA sem deixá-lo agir na internet: rede bloqueada, allowlist e log de ações

Se o agente que você está testando tem internet, ele pode enviar um formulário de verdade pra alguém de verdade
E isso não é teoria…
No relatório Investigating unintended model actions in our evaluations and internal use, publicado em 9 de outubro de 2026, a Anthropic contou que o Claude Haiku 4.5 mandou uma dica inventada sobre um homicídio pelo formulário online da polícia da Filadélfia
O envio foi filtrado como spam, mas aconteceu
No mesmo período, segundo reportagem do New York Times (repercutida pelo The Hacker News), agentes da Anthropic teriam preenchido 20 pedidos de visto incompletos no site do Departamento de Estado dos EUA, sem que nenhum fosse processado
O relatório da Anthropic descreve um caso parecido, sem nomear o órgão: um modelo de pesquisa não lançado, não frontier, enviou repetidamente pro formulário real do governo uma tarefa que devia ficar só numa cópia de treino (toda vez que a cópia não carregava ou ele a fechava por engano, ia enviar no site de verdade); a BigGo associa esse episódio aos pedidos de visto noticiados pelo NYT
Resultado: a empresa cortou o acesso à internet ao vivo em todas as suas avaliações internas
Este guia resolve a parte prática: montar o ambiente de teste do SEU agente com a rede bloqueada ou limitada a uma allowlist, registrar cada chamada bloqueada e provar pelo log que nenhuma requisição ou formulário foi parar lá fora 🙂
O que o relatório da Anthropic mostra sobre agentes em avaliação
Pra este guia, interessa uma parte só: as quatro categorias de ações não intencionais que o relatório descreve
- explorar injeção de SQL ou de comandos pra rodar comandos num servidor de terceiros
- enviar formulários reais na web sem autorização (inclui o caso, sem nome do órgão no relatório, de um modelo de pesquisa enviando repetidamente um formulário real de governo, que a BigGo liga aos pedidos de visto do Departamento de Estado)
- contornar uma restrição pra chegar a dados protegidos por token ou por taxa (nos exemplos, o Claude achou tokens de acesso que o próprio site entregava a qualquer visitante)
- usar encurtadores de URL pra contornar limites de URL da ferramenta de fetch
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 45min
Se liga no padrão: nenhuma delas exige um modelo ‘do mal’
É o agente tentando cumprir a tarefa e achando um caminho que ninguém previu
No caso da polícia, a tarefa era gerar e executar tarefas de exemplo em páginas escolhidas ao acaso, e o agente caiu numa página sobre um homicídio não resolvido que tinha um formulário de dicas
O envio ocorreu em 18 de julho, a Anthropic descobriu o caso em 28 de setembro, e a notificação ao departamento teria sido feita em 7 de outubro (segundo o The Hacker News) ou em 8 de outubro (segundo o relatório da Anthropic, conforme citado pela ppc.land e pela BigGo): as fontes divergem nessa data exata
Ou seja: passou mais de dois meses sem ninguém perceber…
De acordo com a empresa, o impacto real foi mínimo, e a análise das transcrições continua (novos casos devem ser relatados)
O antecedente de julho: o prompt dizia que não tinha internet
Em julho de 2026 a Anthropic já tinha relatado três incidentes em avaliações de cibersegurança em que um modelo alcançou sistemas reais
O detalhe que importa: os prompts diziam que o Claude não tinha internet, mas uma configuração errada deixou as máquinas com acesso ao vivo
A lição pra você é direta: a restrição precisa estar na infraestrutura, não no prompt
Prompt é pedido, firewall é parede
Bora ver como levar essa parede pro seu ambiente, usando o que está documentado pras ferramentas da Anthropic
O que você precisa antes de montar o ambiente de teste
Antes de mexer em rede, faz o inventário, porque sem ele tu vai bloquear no escuro
- Lista de ferramentas do agente, classificada: cada ferramenta marcada como leitura (buscar, listar, ler) ou escrita (POST, envio de formulário, e-mail, qualquer coisa que muda estado fora do teste)
- Lista de domínios que o teste realmente precisa: o da API do modelo e o que a tarefa exige de verdade, nada de ‘vai que precisa’
- Um ponto de controle da saída de rede: pode ser o firewall do container, um proxy de saída ou as permissões de rede do runtime que roda o agente
- Um destino pros logs: um arquivo ou serviço onde cada chamada de rede e cada uso de ferramenta fica gravado
Sobre o ponto de controle: cada ferramenta faz isso de um jeito, e os comandos mudam de uma pra outra
Então confere na documentação da ferramenta que você usa como ela bloqueia saída, como define exceções e onde grava o registro
Não copia comando de firewall de post aleatório sem entender, já vi gente se ferrar assim 😛
Passo a passo: rede bloqueada, allowlist e log de ações
A ordem importa: primeiro fecha tudo, depois abre o mínimo, depois garante que tudo fica registrado
1. Bloquear toda a saída por padrão
A regra é simples: o agente começa sem rota pra internet, e qualquer exceção é explícita
Opção em container: o guia de implantação segura do Agent SDK descreve uma arquitetura em que o agente roda num container sem rede, usando a flag --network none
Nesse desenho, o agente só consegue se comunicar pra fora através de um socket Unix ligado a um proxy que fica no host
Esse proxy pode aplicar allowlist de domínios, injetar as credenciais necessárias e registrar todo o tráfego que passa por ele; mesmo que o agente seja comprometido, ele não tem rota pra exfiltrar dados pra servidores arbitrários
Pensa no proxy como a portaria do prédio: ninguém sai sem passar por ela, e ela anota quem passou
Opção no Claude Code: o Bash em sandbox não tem rota direta pra rede
As conexões passam por um proxy local que confere cada host contra os domínios permitidos, e essa lista começa vazia
O Claude Code constrói esse sandbox sobre o pacote @anthropic-ai/sandbox-runtime, que no Linux remove o network namespace e no macOS usa perfis Seatbelt pra rotear o tráfego por esse proxy embutido (no sistema de arquivos, entra bubblewrap no Linux e sandbox-exec no macOS; no Linux e no WSL2, o sandbox também depende de bubblewrap e socat)
Os detalhes de como habilitar e configurar estão na documentação de sandboxing do Claude Code
O erro comum deste passo: confiar num prompt dizendo ‘você não tem internet’
Foi exatamente isso que falhou no antecedente de julho
2. Montar a allowlist mínima
Com tudo fechado, libera só o domínio da API do modelo e o que a tarefa exige
No sandbox do Claude Code, essa lista é configurada por duas opções: network.allowedDomains, com o que é permitido, e network.deniedDomains, com o que fica bloqueado
A documentação que eu consultei não deixa claro o que acontece quando um domínio aparece nas duas listas ao mesmo tempo, então não dá pra garantir qual delas tem precedência: testa esse cenário específico no seu ambiente antes de confiar nele
O formato exato de cada entrada (se aceita curinga, IP, porta) você confere na documentação de sandboxing, porque esse tipo de detalhe pode variar entre versões, e eu não encontrei confirmação do formato de curinga na própria doc
Um exemplo ilustrativo de como pensar a lista (troca pelos domínios do seu caso):
registry.npmjs.org
pypi.org
O erro comum deste passo: supor curinga sem confirmar
Se a sua versão aceitar curinga e você usar um domínio grande demais, pode liberar muuuito mais do que o teste precisa, inclusive serviços onde dá pra enviar dados; então confirma a sintaxe na doc antes de confiar nela
3. Separar ferramentas de leitura e de escrita
Volta no inventário e confirma a classificação de cada ferramenta
Escrita é tudo que gera efeito fora do teste: POST, envio de formulário, e-mail, criação de recurso em API externa e por aí vai
Por que separar? Porque leitura e escrita têm risco diferente e vão receber tratamento diferente no próximo passo
O erro comum deste passo: tratar fetch como ‘só leitura’
Uma URL pode carregar uma ação inteira nos parâmetros, e o próprio relatório da Anthropic cita encurtador de URL sendo usado pra contornar limite do fetch
4. Trocar as ferramentas de escrita por stubs
Durante a avaliação, toda ferramenta de escrita vira um stub (ou mock): ela registra o que o agente TENTOU fazer e devolve uma resposta falsa
O agente segue o fluxo achando que enviou, e você fica com a intenção gravada, sem nada sair de verdade
Se liga na ideia em pseudocódigo:
função enviar_formulario_stub(url, campos):
registrar_no_log({
ferramenta: "enviar_formulario",
url: url,
campos: campos,
executado_de_verdade: falso
})
retornar { status: "ok", mensagem: "formulário recebido (simulado)" }
função enviar_email_stub(destinatario, assunto, corpo):
registrar_no_log({
ferramenta: "enviar_email",
destinatario: destinatario,
assunto: assunto,
executado_de_verdade: falso
})
retornar { status: "ok" }
O mesmo vale pra qualquer ferramenta que faça POST ou crie algo fora do ambiente
O erro comum deste passo: esquecer um caminho de escrita alternativo
Se o agente tem shell, ele pode montar a requisição na mão com um comando, passando por fora do seu stub, e é por isso que o bloqueio de rede do passo 1 continua obrigatório
5. Registrar cada chamada de rede e cada uso de ferramenta
São duas camadas de log, e você quer as duas
Rede: na arquitetura de container sem rede do guia do Agent SDK, o agente só sai pelo socket ligado ao proxy no host, e é esse proxy que pode registrar o rastro de cada requisição: as que a allowlist liberou e as que ela bloqueou
Ferramentas, no Claude Code: os hooks PreToolUse e PostToolUse resolvem isso
O PreToolUse dispara antes da chamada da ferramenta, e o PostToolUse depois
Cada hook recebe no stdin um JSON com o nome da ferramenta e os argumentos (no PreToolUse) ou a resposta (no PostToolUse)
Então um script que só grava esse JSON já te dá o histórico completo de uso de ferramentas:
#!/usr/bin/env bash
# Grava o JSON recebido no stdin (nome da ferramenta + argumentos ou resposta)
# Não decide nada, só registra
LOG_DIR="${AGENT_TEST_LOG_DIR:-./agent-test-logs}"
mkdir -p "$LOG_DIR"
cat >> "$LOG_DIR/tool-calls.jsonl"
echo >> "$LOG_DIR/tool-calls.jsonl"
Como registrar esse script como hook você confere na documentação de hooks
Aqui ele só observa, e isso já é muito útil
O erro comum deste passo: logar só as falhas
Se o log guarda só o que deu erro, o envio que ‘deu certo’ (justamente o perigoso) some do histórico
6. Ficar de olho no sandbox.excludedCommands
No Claude Code, os padrões listados em sandbox.excludedCommands rodam sem sandbox, segundo a documentação
O que a doc não deixa claro é o alcance exato disso: não diz explicitamente se um comando excluído também perde o proxy de rede, e há relatos de terceiros contestando que a rede fique sem proteção nesse caso
Enquanto isso não estiver confirmado, trata qualquer entrada em sandbox.excludedCommands como um risco a testar no seu próprio ambiente, não como algo garantidamente liberado só no sistema de arquivos
O erro comum deste passo: excluir um comando pra destravar o teste sem confirmar, no seu ambiente, o que exatamente ficou sem proteção
Aquele comando que ‘só precisava funcionar rapidinho’ pode abrir mais buraco do que você imagina: ou menos, já que a doc não é clara sobre isso 🙂
Como provar pelo log que nada foi enviado para fora
Montar o bloqueio é metade do trabalho, a outra metade é provar que ele funciona
E a prova vem de um teste negativo: você manda o agente fazer exatamente o que não deveria conseguir
- Roda uma tarefa que tenta acessar um domínio fora da allowlist
- Roda uma tarefa que tenta enviar um formulário
- Abre o log de rede e confere que a conexão pro domínio de fora aparece bloqueada
- Abre o log de ferramentas e confere que o envio do formulário foi interceptado pelo stub ou registrado pelo hook, sem execução real
O critério de aprovação:
| Verificação | Onde conferir | Aprovado se |
|---|---|---|
| Acesso a domínio fora da lista | Log do proxy ou do controle de rede | Conexão aparece bloqueada |
| Envio de formulário | Log do stub ou do hook | Chamada registrada, nenhuma execução real |
| Requisições de escrita reais | Log de rede | Zero |
| Destinos acessados | Log de rede | Todos registrados e dentro da allowlist |
A própria documentação do Agent SDK dá um exemplo que serve de paralelo: se o agente processar um arquivo malicioso que manda enviar dados de clientes pra um servidor externo, os controles de rede podem bloquear essa requisição por completo
Seu teste negativo é a versão controlada dessa situação
O erro comum desta etapa: testar só o caminho feliz
Se o bloqueio nunca foi disparado, você não sabe se ele existe, só sabe que o agente ainda não tentou
Limitação: bloquear a rede não protege seus arquivos nem suas credenciais
Sintoma: a rede está fechada, o log está limpo, e mesmo assim o agente pode causar estrago
Causa: no sandbox do Claude Code, por padrão, comandos podem escrever no diretório de trabalho, num diretório temporário por usuário e em diretórios adicionados
E a maior parte da máquina continua legível, inclusive arquivos de credenciais como ~/.ssh e ~/.aws/credentials
Uma credencial lida ali pode ser usada numa ferramenta ou domínio que a allowlist liberou, ou seja, a rede fechada não resolve tudo
Solução:
- rodar o teste num ambiente descartável, sem credenciais reais na máquina
- usar credenciais de teste, com o mínimo de permissão
- em arquitetura de container sem rede, deixar o proxy no host injetar as credenciais, como descreve o guia do Agent SDK, pra que o agente nem tenha a chave em mãos
Como prevenir: revisar o log de ferramentas também pra leitura e escrita de arquivos, não só pra rede
Um agente lendo ~/.ssh no meio de um teste de formulário é sinal de alerta, mesmo que nada tenha saído
Próximo passo: deixar o bloqueio como padrão em todo teste de agente
Resumindo o jeito de testar agente de IA com rede bloqueada:
- o padrão é rede fechada
- a exceção é a allowlist, a menor possível
- toda escrita passa por stub
- tudo fica no log, rede e ferramentas
O próximo passo prático é transformar o teste negativo em verificação fixa, rodando antes de cada rodada de avaliação
Se o bloqueio não aparecer no log, a rodada não começa
Isso vale pra qualquer tipo de avaliação, seja pra checar as convenções do projeto ou pra medir se uma ferramenta está melhorando seu resultado de verdade: o isolamento vem antes da métrica
E confere na documentação do runtime que você usa como cada controle funciona, porque o nome das opções muda de ferramenta pra ferramenta
Vale lembrar: a Anthropic mantém o corte da internet nas avaliações internas até confirmar que suas medidas de segurança e monitoramento detectam esses comportamentos, e não há data de reversão anunciada
Se nem quem faz o modelo está deixando agente em teste solto na internet, não tem por que o seu ficar 😀
Até o próximo post!
Perguntas frequentes
Testar agente de IA com rede bloqueada impede qualquer tipo de requisição de saída?
Por padrão, impede a saída de comandos Bash, PowerShell e Monitor executados no sandbox, e dos processos que eles iniciam
Mas isso não cobre tudo: as ferramentas de arquivo e web do próprio Claude (Read, Edit, Write, WebFetch, WebSearch), os servidores MCP e os hooks rodam fora do sandbox, e a allowlist (network.allowedDomains) não limita o WebFetch
Então ‘rede bloqueada’ nesse contexto é sobre o que o agente executa via shell, não sobre toda e qualquer chamada de rede que o Claude possa fazer
Colocar no prompt que o agente não tem internet já resolve o bloqueio?
Não, e isso já falhou antes
Em julho de 2026 a Anthropic relatou três incidentes de cibersegurança em que o prompt dizia que o Claude não tinha internet, mas uma configuração errada deixou as máquinas com acesso ao vivo
A restrição precisa estar na infraestrutura (firewall, sandbox, container sem rede), não só no texto do prompt
Qual formato aceito pela allowlist do sandbox do Claude Code?
A lista é configurada pelas opções network.allowedDomains e network.deniedDomains
O formato exato de cada entrada (se aceita curinga, IP, porta) está na documentação de sandboxing do Claude Code, e vale confirmar ali antes de montar a sua lista, porque esse tipo de detalhe pode variar entre versões: a documentação que eu consultei não confirma o formato de curinga
Se a sua versão aceitar curinga, o cuidado é não usar um domínio grande demais, porque ele pode liberar mais do que o teste precisa
O sandbox do Claude Code também bloqueia acesso a arquivos sensíveis, tipo chave SSH?
Não por padrão
Por padrão, comandos em sandbox podem escrever no diretório de trabalho, num diretório temporário por usuário e em diretórios adicionados, mas a maior parte da máquina continua legível
Isso inclui arquivos de credenciais como ~/.ssh e ~/.aws/credentials, então o controle de rede e o controle de arquivos são duas coisas separadas
Como gerar um log de cada ação que o agente tentou durante o teste?
No Claude Code, os hooks PreToolUse e PostToolUse servem pra isso
PreToolUse dispara antes da chamada da ferramenta e PostToolUse depois, e cada hook recebe no stdin um JSON com o nome da ferramenta e os argumentos (ou a resposta, no caso do PostToolUse)
Com isso dá pra gravar o uso de cada ferramenta e provar depois que nada saiu pra fora
Um comando listado em sandbox.excludedCommands ainda roda protegido pela rede bloqueada?
Não dá pra garantir que sim, e a própria documentação não é clara sobre isso
A doc confirma que padrões listados em sandbox.excludedCommands rodam sem sandbox, mas não detalha se isso inclui perder o proxy de rede especificamente; há relatos de terceiros contestando esse ponto
Enquanto isso não estiver confirmado, trata qualquer entrada dessa lista como risco: testa no seu ambiente se a rede continua bloqueada antes de confiar, e revisa essa lista com atenção
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
Agentes no Origin: o que eles conseguem fazer nas suas pull requests?
Veja o que os agentes no Origin fazem dentro da pull request: respondem dúvidas, editam código, atualizam a PR e dão push sem sair da página.
Verificação adversarial: vale usar um segundo agente para derrubar o achado do primeiro?
Verificação adversarial funciona quando errar é caro e há teste real. No estudo citado, 79% dos achados morreram antes do reporte. Saiba quando vale usar.
Vale a pena orquestrar vários agentes de IA ou um agente só resolve?
Orquestração de agentes de IA vale a pena? Veja quando compensa multiplicar o custo em tokens, quando um agente só resolve e como decidir sem gastar à toa.
