Ektoplazma npm Quraşdırılması Hooks AWS etimadnaməsini oğurlayan

Ektoplazma: npm quraşdırma hooks yalnız konteyner tetikleyicisinin arxasında AWS etimadnaməsini toplayan

TL; DR

Bir dəstə beş npm paket, iki hesab ünvanında dərc edilib, göndərilib postinstall Hook, hostdan bulud etimadnamələrini oxuyur və onları qutudan kənara göndərir. Paketlərdə xəyal və pirat adları var — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — və topladıqları hər şeyi saxtaya çevirirlər ecto_module: YAML manifestini ötürməzdən əvvəl. Klasteri aşağıdakı kimi izləyirik Ektoplazma.

Faydalı yük yalnız müəyyən bir mühit aşkar etdikdə işləyir: adı a olan bir host 12 simvollu altıbucaqlı sətir və altında işləyən bir qovluq /app/node_modules — konteynerləşdirilmiş quruluşun və ya CI işçisinin forması. Həmin qapı keçdikdə, qarmaq sorğulayır AWS instansiya metadata xidməti (IMDSv2) IAM rol etimadnamələri üçün, sadalayır AWS Sirləri Meneceri üç bölgədə, mühit dəyişənlərini boşaldır, altındakı faylları oxuyur /app, və bayraq tutma sətirləri üçün qazıntılar edir. Daha sonra nəticəni iki yolla eksfiltrasiya edir: mayakdan a-ya webhook.site kolleksiyaçı və localhost-first ehtiyat nüsxələrinin siyahısı ilə xam IP son nöqtəsinə manifest PUT.

Sonrakı paket təsvirlərində "Verdaccio təchizat zənciri testi üçün CTF yükü" deyilir. Bu özünütəsviri müşahidə edilə bilən bir fakt kimi bildiririk. Davranışın özü - ictimai IP-yə canlı çıxış, real IMDS etimadnamə oxunuşları, real Secrets Manager zəngləri - etiketdən asılı olmayaraq belədir və bu versiyaların zərərli olaraq təsnif edilməsinin səbəbi də budur.

Qrupda bir ad, coral-wraith, tək bir buraxılışla kifayətlənmədi. Bir neçə saat ərzində onlarla versiya vasitəsilə sürətlə ardıcıl olaraq yenidən nəşr olundu — 1.0.0 dırmanmaq 6.0.0 — və eyni adlı əvvəlki buraxılışda şişirdilmiş istifadə edilmişdi 9999.0.x versiya nömrələri, klassik forma asılılıq-qarışıqlıq cəhdiBunun üzərindəki faydalı yük gözlə görünən şəkildə yetkinləşdi: birdəfəlik host sayma mayakından nəzərdə tutulan hədəf xaricində sakit saxlayan mühit yoxlamaları ilə əhatə olunmuş tam AWS etimadnamə pivotuna.

Paketlər 5 ad; coral-wraith təkbaşına onlarla versiyada yenidən nəşr olunmuşdur
Ekosistem npm
Vektoru quraşdırın postinstall həyat dövrü skripti
Əsas hədəf AWS IAM rol etimadnamələri + Gizli Menecer gizli dəyərləri, mühit dəyişənləri, /app faylları
Exfil webhook.site mayak + xam-IP C2 PUT
Tetikleyici qapı 12-hex hostname + /app/node_modules cwd, üstəgəl həmin kontekst xaricində faydalı yükü basdıran bir mühit yoxlaması
Sərtlik yüksək — bulud etimadnaməsi və idarə olunan gizli açıqlama konteynerləşdirilmiş qurma və işləmə mühitləri

Hücum anatomiyası

Klasterdəki hər bir paket eyni şəkildə qurulub: demək olar ki, boşdur indeks.js (modul.exports = {}), tək sətirli paket.json ssenari — “postinstall”: “postinstall.js node” — və faydalı yük postinstall.jsPaketi quraşdırmaq hooku işə salmaq üçün kifayətdir; idxal və ya zəng tələb olunmur.

Hədəf qapısı. Ekto-ailə yükü bir şey etməzdən əvvəl ətrafını yoxlayır:

function isAppWorker():   host = os.hostname()   if host does NOT match /^[0-9a-f]{12}$/  -> exit   if cwd does NOT contain "/app/node_modules" -> exit   if cwd contains "/tmp/npm-safe"            -> exit   otherwise -> proceed

