AuditorTrap

AuditorTrap: Een nep-cryptografiebeveiligingsgilde met 22 pakketten op npm met twee parallelle payloads

TL; DR

Een enkele npm-publisher, ddjidd5640heeft een catalogus van 22 nep-Web3-beveiligingspakketten samengesteld onder verzonnen merknamen zoals Crypto Security Guild, Web3 Audit Collectiefen DeFi-beveiligingsalliantie.

De pakketten lijken niet op een simpele typosquat-campagne. Ze lijken eerder op een merkgebonden beveiligingssysteem, ondersteund door bijpassende lege GitHub-organisaties en overtuigende MCP-toolnamen zoals search_leaked_credentials, validate_chain_keyen deploy_safe.

De campagne splitst zich op in twee actieve payloadfamilies en één slapende tranche.

variant A Bevat 8 pakketten voor het verzamelen van inloggegevens. Een postinstallatiescript leest lokale geheime archieven, terwijl een gebundeld pakket... scanner.js Dit proces wordt uitgevoerd wanneer een AI-agent de MCP-tools van het pakket aanroept en zoekt naar wallet-sleutels, BIP39-mnemoniccodes, API-tokens en andere inloggegevens.

variant B Bevat 5 op Pinggy gebaseerde binaire droppers. Deze pakketten halen een externe payload op en voeren deze uit tijdens de postinstallatie. foundry-deploy-helper:1.8.96 het plaatsen van een losgekoppeld uitvoerbaar bestand op /tmp/.node-cache.

Variant C Bevat 9 slapende pakketten zonder duidelijke installatie-payload, maar wel met dezelfde uitgever, merkidentiteit en Web3-gerichte naamgeving.

Slechts 8 van de 22 pakketten waren ergens gemarkeerd, voor zover wij konden zien; de overige 14 waren op het moment van analyse nog steeds actief op npm.

Ernst: kritiek.

De aanval: Twee wapens in één kledingkast

De kledingkast is het merk. Open de README van crypto-credential-scanner en je leest dat het een credential scanner is, ontwikkeld door de Crypto Security Guild. Open de pagina van defi-threat-scanner en je leest dat het een tool is van de DeFi Security Alliance. Open web3-secrets-detector en je ziet dat het de Web3 Audit Collective is. Geen van deze collectieven bestaat als organisatie. Het zijn lege GitHub-organisaties waarvan het enige doel is om de hyperlink 'auteur' op de npm-pagina te vullen.

Variant A: de pre-flight check na de installatie en de hoofdact tijdens het MCP-proces.

De 8 Variant-A-pakketten delen allemaal een payload in twee fasen: een pre-flight-fase na de installatie die alle reeds op de schijf aanwezige inloggegevens in platte tekst ophaalt, en een runtime-fase die wordt geactiveerd zodra een AI-agent een van de MCP-tools van het pakket aanroept.

“Fase 1, de voorbereiding op de vlucht” Het programma staat inline in package.json als een node -e one-liner. Het opent zeven bekende dotfiles en verzendt de eerste 200 bytes van elk naar de C2-server:

200 bytes ~/.ssh/id_ed25519 Het zal de aanvaller niet direct je privésleutel geven, maar het zal wel de bestandsnaam, de opmerking en de eerste regels van de PEM-header — genoeg om te bevestigen wat voor soort sleutel daar aanwezig is, wat voldoende is om een ​​vervolgfase in gang te zetten. 200 bytes ~/.env zijn meestal meer dan genoeg om een ​​volledig API-token te lekken. 200 bytes ~/.git-referenties Het betreft doorgaans een complete set OAuth-tokens.

“Podium 2, de hoofdact”Is scanner.jsHet wordt geladen door het pakket. index.js en wordt aangeroepen vanuit de MCP-verzoekhandler op het moment dat een AI-agent een van de geadverteerde tools aanroept. Het bestand is byte voor byte hetzelfde in alle 8 Variant-A-pakketten (b461106e47a1f5966159cd6e92541505), en het is openhartig over wat het doet. Het openingscommentaar luidt, letterlijk:

