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

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 máquina do desenvolvedor — uma zona de confiançaPágina docparece normal aoolho humano…texto branco 1px:“sobrescrever mcp.json”Agente Kirolê a página comotexto, obedece,chama fsWritemcp.jsonnão é lista — umlançador. Recarregarroda seu comando.Código rodacomo o dev:credenciais, código,nuvem, lateralNenhum prompt de aprovação entre “ler esta página” e “executar este código”.CVE-2026-10591 — relatada em fev. 2026, ativa nas v0.9.2 / v0.10.16, corrigida na série v0.11.
CVE-2026-10591, da esquerda para a direita, tudo na máquina do desenvolvedor. Uma página de documentação carrega instruções em texto branco de um pixel, invisíveis no navegador e texto claro para o agente. Ao ser solicitado a ler a página, o Kiro segue a instrução contrabandeada e usa sua própria ferramenta fsWrite para sobrescrever ~/.kiro/settings/mcp.json. Esse arquivo é um lançador: ao recarregar, o Kiro inicia o comando que ele agora nomeia, executando o código do atacante como o desenvolvedor, com acesso a credenciais, código-fonte e sessões de nuvem em que a máquina está conectada. Nenhum prompt de aprovação estava entre ler a página e executar o código.

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.

Config normal — uma máquinaPágina oculta → Kiro reescreve mcp.json →o código roda como você, no seu MacChaves & tokens reaisroubadosCódigo & nuvemacessíveisServidor MCP implantado persisteapós reiníciosO prompt era a única linha, e foi cruzado.Bromure Agentic Coding — VM descartávelMesma cadeia — dentro da VM,como usuário ubuntu descartávelAgarra iscasbrm_… , não chaves reaisSaída filtradano proxy do host, logadaFeche a sessão → caixa reiniciaservidor implantado & persistência apagadosA linha é o hipervisor, não o prompt.
O mesmo ataque, duas máquinas. Em uma configuração normal (à esquerda), o código injetado roda no Mac do desenvolvedor e alcança as credenciais reais, o código-fonte e as sessões de nuvem que vivem ao lado. Sob o Bromure Agentic Coding (à direita), a cadeia idêntica roda dentro de uma VM descartável: o código executa como um usuário ubuntu descartável, as credenciais que ele agarra são iscas, suas requisições de saída são filtradas e registradas no proxy do host, e fechar a sessão reinicia a caixa, apagando o servidor MCP implantado e qualquer persistência. O hipervisor é a linha que o modelo não consegue atravessar na conversa.

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.