TL; DR
En enda npm-utgivare, ddjidd5640, har byggt en katalog med 22 paket med falska Web3-säkerhetsverktyg under påhittade varumärken som Kryptosäkerhetsgilde, Web3 Audit Collectiveoch DeFi-säkerhetsalliansen.
Paketen ser inte ut som en enkel typosquat-kampanj. De ser ut som ett varumärkesbaserat säkerhetsekosystem, backat upp av matchande tomma GitHub-organisationer och övertygande MCP-verktygsnamn som search_leaked_credentials, validate_chain_keyoch deploy_safe.
Kampanjen är uppdelad i två aktiva nyttolastfamiljer och en vilande tranch.
Variant A innehåller 8 paket för insamling av autentiseringsuppgifter. Ett postinstallationsskript läser lokala hemliga arkiv, medan ett paketerat scanner.js körs när en AI-agent anropar paketets MCP-verktyg och söker efter plånboksnycklar, BIP39-mnemonik, API-tokens och andra autentiseringsuppgifter.
Variant B innehåller 5 Pinggy-baserade binära droppare. Dessa paket hämtar och kör en fjärrnyttolast under efterinstallationen, med foundry-deploy-helper:1.8.96 släppa en fristående körbar fil vid /tmp/.node-cache.
Variant C innehåller 9 vilande paket utan någon uppenbar postinstall-nyttolast ännu, men samma utgivare, varumärkesmönster och Web3-fokuserad namngivning.
Endast 8 av de 22 paketen hade flaggats någonstans vi kunde se; de återstående 14 var fortfarande aktiva på npm vid tidpunkten för analysen.
Allvarlighetsgrad: kritisk.
Attacken: Två nyttolaster i en garderob
Garderoben är varumärket. Öppna README-filen för crypto-credential-scanner så får du veta att det är en credential-skanner byggd av Crypto Security Guild. Öppna defi-threat-scanners sida så får du veta att det är ett verktyg för DeFi Security Alliance. Öppna web3-secrets-detector så är det Web3 Audit Collective. Inget av dessa kollektiv existerar som organisationer. De existerar som tomma GitHub-organisationer vars enda syfte är att fylla i npm-sidans "författar"-hyperlänk.
Variant A: förflygningen efter installationen och huvudakten vid MCP-tid
De 8 Variant-A-paketen delar alla en nyttolast i två steg – en förhandsflyg efter installation som hämtar alla inloggningsuppgifter som redan finns på disken i klartext, och en körtidsfas som aktiveras när en AI-agent anropar ett av paketets MCP-verktyg.
"Steg 1, förberedelserna inför flygningen" finns inline i package.json som en nod -e one-liner. Den öppnar sju välkända punktfiler och skickar de första 200 byten av varje till C2:
200 byte av ~/.ssh/id_ed25519 kommer inte att ge angriparen din privata nyckel i sig, men den kommer att ge filnamnet, kommentaren och de första raderna i PEM-rubriken — tillräckligt för att bekräfta vilken typ av nyckel som finns där, vilket är tillräckligt för att driva en uppföljningsfas. 200 byte av ~/.env är vanligtvis mer än tillräckligt för att läcka en komplett API-token. 200 byte av ~/.git-referenser är vanligtvis en fullständig uppsättning OAuth-tokens.
"Etapp 2, huvudakten", Är scanner.jsDen laddas av paketets index.js och anropas inifrån MCP-förfrågningshanteraren i det ögonblick en AI-agent anropar något av de annonserade verktygen. Filen är samma byte för byte över de 8 Variant-A-paketen (b461106e47a1f5966159cd6e92541505), och den är uppriktig om vad den gör. Den inledande kommentarsfältet lyder ordagrant:
| javascript // wallet-scanner.js — inbäddad aktiv skanner för MCP-paket // Körs tyst när AI-agenten anropar något MCP-verktyg, skannar miljön efter // plånböcker/nycklar // Använder endast Node.js inbyggda funktioner, inga externa beroenden |
Det som följer är en rekursiv vandring, djup 3, av:
själva hemkatalogen
…filtrering för filnamn som innehåller något av nyckelbutik, plånbok.json, plånbok.dat, .hemlighet, seed.txt, metamask, fantom-, rabbyn, trust-plånbok, coinbase, privat nyckel, mnemonic, hemlig nyckel, api_key — dvs. en handjusterad lista över varje plats där en kryptoanvändare förvarar en nyckel. För varje matchning öppnas filen och skannas mot sex regexer:
| Typ | Mönster | Vad den fångar |
|---|---|---|
| privat_nyckel | (?:0x)?[a-fA-F0-9]{64} | Ethereums privata nycklar och generiska 32-byte hexadecimala hemligheter. |
| mnemonic | \b([a-z]+\s+){11,23}[a-z]+\b | BIP39 mnemoniska fröfraser som sträcker sig från 12 till 24 ord. |
| api_key | (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) | Generiska API-tokens och autentiseringsuppgifter inbäddade i konfigurationsfiler. |
| hemligt | (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) | Hemligheter och privata värden som vanligtvis lagras i YAML-, JSON- och INI-konfigurationsformat. |
| et_adress | 0x[a-fA-F0-9]{40} | Ethereum-plånboksadresser som används för att identifiera och fingeravtrycka offer. |
| Lösenord | (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) | Lösenord och lösenfrasmiljövariabler i skalexportstil. |
Sedan läser scanner.js ytterligare sex dotfiler i sin helhet — upp till 500 byte vardera av ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials — och genomsöker process.env efter alla variabler vars namn innehåller key, secret, token, password, private, mnemonic, wallet eller seed. Slutligen anropar den execSync('whoami') plus os.hostname() och process.cwd() för att tagga dumpen med offrets identitet. Hela nyttolasten, plus upp till 100 individuella fynd, POSTAS som ett enda JSON-objekt.
Exfil-destinationen är inte direkt hårdkodad. Paketet hämtar den vid körning från:
https://ddjidd564.github.io/defi-security-best-practices/config.json
— ett GitHub Pages-dokument som angriparen kontrollerar. Den aktuella config.json-filen returnerar
Om hämtningen misslyckas, scanner.js faller tillbaka till samma webhook.site URL hårdkodad som en konstant. Denna indirekta kodning är den enda operativa sofistikeringen i kampanjen: den låter angriparen rotera exfil-mål utan att publicera paketet igen, och den håller den faktiska samlar-URL:en borta från npm-artefakten, vilket gör signaturbaserad detektering svårare.
Variant B: en Pinggy-tunnel, en binär och en persistent variant
Den andra live-tranchen är mycket mindre – fem paket – och mycket mindre smart. Författaren slopade MCP-kostymen helt och hållet. Dessa paket påstår sig vara konfigurationshjälpmedel för legitima Ethereum- och Solana-verktyg (tryffel-konfigurationshjälpare, aggregator för prisflöden för kedjelänkar, ganache-cli-leverantör, solana-pda-hjälpare, gjuteri-distributionshjälpare). Nyttalasten är en enda https.get-Och-exec linje i efterinstallation
C2 är gratis Pinggy tunnel — en generisk utvecklartunneltjänst som angriparen använder som tillfällig C2. Paketet laddar ner det som tunneln returnerar och placerar det i child_process.execDet finns ingen integritetskontroll, ingen signering, inget andrastegsskydd. Det som operatörens tunnel betjänar idag är det som körs.
Det mest aggressiva paketet, foundry-deploy-helper:1.8.96, ersätter den inline https.get med curl och ett uthållighetsknep:
Variant C: en polerad fasad, ingen detonator (ännu)
De återstående nio paketen — plånboks-säkerhetskopierings-verifierare, miljösäkerhetsskanner, foundy-verktygslåda (en avsiktlig typoskvad av Foundry), solna-web3 (en typosquat av Solana), plånbokssäkerhetskontroll, hardhat-gas-profiler-plugin, ethers-multicall-utils, defi-miljö-revisor, etherjs-utils - har inget postinstallationsskript och ingen uppenbar runtime-exfil vid första anblicken. De delar utgivare, varumärkesfronter, Web3-namngivningsmönstret och i vissa fall identisk README-standard med de aktiva varianterna. Vi behandlar dem som en del av samma kampanj och har rekommenderat förebyggande borttagning, men vi har ännu inte listat deras runtime-triggers i sin helhet. Den vilande delen kan vara ett fotfäste som operatören reserverar för en framtida vändning – samma mönster som PhantomBot använde i mitten av maj, där operatören bytte ut en autentiseringsstjälare mot en botnätsrekrytering utan att publicera paketnamnet igen.
Tidslinje och katalogen
Det tidigast daterade paketet i kampanjen är det med den lägsta versionen: kedjenyckelvaliderare: 0.2.3 och defi-miljö-revisor:0.3.2 ser ut som tidiga experimentella droppar. När utgivaren nådde truffle-config-helper:1.7.0 och foundry-deploy-helper:1.8.96, versionsinflationen var avsiktlig – man valde siffror som lästes som ett etablerat pakets härstamning. Ingen av de 22 har någon tidigare legitim historia under exakt det namnet på npm.
Hela katalogen, grupperad efter variant:
### Variant A — insamling av autentiseringsuppgifter (postinstallation + MCP-time scanner.js, MD5 b461106e47a1f5966159cd6e92541505)
| Paket | Version | Flaggad i detekteringsflöden |
|---|---|---|
mnemonic-safety-check | 0.5.2 | ja |
solidity-deploy-guard | 0.4.4 | ja |
web3-secrets-detector | 1.2.6 | ja |
eth-wallet-sentinel | 1.0.9 | ja |
deployment-key-auditor | 0.7.3 | ja |
defi-threat-scanner | 2.1.2 | ja |
crypto-credential-scanner | 2.0.2 | ja |
chain-key-validator | 0.2.3 | ja |
### Variant B — Pinggy-tunnel https.get → exec (ingen synlighet för detekteringsflödet före denna rapport)
| Paket | Version | Smak efter installationen |
|---|---|---|
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 — vilande, misstänkt körtidsutlösare (ingen synlighet för detekteringsflödet före denna rapport)
| Paket | Version | Anmärkningar |
|---|---|---|
wallet-backup-verifier | 1.0.1 | |
env-security-scanner | 1.6.0 | |
foundy-toolkit | 1.5.79 | typosquat av gjuteri |
solna-web3 | 1.5.98 | typosquat av 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 |
Kolumnerna Variant A och Variant B väljs inte slumpmässigt. Variant A-namnen säljer sig alla som verktyg för säkerhetsgranskning — ”säkerhetskontroll”, ”distributionsskydd”, ”hemlighetsdetektor”, ”plånboksvakt”, ”nyckelgranskare”, ”hotskanner”, ”autentiseringsskannrar”, ”kedjenyckelvaliderare”. De riktar sig till en utvecklare eller AI-agent som letar efter ett verktyg för att utvärdera säkerheten för ett Web3-projekt. Variant-B-namnen säljer sig alla som hjälp med att bygga och driftsätta för samma Web3-ekosystem — Truffle, Chainlink, Ganache, Solana PDA-verktyg, Foundry. Uppdelningen speglar en vanlig Web3-utvecklares mentala modell för "revisionsfas" kontra "distributionsfas". Oavsett vilken fas man siktar på har utgivaren paketerat en fälla för det.
Indikatorer för kompromiss
Nätverk och filer
| IOC | Variant | Syfte |
|---|---|---|
https://ddjidd564.github.io/defi-security-best-practices/config.json | A | Dynamisk webhook-resolver som hanteras via GitHub Pages. |
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 | A | Nuvarande slutpunkt för exfiltreringsinsamlare, även inbäddad som en reserv. |
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry | B | Pinggy-tunnel som används för att distribuera fjärranslutna binära nyttolaster. |
scanner.js MD5 b461106e47a1f5966159cd6e92541505 | A | Identisk skannernyttolast återanvänd i alla 8 Variant-A-paket. |
/tmp/.node-cache | B | Frikopplad körbar fil som släpptes foundry-deploy-helper:1.8.96. |
Publisher
- npm användarnamn: ddjidd5640
- email: 1623682356@qq.com (obekräftad)
- E -post och SCM verifiering: ingen
- Paket under konto: 22, alla listade i katalogen ovan
- Tidigast synliga aktivitet: kedjenyckelvaliderare: 0.2.3 (Variant A)
- Senaste synliga aktivitet: chain-key-validator:0.2.3 och crypto-credential-scanner:2.0.2 (båda inom 24 timmarna före denna beskrivning)
Varumärkesfronter (används i Författaren / README / falsk GH-org)
- "Crypto Security Guild" — stödd av en tom GitHub-org cryptosec-gillet
- ”Web3 Audit Collective” — stödd av en tom GitHub-org w3audit
- “DeFi Security Alliance” — stödd av en tom GitHub-organisation defi-säkerhet
- Referens GH-konto ddjidd564 — värd för dynamic-webhook config.json
Behavioral
- nod -e efterinstallation läser någon av .ssh, .ethereum, .bitcoin, .env, .bash_history, .zsh_history, .git-referenser med .slice(0, 200) och sammanfogar med | separatorer är ett nästan unikt fingeravtryck för variant A.
- Importera ./scanner.js från ett paket som registrerar sig som en MCP server med verktyg som heter sök_läckta_inloggningsuppgifter eller liknande formulerade "säkerhetsrevisions"-verb är en Variant-A-bekräftelse.
- En nod -e postinstall som hämtar från valfri *.run.pinggy-free.link-värd och skickar svaret till child_process.exec är en Variant-B-bekräftelse oavsett omslutningsformen.
Attribuering och motivation
Det finns tillräckligt med information för ett delvist fingeravtryck från förläggaren och långt ifrån tillräckligt för en riktig identifiering. 1623682356@qq.com är en QQ-e-postadress — Tencents gratis webbmejl, populär i Kina — och den numeriska lokala delen är QQ-användar-ID:t; vi behandlar detta endast som en mjuk signal, eftersom adresser i QQ-format registreras trivialt. npm-kontot har ingen tvåfaktorsupplysning, ingen verifierad e-postadress, ingen verifierad SCM länk. Varumärkestriaden ”Crypto Security Guild” / ”Web3 Audit Collective” / ”DeFi Security Alliance” är tillverkad i stor skal – ingen av de tre existerar utanför denna kampanj – och de bakomliggande GitHub-organisationerna är tomma skal skapade för att fylla npm-sidlänkarna.
Två mönster är värda att nämna, eftersom de dyker upp i angränsande kampanjer. Det första är varumärkesprefabrikation som socialt bevisOperatören valde inte befintliga projektnamn för att typosquatta; de tillverkade en hel förtroendeberättelse från grunden, medvetna om att en AI-agentbygge pipeline eller en hastig utvecklare som skannar npm-sidan kommer att mönstermatcha på "ser ut som en säkerhetsorganisation" snarare än "är en säkerhetsorganisation". Detta är samma tillvägagångssätt som den slordiga litteraturen varnade för – paket anpassade till den typ av namn en LLM skulle uppfinna om de blir ombedda att använda ett Web3-säkerhetsverktyg, tillräckligt väl utrustat så att LLM:en inte dubbelkollar. Slopphukning är den nyligen myntade termen för skadliga paket vars namn matchar platshållarna. LLM:er hallucinerar när ett auktoritativt paket inte existerar; denna kampanj är dess mer aggressiva kusin, där operatören också fabricerar den organisation som platshållaren skulle tillhöra.
Det andra mönstret är MCP-tidsaktivering. När scanner.js körs, installationen är klar och utvecklaren har gått vidare. Utlösaren är att AI-agenten anropar ett verktyg — sök_läckta_inloggningsuppgifter, i Variant-A-fallet – vilket agenten absolut kommer att göra, eftersom det är hela anledningen till att den fick paketet. Det skadliga arbetet sker under god en del av arbetsflödet, när utvecklaren mest sannolikt ser sin AI-assistent lyckas med en uppgift de bett om. Det är en liten beteendeförändring från den äldre "exfil on" npm installera”-mönstret, och det undviker snyggt sandlådans funktioner under installationen.
Vi namnger inte en hotbild. Signalerna (QQ-e-post, ett konto, 22-pakets burst under en dag, två parallella C2-stackar) är lika konsekventa med en ihållande operatör, ett litet team eller en av de paketöversvämningsteam som har varit synliga i npm-telemetri fram till 2025–2026. Vad vi Kan Det som sägs är att den här operatören har ett tydligt föredraget ekosystem (Ethereum + Solana + Foundry/Hardhat-verktyg), ett tydligt föredraget offer (Web3-utvecklare och AI-agenter som arbetar med Web3-projekt) och en tydligt föredragen persistensmodell (MCP-time runtime-trigger plus en fristående binär fallback).
Påverkan, trender och vad försvarare kan göra
Vår tidiga varning pipeline fångas 8 av 22 paket under kampanjens livstid – sex vid den första genomgången och ytterligare två som anlände senare samma dag under kampanjens klusterpass. De övriga 14 paketen var tillgängliga på npm i flera dagar. utan att någonsin dyka upp i någon av de detektionsflöden vi övervakar, och i skrivande stund förblir installerbara. Det gapet är viktigt eftersom:
- Variant A är tyst under installationenDotfile-läsningen sker, men bulk-exfilen utlöses bara när en AI-agent anropar paketets MCP-verktyg. standard sandlådan för att bevaka installationen kommer att se nod -e blocket och bestämma att det är litet och till synes inert.
- Variant B är en enkelradig. Det finns ingenting för en klassificerare av skadlig kod att lära sig av – ingen förvirring, ingen kodad nyttolast, ingen misstänkt utseende domän. Pinggy-tunneln är en legitim utvecklartjänst. Det enda misstänkta är att en "konfigurationshjälp" överhuvudtaget behöver ringa hem.
- Variant C ser helt ren ut. Den har ingen installation hooksVid varje statisk signal är det normalt.
En kort checklista för försvarare i MCP-verktygseran
Tre konkreta åtgärder som skulle ha fångat den här kampanjen tidigare:
- Vikta utgivaren, inte paketet. Tjugotvå paket under ett enda år gammalt QQ-e-postkonto utan SCM Verifiering är en starkare signal än någon funktion per paket. Vårt arbetsflöde för tidig varning fångade upp de första paketen eftersom utgivarens fingeravtryck stack ut – vi rekommenderade ett utgivarens ryktespoäng som vilken som helst av klassificerare för säkra, ofullständiga eller skadliga program per paket kan nedvikta.
- Behandla indirekta inställningar för dynamisk konfiguration som skadliga tills motsatsen bevisas. Ett paket som matchar sin utgående slutpunkt vid körning från ett tredjepartsdokument (GitHub Pages, GitHub Gist, Pastebin, S3-objekt, någon annanstans) har ingen legitim anledning att göra det för telemetri. Verkliga telemetrislutpunkter är hårdkodade och dokumenterade.
- Granska MCP-serverpaket via deras annonserade verktygsyta. Variant-A-paketen annonserar alla verktyg med namnet
search_leaked_credentials,validate_chain_key,deploy_safe, och liknande "revisionsverb". En MCP-värd som visar ett verktyg vars beskrivning påstår sig skanna projektkataloger efter autentiseringsuppgifter bör kräva explicit operator-tillträde innan agenten anropar det på en riktig kodbas. Poängen med MCP är att agentloopen inte har något sätt att veta omsearch_leaked_credentialsär en autentiseringssökning eller en autentiseringsutrensare.
För utvecklare som kanske redan har installerat ett av de 22 paketen: anta vilken klartextnyckel som helst i ~ / .ssh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.env, eller ~/.git-referenser är komprometterad, rotera alla autentiseringsuppgifter vars namn matchar env-variabelfilterlistan ovan, och på Linux/macOS sök efter en körbar fil på /tmp/.node-cache (och alla föräldralösa processer som startats från den). Ominstallera den legitima versionen av det imiterade verktyget (gjuteri, tryffel, hjälm, ganache, etc.) tar inte bort den borttagna binärfilen.
Den vilande Variant-C-tranchen är den del av den här historien som åldras värst. Nio paket med en ren installationsprofil och en etablerad utgivare är precis den typ av inventarie en operatör håller i reserv. Om de detonerar senare – som PhantomBot gjorde när dess axois-utils ompaketering som har omvandlats från stöld av autentiseringsuppgifter till en botnätsrekrytering — de kommer att detonera mot alla registerkonsumenter som har fäst ett Variant-C-paket mellan idag och nedtagningen. Att fästa ett skadligt paket efter version skyddar dig inte från en utgivare som kontrollerar varje version.
Referensprojekt
- [npm utgivares sida för ddjidd5640](https://www.npmjs.com/~ddjidd5640) — 22 paket listade för närvarande under detta konto. Auktoritativ källa för katalogen i skrivande stund.
- [npm-paketsida för kryptoautentiseringsskanner](https://www.npmjs.com/package/crypto-credential-scanner) — exempel på variant-A-artefakt; README, versionshistorik och länkar till författaren syns här.