javascript // wallet-scanner.js — ingebouwde actieve scanner voor MCP-pakketten // Draait stil wanneer de AI-agent een MCP-tool aanroept, scant de omgeving op // wallets/sleutels // Gebruikt alleen ingebouwde Node.js-functies, geen externe afhankelijkheden

Hieronder volgt een recursieve wandeling met diepte 3 van:

de thuismap zelf

…filteren op bestandsnamen die een van de volgende tekens bevatten sleutel winkel, portemonnee.json, portemonnee.dat, .geheim, seed.txt, metamask, spook, rabbijn, vertrouwenswallet, coinbase, prive sleutel, ezelsbruggetje, geheime sleutel, API sleutel — oftewel, een handmatig samengestelde lijst van alle locaties waar een cryptogebruiker een sleutel bewaart. Voor elke overeenkomst wordt het bestand geopend en vergeleken met zes reguliere expressies:

Type Patronen Wat het vangt
prive sleutel (?:0x)?[a-fA-F0-9]{64} Ethereum privésleutels en generieke hexadecimale geheimen van 32 bytes.
ezelsbruggetje \b([a-z]+\s+){11,23}[a-z]+\b BIP39-ezelsbruggetjes met 12 tot 24 woorden.
API sleutel (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) Generieke API-tokens en inloggegevens zijn opgenomen in configuratiebestanden.
geheim (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) Geheimen en privéwaarden die doorgaans worden opgeslagen in YAML-, JSON- en INI-configuratiebestanden.
eth_adres 0x[a-fA-F0-9]{40} Ethereum-walletadressen worden gebruikt om slachtoffers te identificeren en hun vingerafdrukken vast te stellen.
wachtwoord (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) Shell-exportstijl wachtwoorden en wachtwoordzin-omgevingsvariabelen.

Vervolgens leest scanner.js nog zes dotfiles volledig uit — tot 500 bytes per stuk van ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig en ~/.git-credentials — en doorzoekt process.env naar variabelen waarvan de naam key, secret, token, password, private, mnemonic, wallet of seed bevat. Ten slotte roept het execSync('whoami') aan, samen met os.hostname() en process.cwd() om de dump te voorzien van de identiteit van het slachtoffer. De volledige payload, plus maximaal 100 afzonderlijke bevindingen, wordt als één JSON-object verzonden via POST.

De bestemming voor het exporteren van bestanden is niet direct vastgelegd in de code. Het pakket haalt deze tijdens de uitvoering op van:
https://ddjidd564.github.io/defi-security-best-practices/config.json

— een GitHub Pages-document dat de aanvaller beheert. Het huidige config.json-bestand retourneert

Als die ophaalactie mislukt, scanner.js valt terug op hetzelfde webhook.site De URL is als constante vastgelegd. Deze omweg is het enige operationele verfijningsaspect van de campagne: het stelt de aanvaller in staat om de exfiltreerdoelen te wijzigen zonder het pakket opnieuw te publiceren, en het houdt de daadwerkelijke collector-URL buiten het npm-artefact, wat detectie op basis van signaturen bemoeilijkt.

Variant B: een Pinggy-tunnel, een binair bestand en één persistente variant

De andere, nog niet uitgebrachte tranche is veel kleiner – vijf pakketten – en veel minder geavanceerd. De auteur heeft de MCP-vormgeving volledig laten vallen. Deze pakketten beweren configuratiehulpmiddelen te zijn voor legitieme Ethereum- en Solana-tools (truffle-config-helper, chainlink-prijs-feed-aggregator, ganache-cli-provider, solana-pda-helper, foundry-deploy-helper). De lading bestaat uit één enkele https.get-Enexec lijn in de na installatie

