← Voltar para todas as publicações
Publicado em · por Renaud Deraison

O prompt não falava de formulários

Em 9 de outubro, a Anthropic publicou um relatório sobre modelos Claude que agiram em sites reais durante testes internos. Um deles, o Claude Haiku 4.5, enviou em 18 de julho uma denúncia falsa sobre um homicídio não solucionado à polícia de Filadélfia. Suas instruções proibiam logins, compras e dados pessoais, e não diziam nada sobre formulários. A Anthropic encontrou a denúncia dez semanas depois. No Bromure Agentic Coding, o limite é uma regra no Mac: o agente pode ler qualquer página, e um POST para um site que você não listou volta com 403 e aparece na Security Timeline no mesmo minuto.

O modelo foi instruído a não fazer login, não comprar nada e não digitar dados pessoais. Ninguém disse a ele para não clicar em Enviar.

Às 23h27 de 18 de julho, alguém enviou uma denúncia pelo formulário público do PhillyUnsolvedMurders.com, o site da polícia de Filadélfia dedicado a homicídios não solucionados. A mensagem começava com “Talvez eu tenha informações sobre este caso.” Ela veio do Claude Haiku 4.5, rodando dentro de um teste da Anthropic que gerava tarefas de exemplo a partir de sites escolhidos ao acaso.

O filtro do departamento a marcou como spam, e ela nunca chegou ao Real-Time Crime Center. A Anthropic encontrou o envio em 28 de setembro, avisou o departamento em 7 de outubro e se reuniu com autoridades em 8 de outubro. A polícia tornou o caso público na sexta-feira, 9 de outubro, e a Anthropic publicou seu relatório, Investigating unintended model actions, no mesmo dia. A declaração do departamento, segundo a 6abc Action News: “O atraso de dois meses para detectar o incidente e comunicá-lo à Cidade é inaceitável.”

A Anthropic cortou o acesso à internet real em todas as suas avaliações internas até que seu monitoramento “detecte com confiabilidade comportamentos como esses”, informou o The Hacker News. O New York Times, citando duas fontes anônimas, acrescenta que agentes da Anthropic preencheram 20 pedidos de visto no site do Departamento de Estado.

Quatro tipos de insistência

O relatório organiza o que a Anthropic encontrou em quatro categorias. A Anthropic diz que o impacto no mundo real foi mínimo e que nenhum dado de cliente foi envolvido. Leia-as como uma lista do que um agente capaz faz quando uma tarefa entra no seu caminho:

  1. Ele explorou um servidor para terminar um cálculo. Uma ferramenta de análise hospedada por uma universidade retornou um erro. O Claude encontrou no servidor um script que devolvia “qualquer arquivo que fosse pedido”, depois uma falha de injeção, e a usou para rodar o cálculo.
  2. Ele enviou formulários que não deveria. Quando um formulário de treino não carregou, um modelo de pesquisa não lançado foi ao site real do governo e enviou o formulário de verdade, várias vezes. O Haiku 4.5, instruído a parar antes do envio final, enviou mesmo assim, esperando uma página de confirmação; seu raciocínio dizia que estava “demonstrando o processo”. Depois, a denúncia à polícia.
  3. Ele contornou bloqueios para chegar aos dados. Limitado em quantas páginas podia percorrer, o Claude leu o arquivo de configurações de um site de mapas, encontrou tokens de acesso válidos e consultou o servidor de mapas diretamente. Para o projeto de estatística de um pesquisador, descobriu que o painel pago de uma agência estadual entrega um token a cada visitante, pediu um e consultou o banco de dados sem pagar.
  4. Ele encurtou seu caminho para além de um limite de fetch. A ferramenta de fetch da Anthropic limita o tamanho das URLs, porque URLs longas têm “espaço para carregar” instruções injetadas. Vários modelos, entre eles o Claude Opus 5 e o Claude Mythos 5, passaram suas URLs por encurtadores gratuitos. O operador do da.gd escreveu para dizer que tinha percebido.

O diagnóstico da própria Anthropic: a maioria desses casos é de situações em que o Claude “contorna uma restrição em vez de parar”, e alguns “poderiam ter sido evitados” se as avaliações tivessem declarado seus alvos, as ações permitidas e os limites de rede.

Dois tipos de limite, ambos do lado de dentro

Todo limite do relatório fica dentro do agente. Alguns eram frases no prompt: sem login, sem contas, sem dados pessoais, parar antes do envio final. O modelo seguiu as que recebeu. Formulários não estavam na lista, e a instrução de parar antes de enviar perdeu para a vontade do modelo de ver uma página de confirmação.

O resto eram limites de ferramenta: um teto de tamanho de URL no fetch, um orçamento de cliques no harness de avaliação. O modelo manteve o objetivo e usou outro caminho: um encurtador, um arquivo de configurações, uma consulta direta ao servidor por trás da página.

A detecção da Anthropic ficou atrás de tudo isso. Uma revisão de transcrições iniciada em julho se expandiu das avaliações de segurança cibernética para todos os lugares onde o Claude podia acessar a internet, e a denúncia apareceu em 28 de setembro, dez semanas depois de enviada. O operador do da.gd e a polícia de Filadélfia encontraram, cada um por conta própria, a sua parte.

Um formulário, 72 dias de silêncio18 jul, 23h27POST no formulário de denúncias da polícia:“Talvez eu tenha informações sobre este caso.”Prompt: sem login, sem compras,sem dados pessoais. Formulários: nada.72 dias: nenhum alerta, nenhum log lido. A denúncia fica na transcrição.28 setachada numa revisãode transcrições7 outpolícia avisada9 outdeclaraçãoe relatório
A denúncia à polícia, do envio à divulgação. A única checagem entre o modelo e o formulário era uma lista de coisas a não fazer, e o envio apareceu numa revisão de transcrições dez semanas depois.

Seu agente tem os mesmos hábitos

Essas eram as próprias avaliações da Anthropic, conduzidas por quem treina os modelos. Seu agente de programação tem as mesmas ferramentas: um fetch, um shell com curl, Python com requests e, muitas vezes, um navegador. Ele também tem a mesma disposição que o relatório descreve. Dê a ele uma tarefa que falha no meio, uma fixture de teste que precisa de um endpoint real, um fluxo de cadastro para checar, um webhook para “verificar”, e ele vai procurar outro jeito de terminar.

Os seus limites também são frases: uma linha no CLAUDE.md dizendo para não mexer em produção, uma nota na tarefa pedindo para parar antes do deploy. Cada uma cobre os casos em que seu autor pensou. Um curl -X POST para um formulário real, uma API ou um servidor de staging que acaba sendo produção é um único comando para um agente que quer ver o resultado.

A mesma tarefa numa máquina Bromure

No Bromure Agentic Coding, o agente roda numa VM Linux no seu Mac, e toda conexão que a VM abre passa por um switch virtual e um proxy no host. As regras ficam lá, fora do alcance do agente. Repita a denúncia à polícia numa máquina e deixe o modelo decidir enviar.

Ler é permitido, escrever é listado

O firewall Outbound connections no painel Guardrails da máquina aceita regras por host, protocolo, porta e, para tráfego web, método HTTP. A Anthropic disse que suas avaliações precisavam de “limites de rede” declarados. Aqui está um, no formato pf do painel:

allow web api.anthropic.com
allow web github.com
allow web registry.npmjs.org
allow web pypi.org
allow web any:80,443 read-only
default deny

As regras valem de cima para baixo. O provedor do modelo, a forja e os registries que o projeto usa recebem todos os métodos. Todo o resto da web recebe GET, HEAD e OPTIONS: o agente pode ler qualquer página de documentação, issue, changelog ou formulário de denúncia que quiser. Quando ele clica em Enviar, o POST para phillyunsolvedmurders.com bate na regra somente leitura, e o proxy responde 403 com “POST to phillyunsolvedmurders.com blocked by Bromure Guardrails.” O formulário nunca recebe a requisição. O agente recebe um erro claro que pode relatar, e default deny descarta tudo o que não for tráfego web para um host listado.

Você não precisa listar formulários, pedidos de visto ou páginas de treino que não carregaram. A regra nomeia os quatro hosts em que esta máquina escreve e recusa escritas para o resto da web.

O desvio encontra a mesma regra

Os limites técnicos da Anthropic moravam em ferramentas, então o modelo trocou de ferramenta. Uma regra do Bromure mora na rede, então trocar de ferramenta não adianta. O proxy vê a requisição depois que ela sai da VM, venha ela do fetch do agente, do curl, do Python, de um script Node que o agente escreveu há um minuto ou de um redirecionamento de um encurtador de URL. Um link curto continua virando uma requisição ao host real com o método real, e essa requisição é verificada como qualquer outra.

O mesmo vale para um token tirado de um arquivo de configurações. Se o agente encontra uma chave e a usa para escrever num servidor que o projeto não lista, a escrita bate na regra somente leitura. As chaves que você mesmo configurou têm sua própria política: as credenciais da máquina ficam por padrão em Prompt before write, então um push, um upload para um registry ou uma mudança na AWS para num diálogo no Mac que mostra a operação exata.

O registro é escrito no mesmo minuto

A polícia de Filadélfia chamou o intervalo de dez semanas de inaceitável. Numa máquina Bromure, o POST recusado é uma linha vermelha na Security Timeline às 23h27 de 18 de julho, com o nome da máquina, o host, o método e o caminho. A timeline está sempre ligada, guarda 90 dias, e sua aba Overview mostra numa única tela os bloqueios mais recentes das últimas 24 horas. Num Mac inscrito no bromure.io, o mesmo evento vai para o console da organização.

O trace completa o resto. No nível padrão, AI request details, o proxy guarda cada requisição feita pela máquina, com host, método e caminho, e a conversa completa com o modelo, criptografada no Mac. O Trace Inspector mostra o turno em que o modelo decidiu enviar, ao lado da requisição que ele fez. bromure-cli trace hostnames lista cada host que a máquina contatou, com a contagem de requisições, então um site com o qual o projeto não tem nada a ver se destaca numa lista de algumas dezenas de nomes. Um revisor lê uma tela, não dez semanas de transcrições.

Execuções sem supervisão seguem as mesmas regras

Os incidentes do relatório aconteceram em execuções automatizadas que ninguém estava acompanhando. As Automations do Bromure, execuções de agente agendadas ou disparadas por eventos, rodam numa máquina sob os guardrails e o firewall daquela máquina. Uma execução às 23h27 encontra as mesmas regras que uma que você acompanha ao meio-dia, e seus bloqueios vão para a mesma timeline.

No Bromure: o agente lê tudo e escreve onde o Mac permiteVM da máquina (Ubuntu)GET /case/… → páginaPOST /tip → 403via fetch, curl, Pythonou uma URL encurtada:a mesma requisição na redemodelo: “envie o formulário”Switch + proxy, no Macallow web api.anthropic.comallow web github.comallow web registry.npmjs.orgallow web pypi.orgallow web any:80,443 read-onlydefault denyPOST para phillyunsolvedmurders.com→ 403, bloqueado pelo Bromure GuardrailsFormulárioserviu a páginaenviosrecebidos: nenhumSecurity Timeline, no mesmo minuto18 jul 23:27 · evals · Guardrails · POST phillyunsolvedmurders.com/… · bloqueadoO trace guarda o método, o host e o caminho, e o turno do modelo que o pediu, criptografados no Mac.
A mesma denúncia numa máquina Bromure. O agente pode ler a página e preencher o formulário. O POST passa pelo proxy no Mac, bate na regra somente leitura e recebe um 403, e a Security Timeline o registra no mesmo minuto.

A correção da Anthropic, no seu notebook

A lista de correções da Anthropic inclui aposentar ou refazer avaliações para que não toquem sites reais, endurecer sua ferramenta de fetch, mover agentes internos para “infraestrutura gerenciada de forma centralizada” com acesso reduzido à internet, e um monitoramento automatizado que, em testes, bloqueou todos os casos do relatório. É um laboratório com sua própria equipe de infraestrutura reconstruindo seu harness.

Um desenvolvedor que roda Claude Code, Codex ou qualquer outro agente num notebook precisa das mesmas três coisas: um limite que não seja uma frase, verificado num lugar que o agente não pode editar, e um registro que alguém veja no mesmo dia. Uma máquina Bromure entrega a regra de firewall, o proxy no Mac e a Security Timeline sem reconstruir nada.

Lê em qualquer lugar, escreve onde está listado

Uma regra de firewall dá ao agente todas as páginas da web com GET e HEAD, e reserva POST, PUT e DELETE para os hosts que o projeto usa. Um envio para qualquer outro lugar recebe um 403 do proxy no Mac.

Trocar de ferramenta não muda a resposta

A checagem roda na requisição depois que ela sai da VM. Fetch, curl, Python, uma URL encurtada ou um token tirado de um arquivo de configurações terminam todos na mesma requisição e na mesma regra.

Chaves configuradas perguntam antes de escrever

Máquinas novas colocam todo serviço configurado em Prompt before write. Um push, um upload ou uma mudança na nuvem para num diálogo no Mac que mostra a operação exata.

O bloqueio fica registrado naquele minuto

Cada recusa é uma linha na Security Timeline com host, método e caminho, guardada por 90 dias. O trace guarda o turno do modelo que a pediu.

O próximo formulário

A Anthropic espera encontrar mais casos à medida que sua revisão avança. Seus modelos preencheram pedidos de visto e uma denúncia à polícia enquanto rodavam testes, com instruções escritas por quem os treinou. Seu agente vai dar com uma fixture quebrada, uma URL de staging ou uma página de cadastro própria, com instruções escritas às pressas.

Escreva seu limite como uma regra de firewall no Mac e mantenha a linha do CLAUDE.md como lembrete. Sobre os incidentes de julho que deram início à revisão da Anthropic, leia A sandbox era uma frase, e para a versão da OpenAI da mesma história, A tarefa era impossível, então o agente saiu.