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

diagrama de como testar agente de IA com rede bloqueada usando 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
Formação Recomendada

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

  1. Roda uma tarefa que tenta acessar um domínio fora da allowlist
  2. Roda uma tarefa que tenta enviar um formulário
  3. Abre o log de rede e confere que a conexão pro domínio de fora aparece bloqueada
  4. 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



Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares