AuditorTrap

AuditorTrap: O breaslă de securitate cripto falsă cu 22 de pachete pe npm cu două sarcini utile paralele

TL; DR

Un singur editor npm, ddjidd5640, a creat un catalog de 22 de pachete de instrumente de securitate Web3 false sub mărci fabricate, cum ar fi Breasla de Securitate Crypto, Colectivul de audit Web3 și Alianța de Securitate DeFi.

Pachetele nu arată ca o simplă campanie typosquat. Ele arată ca un ecosistem de securitate de marcă, susținut de organizații GitHub goale și nume convingătoare de instrumente MCP, cum ar fi search_leaked_credentials, validate_chain_key și deploy_safe.

Campania se împarte în două familii de sarcini utile active și o tranșă inactivă.

Varianta A conține 8 pachete de recoltare a credențiale. Un script postinstalare citește depozitele locale de secrete, în timp ce un script inclus în pachet scanner.js rulează atunci când un agent AI invocă instrumentele MCP ale pachetului, căutând chei de portofel, mnemonice BIP39, token-uri API și alte acreditări.

Varianta B conține 5 dropper-uri binare bazate pe Pinggy. Aceste pachete preiau și execută o funcție utilă la distanță în timpul postinstalării, cu foundry-deploy-helper:1.8.96 abandonând un executabil detașat la /tmp/.node-cache.

Varianta C conține 9 pachete inactive fără o sarcină utilă post-instalare evidentă încă, dar cu același editor, model de branding și denumire axată pe Web3.

Doar 8 din cele 22 de pachete fuseseră semnalizate undeva unde puteam vedea; restul de 14 erau încă active pe npm la momentul analizei.

Severitate: critică.

Atacul: Două încărcături utile într-un singur dulap

Garderoba este brandul. Deschideți fișierul README al crypto-credential-scanner și vi se va spune că este un scaner de credențiale construit de Crypto Security Guild. Deschideți pagina defi-threat-scanner și vi se va spune că este un instrument al DeFi Security Alliance. Deschideți web3-secrets-detector și este Web3 Audit Collective. Niciunul dintre aceste colective nu există ca organizație. Ele există ca organizații GitHub goale al căror singur scop este de a popula hyperlinkul „autor” al paginii npm.

Varianta A: verificarea preliminară post-instalare și actul principal în timpul MCP

Cele 8 pachete Variant-A au în comun o sarcină utilă în două etape - o etapă pre-flight post-instalare care preia orice acreditări deja existente pe disc în text simplu și o etapă de execuție care se activează odată ce un agent AI apelează unul dintre instrumentele MCP ale pachetului.

„Etapa 1, pregătirea înainte de zbor” locuiește în linie în package.json ca un nod -e one-liner. Deschide șapte fișiere dotfile bine cunoscute și trimite primii 200 de octeți din fiecare către C2:

200 de octeți de ~/.ssh/id_ed25519 nu va oferi atacatorului cheia ta privată de la sine, dar îi va oferi numele fișierului, comentariul și primele linii ale antetului PEM — suficient pentru a confirma ce fel de cheie se află acolo, ceea ce este suficient pentru a declanșa o etapă ulterioară. 200 de octeți de ~/.env sunt de obicei mai mult decât suficiente pentru a scurge un token API complet. 200 de octeți de ~/.git-credentials sunt de obicei un set complet de token-uri OAuth.

„Etapa 2, actul principal”, Este scanner.jsEste încărcat de pachet index.js și apelat din interiorul handlerului de cereri MCP în momentul în care un agent AI invocă oricare dintre instrumentele promovate. Fișierul este același octet cu octet în cele 8 pachete Variant-A (b461106e47a1f5966159cd6e92541505) și este sincer în ceea ce privește ceea ce face. Blocul de comentarii de la început spune, textual:

javascript // wallet-scanner.js — scaner activ încorporat pentru pachete MCP // Rulează silențios când agentul AI apelează orice instrument MCP, scanează mediul pentru // portofele/chei // Folosește doar elementele încorporate Node.js, fără dependențe externe

Ceea ce urmează este o parcursă recursivă, adâncimea 3, de:

directorul principal în sine

...filtrarea numelor de fișiere care conțin oricare dintre depozit de chei, portofel.json, portofel.dat, .secret, seed.txt, metamask, fantomă, rabios, portofel de încredere, coinbase, cheie privată, mnemonic, cheie secreta, api_key — adică o listă ajustată manual cu fiecare loc unde un utilizator cripto păstrează o cheie. Pentru fiecare potrivire, fișierul este deschis și scanat în raport cu șase expresii regulate:

