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

Eles adicionaram o seu agente à lista

A Gen Digital publicou em 8 de setembro uma pesquisa mostrando que oito famílias de infostealers comuns agora coletam os dados locais dos agentes de codificação de IA: tokens de acesso e de renovação, configurações MCP, bancos de conversas, históricos de prompts, rastros de projetos. Nenhuma falha do Claude, do Cursor ou do Codex está envolvida. Os stealers carregam regras de coleta gerenciadas remotamente, então adicionar a pasta do seu agente foi apenas uma atualização de configuração enviada a máquinas que já estavam infectadas. O Bromure Agentic Coding move essa pasta para dentro de uma VM e a preenche com falsificações brm-, e mantém o token de renovação no host, onde o convidado nunca pode segurá-lo.

O seu agente de codificação não tem bug nenhum para alguém encontrar. Alguém reparou onde ele guarda os arquivos e enviou uma única linha nova de configuração para algumas centenas de milhares de máquinas que já estavam comprometidas.

Em 8 de setembro, Jan Rubín, que lidera a equipe de pesquisa de ameaças da Gen Digital, publicou um texto curto com um achado sem glamour. Oito famílias distintas de malware comum de roubo de informação agora coletam os dados locais dos agentes de codificação de IA. Elas copiam arquivos. Essa é toda a técnica.

Os alvos nomeados parecem uma enquete sobre o que os desenvolvedores instalaram este ano: Claude, Cline, Codex, Continue, Cursor, OpenCode, Kilo. O Amatera foi atrás de Cline e Continue. O Remus foi atrás de Claude, Cursor e OpenCode. O CallbackBeaver acrescentou Cursor e Claude, e a Gen contou mais de 5.000 amostras dele em uma janela de trinta dias. BeeStealer, STG Stealer, HydraStealer, APEX Stealer e Otter Stealer estão todos fazendo alguma versão da mesma coisa. No macOS a variante é o Djinn Stealer, e a lista dele é a mais longa: Claude, Codex, Gemini, Cline, OpenCode, Kilo.

Rubín é cuidadoso ao descrever o que está vendo. “A atividade não aponta para uma falha recém-descoberta no Claude, no Cursor ou no Codex”, escreve ele. “Ela mostra, isso sim, criminosos adaptando stealers já estabelecidos para coletar arquivos valiosos guardados em pastas locais previsíveis.”

A lista ficou uma linha maior

A mudança custou quase nada a quem a fez.

Os stealers modernos não fixam no código o que levam. Eles vêm com regras de coleta gerenciadas remotamente: um bloco de configuração listando pastas, nomes de arquivos, bancos de dados, extensões e limites de busca, buscado na infraestrutura do operador. Acrescentar um alvo novo, como o Cyber Press resumiu, significa que os operadores “adicionam ferramentas de IA recém-populares às listas de coleta do malware atualizando caminhos, nomes de arquivos ou regras de banco de dados, sem necessariamente reconstruir o malware”.

Isso foi uma decisão de produto. Alguém olhou quais pastas agora guardam algo que vale a pena vender, escreveu alguns caminhos numa configuração, e as máquinas que já rodavam uma dessas famílias começaram a enviar os dados dos agentes no contato seguinte. Os operadores não reinfectaram nada. O binário em disco continuou o mesmo, e a assinatura de detecção também.

A Gen registrou detecções de infostealer em 3,3 milhões de usuários protegidos únicos no primeiro semestre de 2026, com totais mensais acima de 500.000. Só o Amatera e o Remus apareceram em dezenas de milhares de usuários ao longo de três meses. É essa a população para a qual os operadores enviaram a nova regra.

uma atualização de config, não uma campanhaoperador — regras de coletanavegadores, cookies, carteirasSlack, Discord, perfis de VPNchaves ssh, caminhos na nuvem+ diretórios de agentes de IAuma linha acrescentada, setembrocontato seguintemáquinas já infectadas3,3 mi de usuários, S1 2026500.000+ detecções por mêsbinário inalterado em disconenhuma reinfecção precisanenhuma assinatura novao que sai do laptoptokens de acesso + renovaçãocredenciais de servidor MCPbanco de conversashistórico de promptsnomes de projetos, fonte em cachedetalhes de conta e assinaturaoito famílias, um trimestreAmatera · Remus · CallbackBeaver · BeeStealer · STG · Hydra · APEX · Otter — e Djinn no macOS
Acrescentar os agentes de codificação de IA à lista de saque não custou nenhuma compilação nova aos operadores. Os stealers comuns buscam nos seus operadores regras de coleta gerenciadas remotamente (pastas, nomes de arquivos, bancos de dados, extensões). Um operador acrescenta os diretórios dos agentes, e cada máquina já infectada passa a coletá-los no contato seguinte. O binário em disco fica inalterado, então nada na máquina parece diferente.