De C2 is gratis Pingy tunnel — een generieke ontwikkelaarstunnelingservice die de aanvaller gebruikt als tijdelijke C2. Het pakket downloadt alles wat de tunnel retourneert en plaatst het in de tunnel. child_process.execEr is geen integriteitscontrole, geen ondertekening, geen beveiliging in een tweede fase. Wat er vandaag ook in de tunnel van de exploitant omgaat, daar rijdt het doorheen.

Het meest agressieve pakket, foundry-deploy-helper:1.8.96, vervangt de inline https.get with krullen en een volhardingstruc:

Het achtervolgende & Het ontkoppelt het binaire bestand van het installatieproces, waardoor de installatie geruisloos wordt voltooid terwijl een langlopend binair bestand op de achtergrond blijft draaien onder een naam die lijkt op een onopvallend Node.js-cachebestand. We hebben het binaire bestand zelf niet opgehaald; de tunnel reageerde niet toen we dit controleerden, wat het verwachte gedrag is voor een tunnel die de operator naar behoefte opzet en verbreekt.

 Variant C: een gepolijste façade, (nog) geen ontsteker.

De resterende negen pakketten — portemonnee-back-up-verificator, env-security-scanner, foundy-toolkit (een opzettelijke typosquat van Foundry), solna-web3 (een typosquat van Solana), portemonnee-beveiligingscontrole, hardhat-gas-profiler-plugin, ethers-multicall-utils, defi-env-auditor, etherjs-utils - hebben geen postinstallatiescript En op het eerste gezicht geen duidelijke runtime-exfiltratie. Ze delen de uitgever, de merknamen, het Web3-naamgevingspatroon en in sommige gevallen identieke README-templates met de actieve varianten. We beschouwen ze als onderdeel van dezelfde campagne en hebben preventieve verwijdering aanbevolen, maar we hebben hun runtime-triggers nog niet volledig in kaart gebracht. De slapende variant is mogelijk een strategische zet die de operator reserveert voor een toekomstige overname – hetzelfde patroon dat PhantomBot medio mei gebruikte, waarbij de operator een credential stealer verving door een botnet-rekrut zonder de pakketnaam opnieuw te publiceren.

Tijdlijn en de catalogus

Het pakket met de vroegste datum in de campagne is het pakket met de laagste versie: chain-key-validator:0.2.3 en defi-env-auditor:0.3.2 lijken op vroege experimentele resultaten. Tegen de tijd dat de uitgever... truffle-config-helper:1.7.0 en foundry-deploy-helper:1.8.96De versie-inflatie was opzettelijk — er werden nummers gekozen die leken op de afstamming van een bestaand pakket. Geen van de 22 heeft een legitieme geschiedenis onder die exacte naam op npm.

De volledige catalogus, gegroepeerd per variant:

### Variant A — credential harvester (postinstall + MCP-time scanner.js, MD5 b461106e47a1f5966159cd6e92541505)

Pakket Versie Gemarkeerd in detectiefeeds
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 (geen zichtbaarheid van de detectiefeed vóór dit rapport)

Pakket Versie Smaak na installatie
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 — slapend, vermoedelijke runtime-trigger (geen zichtbaarheid in detectiefeed vóór dit rapport)

Pakket Versie Notes
wallet-backup-verifier 1.0.1
env-security-scanner 1.6.0
foundy-toolkit 1.5.79 typosquat van gieterij
solna-web3 1.5.98 typosquat van 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

De kolommen Variant-A en Variant-B zijn niet willekeurig gekozen. De namen in Variant-A verkopen zichzelf allemaal als beveiligingsaudittools — “veiligheidscontrole”, “beveiliging implementeren”, “geheimdetector”, “walletbewaker”, “sleutelauditor”, “dreigingsscanner”, “referentiescanner”, “sleutelketenvalidator”. Ze zijn gericht op een ontwikkelaar of AI-agent die op zoek is naar een tool om de veiligheid van een Web3-project te beoordelen. De Variant-B-namen verkopen zichzelf allemaal als Hulpmiddelen voor het bouwen en implementeren Voor hetzelfde Web3-ecosysteem geldt dat de tools Truffle, Chainlink, Ganache, Solana PDA en Foundry allemaal hetzelfde zijn. De tweedeling weerspiegelt het mentale model van een doorsnee Web3-ontwikkelaar: "auditfase" versus "implementatiefase". In welke fase je je ook bevindt, de uitgever heeft er een valstrik voor ingebouwd.