12 altıbucaqlı host adı, Docker-in konteynerə təyin etdiyi standart formadır və /tətbiq/node_modules Konteynerdaxili quraşdırma yolu ənənəvidir. Yol sandboxlu çıxarış qovluğuna bənzədiyi təqdirdə üçüncü bənd aradan qalxır. Nəticə etibarilə, faydalı yük geliştirici noutbukunda və ya analiz sandboxunda hərəkətsiz qalır və yalnız konteynerləşdirilmiş build və ya runtime işçisi daxilində aktivləşir — canlı bulud etimadnaməsini daşımaq ehtimalı ən yüksək olan mühit növü. Klasterdəki ən erkən paket, mərcan ruh, belə bir qapısı yoxdur və (daha sadə) kolleksiyasını qeyd-şərtsiz işlədir.

kolleksiyaDarvaza keçəndə qarmaq içəridən atılır execFileSync(“/bin/sh”, [“-c”, …]) və aşağıdakı ardıcıllıqla tək bir mürəkkəb əmri işlədir:

1. PUT /latest/api/token to 169.254.169.254          (IMDSv2 token request) 2. GET .../iam/security-credentials/                  (IAM role name) 3. GET .../iam/security-credentials/<role>            (temporary credentials) 4. dump env | sort                                    (environment variables) 5. list /app (excl. node_modules) + cat first 15      (application files) 6. aws secretsmanager list-secrets                    (us-east-1, eu-west-1, eu-central-1) 7. scrape readable files for HTB{...}                 (capture-the-flag strings)

1-3-cü addımlar IMDSv2 dərsliyinin axtarışıdır: sessiya tokenini tələb edin, sonra onu əlavə edin X-aws-ec2-metadata-token başlıq vasitəsilə instansiyanın IAM rolunu və həmin rolun müvəqqəti giriş açarlarını çıxarın. Daha sadə təsdiqlənməmiş IMDSv1 əvəzinə IMDSv2 tətbiq etmək seçimi GET Qeyd etmək lazımdır ki, bu o deməkdir ki, faydalı yük hətta token əsaslı metaməlumat girişi tələb etmək üçün konfiqurasiya edilmiş instansiyalarda belə işləyir ki, bu da AWS tərəfindən tövsiyə olunan sərtləşdirmədir. 3-cü addımda qaytarılan etimadnamələr qısa müddətlidir. AccessKeyId/Gizli Giriş Açarı/Nişan instansiyanın roluna tətbiq olunan üçqatlar; həmin rolun edə biləcəyi hər şeyi həmin açarların sahibi etimadnamənin ömrü boyu edə bilər.

4-6-cı addımlar baxış bucağını genişləndirir. env dump, build və ya runtime prosesindən miras qalan hər şeyi ələ keçirir — praktikada qeyd dəftəri tokenləri, verilənlər bazası bağlantısı sətirləri və API açarları ən çox burada yerləşir. / proqram file walk xaricində on beşə qədər tətbiq faylını oxuyur düyün_ modulları, səthi konfiqurasiya edə bilən, .NS fayllar və ya mənbə. 6-cı addım çağırışları aws sirləri meneceri siyahı sirləri üç bölgədə; 1-3 addımlarında götürülmüş etimadnamələr həmin zəngləri təsdiqləyən şeydir, buna görə də IMDS oxuyur və Secrets Manager sayma zənciri vahid eskalasiyaya birləşdirilir: instansiya rolu → idarə olunan gizli inventar. 7-ci addım bayraq ələ keçirmə çərçivəsinə işarədir — nə vaxt bir HTB{…} Bayraq tapılarsa, o, təkbaşına göndərilir, əks halda toplanmış xam ləkə dörd hissəyə bölünərək göndərilir.

Klasterdəki sonrakı versiyalar eskalasiyanı daha da artırır. Onlar inventarda dayanmaq əvəzinə, IMDS cavabını təhlil edir, müvəqqəti açarları ixrac edirlər AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN mühit dəyişkənləri, şəxsiyyəti təsdiqləyin aws sts zəng edənin şəxsiyyətini əldə edin, və sonra qaytarılan hər bir sirri dövrələyin siyahı sirləri zəng aws secretsmanager get-secret-value hər birində — yalnız adlarını deyil, gizli məzmunu da əldə edir. Eyni versiyalar həmçinin proseslə əvəz olunmuş bayraq binarlarını da oxuyur (/oxu bayraq və dostlar) və cəhd edin şarj qaçışı altında tapılan hər hansı bir Rust layihəsinə qarşı / proqram, məhsulu bulud etimadnamələrindən kənara çıxaraq, quruluş mühitinin üzə çıxardığı hər şeyə genişləndirir.