O que tem nessa pasta

O inventário da Gen sobre o que as regras coletam é específico: “tokens de acesso e de renovação, credenciais guardadas em configurações MCP, históricos de prompts, bancos de conversas, detalhes de conta e rastros dos projetos em que um desenvolvedor esteve trabalhando”.

Essa lista guarda dois tipos diferentes de perda sob um nome só.

O primeiro é acesso. Um token de acesso compra uma sessão. Um token de renovação compra sessões, no plural, por todo o tempo em que continuar válido, porque alguém o projetou para sobreviver à sessão de onde veio. É essa propriedade que o torna digno de roubo, e é por isso que revogar uma sessão deixa o ladrão onde ele estava. Ao lado dele, na mesma pasta, estão as credenciais da sua configuração MCP, que abrem outra coisa ainda: um serviço interno, um sistema de chamados, um banco de dados atrás de um servidor MCP em HTTP.

O segundo tipo de perda é inteligência, e é mais novo. O seu histórico de prompts é um passeio guiado pela infraestrutura do seu empregador. O Cyber Press disse sem rodeios: históricos de prompts roubados revelam “nomes de repositórios, hostnames internos, detalhes de infraestrutura, controles de segurança, segredos de API e planos de negócio”. Numa terça-feira você digita o nome do serviço, o nome do cluster, o motivo pelo qual a migração está travada, e então cola o trecho com a string de conexão dentro para perguntar por que a coisa continua falhando. Você nunca escreveu um modelo de ameaças para o seu próprio log de conversa.

Ele chega por um resultado de busca

Colocar o stealer na máquina também não exige um zero-day. Em maio, a EclecticIQ documentou uma campanha que colocou páginas falsas de instalação acima das verdadeiras: claudecode.co.com e geminicli.co.com, imitando a documentação do fornecedor de perto o bastante para passar num olhar rápido. A página entrega uma linha de PowerShell para você copiar. Você executa e recebe a ferramenta que queria, instalada à vista de todos, enquanto um segundo comando escondido puxa um stealer sem arquivo direto para a memória. Ele desliga ETW e AMSI no caminho, e depois colhe navegadores, Slack, Teams, Discord, clientes de VPN, chaves SSH e caminhos de armazenamento na nuvem. O mesmo ator rodou a mesma jogada contra Node.js, Chocolatey, KeePassXC e Monero.

A vítima, então, é o desenvolvedor que procurou um agente de codificação e clicou no primeiro resultado. Quatro meses depois esse mesmo desenvolvedor também está entregando os tokens e o histórico de conversas do agente, porque a regra de coleta ganhou uma linha.

A mesma varredura, dentro de um workspace Bromure

O Bromure Agentic Coding roda cada agente de codificação em uma VM Linux com virtualização de hardware no seu Mac e mantém todo segredo real do lado do host dessa fronteira. Pegue a lista de coleta da Gen item por item e rode contra um workspace. Suponha que o stealer vença no host, leia a regra e vá buscar cada coisa.

Tokens de acesso e de renovação. Se você usa uma assinatura do Claude ou do ChatGPT em vez de uma chave de API, o login nunca acontece na sua VM de trabalho. O Bromure inicializa uma VM de registro descartável, sem pastas do workspace montadas e sem mapa de troca de credenciais, roda o claude login de verdade dentro dela, captura no host os tokens OAuth resultantes, criptografa-os e destrói a VM. Dali em diante o convidado roda em modo de chave de API segurando uma credencial falsa determinística: uma ANTHROPIC_API_KEY falsa para o Claude, um ~/.codex/auth.json semeado com um JWT falso de expiração muito distante para o Codex, de modo que o cliente nunca tente renová-lo sozinho. Quem renova é o host, cerca de cinco minutos antes da expiração, uma vez para cada VM em execução. O manual coloca a consequência sem rodeios: o convidado nunca segura um token de renovação.

Credenciais guardadas em configurações MCP. O bearer do MCP recebe o mesmo tratamento, e o painel de ajustes diz isso. O token verdadeiro de um servidor MCP com transporte HTTP fica no host, a configuração que o agente lê recebe um substituto brm-mcp_…, e o proxy troca pelo valor real no fio, com escopo exato ou de subdomínio para o host daquele servidor e para mais lugar nenhum. O campo no painel MCP traz a legenda Nunca enviado à VM — trocado pelo proxy.