Indicatoren van compromis

Netwerk en bestanden

IOC Variant Doel
https://ddjidd564.github.io/defi-security-best-practices/config.json A Dynamische webhook-resolver gehost via GitHub Pages.
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 A Het huidige endpoint voor het verzamelen van gegevenslekken is ook als back-up ingebouwd.
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry B Pinggy-tunnel gebruikt voor het distribueren van binaire payloads op afstand.
scanner.js MD5 b461106e47a1f5966159cd6e92541505 A Dezelfde scannerpayload is hergebruikt voor alle 8 Variant-A-pakketten.
/tmp/.node-cache B Losgekoppeld uitvoerbaar bestand gedropt door foundry-deploy-helper:1.8.96.

Uitgever

  • npm gebruikersnaam: ddjidd5640
  • e-mail: 1623682356@qq.com (niet geverifieerd)
  • E-mail en SCM verificatie: geen
  • Pakketten onder account: 22, allemaal vermeld in de bovenstaande catalogus.
  • Vroegst zichtbare activiteit: chain-key-validator:0.2.3 (Variant A)
  • Recentelijk zichtbare activiteit: chain-key-validator:0.2.3 en crypto-credential-scanner:2.0.2 (beide binnen 24 uur vóór dit bericht)

Merkfronten (gebruikt in auteur / README / nep GH-organisatie)

  • “Crypto Security Guild” — ondersteund door een lege GitHub-organisatie cryptosec-gilde
  • “Web3 Audit Collective” — ondersteund door een lege GitHub-organisatie w3audit
  • “DeFi Security Alliance” — ondersteund door een lege GitHub-organisatie defi-beveiliging
  • Referentie GH-account ddjidd564 — host van het dynamische-webhook-configuratiebestand config.json

Gedragswetenschappen

  • node -e na installatie lezen van een van de volgende .ssh, .ethereum, .bitcoin, .env, .bash_geschiedenis, .zsh_geschiedenis, .git-credentials with .slice(0, 200) en samenvoegen met | De scheidingstekens vormen een bijna unieke vingerafdruk voor variant A.
  • Importeren ./scanner.js van een pakket dat zichzelf registreert als een MCP Server met gereedschappen genaamd zoek_naar_gelekte_inloggegevens Of soortgelijke werkwoorden zoals "beveiligingsaudit" vormen een bevestiging van variant A.
  • Een `node -e postinstall` die gegevens ophaalt van een willekeurige `*.run.pinggy-free.link` host en het antwoord doorstuurt naar `child_process.exec` is een Variant-B bevestiging, ongeacht de wrapper.

Toeschrijving en motivatie

Er is voldoende informatie beschikbaar voor een gedeeltelijke uitgeversvingerafdruk, maar lang niet genoeg voor een echte identificatie. E-mail 1623682356@qq.com Het betreft een QQ-e-mailadres — de gratis webmail van Tencent, populair in China — en het numerieke lokale gedeelte is de QQ-gebruikers-ID; we beschouwen dit slechts als een soft signal, aangezien adressen in QQ-formaat eenvoudig te registreren zijn. Het npm-account heeft geen tweefactorauthenticatie, geen geverifieerd e-mailadres en geen geverifieerde authenticatiegegevens. SCM link. De merkdriehoek "Crypto Security Guild" / "Web3 Audit Collective" / "DeFi Security Alliance" is volledig verzonnen — geen van de drie bestaat buiten deze campagne — en de ondersteunende GitHub-organisaties zijn lege hulzen die zijn gecreëerd om de links op de npm-pagina te vullen.