Tip Model Ceea ce prinde
cheie_privată (?:0x)?[a-fA-F0-9]{64} Chei private Ethereum și secrete hexazecimale generice pe 32 de octeți.
mnemonic \b([a-z]+\s+){11,23}[a-z]+\b Fraze mnemonice BIP39 cuprinzând între 12 și 24 de cuvinte.
api_key (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) Jetoane API generice și valori de acreditare încorporate în fișierele de configurare.
secret (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) Secrete și valori private stocate în mod obișnuit în formatele de configurare YAML, JSON și INI.
adresă_eth 0x[a-fA-F0-9]{40} Adrese de portofel Ethereum folosite pentru identificarea și amprentarea victimelor.
parola (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) Parole și variabile de mediu cu frază de acces în stil shell export.

Apoi, scanner.js citește încă șase fișiere dotfile în întregime — până la 500 de octeți fiecare dintre ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials — și caută în process.env orice variabilă al cărei nume conține key, secret, token, password, private, mnemonic, wallet sau seed. În cele din urmă, apelează execSync('whoami') plus os.hostname() și process.cwd() pentru a eticheta dump-ul cu identitatea victimei. Întreaga sarcină utilă, plus până la 100 de descoperiri individuale, este trimisă prin POST ca un singur obiect JSON.

Destinația exfil nu este codificată direct. Pachetul o preia în timpul execuției de la:
https://ddjidd564.github.io/defi-security-best-practices/config.json

— un document GitHub Pages controlat de atacator. Fișierul config.json curent returnează

Dacă acea preluare eșuează, scanner.js se întoarce la același lucru webhook.site URL codificat ca o constantă. Această indirecționare este singurul element de sofisticare operațională din campanie: permite atacatorului să rotească țintele exfil fără a republica pachetul și păstrează URL-ul colectorului real în afara artefactului npm, ceea ce îngreunează detectarea bazată pe semnătură.

Varianta B: un tunel Pinggy, un fișier binar și o variantă persistentă