Todo o resto que parece uma chave. Cada credencial que você configura é substituída dentro da VM por uma falsificação que preserva a estrutura, derivada do valor real mais um sal por instalação, então ela mantém o formato que os validadores esperam e continua estável entre sessões: sk-ant-api03-brm-…, sk-brm-…, xai-brm-…, brm-k8s-…, brm-docker-…, brm-db-…. O canal de troca só corre num sentido. O host pode escrever falsificações dentro do convidado; não existe chamada pela qual o convidado peça de volta um valor real, e o agente dentro da VM se recusa a escrever qualquer credencial que não carregue o prefixo brm-.

Bancos de conversas, históricos de prompts, referências de projetos, fonte em cache. Esses são reais e duráveis, porque trabalho de código precisa de estado durável. Eles vivem na pasta pessoal persistente da própria VM do workspace, uma por workspace, atrás do hipervisor, e não no diretório pessoal do macOS que a regra de coleta nomeia. Uma regra que diz “copie o diretório de configuração do agente do perfil do usuário” encontra um perfil de usuário sem agente nenhum dentro.

O armazenamento do próprio host. O que o host guarda fica criptografado em repouso com AES-GCM sob uma chave mestra de 256 bits por instalação que vive no Keychain de Data Protection do macOS, restrita à identidade de assinatura do aplicativo, com a sincronização do iCloud desativada. O aplicativo não envia nem sincroniza nada. Copie a pasta Application Support, ou restaure um backup dela do Time Machine, e sem a entrada de keychain deste Mac você tem texto cifrado.

a regra de coleta, rodada dentro de um workspaceo que a regra pedeo que ela encontratokens de acesso + renovaçãouma chave falsa; nenhum token de renovação existe na VMo host renova ~5 min antes da expiração, para todas as VMsconfiguração MCPbrm-mcp_…bearer real trocado no fio, com escopo só naquele hostchaves de API, credenciais de nuvemsk-ant-api03-brm-… · brm-k8s-… · brm-db-…formato certo, valor errado, inerte fora do seu escopobanco de conversas, históricoreais, duráveis — e dentro da pasta da VM, não da suao caminho da regra nomeia uma pasta que o seu Mac não tem
A lista de coleta da Gen Digital, item por item, rodada contra um workspace do Bromure Agentic Coding. Os tokens de assinatura ficam no host e são renovados no host, então o convidado nunca segura um token de renovação. O bearer do MCP na configuração do agente é um substituto brm-mcp. As chaves de API são falsificações que preservam a estrutura. O banco de conversas e o histórico de prompts são reais, e ficam na pasta pessoal persistente da VM em vez do diretório pessoal do macOS para onde a regra aponta.

Quando a varredura acontece dentro da VM

Um stealer também pode chegar pelo outro lado: puxado pelo próprio agente, por uma dependência ou por uma instrução envenenada, e executado dentro do workspace. Aí a varredura funciona, e ela coleta falsificações. É no envio que a coisa cai.

Cada falsificação tem uma única família legítima de destino, o escopo de host para o qual foi cunhada, então o proxy varre toda requisição de saída, cabeçalhos e corpo, com um autômato de Aho-Corasick barato o bastante para rodar em tudo, procurando uma falsificação indo para onde ela não pertence. Ao acertar, ele recusa a requisição com HTTP 451 sem encaminhar um byte, põe a VM em pausa na hora e levanta um alerta que oferece Desligar, Guardar para investigação (exportar antes o disco, a pasta pessoal e as pastas compartilhadas para perícia), ou Continuar por sua conta e risco. O evento aparece como uma linha vermelha de Credential brokering na Security Timeline, o aplicativo marca o workspace como comprometido, e o próximo início exige Limpar e iniciar.

O proxy também sinaliza segredos não trocados e com cara de reais no tráfego de saída: valores de Bearer e x-api-key com prefixos conhecidos como sk-ant-, ghp_ ou AKIA, e tokens opacos de vinte caracteres ou mais. Esses aparecem no Trace Inspector e em bromure-cli trace leaks. Em geral querem dizer que alguém colou um segredo real dentro da VM na mão, que é a única maneira de desfazer a fronteira por dentro.