Bu sonrakı versiyalar da özlərini daha aqressiv şəkildə bağlayır. 12-hex-hostname və əlavə olaraq /tətbiq/node_modules yoxlamalar zamanı faydalı yük aktiv paket qeydiyyatı konfiqurasiyasını və işçi qovluq yolunu yoxlayır və canlı hədəf əvəzinə təhlil və ya güzgü kontekstini göstərdikdə səssizcə çıxır. Birləşdirilmiş effekt əksər yoxlama mühitlərində müşahidə edilə bilən heç bir şey etməyən və tam kolleksiyasını yalnız özünü orijinal konteynerləşdirilmiş hostda hesab etdiyi yerdə işlədən faydalı yükdür.

EksfiltrasiyaToplanan məlumatlar hostu iki kanalda qoyur. Birincisi, mayak POST sabit bir webhook.site kolleksiyaçı, host adını, rəqəmli UID-i, işçi qovluğu və 120 KB-a qədər toplanmış məlumatları daşıyır. İkincisi, məlumatlar saxta YAML “modul manifesti”nə qatlanır və PUT üçün /api/modullar/ hədəf serverdə:

ecto_module:   name: "<flag-or-chunk-0>"   version: "1.0.0"   power_level: "<chunk-1>"   ship_deck: "<chunk-2>"   cargo_hold: "<chunk-3>"

Manifest sahə adları (güc_səviyyəsi, gəmi göyərtəsi, yük_saxla) bəzəkdir — oğurlanmış məlumatlar sətir dəyərlərinin içərisindədir, buna görə də şəbəkə monitoru aşkar məlumat boşaltmasından daha çox, zərərsiz paket qeydiyyatı manifestinin yüklənməsinə bənzəyən bir şey görür. Mayak kanalı daha çox şey daşıyır: POST bədənə webhook.site host adını, rəqəmli UID-i, iş qovluğunu və toplanmış 120 KB-a qədər bloku ehtiva edir, beləliklə, hətta tək bir uğurlu mayak belə tam məlumatı təmin edir. webhook.site pulsuz sorğu yoxlama xidmətidir; onu kollektor kimi istifadə etmək o deməkdir ki, operator heç vaxt həmin kanal üçün öz infrastrukturunu qəbul etmək üçün ayağa qalxmalı deyil və qeydə alınmış sorğular xidmətin zibil qutusunda qalır.

