A chave tinha casas demais
A Wiz conta pelo menos nove plataformas de desenvolvimento de IA que divulgaram invasões em outubro, a maioria ligada a acesso a credenciais, com atacantes atrás de variáveis de ambiente armazenadas que guardam chaves de IA. A mais recente, a Northflank, disse aos clientes em 30 de outubro que considerassem toda variável de ambiente como descriptografada, e usuários relataram suas chaves de IA sendo usadas em poucas horas. No Bromure Agentic Coding, a chave com que seu agente programa fica em um só lugar no seu Mac, o agente não consegue copiá-la para uma plataforma, e trocá-la leva uma colagem.
Toda plataforma em que você cola uma chave de IA guarda uma cópia dela. Em outubro, atacantes foram atrás dessas cópias em nove plataformas, e a Wiz viu chaves roubadas sendo testadas em menos de 30 minutos.
Em 30 de outubro, às 11h43 UTC, a Wiz alertou a Northflank, uma plataforma de nuvem para implantar aplicativos, bancos de dados e cargas de IA, sobre uma invasão. Cerca de duas horas depois, a página de status da Northflank dizia a todos os clientes: "Assume all environment variables have been decrypted. Disable/rotate all keys." (considere que todas as variáveis de ambiente foram descriptografadas; desative ou troque todas as chaves). Às 15h12, acrescentou: "Multiple users are confirming that their AI keys have been used." (vários usuários confirmam que suas chaves de IA foram usadas). A última atualização do dia, às 23h38, dizia: "Users have reported unauthorised use of AI API keys supplied to the Northflank platform." (usuários relataram uso não autorizado de chaves de API de IA fornecidas à plataforma Northflank). BleepingComputer relata que a Northflank não disse como os atacantes entraram nem quantos clientes foram afetados.
A Northflank não foi a primeira. No mesmo dia, os pesquisadores da Wiz Benjamin Read e Rami McCarthy publicaram Black October for AI Developer Platforms, que conta pelo menos nove plataformas de desenvolvimento de IA que divulgaram incidentes de segurança durante o mês. "Em qualquer outro mês, esta seria a principal notícia de segurança", escrevem.
Nove plataformas em um mês
A lista da Wiz, em ordem:
| Data | Plataforma | O que diz a divulgação |
|---|---|---|
| 6 out. | Fireworks AI | Acesso a credenciais; sinais de um ataque de "enxame de agentes" |
| 9 out. | Andromeda | Parte de um "ataque em todo o setor" |
| 14 out. | Zeabur | Acesso a credenciais; a empresa vai encerrar as atividades |
| 15 out. | Lightning AI | Acesso a credenciais |
| 16–17 out. | OpenCode | Um "sistema legado"; chaves de provedores armazenadas expostas |
| 20 out. | Railway | "Escalonamento de privilégios na nossa infraestrutura de build" |
| 23 out. | Warp | Um fornecedor terceirizado; rastros de agente levados |
| 28 out. | CommandCode | Atribuído a destilação |
| 30 out. | Northflank | Variáveis de ambiente presumidas descriptografadas |
A Wiz não encontrou uma vulnerabilidade ou dependência única por trás das nove. Elas têm em comum o alvo. A maioria dos incidentes remonta a acesso a credenciais, e os atacantes foram atrás de variáveis de ambiente armazenadas, "especialmente as que dão acesso a IA". OpenCode e CommandCode culparam a destilação, em que acesso roubado a modelos de fronteira treina modelos mais baratos. A Wiz liga o resto da demanda ao mercado de revenda que chama de LLMJacking: chaves roubadas vendidas como acesso a modelos com desconto.
Testadas em trinta minutos, revendidas aos milhões
A Wiz também rastreou o que aconteceu com dois conjuntos de credenciais corporativas roubadas usadas para o Amazon Bedrock. A Wiz não conseguiu ligar nenhum dos casos a uma invasão de plataforma específica, mas o padrão explica por que vale a pena caçar chaves de IA:
- Em até 30 minutos após o acesso às credenciais relatado, uma única
chamada
InvokeModelde um IP residencial testou as chaves. Ela pediu o Claude Fable 5.1, falhou e recorreu ao Opus 5.5, que funcionou. - Um pequeno cliente em Go passou então a verificar as chaves de 14 a 120 vezes por dia para garantir que ainda funcionavam.
- Um script
boto3enumerou as cotas do Bedrock e do EC2. O mesmo script, até a string de versão, apareceu nos dois casos. - Depois veio o tráfego em massa. O caso A fez cerca de 800.000 chamadas ao Bedrock em umas 30 horas, cerca de 90% delas bem-sucedidas. O caso B fez cerca de 1,7 milhão de chamadas em umas 13 horas, mais de um milhão bem-sucedidas.
A Wiz estima que os dois casos "provavelmente geraram mais de US$ 100 mil em uso" a preço de tabela. Os padrões de tokens pareciam tráfego revendido de agentes de programação: cache de prompts e muitos usuários finais atrás de um único revendedor. A Wiz liga a infraestrutura que tocou as chaves a sites de revenda de LLM, incluindo um que aceita pagamento em USDT.
Esse é o mercado que as chaves de IA roubadas alimentam: gente rodando agentes de programação na conta de outra pessoa.
Como uma chave acaba em nove lugares
Um desenvolvedor pega uma chave da Anthropic e começa a usá-la. Ela vai para o agente de programação, depois para o deploy de preview para que o recurso de IA do app funcione, depois para o job de CI que roda as avaliações, depois para um serviço de notebooks para testar um fine-tuning. Cada colagem leva trinta segundos e faz algo funcionar. Você nunca volta a nenhuma delas.
Agentes de programação aceleram isso. Peça a um para "fazer deploy disso
na Northflank" ou "configurar o serviço no Railway" e ele faz o que um
desenvolvedor faria: lê ANTHROPIC_API_KEY do ambiente e a passa para a
CLI da plataforma como variável do serviço. O deploy funciona. A chave
agora mora em mais uma plataforma, ao lado da senha do banco de dados, e
nenhum humano a digitou lá.
Aí alguém invade uma plataforma, e o conselho é sempre o mesmo. O da Northflank foi "Revoke existing credentials with their issuing providers, generate replacements" (revogue as credenciais existentes junto aos emissores, gere substitutas). Para isso, você primeiro precisa lembrar de todos os lugares por onde aquela chave passou.
O mesmo mês no Bromure Agentic Coding
O Bromure Agentic Coding roda Claude Code, Codex, Grok, Kimi e omp em VMs Ubuntu no seu Mac, uma VM por máquina. O agente, seus repositórios e todo comando que ele executa vivem na VM. As credenciais reais, e o proxy por onde passa todo o tráfego da VM, ficam no Mac.
A chave mora em um só lugar
As chaves de modelo vão em Preferences › Models, uma vez. O Bromure as
guarda em models.enc, criptografado com AES-GCM sob uma chave mestra no
Data Protection Keychain do Mac, com a sincronização do iCloud desligada.
O app não envia, sincroniza nem faz backup de nenhuma credencial,
armazenamento de tokens ou material de chave em lugar nenhum. O Bromure
não mantém nenhum console que guarde chaves de provedores, então um
atacante não encontra nada do nosso lado para invadir.
Dentro de cada VM, ANTHROPIC_API_KEY guarda um substituto que começa com
sk-ant-api03-brm-. O Claude Code o aceita, porque tem o formato certo.
Quando o agente chama api.anthropic.com, a requisição sai da VM pelo
proxy no seu Mac, que troca pela chave real e encaminha a requisição. O
proxy adiciona a chave para os hosts do próprio provedor e nenhum outro:
anthropic.com para uma chave da Anthropic, openai.com para uma chave
da OpenAI, e assim por diante.
Se em vez disso você entra com uma assinatura do Claude, ChatGPT, Grok ou Kimi, os tokens OAuth ficam no Mac e o Mac os renova. A VM nunca guarda um refresh token.
O agente não consegue espalhá-la
Agora repita o deploy. O agente roda a CLI da plataforma e define
ANTHROPIC_API_KEY no serviço, usando o valor do seu ambiente. Esse valor
é o substituto, e a requisição que o carrega vai para a API da plataforma.
O proxy do Bromure examina toda requisição de saída, cabeçalhos e corpo, em busca de substitutos indo para um host para o qual não foram emitidos. Uma chave substituta da Anthropic numa requisição para a API de uma plataforma de deploy é um caso desses. O proxy bloqueia a requisição com HTTP 451 antes que um byte chegue à plataforma, pausa a VM e mostra This environment may have been compromised, nomeando a credencial, o host a que ela pertence e o host para onde foi enviada.
Criamos esse alerta para malware que rouba chaves, e ele dispara do mesmo jeito para um agente tentando ajudar. Sua chave de programação não é copiada para uma plataforma de deploy sem que você veja. Se a cópia é o que você quer, Allow a envia para aquele host pelo resto da sessão. A melhor solução é emitir para o serviço de produção uma chave própria, restrita à produção, e deixar no seu Mac a chave com que seu agente programa.
Agentes também puxam segredos no sentido contrário. railway variables ou
o env pull de uma plataforma podem jogar um .env de produção no
repositório, com os valores reais. Ative Only allow credentials Bromure
injects nos Guardrails da máquina e qualquer requisição carregando uma
credencial que o Bromure não colocou ali é bloqueada e gera o mesmo
alerta. Uma chave real que o agente baixou de uma plataforma fica sem uso
na VM.
Bedrock sem chave para roubar
Os dois casos rastreados pela Wiz rodavam no Amazon Bedrock com credenciais corporativas de longa duração. No Bromure, qualquer agente pode rodar no Bedrock, o Claude Code de forma nativa e os outros pela API compatível com OpenAI do Bedrock, e nenhum deles precisa de uma chave do Bedrock. Deixe o campo Bedrock API key vazio e o Mac assina cada requisição com as credenciais AWS da máquina.
Essas credenciais podem ser temporárias. Escolha SSO / Identity Center nas credenciais AWS da máquina e o Mac obtém credenciais de função de curta duração do seu cache de SSO, renovando-as cerca de cinco minutos antes de expirarem. A VM recebe uma chave secreta falsa que produz assinaturas que a AWS rejeita; o Mac as remove e assina de novo. Nenhuma variável de ambiente em lugar nenhum guarda uma credencial do Bedrock de longa duração para alguém descriptografar.
Trocar leva uma colagem
Quando uma plataforma manda você trocar as chaves, a chave que seus agentes usam é um único campo. Cole a nova chave em Preferences › Models e o Bromure a aplica cerca de um segundo e meio depois que você para de digitar, em toda máquina em execução que a usa. Cada agente cuja credencial mudou é relançado com suas flags de retomada, então a conversa continua. As VMs não reiniciam, e nada dentro delas precisa ser editado, porque nada dentro delas guardava a chave antiga.
Se suas chaves ficam no 1Password, as outras chaves de API de uma máquina
podem ser referências op:// em vez de valores. O Bromure as resolve no
Mac e as resolve de novo a cada dois minutos, então trocar o item no
1Password chega às máquinas em execução em poucos minutos, sem reiniciar.
Seu próprio registro de cada uso
O outro conselho da Northflank foi verificar nos logs de uso e de cobrança
do provedor atividades que você não executou. No Bromure, cada troca é uma
linha na Security Timeline do seu Mac, em Credential brokering,
com uma prévia mascarada da chave e o host, como
sk-a…f9q3 → api.anthropic.com. Assinaturas AWS, Bedrock incluído,
aparecem como linhas Credential used com uma chave de acesso
mascarada. Quando o painel do provedor mostra um pico, você consegue ver
quais chamadas vieram das suas próprias máquinas.
Num Mac inscrito no Bromure Enterprise Manager, as mesmas trocas são
enviadas à sua organização como eventos credential.token_swap, levando
só prévias, nunca a chave em si. Um administrador que precisa responder
"alguma das nossas chaves foi usada de outro lugar?" tem o lado legítimo
do registro para toda a frota.
Uma cópia, no Mac
As chaves de modelo ficam em models.enc, criptografado sob uma chave do Keychain, nunca sincronizado nem enviado. Nenhum console de fornecedor as guarda.
Substitutos na VM
O ANTHROPIC_API_KEY do agente é um substituto. A chave real é adicionada no Mac, só para os hosts do próprio provedor.
Sem cópias acidentais
Um substituto enviado a uma plataforma de deploy é bloqueado com um 451, a VM pausa e o alerta nomeia o destino.
Credenciais estritas
Com o modo estrito ligado, uma chave real que o agente puxou do arquivo env de uma plataforma é bloqueada assim que é usada.
Bedrock com SSO
O Mac assina as chamadas ao Bedrock com credenciais de curta duração do Identity Center. Nenhuma chave de longa duração para guardar ou roubar.
Trocar com uma colagem
Uma nova chave em Preferences › Models chega a todo agente em execução em segundos. As VMs não reiniciam.
Conte as cópias
A Wiz ainda não sabe se um único grupo está por trás dos nove incidentes, e a maioria das plataformas não publicou a causa raiz. Toda plataforma que guarda sua chave de IA pode perdê-la, e outubro mostrou que os ladrões agora têm compradores esperando.
A chave com que seu agente programa é a que você menos gostaria de ver nessa lista. Ela funciona com seus melhores modelos e seus limites mais altos, e seu agente a usa o dia todo. No Bromure Agentic Coding, ela fica no seu Mac. O agente recebe um substituto, que nenhuma outra plataforma consegue usar.
Sobre a invasão do console do OpenCode, uma das nove de outubro, leia As chaves estavam no console deles. Sobre os rastros de agente roubados da Warp, leia O log do agente estava na nuvem deles.