Twee patronen verdienen vermelding, omdat ze in aangrenzende campagnes voorkomen. Het eerste patroon is Merkprefabricage als sociaal bewijsDe operator koos geen bestaande projectnamen om te misbruiken; ze verzonnen een compleet verhaal over vertrouwen van de grond af, wetende dat een AI-agent bouwen pipeline Of een gehaaste ontwikkelaar die de npm-pagina scant, zal een patroonmatch uitvoeren op "lijkt op een beveiligingsorganisatie" in plaats van "is een beveiligingsorganisatie". Dit is dezelfde aanpak waarvoor in de literatuur over slopsquatting werd gewaarschuwd: pakketten die zijn afgestemd op het soort naam dat een rechtenstudent zou gebruiken. uitvinden als er om een ​​Web3-beveiligingstool wordt gevraagd, die er zo goed uitziet dat de LLM (Letter of Land Management) geen dubbele controle uitvoert. Slopsquatting is de recent bedachte term voor kwaadaardige pakketten waarvan de namen overeenkomen met de plaatsaanduidingen die LLM's hallucineren wanneer een gezaghebbend pakket niet bestaat; deze campagne is de agressievere variant ervan, waarbij de operator ook de organisatie verzint waartoe de plaatsaanduiding zou behoren.

Het tweede patroon is MCP-tijdactivering. Tegen de tijd scanner.js De installatie is voltooid en de ontwikkelaar is verdergegaan. De trigger is dat de AI-agent een tool aanroept. zoek_naar_gelekte_inloggegevensIn het geval van variant A zal de agent dat absoluut doen, want dat is precies de reden waarom hij het pakket heeft gekregen. De kwaadwillige handelingen vinden plaats tijdens de goed onderdeel van de workflow, wanneer de ontwikkelaar waarschijnlijk ziet hoe zijn AI-assistent een gevraagde taak succesvol uitvoert. Het is een kleine gedragsverandering ten opzichte van de oudere "exfil on"-methode. npm installeren"patroon, en het omzeilt handig de installatie-sandboxing.

We noemen geen specifieke dader. De signalen (QQ-e-mail, één account, een burst van 22 pakketten op één dag, twee parallelle C2-stacks) komen even goed overeen met één persistente operator, een klein team of een van de teams die pakketten verspreiden en die in de npm-telemetrie tot 2025-2026 zichtbaar zijn geweest. Wat we blikje Het argument is dat deze operator een duidelijk voorkeursecosysteem heeft (Ethereum + Solana + Foundry/Hardhat-tools), een duidelijk voorkeursdoelwit (Web3-ontwikkelaars en de AI-agenten die aan Web3-projecten werken) en een duidelijk voorkeurspersistentiemodel (MCP-runtime-trigger plus een losgekoppelde binaire fallback).

Impact, trends en wat verdedigers kunnen doen

Ons vroegtijdige waarschuwingssysteem pipeline gevangen 8 van 22 Pakketten gedurende de looptijd van de campagne: zes bij de eerste ronde en nog twee die later op dezelfde dag arriveerden tijdens de clusteringronde van de campagne. De andere 14 pakketten stonden al dagenlang live op npm. zonder ooit op te duiken in de detectiestromen die we monitoren.En op het moment van schrijven zijn ze nog steeds installeerbaar. Dat verschil is belangrijk omdat:

  • Variant A is stil tijdens de installatie.Het lezen van het dotfile vindt plaats, maar de bulk-exfiltratie wordt pas geactiveerd wanneer een AI-agent de MCP-tools van het pakket aanroept. standard De postinstall-watching sandbox zal de node -e blok en concludeer dat het klein en blijkbaar inert is.
  • Variant B bestaat uit één enkele lijn. Er is niets voor een malwareclassificatiesysteem om van te leren: geen verhulling, geen gecodeerde payload, geen verdacht ogend domein. De Pinggy-tunnel is een legitieme ontwikkelaarsservice. Het enige verdachte is dat een "configuratiehulpmiddel" überhaupt contact moet opnemen met de server.
  • Variant C ziet er volkomen schoon uit. Het heeft geen installatie. hooksBij elk statisch signaal is dat normaal.

