Escrito em tinta invisível
A Socket descobriu o TrapDoor, uma campanha de ataque à cadeia de suprimentos no npm, no PyPI e no Crates.io que faz algo inédito: um pacote instalado reescreve o arquivo de regras do seu próprio agente de código — CLAUDE.md, .cursorrules — e esconde a instrução em Unicode de largura zero que você não consegue ver. Na próxima vez que você executar o agente, ele lê as próprias regras internas e roda um “scan de segurança” que coleta suas chaves SSH, credenciais de nuvem, token do GitHub e carteiras de cripto. A instrução é invisível; o roubo é real. O Bromure Agentic Coding entrega a esse scan uma caixa onde não há nada que valha a pena levar.
Um pacote que você instalou edita o arquivo em que seu agente de código mais confia — o próprio arquivo de regras dele — e escreve a linha maliciosa em caracteres que aparecem como nada. Você revisa o arquivo, vê notas de projeto comuns e aprova. O agente lê o mesmo arquivo e vê uma ordem: rodar um scan de segurança, enviar os resultados para cá.
A maioria dos ataques que cobrimos esconde uma instrução maliciosa em algum lugar onde o agente vai lê-la — uma página web, um comentário de pull request, um README. Este a esconde no último lugar em que você pensaria em olhar: a própria configuração do agente. Em 22 de maio de 2026, a Socket começou a rastrear uma campanha que batizou de TrapDoor — 34 pacotes maliciosos e mais de 384 versões publicados no npm, no PyPI e no Crates.io, com os operadores republicando mais rápido do que as remoções conseguiam acompanhar. O feed automatizado da Socket detectava novas versões em média em cinco minutos e cinquenta e seis segundos; a mais rápida, cinquenta e oito segundos após a publicação. The Hacker News e Phoenix Security cobriram o caso na mesma semana. Escrevemos sobre isso agora porque seu lance mais recente é o exemplo mais nítido até hoje de um ladrão de cadeia de suprimentos feito para mirar direto em um agente de código.
Os pacotes parecem as ferramentas que um desenvolvedor pega sem pensar
duas vezes: carregadores de ambiente, verificadores de carteira,
auxiliares de build e — o que começou tudo — eth-security-auditor, um
“auditor de segurança”. Instale um e ele faz as coisas comuns de um
infostealer. Mas o payload compartilhado do npm, um arquivo de 48 KB
chamado trap-core.js, faz mais uma coisa que não tem nada de comum. Ele
escreve em .cursorrules e CLAUDE.md.
A linha que você não consegue ver
Esses dois arquivos são regras internas. O Cursor lê .cursorrules; o
Claude Code lê CLAUDE.md. Eles existem para que um repositório possa
dizer ao agente como se comportar neste projeto — as convenções, o que se
faz e o que não se faz — e o agente os trata como instruções permanentes,
aplicadas a tudo o que ele faz naquela pasta. É o texto de maior confiança
do espaço de trabalho, porque presume-se que você o escreveu.
O TrapDoor escreve neles e esconde a escrita. A instrução maliciosa é
codificada com caracteres Unicode de largura zero — U+200B, U+200C,
U+200D, U+FEFF — pontos de código que um editor de texto não exibe de
forma alguma. Abra CLAUDE.md e você vê suas notas de projeto comuns.
Rode git diff e, dependendo das suas configurações, você talvez não veja
nada digno de parar. Os bytes estão lá; os glifos não. É uma mensagem
escrita em tinta invisível, e o único leitor que a revela é o agente, que
analisa todo o fluxo Unicode e encontra uma instrução plantada no próprio
livro de regras.
O scan que rouba
A instrução oculta manda o agente rodar um “scan de segurança”. Nada nisso
soa alarmante — você entregou ao agente um auditor de segurança, e agora
as regras dele pedem que ele audite. O que o scan de fato faz é vasculhar
a máquina em busca de qualquer coisa que valha dinheiro. A análise do
payload feita pela Socket lista chaves SSH, credenciais AWS, tokens do
GitHub, perfis de navegador e bancos de login, variáveis de ambiente e
chaves de API e — a assinatura desta campanha — carteiras de
criptomoeda: Sui, Solana, Aptos e as extensões de carteira do navegador.
Depois exfiltra para um site do GitHub Pages (ddjidd564[.]github[.]io)
e, na variante do Crates.io, para GitHub Gists.
Um detalhe mostra o quanto isso é deliberado. Antes de enviar qualquer coisa, o payload “chama ativamente as APIs da AWS e do GitHub para confirmar se as credenciais roubadas são válidas, filtrando os tokens de alto valor antes da exfiltração”. Ele não apenas pega e despeja. Testa cada credencial contra o serviço real, guarda as ativas e joga fora as mortas. Os operadores querem uma lista limpa de chaves que funcionam.
A Phoenix Security nomeia por que isso atinge com mais força as pessoas visadas: desenvolvedores de cripto e DeFi, porque “chaves SSH, credenciais de nuvem, tokens do GitHub e keystores de carteira cripto rotineiramente coexistem na mesma máquina”. Essa frase é toda a superfície de ataque. O agente roda no seu notebook, como você, e tudo o que tem valor está ao alcance dele. A linha invisível no arquivo de regras é apenas o gatilho; o acesso ambiente é o payload.
Onde o Bromure traça a linha
O Bromure Agentic Coding não depende de flagrar a linha invisível — embora, como veremos, ele leia os mesmos bytes. Ele muda o que a linha consegue alcançar quando dispara. O agente de cada perfil roda dentro de uma VM Linux descartável no Apple Silicon, a um hipervisor de distância do macOS, e as credenciais nessa caixa não são as suas.
As credenciais são iscas. Esta é a camada em que o TrapDoor entra
direto, porque o TrapDoor é, no fundo, um ladrão de credenciais. Um
intermediário de credenciais no host
mantém seus segredos reais da Anthropic, da AWS e do GitHub totalmente
fora da caixa. Dentro da VM o agente vê substitutos — um token brm_…, um
kubeconfig sintético, uma chave SSH descartável — e o intermediário só
troca pelo valor real na fronteira de rede, em requisições para destinos
que você já aprovou. Então o “scan de segurança” roda, vasculha o disco e
colhe exatamente o que foi enviado para colher: falsificações. E o passo
esperto de validação da campanha se volta contra ela — ele chama a AWS e o
GitHub para confirmar que os tokens estão ativos, as iscas falham nesse
teste, e o filtro feito para manter só as chaves que funcionam não mantém
nada.
As carteiras não estão lá. Os keystores Sui e Solana, os bancos de login do navegador, as extensões de carteira — nada disso vive em uma VM de código descartável. Está na sua máquina real, a um hipervisor de distância, onde o scan não consegue ver. Feche a sessão e a caixa se reinicia, arquivo de regras envenenado e tudo.
A exfiltração é filtrada. Digamos que o scan encontre algo que valha a
pena enviar. O POST para ddjidd564.github.io, ou a escrita em um GitHub
Gist, é uma requisição de saída, e toda requisição de saída atravessa o
proxy do host, onde o destino verdadeiro é conferido contra a lista
aprovada do perfil na hora de sair. Um ladrão ligando para casa, para um
endereço que o perfil nunca aprovou, não sai — e as formas destrutivas
contra as APIs que o perfil de fato expõe encontram uma proteção que pode
recusá-las, não importa no que o agente tenha sido convencido.
À frente de tudo isso está a camada que encontra o TrapDoor no seu gatilho. Todo o ataque começa com conteúdo que o agente lê — o arquivo de regras envenenado — e o Bromure pontua o conteúdo não confiável com um detector de injeção no dispositivo antes que o modelo aja sobre ele. O Unicode de largura zero que esconde a instrução do seu editor não a esconde do avaliador: ele lê o mesmo fluxo de bytes, pontos de código invisíveis incluídos, e um arquivo de regras que decodifica para “rodar um scan e enviar os segredos para fora” é exatamente o formato que ele foi feito para sinalizar. Ele pega a maior parte disso na porta. Uma codificação suficientemente inédita ainda pode escapar de um classificador, e é por isso que ele fica na frente da caixa descartável em vez de no lugar dela.
Invisível para você, vazio para o ladrão
A parte perturbadora do TrapDoor não é o truque de codificação. É que o truque funciona no único arquivo em que mandaram você confiar — as regras que você escreveu para o seu próprio agente — e que um humano revisando esse arquivo não vê nada de errado, porque não há nada para ver. A detecção tem de vencer toda vez contra cada nova forma de esconder uma linha. É uma corrida que vale a pena correr, e o avaliador no dispositivo a corre, mas não é onde a segurança deveria repousar.
O Bromure Agentic Coding a faz repousar um nível abaixo. Ele parte do princípio de que o agente acabará lendo uma instrução envenenada que não consegue distinguir de uma real — tinta invisível ou não — e garante que, quando o agente for procurar segredos para roubar, os segredos sejam iscas, as carteiras estejam em uma máquina que ele não pode alcançar e a saída seja filtrada. O scan roda mesmo assim. Ele apenas volta de mãos vazias. Instale-o e dê ao seu agente um livro de regras que, envenenado ou não, aponta para nada que valha a pena levar.