Alcançabilidade é a terceira checagem. Cada workspace carrega um firewall de saída ordenado cobrindo ação, protocolo, host ou CIDR, portas e, para tráfego web, os verbos HTTP individuais, com um controle segmentado para o tráfego não correspondido. Workspaces novos permitem o que nenhuma regra alcança. Ponha em Negar, liste o que o trabalho precisa, e o host de C2 de um stealer não está na lista. Dois componentes fora do convidado aplicam isso: o switch de rede virtual casa cada fluxo por IP de destino e por hostname bisbilhotado no DNS, e o proxy casa de novo pelo nome de servidor TLS. As suas edições de regra chegam às sessões em execução sem reinicializar.

o estado está na sua pasta pessoalum caminho previsível, legível por tudo que roda como vocêo diretório do agentetoken de acesso · token de renovaçãobearer tokens do MCPbanco de conversashistórico de prompts · nomes de projetoso stealer residente lê a regra e copia a pastao binário nunca mudou; só a lista de caminhos mudouenviadoacesso renovável, mais um mapa do parqueo estado está numa VM, e são chamarizesa sua pasta pessoal do macOS não tem agente para nomearVM do workspace — pasta pessoal persistentechave falsa · nenhum token de renovaçãobrm-mcp_… · brm-k8s-… · brm-db-…banco de conversas e histórico, atrás do hipervisorreais criptografados no host, AES-GCM, chave no keychainvsock 8443 — a única saídaproxy no host — consultado a cada requisiçãofirewall de saída · host, porta, verbo HTTPtroca · valor real injetado só para um hostuma linha de rastro por requisição, na sua máquinafalsificação fora do escopo → HTTP 451, VM em pausa, linha na timeline
Dois lugares para guardar o estado de um agente. Num Mac comum os tokens, as credenciais MCP e o histórico de conversas ficam numa pasta previsível dentro do perfil do usuário, que é justamente a que a regra de coleta nomeia, e qualquer coisa rodando como você consegue ler. Num workspace do Bromure Agentic Coding o mesmo estado fica na pasta pessoal persistente de uma VM, as credenciais nela são falsificações brm-, e a única rota para fora é a porta vsock 8443 até um proxy no host que confere o firewall, troca credenciais e recusa qualquer falsificação que saia do seu escopo.

Se você instala agentes por copiar e colar

Confira de onde eles vieram. A campanha da EclecticIQ colocou claudecode.co.com e geminicli.co.com acima das páginas reais e entregou aos visitantes uma linha de PowerShell que instalava a ferramenta legítima enquanto puxava um stealer para a memória. Se isso descreve alguma instalação que você fez, trate a máquina inteira como exposta: revogue as sessões da assinatura em vez de rotacionar uma chave, rotacione todos os tokens da sua configuração MCP, e leia o seu próprio histórico de prompts do jeito que um atacante leria. Os hostnames e nomes de repositório dentro dele são a parte que você não consegue rotacionar.

As duas configurações que encolhem o alvo

Registre a sua assinatura do Claude ou do ChatGPT pelo editor de workspace, para que os tokens OAuth sejam capturados no host e o convidado rode com uma chave falsa. Depois abra Guardrails, ponha Tráfego não correspondido em Negar e liste o que o trabalho precisa: allow web api.github.com, allow web registry.npmjs.org, default deny. Rode bromure-cli trace hostnames my-workspace depois de uma sessão para ver cada host que o agente alcançou, com as contagens.

O saque segue a adoção

Stealers aprendem pastas numa ordem previsível. Perfis de navegador, depois carteiras de criptomoeda, depois tokens de Discord e Slack, depois perfis de VPN. Cada um entrou nas regras de coleta um ou dois anos depois que a coisa a que ele pertencia virou normal. O atraso é o tempo que leva para máquinas suficientes terem a pasta e a linha de configuração valer a pena de ser escrita.

Os agentes de codificação cruzaram esse limiar este ano, a um preço de entrada de uma atualização de configuração, em oito famílias, dentro de um único trimestre. Nenhum patch fecha isso, porque nada está quebrado. A pasta está onde deveria estar, guardando o que deveria guardar, numa máquina que também roda o seu navegador e o seu e-mail.

O que muda o desfecho é fazer a pasta valer menos que o trabalho de copiá-la. Ponha o estado do agente do outro lado de um hipervisor, encha os arquivos de credenciais dele com valores do formato certo e do número errado, e mantenha os verdadeiros no host, onde a renovação acontece.

O seu agente de codificação é um aplicativo normal que guarda arquivos normais num lugar normal, e é por isso que ele foi parar na lista. Decida quanto esses arquivos têm permissão de valer, antes que a próxima família atualize a configuração dela. Instale o Bromure Agentic Coding e deixe que copiem os chamarizes.