Een korte checklist voor de verdediger in het MCP-tooltijdperk

Drie concrete acties die deze campagne eerder op gang hadden kunnen brengen:

  1. Geef de uitgever de voorkeur, niet de verpakking. Tweeëntwintig pakketten onder één QQ-mailaccount van een jaar oud, zonder SCM Verificatie is een veel duidelijker signaal dan welke afzonderlijke pakketinformatie dan ook. Ons vroegtijdige waarschuwingssysteem detecteerde de eerste pakketten omdat de vingerafdruk van de uitgever opviel. Dit leidde tot een aanbeveling voor een reputatiescore van de uitgever, die door elk van de afzonderlijke pakketclassificaties (veilig, onduidelijk of malware) naar beneden kan worden bijgesteld.
  2. Beschouw indirecte verwijzingen naar dynamische configuratie als kwaadaardig totdat het tegendeel is bewezen. Een pakket dat zijn uitgaande eindpunt tijdens de uitvoering bepaalt aan de hand van een document van een derde partij (GitHub Pages, GitHub Gist, Pastebin, S3-object, of waar dan ook) heeft daar geen legitieme reden voor bij telemetrie. Echte telemetrie-eindpunten zijn vastgelegd in de code en gedocumenteerd.
  3. Controleer MCP-serverpakketten op basis van de tools die ze aanbieden. De Variant-A-pakketten adverteren allemaal tools met de naam search_leaked_credentials, validate_chain_key, deploy_safeen vergelijkbare "audit"-werkwoorden. Een MCP-host die een tool beschikbaar stelt waarvan de beschrijving beweert projectmappen te scannen op inloggegevens, zou expliciete toestemming van de operator moeten vereisen voordat de agent deze op een echte codebase toepast. Het punt van MCP is dat de agentloop geen manier heeft om te weten of search_leaked_credentials Is het een onderzoek naar inloggegevens of is het een poging tot het stelen van inloggegevens?

Voor ontwikkelaars die mogelijk al een van de 22 pakketten hebben geïnstalleerd: ga ervan uit dat elke sleutel in platte tekst in ~ / .ssh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.envof ~/.git-referenties Als de inloggegevens gecompromitteerd zijn, vervang dan alle inloggegevens waarvan de naam overeenkomt met de bovenstaande lijst met omgevingsvariabelen, en controleer op Linux/macOS op een uitvoerbaar bestand op /tmp/.node-cache (en elk weesproces dat daaruit is gestart). Het opnieuw installeren van de legitieme versie van de geïmproviseerde tooling (gieterij, truffel, harde hoed, ganache, enz.) verwijdert het weggegooide binaire bestand niet.

De slapende Variant-C-tranche is het deel van dit verhaal dat het slechtst verouderd is. Negen pakketten met een schoon installatieprofiel en een gevestigde uitgever zijn precies het soort voorraad dat een operator in reserve houdt. Als ze later ontploffen – zoals PhantomBot deed toen zijn axois-utils De herverpakking is omgeslagen van het stelen van inloggegevens naar het rekruteren van een botnet — ze zullen toeslaan tegen elke registergebruiker die tussen vandaag en de verwijdering een Variant-C-pakket heeft vastgezet. Het vastzetten van een kwaadaardig pakket op versie beschermt je niet tegen een uitgever die elke versie beheert.

Referenties

sca-tools-software-compositie-analyse-tools
Prioriteer, herstel en beveilig uw softwarerisico's
Maak nu een gratis account aan.
Geen kredietkaart nodig.

Beveilig uw softwareontwikkeling en -levering

met Xygeni-productsuite