Manifest PUT bir neçə ilə başlayan ehtiyat siyahısını gəzir 127.0.0.1/localhost limanları və sonra üç ictimai ünvana düşür154.57.164.0/24` diapazon, 2xx statusu ilə cavab verən ilk son nöqtədə dayanır. Localhost-first sıralaması “verdaccio testing” özünütəsviri (loopback-də yerli reyestr) ilə uyğundur, lakin public-IP ehtiyatları o deməkdir ki, loopback dinləmədikdə — yəni müəllifin öz test qurğusu olmayan istənilən maşında — məlumatların hostu tərk etməsi deməkdir.

İş qrafiki

Klaster tək bir düşmə əvəzinə artan qabiliyyət artımını göstərir. Biz bunu divar saatı dərc etməklə deyil, müşahidə olunan davranışla sıralayırıq:

Mərhələ Paketlər / Versiyalar Davranış
Erkən qaçış coral-wraith 9999.0.x Asılılıq-qarışıqlıq cəhdi ilə uyğun olaraq şişirdilmiş versiya nömrələri; quraşdırma vaxtı siyahıyaalması və exfil
Toxum coral-wraith 1.0.0 postinstall id/env/flag fayllarını toplayır; tək PUT əmri 154[.]57[.]164[.]71:30782, marker ECT-472839
Sürətli iterasiya coral-wraith 1.0.1 → 6.0.0 Saatlar ərzində onlarla buraxılış; faydalı yük artır isAppWorker() gate, IMDSv2 etimadnaməsinin pull, tam get-secret-value pivot, qeyd defteri/yol mühitinin yoxlanılması və ikili sink markerləri
Paralel adlar ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Eyni qapalı yük; webhook.site mayak və çoxnöqtəli ehtiyat siyahısı
Variantlar ecto-rust-read-f3a9c1 1.0.1–1.0.2 Əlavə lavabo markerləri əlavə edir ECT-987654, ECT-654321, ECT-839201
Variantlar ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Eyni qapılı faydalı yük, eyni C2 və mayak

Klasterin əsas xüsusiyyəti onun nəşr ritmidir: bir paket və bir versiya əvəzinə, eyni ad sürətlə təkrar-təkrar nəşr olunur, hər biri eyni faydalı yükü daşıyan bir neçə fərqli adlı qardaş-bacı ilə yanaşı, sonuncusunun kiçik bir variasiyasını buraxır. fısıltı ailə kod iki yaxın barmaq izinə bölünür — biri iki kritik aşkarlamanı işə salır, digəri isə üç (əlavə fayl oxuma sinki) — lakin hər ikisi eyni faydalı yükə cavab verir; fərq davranış çəngəli deyil, kod sürüşməsidir. Versiyaları fısıltı təhlil edilən diapazondan kənara çıxan (yazı zamanı ən azı 1.0.25-ə qədər) məlumatlar reyestrdə canlı olaraq müşahidə edildi və mərcan ruh adı öz versiyasını eyni pəncərədən yuxarı qaldırmağa davam etdi.

Kompromis göstəriciləri

Aşağıdakı bütün göstəricilər diskdəki paket mənbəyindən çıxarılıb. Şəbəkə göstəriciləri deformasiya olunub.

şəbəkə

Göstərici Rol
hxxp://154[.]57[.]164[.]71:30782 C2 PUT hədəfi (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT ehtiyat nüsxəsi (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT ehtiyat nüsxəsi (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT ehtiyat nüsxəsi (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Mayak kolleksiyaçısı
169[.]254[.]169[.]254/latest/... IMDSv2 etimadnaməsinin oxunması (hədəf tərəfi, AWS metadatası)

Davranış/fayl

Göstərici Rol
"postinstall": "node postinstall.js" Vektoru quraşdırın
ecto_module: YAML ilə power_level / ship_deck / cargo_hold düymələri Exfil manifest sxemi
Lavabo markerləri ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 yol seqmenti /api/modules/<marker>
isAppWorker() qapı: ev sahibi /^[0-9a-f]{12}$/, cwd ehtiva edir /app/node_modules Aktivləşdirmə şərti
aws secretsmanager list-secrets artıq us-east-1, eu-west-1, eu-central-1 Sirlərin sadalanması
HTB{...} regex qırıntısı Bayraq ələ keçirmə məhsulu

Fayl heşləri (sha256, analiz zamanı qeydə alınıb)

fayl sha256
coral-wraith/postinstall.js ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3

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

Beş paket adı iki npm hesab sahibi altında dərc edildi, lakin onları bir klaster kimi qəbul etmək üçün kifayət qədər infrastruktur paylaşırlar: eyni ecto_module manifest sxemi, eyni ECT-472839 əsas lavabo marker, eyni webhook.site kolleksiyaçı ID-si və C2 son nöqtələri eyni yerdədir 154.57.164.0/24` blok. Toxum paketi (`mərcan-ruhi, daha sadə və təminatsız) və qapalı ekto-ailə müstəqil səylər əvəzinə tək bir alət dəsti üzərində təkrarlamalar kimi oxunur.

Paketlər sonrakı versiyalarda özlərini belə təsvir edirlər "Verdaccio təchizat zənciri testi üçün CTF yükü." Biz bu etiketi müşahidə edilə bilən bir fakt kimi qəbul edirik və məqsəd haqqında bir tapıntı kimi təkrarlamırıq. Kodun etdiyi şey birmənalıdır və necə etiketlənməsindən asılı deyil: o, instansiya metadata xidmətindən IAM rol etimadnaməsini oxuyur, üç AWS bölgəsində idarə olunan sirləri sadalayır və nəticələri ictimai IP-yə və üçüncü tərəf vebhook kolleksiyaçısına ötürür. Həqiqətən yalnız döngü test qoşqusunun ictimai IP ehtiyat siyahısına, IMDS etimadnaməsinin oxunuşlarına və ya bölgələrarası Gizlilik Menecerinin çağırışlarına ehtiyacı olmazdı. Çıxış və etimadnamənin əhatə dairəsi real olduğundan, qapalı versiyalar zərərli kimi təsnif edildi.

Yalnız konteyner qapısı əməliyyat baxımından ən diqqətəlayiq xüsusiyyətdir. Bu, həm yayınma tədbiridir - noutbuklarda və analiz qum qutularında səssiz qalmaq - və hədəfləmə tədbiridir, yalnız real IAM rolu və canlı sirlərin mövcud olma ehtimalı ən yüksək olan yerlərdə atəş açır. Bu paketləri ümumi qum qutusunda işlədən analitiklər heç nə müşahidə etməyəcəklər; davranış yalnız Docker tipli host adı və konteynerdaxili quraşdırma yolu altında özünü göstərir.

Müdafiəçilər üçün təsir, trendlər və rəhbərlik

Buradakı açıqlama bulud etimadnaməsi və build və runtime konteynerləri daxilində gizli açıqlamadır. IMDS-dən götürülmüş IAM rol etimadnaməsi, rolun sahib olduğu bütün icazələri daşıyır; sirr meneceri:Sirlərin siyahısı (və hər hansı bir davamı Gizli Dəyəri Alın) bunu saxlanılan tətbiq sirlərinə qədər genişləndirir. Ətraf mühit dəyişənlərinin dumpları tez-tez qeyd dəftərləri tokenlərini, verilənlər bazası URL-lərini və API açarlarını daşıyır. CI və ya konteyner kontekstində - qapının seçdiyi şey - bu paketlərdən birinin tək bir tranzit quraşdırılması həmin materialı sızdırmaq üçün kifayətdir.

Ektoplazma, gördüyümüz bir nümunəyə uyğundur: yerli fayllardan daha çox bulud metaməlumatlarına və idarə olunan sirlərə çatan və yalnız yüksək dəyərli mühitlərdə işə düşməyə qadir olan quraşdırma vaxtı yükləri. Ardınca iki müdafiə müşahidəsi gəlir.

  • Forma aşkar edilə bilər. Çağrı qrafiki həm bulud sirləri API-sinə (aws sirr meneceri, gcloud sirləri, az keyvault) və ya IMDS ünvanı və şəbəkə çıxış sinki dar, yüksək siqnallı bir nümunədir — bu, demək olar ki, heç vaxt qanuni bir həyat dövrü skriptində baş vermir. Statik axın təhlili hər hansı bir konkret domen və ya IP-dən asılı olmayaraq onu işarələyə bilər.
  • Ətraf mühitin sərtləşməsi onu zəiflədir. IMDSv2-ni 1 hop limiti ilə tətbiq etmək, konteyner iş yüklərinin instansiya metaməlumatlarına çatmasının qarşısını alır; IAM rollarını ən az imtiyazla əhatə etmək sızan hər hansı bir etimadnamənin partlayış radiusunu məhdudlaşdırır; və quraşdırmaları aşağıdakılarla işə salır –ignore-scripts CI-də, ehtiyac duymayan paketlər üçün install-hook vektorunu tamamilə silir.

Müdafiəçilər üçün praktik yoxlamalar aşağıdakılardır: build/CI konteynerlərindən icazə verilməyən ictimai IP-lərə çıxış əlaqələri barədə xəbərdarlıq npm yükləyin; paket həyat dövrü skriptlərindən qaynaqlanan IMDS girişini izləyin; və əksi sübut olunana qədər bulud CLI-yə ötürülən hər hansı bir quraşdırma hook-unu şübhəli hesab edin.

Bu klasterə xas olan iki əlavə qeyd. Birincisi, aktivləşdirmə konteynerləşdirilmiş mühitlərə bağlı olduğundan, iş stansiyasında yoxlanıldıqda inert görünən paket hələ də istehsalda aktiv ola bilər - yoxlama "Mən onu quraşdırdım və heç nə olmadı" deyə etibar etmək əvəzinə, konteynerin host adını və yol şərtlərini təkrarlamalı və ya mənbəyi birbaşa oxumalıdır. İkincisi, ictimai sorğu-yoxlama xidmətinin mayak toplayıcısı kimi istifadəsi, çıxarılan məlumatların bəzilərinin hadisəyə cavab olaraq bərpa edilə biləcəyi deməkdir: bu paketlərdən birini asılılıq ağacında tapan bir təşkilat, uğurlu mayakın faydalı yükün toplama məntiqindən nələri ehtiva edəcəyi barədə mülahizə yürüdə bilər və təsirlənmiş quruluş və ya işləmə mühitindən əldə edilə bilən hər hansı bir IAM rol etimadnaməsini, qeyd nişanlarını və idarə olunan sirləri fırlatmalıdır. Etimadnamənin rotasiyası, paketin silinməsi deyil, quraşdırma başladıqdan sonra əməliyyat bərpasıdı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ə