Cealaltă tranșă activă este mult mai mică — cinci pachete — și mult mai puțin inteligentă. Autorul a renunțat complet la costumul MCP. Aceste pachete pretind că sunt instrumente de configurare pentru instrumente legitime Ethereum și Solana (truffle-config-helper, agregator-de-feed-uri-de-preț-chainlink, furnizor de ganache-cli, solana-pda-helper, ajutor-la-implementarea-turnătorieiSarcina utilă este una singură https.get-Și-Exec linie în postinstalare

C2 este gratuit Pinggy tunel — un serviciu generic de tunelare pentru dezvoltatori pe care atacatorul îl folosește ca C2 efemer. Pachetul descarcă tot ce returnează tunelul și îl introduce în proces_copil.execNu există nicio verificare a integrității, nicio semnătură, nicio protecție de nivel doi. Indiferent ce deservește tunelul operatorului astăzi, este ceea ce funcționează.

Cel mai agresiv pachet, ajutor-la-implementarea-turnătorii:1.8.96, înlocuiește inline https.get implementate cu răsuci și un truc de persistență:

Urmărirea & detașează fișierul binar de procesul de instalare, astfel încât instalarea se finalizează silențios, în timp ce un fișier binar cu rulare lungă este lăsat să ruleze în fundal sub un nume care arată ca un fișier cache Node.js banal. Nu am recuperat fișierul binar în sine; tunelul nu a răspuns când am verificat, acesta fiind comportamentul așteptat pentru un tunel pe care operatorul îl activează și îl dezactivează la cerere.

 Varianta C: o fațadă lustruită, fără detonator (încă)

Celelalte nouă pachete — verificator-de-copiere-de-rezervă-pentru-portofel, scaner-de-securitate-env, trusă de instrumente foundy (o scriere deliberată a lui Foundry), solna-web3 (un typosquat al lui Solana), verificator-de-securitate-portofel, plugin hardhat-gas-profiler, ethers-multicall-utils, auditor defi-env, utilitare etherjs - avea fără script de postinstalare și nicio exfilare evidentă la prima vedere în timpul rulării. Au în comun editorul, fronturile de brand, modelul de denumire Web3 și, în unele cazuri, un fișier README identic cu variantele active. Le tratăm ca parte a aceleiași campanii și am recomandat eliminarea preventivă, dar nu am enumerat încă în întregime factorii declanșatori ai acestora în timpul rulării. Tranșa inactivă ar putea fi un punct de sprijin pe care operatorul îl rezervă pentru o viitoare schimbare - același model folosit de PhantomBot la mijlocul lunii mai, unde operatorul a schimbat un hoț de credențiale cu un recrut de botnet fără a republica numele pachetului.

Cronologie și catalog

Cel mai vechi pachet din campanie este cel cu cea mai recentă versiune: validator-cheie-lanț:0.2.3 și defi-env-auditor:0.3.2 arătau ca niște lansări experimentale timpurii. Până când editorul a ajuns truffle-config-helper:1.7.0 și ajutor-la-implementarea-turnătorii:1.8.96, inflația versiunilor a fost deliberată — alegerea unor numere care se citesc ca o linie genetică a unui pachet stabilit. Niciunul dintre cele 22 nu are vreun istoric legitim anterior sub exact acest nume pe npm.

Catalogul complet, grupat după variante:

### Varianta A — instrument de colectare a credențialelor (postinstalare + scanner.js în timpul MCP, MD5 b461106e47a1f5966159cd6e92541505)

Pachet Versiune Semnalat în fluxurile de detectare
mnemonic-safety-check 0.5.2 da
solidity-deploy-guard 0.4.4 da
web3-secrets-detector 1.2.6 da
eth-wallet-sentinel 1.0.9 da
deployment-key-auditor 0.7.3 da
defi-threat-scanner 2.1.2 da
crypto-credential-scanner 2.0.2 da
chain-key-validator 0.2.3 da

### Varianta B — Tunel Pinggy https.get → exec (fără vizibilitate a fluxului de detectare înainte de acest raport)

Pachet Versiune Aromă postinstalare
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 &

### Varianta C — inactiv, declanșator suspectat în timpul execuției (fără vizibilitate a fluxului de detectare înainte de acest raport)

Pachet Versiune notițe
wallet-backup-verifier 1.0.1
env-security-scanner 1.6.0
foundy-toolkit 1.5.79 typosquat de turnătorie
solna-web3 1.5.98 typosquat al lui 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

Coloanele Varianta A și Varianta B nu sunt alese la întâmplare. Numele Variantei A se vând toate ca fiind instrumente de auditare a securității — „verificare de siguranță”, „gardă implementare”, „detector de secrete”, „santinelă portofel”, „auditor cheie”, „scanner de amenințări”, „scanner de credențiale”, „validator cheie lanț”. Acestea sunt destinate unui dezvoltator sau agent AI care caută un instrument pentru a evalua siguranța unui proiect Web3. Numele Variantei B se vând toate ca fiind asistenți la construire și implementare pentru același ecosistem Web3 — Truffle, Chainlink, Ganache, instrumentele Solana PDA, Foundry. Separarea reflectă modelul mental al unui dezvoltator Web3 normal: „faza de audit” vs. „faza de implementare”. Indiferent de faza pe care o alegeți, editorul a pregătit o capcană pentru aceasta.

Indicatori de compromis

Rețea și fișiere

IOC Variantă Scop
https://ddjidd564.github.io/defi-security-best-practices/config.json A Rezolvator dinamic de webhook-uri găzduit prin GitHub Pages.
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 A Punct final curent al colectorului de exfiltrare, încorporat și ca rezervă.
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry B Tunel Pinggy folosit pentru distribuirea de sarcini binare la distanță.
scanner.js MD5 b461106e47a1f5966159cd6e92541505 A Sarcină utilă identică a scanerului reutilizată în toate cele 8 pachete Variant-A.
/tmp/.node-cache B Executabil detașat eliminat de foundry-deploy-helper:1.8.96.

Editor

  • nume de utilizator npm: ddjidd5640
  • e-mail: 1623682356@qq.com (neverificat)
  • E-mail și SCM verificare: nicio
  • Pachete în cont: 22, toate listate în catalogul de mai sus
  • Cea mai veche activitate vizibilă: validator-cheie-lanț:0.2.3 (Varianta A)
  • Ultima activitate vizibilă: chain-key-validator:0.2.3 și crypto-credential-scanner:2.0.2 (ambele în ultimele 24 de ore dinaintea acestei scrieri)

Fațade de marcă (utilizate în autor / README / organizație GH falsă)

  • „Crypto Security Guild” — susținută de o organizație GitHub goală cryptosec-guild
  • „Web3 Audit Collective” — susținut de o organizație GitHub goală w3audit
  • „DeFi Security Alliance” — susținută de o organizație GitHub goală defi-securitate
  • Contul GH de referință ddjidd564 — gazda fișierului config.json dynamic-webhook

Comportamental

  • nod -e citirea postinstalare a oricăruia dintre .ssh, .ethereum, .bitcoin, .și V, .bash_history, .zsh_history, .git-credentials implementate cu .slice(0, 200) și concatenând cu | separatoarele reprezintă o amprentă aproape unică pentru Varianta A.
  • Importarea ./scanner.js dintr-un pachet care se înregistrează ca MCP server de cu instrumente numite date_de_credențialitate_scurse_de_căutare sau verbele de „audit de securitate” formulate similar reprezintă o confirmare a Variantei A.
  • Un nod -e postinstall care preia de la orice gazdă *.run.pinggy-free.link și redirecționează răspunsul către child_process.exec este o confirmare Variant-B, indiferent de wrapper.

Atribuire și motivație

Există suficiente date disponibile pentru o amprentă parțială a editorului și nici pe departe suficiente pentru o identificare reală. 1623682356@qq.com este o adresă de e-mail QQ — serviciul de webmail gratuit al Tencent, popular în China continentală — iar partea numerică locală este ID-ul utilizatorului QQ; tratăm acest lucru doar ca un semnal soft, deoarece adresele în format QQ sunt înregistrate în mod trivial. Contul npm nu are divulgare cu doi factori, nu are e-mail verificat, nu este verificat SCM Triada de branduri „Crypto Security Guild” / „Web3 Audit Collective” / „DeFi Security Alliance” este fabricată en-gros — niciuna dintre cele trei nu există în afara acestei campanii — iar organizațiile GitHub care o susțin sunt shells goale create pentru a popula linkurile paginii npm.

Două modele merită denumite, deoarece apar în campanii adiacente. Primul este prefabricarea mărcii ca dovadă socialăoperatorul nu a ales nume de proiecte existente pentru a le typosquata; a creat o întreagă narațiune de încredere de la zero, știind că un Construcție de agent AI pipeline sau un dezvoltator grăbit care scanează pagina npm va găsi o potrivire de tipar pe „pare a fi o organizație de securitate” în loc de „este o organizație de securitate”. Aceasta este aceeași abordare despre care avertiza literatura de specialitate privind slopsquatting - pachete reglate la tipul de nume pe care l-ar folosi un LLM. inventa dacă li se cere un instrument de securitate Web3, suficient de bine echipat încât LLM-ul să nu verifice de două ori. Genuflexiuni este termenul inventat recent pentru pachetele rău intenționate ale căror nume corespund cu substituenții. LLM-urile au halucinații atunci când un pachet autoritar nu există; această campanie este verișoara sa mai agresivă, în care operatorul fabrică și organizația căreia i-ar aparține substituentul.

Al doilea model este Activare în timp MCP. Până când scanner.js rulează, instalarea s-a terminat și dezvoltatorul a continuat. Declanșatorul este agentul AI care apelează un instrument — date_de_credențialitate_scurse_de_căutare, în cazul Variantei A — lucru pe care agentul îl va face cu siguranță, deoarece acesta este întregul motiv pentru care i-a fost dat pachetul. Lucrările rău intenționate au loc în timpul bine parte a fluxului de lucru, atunci când dezvoltatorul are cea mai mare probabilitate să-și urmărească asistentul AI cum reușește să îndeplinească o sarcină pe care a solicitat-o. Este o mică schimbare de comportament față de vechiul „exfil pe” npm install„și evită cu ușurință sandboxing-ul în timpul instalării.

Nu numim un actor de amenințare. Semnalele (email QQ, cont unic, rafală de 22 de pachete într-o singură zi, două stive C2 paralele) sunt la fel de consistente cu un operator persistent, o echipă mică sau una dintre echipele de inundații de pachete care au fost vizibile în telemetria npm în perioada 2025-2026. Ceea ce noi... poate să Se poate spune că acest operator are un ecosistem preferat clar (Ethereum + Solana + instrumente Foundry/Hardhat), o victimă preferată clară (dezvoltatorii Web3 și agenții AI care lucrează la proiecte Web3) și un model de persistență preferat clar (declanșator în timpul execuției MCP plus o soluție binară detașată).

Impact, tendințe și ce pot face apărătorii

Avertismentul nostru timpuriu pipeline prins 8 de 22 pachete pe durata campaniei — șase la verificarea inițială și încă două care au sosit mai târziu în aceeași zi, în timpul etapei de grupare a campaniei. Celelalte 14 pachete au fost disponibile pe npm timp de zile întregi. fără a apărea vreodată în niciunul dintre fluxurile de detectare pe care le monitorizămși, la momentul scrierii, rămân instalabile. Această lacună este importantă deoarece:

  • Varianta A este silențioasă în timpul instalăriiCitirea fișierului dotfile are loc, dar exfilarea în bloc se declanșează doar atunci când un agent AI invocă instrumentele MCP ale pachetului. A standard sandbox-ul care urmărește postinstalarea va vedea nod -e bloc și să decidă că este mic și aparent inert.
  • Varianta B este o singură linie. Un clasificator de programe malware nu are nimic de învățat din el - nicio ofuscare, nicio sarcină utilă codificată, niciun domeniu suspect. Tunelul Pinggy este un serviciu legitim pentru dezvoltatori. Singurul lucru suspect este că un „ajutor de configurare” trebuie să sune acasă.
  • Varianta C arată complet curată. Nu are instalare hooksLa fiecare semnal static, este normal.

O scurtă listă de verificare a apărătorilor pentru era instrumentului MCP

Trei acțiuni concrete care ar fi prins această campanie mai devreme:

  1. Ponderează editorul, nu ambalajul. Douăzeci și două de pachete sub un cont de e-mail QQ vechi de un an, fără SCM Verificarea este un semnal mai puternic decât orice funcție per pachet. Fluxul nostru de lucru de avertizare timpurie a detectat primele pachete deoarece amprenta editorului ieșea în evidență - recomandând un scor de reputație al editorului pe care oricare dintre clasificatorii per pachet siguri, neconcludenți sau malware îl poate reduce.
  2. Tratați indirecțiile de configurare dinamică ca fiind rău intenționate până la proba contrarie. Un pachet care își rezolvă endpoint-ul de ieșire la momentul execuției dintr-un document terț (GitHub Pages, GitHub Gist, Pastebin, obiect S3, oriunde altundeva) nu are niciun motiv legitim să facă acest lucru pentru telemetrie. Endpoint-urile de telemetrie reale sunt codificate și documentate.
  3. Auditați pachetele serverului MCP după suprafața instrumentelor anunțată. Toate pachetele Variant-A promovează instrumente numite search_leaked_credentials, validate_chain_key, deploy_safeși verbe similare de „audit”. O gazdă MCP care afișează un instrument a cărui descriere pretinde că scanează directoarele de proiect pentru acreditări ar trebui să necesite o aprobare explicită a operatorului înainte ca agentul să îl invoce pe o bază de cod reală. Ideea MCP este că bucla agentului nu are cum să știe dacă search_leaked_credentials este o căutare de acreditări sau este un exfiltrator de acreditări.

Pentru dezvoltatorii care este posibil să fi instalat deja unul dintre cele 22 de pachete: presupuneți orice cheie text în clar din ~ / .ssh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.env, ~/.git-credentials este compromisă, rotiți fiecare acreditări al cărei nume se potrivește cu lista de filtre env-variable de mai sus și, pe Linux/macOS, verificați dacă există un fișier executabil la /tmp/.node-cache (și orice proces orfan pornit de la acesta). Reinstalarea versiunii legitime a instrumentului impersonat (turnătorie, trufă, palarie tare, ganache, etc.) nu elimină fișierul binar eliminat.

Tranșa inactivă Variant-C este partea din această poveste care îmbătrânește cel mai greu. Nouă pachete cu un profil de instalare curat și un editor consacrat sunt exact genul de inventar pe care un operator îl păstrează în rezervă. Dacă acestea detonează mai târziu - așa cum a făcut PhantomBot când... axois-utils reîmpachetarea a trecut de la furtul de acreditări la o recrutare de botnet — acestea vor detona împotriva oricărui consumator de registru care a fixat un pachet Variant-C între ziua de azi și momentul eliminării. Fixarea unui pachet rău intenționat în funcție de versiune nu vă protejează de un editor care controlează fiecare versiune.

Referinte

  • [pagina editorului npm pentru ddjidd5640](https://www.npmjs.com/~ddjidd5640) — 22 de colete listate în prezent în cadrul acestui cont. Sursă autorizată pentru catalog la momentul redactării.
  • [pagina pachetului npm pentru scaner de acreditări criptografice](https://www.npmjs.com/package/crypto-credential-scanner) — exemplu de artefact Varianta A; fișierul README, istoricul versiunilor și linkurile către autori sunt vizibile aici.
sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni