O bloqueio foi a entrega
Na DEF CON 34 desta semana, a Tenet Security mostrou um ataque que começa com uma requisição que o seu firewall certamente vai recusar. O 403 é justamente o objetivo: o WAF grava a requisição bloqueada no log de segurança, na íntegra, e dias depois um agente de código lê esse log para depurar os 403 e segue as instruções contidas nele. Nenhum passo da cadeia é não autorizado. O Bromure Agentic Coding pontua o texto na chegada e mantém a credencial de que o agente sequestrado precisa fora da máquina em que ele roda.
O firewall funcionou. Casou com a regra, devolveu um 403 e gravou no log a requisição que recusou, como projetado. Foi essa entrada de log que levou o payload até o agente de código.
A DEF CON 34 encerrou esta manhã em Las Vegas. Na sexta-feira, Barak Sternberg, Nevo Poran e Ron Bobrov, da Tenet Security, apresentaram uma palestra cujo título também é o argumento: Your WAF Blocked Us, That Was The Exploit. O resumo da programação diz “Remote Agent Takeover via Cloudflare, Sentry and Claude Zero-Day for data exfil”. A cobertura de síntese saiu em 8 de agosto.
A mesma equipe batizou de Agentjacking em junho, depois de mostrar que um relatório de erro falso do Sentry obtido via MCP fazia um agente de código executar código controlado pelo atacante em 85% das tentativas, em mais de uma centena de instâncias reais. A palestra de sexta-feira estende isso ao Seer, o agente do próprio Sentry, cujas recomendações envenenadas descem depois até o Cursor. A cadeia da Cloudflare é o material novo.
O 403 é justamente o objetivo
Comece pelo problema do atacante. Ele não consegue alcançar o seu agente de código. Ele roda na máquina de um desenvolvedor, atrás de tudo o que você possui, e o atacante não tem credencial, nem sessão, nem rota de entrada.
Então ele envia uma requisição construída para ser recusada.
O WAF casa com uma regra gerenciada e devolve 403. Ele também cumpre a outra metade do seu trabalho e registra a requisição que bloqueou, payload e tudo, no log de eventos de segurança. Uma entrada de log que omitisse o payload seria inútil para o analista para quem ela existe.
Dias depois, alguém percebe que o endpoint está devolvendo 403 e pede ao agente
que dê uma olhada. O agente chama o servidor MCP de observabilidade da
Cloudflare, um dos
servidores oficiais que a Cloudflare publica
para isso, e puxa as linhas das requisições bloqueadas. O texto do atacante
chega dentro de um bloco tool_result, vindo de um serviço do próprio
fornecedor que o desenvolvedor conectou, sob um campo que significa esta é uma
requisição que rejeitamos.
O agente lê aquilo como instruções. Em seguida usa as suas próprias ferramentas autorizadas da Cloudflare para reescrever registros DNS e redirecionar o tráfego dos clientes. A Tenet estima a exposição em mais de 15.000 organizações, incluindo 27% da Fortune 1000.
Nada de não autorizado acontece
A Tenet chama o padrão de Authorized Intent Chain, e o texto de junho enuncia a consequência:
Percorra a cadeia de novo e tente achar o passo em que alertar. O desenvolvedor autorizou o agente. O agente foi configurado com o servidor MCP. O servidor MCP consultou logs que ele existe para consultar. A conta que ele usou detém a permissão de DNS que você concedeu de propósito. E a requisição que iniciou tudo isso foi bloqueada. Cada controle no caminho fez exatamente aquilo para o que foi comprado, e é a composição desses comportamentos corretos que constitui o ataque.
Qualquer coisa que funcione perguntando quem está fazendo isto e tem permissão vai responder sim em cada salto, porque a resposta é sim. Restam dois movimentos. Ler o texto no caminho de entrada e colocar a aplicação da política em um lugar que o agente sequestrado não alcança.
Pontuar o texto na chegada
O Bromure Agentic Coding roda o agente dentro de uma VM Linux descartável em Apple Silicon e encaminha cada byte do seu tráfego por um proxy no host, fora da caixa em que o agente roda. Isso inclui o tráfego do modelo, que é onde linhas de log viram instruções.
A saída de ferramenta chega como não confiável
O Bromure pontua o conteúdo que o agente lê, incluindo conteúdo de
arquivos, páginas web e os blocos tool_result que voltam de servidores
MCP e comandos de shell, com um modelo local de injeção de prompt. Esse
detector procura justamente isto: uma linha de log carregando um imperativo
dirigido a quem a ler. Ele pontua o próprio trecho, então a Cloudflare
entregá-lo por uma conexão que você configurou não compra nada para o
payload.
Você escolhe o que uma detecção faz
Log and continue registra cada ocorrência na janela Security Log e deixa a requisição seguir. Ask me what to do pausa a requisição de saída e mostra o texto sinalizado, para você decidir com a frase diante dos olhos. Block interrompe unilateralmente antes que o modelo leia, e o agente recebe um 451 seco que ele relata como falha de API.
Arquivos de autoridade têm o próprio classificador
O envenenamento de configuração era a outra metade da divulgação na DEF
CON. Um classificador ModernBERT ajustado pontua os arquivos que um agente
trata como ordens permanentes, CLAUDE.md e AGENTS.md e GROK.md e suas
variantes aninhadas e globais, ao lado de um scanner determinístico para os
payloads de largura zero, bidirecionais e de tags Unicode que nenhum modelo
consegue ler.
Fica no seu Mac
Os dois detectores rodam no dispositivo, a partir de modelos que você baixa uma vez de bromure.io. Pontuar os seus logs de WAF de produção em busca de instruções injetadas não envolve mandar os seus logs de WAF de produção a lugar nenhum.
A escrita exige uma chave que não está na máquina
Suponha que um payload passe mesmo assim. O fim desta cadeia é uma chamada de API que altera um registro DNS, e essa chamada precisa de uma credencial.
Em um perfil Bromure, ela não está lá para ser tomada. Um token da Cloudflare
entra como uma entrada Other API keys, que cunha um valor falso brm_… e o
exporta para dentro da VM sob o nome de variável de ambiente que você escolher.
O token real fica no host, e o proxy o substitui no fio, em requisições de
saída para o único host de destino ao qual você o vinculou. O processo do
agente nunca o detém. Um dotfile ou um histórico de shell também não.
Ligue Require approval to use para essa entrada e cada substituição levanta um diálogo no macOS, fora da VM, antes de o Bromure encaminhar o valor real. Um agente sequestrado consegue compor uma atualização de DNS bem formada, e não consegue responder ao diálogo.
O resto do raio de alcance tem uma resposta mais estrita. Guardrails é um motor de políticas que roda no proxy do host e remove operações destrutivas dos protocolos que o agente fala: Kubernetes, AWS, DigitalOcean, registries de contêiner, GitHub, GitLab, Bitbucket e os endpoints HTTPS de bancos de dados. Escolha Block destructive ou Read-only por recurso, e uma chamada bloqueada volta como um 403 seco. Como é o host que toma essa decisão, um agente seguindo instruções de outra pessoa dentro da VM não tem nada para desligar.
Um bug de sandbox não move um hipervisor
A palestra também divulgou um zero-day do Claude que contorna o sandbox de rede do agente para exfiltração completa de dados, mais rootkits agênticos montados a partir de injeção em memória e envenenamento de configuração que nenhum EDR detecta. Os dois achados apontam para o mesmo ponto fraco: a contenção que um agente traz de fábrica é alcançável de dentro.
O Bromure põe a fronteira em outro lugar. A fronteira é uma máquina virtual, rodando no hipervisor da Apple com o próprio kernel, em NAT, com cada pacote atravessando um proxy que roda no macOS. Um defeito no sandbox in-process do agente é um defeito dentro da VM. Ele não realoca a VM, e não dá ao código dentro da VM uma rota para a rede que pule o proxy do host.
E quando algo de fato aterrissa ali, aterrissa em uma máquina construída para
ser jogada fora. Erase home limpa /home/ubuntu, ou seja, dotfiles,
.ssh, npm-global, .cargo e histórico de shell, e o devolve ao estado
pós-clone. Reset to base descarta toda mudança em nível de sistema e
reclona o disco de trabalho a partir da imagem base. O rootkit que nenhum
scanner encontra continua em uma camada de disco que você pode apagar.
A cadeia invisível, escrita por extenso
A observação mais forte da Tenet é que a cadeia se esconde à vista de todos porque cada passo dela é legítimo. Não há assinatura nem anomalia a correlacionar.
O Bromure não tenta correlacionar nenhuma. Cada requisição que a VM faz atravessa o proxy do host, e o Bromure registra o host, o status, a latência e quais credenciais ele trocou. Detecções de injeção caem no Security Log com o texto sinalizado anexo. Aumente o nível de trace e o Bromure guarda também os corpos das requisições de IA, cifrados com a mesma chave de keychain dos segredos do seu perfil.
Aí você pode fazer outra pergunta: o que esta sessão tocou. Um agente que passou a tarde lendo logs da Cloudflare e depois fez a sua primeira chamada à API de DNS são duas linhas que você consegue ler, na máquina em que a sessão rodou, sem agente a implantar e sem SIEM para onde rotear.
A Cloudflare vai ajustar a sua superfície, o Sentry a dele, e as duas cadeias da palestra de sexta-feira vão fechar. Combine qualquer sistema que registre entrada hostil com qualquer agente que leia registros para fazer o seu trabalho, e você reconstruiu este ataque a partir de duas peças que fazem, as duas, o seu trabalho. Você guarda logs para que alguém os leia, e esse leitor agora é um programa que age sobre o que encontra.
Um instinto cobre isso: trate tudo o que o agente lê como algo que um estranho pode ter escrito, inclusive as partes que as suas próprias defesas anotaram.
Instale o Bromure Agentic Coding, e coloque entre o log e o agente algo que confira o texto.