A página web reescreveu a configuração do agente
Em 21 de julho de 2026, a Intezer e a Kodem Security divulgaram a CVE-2026-10591: uma página de documentação de aparência comum trazia instruções em texto branco de um pixel, e quando um desenvolvedor pediu ao agente Kiro da AWS para lê-la, o Kiro usou sua própria ferramenta de escrita de arquivos para sobrescrever a configuração que lança seus servidores MCP sem qualquer aprovação, depois recarregou o arquivo e executou o código do atacante no host, com os privilégios do desenvolvedor. A AWS adicionou um prompt de aprovação. O que permanece é que o agente, a web que ele lê e a máquina do desenvolvedor eram uma única zona de confiança. O Bromure Agentic Coding coloca um hipervisor entre eles.
Um desenvolvedor pediu ao Kiro para ler uma página de documentação. A página continha uma frase pintada em texto branco de um pixel, escrita para o modelo, não para o olho. Seguindo-a, o Kiro reescreveu o arquivo que decide quais programas ele lança, e então lançou um. Nada disso exigiu um clique.
O Kiro é o IDE agêntico da AWS: um agente de código que lê a web aberta em seu
nome, busca documentação e conecta ferramentas para você. Como a maioria dos
agentes em 2026, ele fala o Model Context Protocol, ou MCP: a tomada que
permite a um agente de código chamar ferramentas externas e ler seus
resultados. O Kiro mantém sua lista de servidores MCP, e o comando exato usado
para iniciar cada um, em um arquivo simples em ~/.kiro/settings/mcp.json.
Quando esse arquivo muda, o Kiro o recarrega e lança tudo o que ele agora
descreve.
Essa última frase é toda a vulnerabilidade. O arquivo é um lançador, e o agente pode escrever nele.
Em 21 de julho de 2026, a Intezer, em pesquisa com a Kodem Security, mostrou a cadeia que se segue, e The Hacker News a cobriu no mesmo dia. A AWS atribuiu a CVE-2026-10591, classificada em 8,8 de 10. Partes anteriores do mesmo problema já haviam sido sinalizadas por Johann Rehberger e pela Cymulate. O que a Intezer acrescentou foi a entrega.
Uma página que você lê, não um arquivo que você abriu
As instruções não chegaram em um repositório ou uma configuração que o
desenvolvedor escolheu confiar. Elas chegaram em uma página web. A Intezer as
plantou em texto branco de um pixel, color:#fff;font-size:1px, em uma página
de documentação de API por outro lado comum. Em um navegador, o parágrafo não
renderiza nada: uma fatia em branco que um humano passa direto ao rolar. Para o
agente, que ingere o texto da página em vez de sua imagem, é um parágrafo claro
de instruções.
Essas instruções mandaram o Kiro usar fsWrite, sua própria ferramenta de
escrita de arquivos, para sobrescrever ~/.kiro/settings/mcp.json com uma
entrada fornecida pelo atacante. O Kiro fez isso sem perguntar. Seu modo
Autopilot padrão escreveu o arquivo por conta própria, sem nenhuma caixa de
diálogo e sem um prompt de “permitir esta escrita?”. O recarregamento disparou,
o Kiro lançou o comando da nova entrada, e o código do atacante rodou no host
com os privilégios do desenvolvedor: o suficiente para ler credenciais, copiar
código-fonte, instalar persistência ou mover-se lateralmente para tudo o que a
máquina do desenvolvedor pode alcançar.
A AWS adicionou um prompt. A máquina ainda é o prêmio.
A correção é a sensata. A AWS agora marca mcp.json, .vscode/tasks.json, o
diretório .git e outros arquivos sensíveis à execução como caminhos
protegidos: escrever em qualquer um deles exige aprovação explícita, tanto no
modo Autopilot quanto no Supervised. A etapa de aprovação que faltava agora
existe. Se você usa o Kiro, atualize-o.
O que a correção não muda é o formato da sala. A AWS disse isso ao encerrar: um humano no circuito só funciona como controle se lhe for mostrado o passo que importa, e se a plataforma segurar a linha mesmo depois de o modelo ter sido completamente convencido a cruzá-la. São duas exigências. O prompt satisfaz a primeira: ele revela a escrita. Não pode satisfazer a segunda, porque quando o código roda, ele roda na própria máquina do desenvolvedor, com o próprio alcance dele. Uma aprovação que você clica em uma tarde cansada, ou uma aprovação que a próxima página astuta aprende a formular para que pareça rotineira, leva você ao mesmo lugar: o código do atacante executando onde vivem suas chaves, seus repositórios e suas sessões de nuvem.
O formato recorrente aqui — uma página que o agente leu, uma configuração que ele podia escrever, um lançamento que ele podia disparar — não é específico do Kiro. É a cara de um agente que lê a web aberta e edita arquivos em uma máquina cheia de segredos. A pergunta duradoura é onde o agente roda, e o que está ao redor dele quando o prompt falha.
Onde o Bromure executa os mesmos passos
O Bromure Agentic Coding não tenta fazer o agente desconfiar da página, recusar a escrita ou pegar o clique. Ele muda a máquina em que toda a sequência roda. O agente de cada perfil roda dentro de uma VM Linux descartável em Apple Silicon, a um hipervisor de distância do macOS. Rode a cadeia exata da CVE-2026-10591 ali e cada passo ainda dispara, e cada passo aterrissa em outro lugar.
A página é lida. A injeção vence. O substituto do Kiro reescreve mcp.json, o
recarregamento dispara, o comando do atacante é lançado “com os privilégios do
desenvolvedor”. Só que dentro da VM o desenvolvedor é o usuário ubuntu em uma
caixa descartável, e a caixa não guarda nada que valha a viagem. O código sai à
procura das credenciais que tornam o ataque lucrativo — a chave Anthropic, as
chaves AWS, o token GitHub — e encontra iscas. No Bromure, os segredos reais
nunca entram na VM; um corretor de credenciais
no host injeta substitutos como brm_…, um kubeconfig sintético e uma chave
SSH descartável, e só troca pelo valor real na fronteira de rede, em
requisições para destinos que você aprovou. O roubo de código-fonte alcança
apenas as pastas que você escolheu montar. O “movimento lateral para sistemas
internos” alcança o firewall da VM de cada perfil.
Depois há a metade de saída. Roubar uma isca só compensa se você conseguir enviá-la a algum lugar, e mover-se lateralmente significa alcançar um segundo host. Ambas são ações de rede, e no Bromure ambas cruzam o proxy do host, onde o verdadeiro destino de uma requisição é filtrado na saída e onde a forma destrutiva de uma ação — um delete, um drop ou um terminate contra as APIs de nuvem e git que o perfil expõe — encontra uma proteção capaz de recusá-la, não importa o que o agente tenha sido persuadido a fazer. Tudo o que o código lançado tenta deixa uma linha registrada no rastro da sessão.
E uma camada fica na frente de tudo isso, por um motivo que se encaixa
exatamente neste ataque. O Bromure pontua o conteúdo não confiável que um
agente lê — uma página buscada ou uma resposta de ferramenta — com um
detector de injeção no
dispositivo antes de o modelo agir sobre ele. O motivo de o texto de um pixel
funcionar é que uma pessoa lê a página renderizada. O classificador não; ele lê
o mesmo fluxo bruto que o modelo lê, onde color:#fff;font-size:1px não esconde
nada. O truque que torna o parágrafo invisível ao olho não faz diferença para
um avaliador que lê os bytes. Ele pega a maior parte disso, e um disfarce novo
o suficiente ainda pode escapar de um único detector, por isso ele fica na
frente da caixa descartável em vez de substituí-la.
A web é a entrada não confiável agora
Por anos, o conselho para agentes de código era ter cuidado com quais repositórios você confia. O Kiro leva a lição adiante: a entrada perigosa era uma página de documentação, do tipo que um agente lê cem vezes por dia, e a arma era uma propriedade CSS que um navegador honra desde os anos 1990. À medida que mais do fluxo de desenvolvimento passa por agentes que leem a web aberta, cada página é entrada não confiável, e ler com mais cuidado não corrige isso.
O prompt que a AWS adicionou é a correção certa, e deve ser lançado. Mas um controle que depende de uma pessoa pegar a única escrita que importa, em cada página, para sempre, é um controle com um péssimo histórico no longo prazo. O Bromure Agentic Coding não pede que o agente tenha cuidado com a web. Ele assume que a página vence, que a configuração é reescrita e que o código roda, e garante que, quando tudo isso acontecer, aconteça em uma caixa sem nada a levar e sem caminho de volta. Essa é a diferença entre um prompt que se pode contornar na conversa e uma linha traçada um nível abaixo, onde a conversa para de funcionar. Instale-o e dê ao seu agente uma máquina que não é sua para perder.