Ektoplazma npm Instalēšana Hooks Kas zog AWS akreditācijas datus

Ektoplazma: npm instalēšana hooks kas apkopo AWS akreditācijas datus aiz tikai konteinera aktivizētāja

TL; DR

Kopa piecas npm paketes, publicēts divos kontu lietotājvārdos, nosūtīja postinstall āķis, kas nolasa mākoņa akreditācijas datus no resursdatora un nosūta tos ārpus kastes. Pakotnēm ir spoku un pirātu nosaukumi — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — un serializēt visu, ko viņi savāc, par viltojumu ecto_module: YAML manifests pirms tā nosūtīšanas. Mēs izsekojam klasteri kā Ektoplazma.

Kravnesība tiek palaista tikai tad, kad tā nosaka noteiktu vidi: resursdatoru, kura nosaukums ir 12 rakstzīmju heksadecimālskaitļu virkne un darba direktoriju zem /app/node_modules — konteinerizētas būvējuma vai CI darbinieka forma. Kad šie vārti iziet cauri, āķis vaicā AWS instances metadatu pakalpojums (IMDSv2) IAM lomas akreditācijas datiem uzskaita AWS noslēpumu pārvaldnieks trīs reģionos, izgāž vides mainīgos, nolasa failus zem /appun meklē karoga sagūstīšanas virknes. Pēc tam rezultāts tiek izfiltrēts divos veidos: kā bāka uz webhook.site kolektors un manifesta PUT uz neapstrādātas IP adreses galapunktu ar localhost-first rezerves variantu sarakstu.

Vēlākajos pakotņu aprakstos bija teikts: "CTF lietderīgā slodze Verdaccio piegādes ķēdes testēšanai". Mēs ziņojam par šo pašaprakstu kā novērojamu faktu. Pati uzvedība — tiešraides izeja uz publisku IP adresi, reālas IMDS akreditācijas datu nolasīšana, reāli Secrets Manager izsaukumi — ir tāda, kāda tā ir, neatkarīgi no etiķetes, un tas ir iemesls, kāpēc šīs versijas tika klasificētas kā ļaunprātīgas.

Viens vārds klasterī, coral-wraith, neapstājās pie viena izlaiduma. Tas tika atkārtoti publicēts ātrā secībā desmitiem versiju dažu stundu laikā — 1.0.0 kāpšana uz 6.0.0 — un agrākā tāda paša nosaukuma sērijā tika izmantots piepūsts 9999.0.x versiju numuri, klasiskā forma atkarības-apjukuma mēģinājumsŠajā mainīgajā periodā lietderīgā slodze ir redzami nobriedusi: no vienreizējas resursdatora uzskaitījuma bākas līdz pilnīgai AWS akreditācijas datu apmaiņai, kas ietverta vides pārbaudēs, kas to notur ārpus paredzētā mērķa.

Paketes 5 vārdi; coral-wraith vien atkārtoti publicēts desmitiem versiju
Ekosistēma npm
Instalēt vektoru postinstall dzīves cikla skripts
Primārais mērķis AWS IAM lomas akreditācijas dati + Noslēpumu pārvaldnieka slepenās vērtības, vides mainīgie, /app faili
Exfil webhook.site bāka + neapstrādāta IP adrese C2 PUT
Sprūda vārti 12 heksadecimālkodu resursdatora nosaukums + /app/node_modules cwd, kā arī vides pārbaude, kas ārpus šī konteksta izslēdz lietderīgo slodzi
Smagums augsts — mākoņa akreditācijas dati un pārvaldīta slepenības izpaušana no konteinerizētas būvēšanas un izpildlaika vides

Uzbrukuma anatomija

Katrs klastera pakotne ir veidota vienādi: gandrīz tukša index.js (modulis.eksports = {}), vienas rindas pack.json skripts — “pēcinstalēšana”: “mezgls pēcinstalēšanas.js” — un lietderīgā slodze postinstall.jsLai palaistu āķi, pietiek ar pakotnes instalēšanu; nav nepieciešama importēšana vai izsaukšana.

Mērķēšanas vārti. Pirms jebkādu darbību veikšanas ektoģimenes kravas pārbauda apkārtni:

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 heksadecimālskaitļu resursdatora nosaukums ir noklusējuma forma, ko Docker piešķir konteineram, un /lietotne/mezglu_moduli ir parasts konteinera instalēšanas ceļš. Trešais punkts tiek izslēgts, ja ceļš izskatās pēc smilškastes ekstrakcijas direktorijas. Rezultātā lietderīgā slodze paliek neaktīva izstrādātāja klēpjdatorā vai analīzes smilškastē un tiek aktivizēta tikai konteinerizētā būvējuma vai izpildlaika darbinieka ietvaros — tādā vidē, kurā, visticamāk, būs pieejami aktīvi mākoņa akreditācijas dati. Agrākā pakotne klasterī, koraļļu spoks, nav šādu vārtu un bez nosacījumiem palaiž savu (vienkāršāko) kolekciju.

TransportēšanaKad vārti paiet garām, āķis izlien cauri. izpildfaila sinhronizācija(“/bin/sh”, [“-c”, …]) un palaiž vienu saliktu komandu, kas šādā secībā:

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. darbība ir IMDSv2 izguves mācību grāmata: pieprasiet sesijas marķieri un pēc tam pievienojiet to kā X-aws-ec2-metadatu-token galvene, lai izgūtu instances IAM lomu un šīs lomas pagaidu piekļuves atslēgas. Izvēle ieviest IMDSv2, nevis vienkāršāko neautentificēto IMDSv1 GET ir vērts atzīmēt — tas nozīmē, ka lietderīgā slodze darbojas pat instancēs, kas konfigurētas tā, lai pieprasītu uz marķieriem balstītu metadatu piekļuvi, kas ir AWS ieteiktā aizsardzības pakāpe. 3. solī atgrieztie akreditācijas dati ir īslaicīgi. Piekļuves atslēgas ID/Slepenās piekļuves atslēga/žetons trīskāršie elementi, kas saistīti ar instances lomu; visu, ko šī loma var darīt, šo atslēgu turētājs var darīt akreditācijas datu mūža laikā.

4.–6. darbība paplašina tvērumu. env izgāztuve uztver visu, ko mantojis veidošanas vai izpildlaika process — praksē šeit visbiežāk atrodas reģistra žetoni, datubāzes savienojuma virknes un API atslēgas. / app failu pastaiga nolasa līdz piecpadsmit lietojumprogrammu failiem ārpusē mezgla_moduļi, kas var virsmas konfigurāciju, .env faili vai avots. 6. darbība izsauc aws secretsmanager saraksts-noslēpumi trīs reģionos; 1.–3. darbībā iegūtie akreditācijas dati ir tieši tie, kas autentificē šos izsaukumus, tāpēc IMDS nolasīšana un Noslēpumu pārvaldnieka uzskaitīšanas ķēde apvienojas vienā eskalācijā: instances loma → pārvaldīto slepeno datu inventārs. 7. darbība ir atsauce uz karodziņa uztveršanas ietvaru — kad HTB{…} Ja karodziņš ir atrasts, tas tiek nosūtīts atsevišķi, pretējā gadījumā neapstrādātais savāktais blobs tiek sadalīts četrās daļās un nosūtīts.

Vēlākās klastera versijas turpina eskalāciju. Tā vietā, lai apstātos pie inventarizācijas, tās parsē IMDS atbildi, eksportē pagaidu atslēgas kā AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN vides mainīgie, apstipriniet identitāti ar aws sts get-caller-identity, un pēc tam atkārtojiet katru noslēpumu, ko atgriež sarakstu-noslēpumi zvanot aws secretsmanager get-secret-value katrā — izgūstot slepeno saturu, ne tikai to nosaukumus. Tās pašas versijas nolasa arī ar procesu aizvietotus karodziņu bināros failus (/lasīt karodziņu un draugiem) un mēģiniet a uzlādes skrējiens pret jebkuru Rust projektu, kas atrodams sadaļā / app, paplašinot ražas novākšanu ārpus mākoņa akreditācijas datiem, iekļaujot visu, ko atklāj izveides vide.

Šīs jaunākās versijas arī agresīvāk sevi vārtē. Papildus 12 heksadecimālkodu nosaukumam un /lietotne/mezglu_moduli Pārbaudes, lietderīgā slodze pārbauda aktīvo pakotnes reģistra konfigurāciju un darba direktorija ceļu un klusējot aizveras, ja tās norāda uz analīzes vai spoguļa kontekstu, nevis uz aktīvu mērķi. Kombinētais efekts ir lietderīgā slodze, kas vairumā pārbaudes vides nedara neko novērojamu un palaiž pilnu kolekciju tikai tad, ja tā nosaka, ka atrodas uz īsta konteinerizēta resursdatora.

EksfiltrācijaApkopotie dati atstāj resursdatoru divos kanālos. Pirmkārt, bāka POST uz fiksētu tīmekļa vietne savācējs, kas satur resursdatora nosaukumu, skaitlisko UID, darba direktoriju un līdz 120 KB apkopoto datu. Otrkārt, dati tiek salocīti viltotā YAML “moduļa manifestā” un izlikt uz /api/moduļi/ mērķa serverī:

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

Manifesta lauku nosaukumi (jaudas_līmenis, kuģa klājs, kravas_tilpne) ir dekorācija — nozagtie dati atrodas virkņu vērtību iekšpusē, tāpēc tīkla monitors redz to, kas izskatās pēc labdabīga pakotnes reģistra manifesta augšupielādes, nevis acīmredzamas datu izgāztuves. Bākas kanāls pārraida vairāk: POST ķermenis uz tīmekļa vietne ietver resursdatora nosaukumu, skaitlisko UID, darba direktoriju un līdz 120 KB no apkopotā bloba, tāpēc pat viens veiksmīgs bāksignāls sniedz pilnu rezultātu. tīmekļa vietne ir bezmaksas pieprasījumu pārbaudes pakalpojums; tā izmantošana kā savācējs nozīmē, ka operatoram nekad nav jāveido sava saņemšanas infrastruktūra šim kanālam, un reģistrētie pieprasījumi saglabājas pakalpojuma atkritnē.

Manifests izlikt iet cauri rezerves sarakstam, kas sākas ar vairākiem 127.0.0.1/localhost porti un pēc tam nonāk trīs publiskās adresēs sadaļā `154.57.164.0/24` diapazons, apstājoties pie pirmā galapunkta, kas atbild ar 2xx statusu. Secība “localhost-first” atbilst “verdaccio testing” pašraksturam (lokāls reģistrs atgriezeniskās saites savienojumā), bet publiskās IP adreses rezerves adreses nozīmē, ka dati atstāj resursdatoru ikreiz, kad atgriezeniskā saite neklausās — tas ir, jebkurā datorā, kas nav autora paša testa platforma.

Timeline

Klasteris parāda pakāpenisku spēju pieaugumu, nevis vienu kritumu. Mēs to sakārtojam pēc novērotās uzvedības, nevis pēc publicētā sienas pulksteņa:

posms Pakotnes/versijas Uzvedība
Agrīnais skrējiens coral-wraith 9999.0.x Pārspīlēti versiju numuri, kas atbilst atkarību sajaukšanas mēģinājumam; instalēšanas laika uzskaitījums un exfil
Sēkla coral-wraith 1.0.0 pēcinstalēšanas apkopo id/env/flag failus; veic vienu PUT uzdevumu uz 154[.]57[.]164[.]71:30782, marķieris ECT-472839
Ātra iterācija coral-wraith 1.0.1 → 6.0.0 Desmitiem izlaidumu dažu stundu laikā; kravnesība pieaug isAppWorker() vārti, IMDSv2 akreditācijas datu iegūšana, pilns get-secret-value pivot, reģistra/ceļa vides pārbaude un dubultie sateknes marķieri
Paralēli nosaukumi ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Tā pati slēgtā kravnesība; webhook.site bāku un vairāku galapunktu rezerves saraksts
varianti ecto-rust-read-f3a9c1 1.0.1–1.0.2 Pievieno papildu izlietnes marķierus ECT-987654, ECT-654321, ECT-839201
varianti ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Tā pati slēgtā krava, tas pats C2 un bāka

Klastera raksturīgā iezīme ir tā publicēšanas ritms: nevis viens pakotnes nosaukums un viena versija, bet gan viens un tas pats nosaukums tiek atkārtoti publicēts atkal un atkal ātrā secībā, katrā laidienā izlaižot nelielu iepriekšējās versijas variāciju, kā arī vairākus atšķirīgi nosauktus brāļus un māsas, kas nes vienu un to pašu lietderīgo slodzi. čukstēt saime kods sadalījās divos līdzīgos pirkstu nospiedumos — viens komplekts aktivizēja divas kritiskas noteikšanas, cits trīs (papildu failu lasīšanas uztveršanas vieta) —, bet abi atrisinās vienu un to pašu lietderīgo slodzi; atšķirība ir koda novirze, nevis uzvedības atzarojums. Versijas čukstēt reģistrā tiešraidē tika novēroti rādītāji ārpus analizētā diapazona (līdz vismaz 1.0.25 rakstīšanas brīdī), un koraļļu spoks nosaukums turpināja kāpt pa savām versiju kāpnēm pa to pašu logu.

Kompromisa rādītāji

Visi tālāk norādītie indikatori tika iegūti no pakotnes avota diskā. Tīkla indikatori ir attīrīti no fangām.

tīkls

Indikators Loma
hxxp://154[.]57[.]164[.]71:30782 C2 PUT mērķis (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT rezerves variants (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT rezerves variants (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT rezerves variants (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Bākuguns savācējs
169[.]254[.]169[.]254/latest/... IMDSv2 akreditācijas datu nolasīšana (mērķa pusē, AWS metadati)

Uzvedības/fails

Indikators Loma
"postinstall": "node postinstall.js" Instalēt vektoru
ecto_module: YAML ar power_level / ship_deck / cargo_hold atslēgas Exfil manifesta shēma
Izlietnes marķieri ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 ceļa segments /api/modules/<marker>
isAppWorker() vārti: saimnieks /^[0-9a-f]{12}$/, cwd satur /app/node_modules Aktivizācijas nosacījums
aws secretsmanager list-secrets vairāk us-east-1, eu-west-1, eu-central-1 Noslēpumu uzskaitījums
HTB{...} regulārās izteiksmes nokasīšana Karoga ieņemšanas raža

Failu heši (sha256, uztverti analīzes laikā)

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

Atribūcija un novērotā uzvedība

Pieci pakotņu nosaukumi tika publicēti divos npm konta lietotājvārdos, taču tiem ir pietiekami daudz kopīgas infrastruktūras, lai tos uzskatītu par vienu klasteri: tas pats ekto_modulis manifesta shēma, tā pati ECT-472839 primārais izlietnes marķieris, tas pats tīmekļa vietne kolekcionāra ID un C2 galapunkti tajā pašā 154.57.164.0/24` bloks. Sēklu pakotne (`coral-wraith, vienkāršāki un neietvertie), un ierobežotā ektoģimene tādējādi tiek interpretēta kā viena instrumentu komplekta iterācijas, nevis neatkarīgi centieni.

Pakotnes vēlākajās versijās tiek aprakstītas kā “CTF lietderīgā slodze Verdaccio piegādes ķēdes testēšanai.” Mēs šo apzīmējumu parādām kā novērojamu faktu un nepārprotami to neuzsveram kā atklājumu par mērķi. Koda darbības ir nepārprotamas un neatkarīgas no tā, kā tas ir apzīmēts: tas nolasa IAM lomas akreditācijas datus no instances metadatu pakalpojuma, uzskaita pārvaldītos noslēpumus trīs AWS reģionos un nosūta rezultātus uz publisku IP adresi un trešās puses tīmekļa āķa kolekcionāru. Patiesi atgriezeniskās saites testa sistēmai nebūtu nepieciešams publiskās IP adreses rezerves saraksts, IMDS akreditācijas datu nolasījumi vai starpreģionu noslēpumu pārvaldnieka izsaukumi. Tā kā izejošā informācija un akreditācijas datu sasniedzamība ir reāla, slēgtās versijas tika klasificētas kā ļaunprātīgas.

Konteineram paredzētā vārteja ir operacionāli visievērojamākā iezīme. Tā ir gan apiešanas metode — klusēšana klēpjdatoros un analīzes smilškastēs —, gan mērķauditorijas atlases metode, kas aktivizējas tikai tur, kur visticamāk ir reāla IAM loma un aktīvi noslēpumi. Analītiķi, kas darbina šīs pakotnes vispārīgā smilškastē, neko neievērotu; šāda uzvedība izpaužas tikai Docker stila resursdatora nosaukumā un konteinera instalācijas ceļā.

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

Šeit atklātība ir mākoņa akreditācijas dati un slepenības izpaušana būvēšanas un izpildlaika konteineros. No IMDS izgūtie IAM lomas akreditācijas dati satur visas atļaujas, kas šai lomai ir; noslēpumu pārvaldnieks:Noslēpumu saraksts (un jebkādi turpmāki pasākumi Iegūt slepeno vērtību) paplašina to līdz saglabātajiem lietojumprogrammu noslēpumiem. Vides mainīgo izgāztuves bieži satur reģistra marķierus, datubāzes URL un API atslēgas. CI vai konteinera kontekstā — tieši tam, kam vārti atlasa — viena no šīm pakotnēm tranzitīva instalēšana ir pietiekama, lai nopludinātu šo materiālu.

Ektoplazma atbilst modelim, ko mēs joprojām novērojam: instalēšanas laika vērtumi, kas meklē mākoņa metadatus un pārvaldītos noslēpumus, nevis lokālos failus, un kas aktivizējas tikai augstas vērtības vidēs. Seko divi aizsardzības novērojumi.

  • Forma ir nosakāma. npm/PyPI instalēšanas āķis, kura izsaukuma grafiks sasniedz gan mākoņa noslēpumu API (AWS noslēpumu pārvaldnieks, gcloud noslēpumi, az atslēgu krātuve) vai IMDS adrese un tīkla izejas uztveršanas punkts ir šaurs, ar augstu signāla līmeni — tas gandrīz nekad nerodas likumīgā dzīves cikla skriptā. Statiskās plūsmas analīze var to atzīmēt bez īpašas domēna vai IP adreses.
  • Vides sacietēšana to notrulina. IMDSv2 ieviešana ar lēciena ierobežojumu 1 neļauj konteineru darba slodzēm sasniegt instances metadatus; IAM lomu noteikšana ar vismazākajām privilēģijām ierobežo jebkuras noplūdes akreditācijas datu izplatīšanās rādiusu; un instalāciju palaišana ar – Ignorēt-skriptus CI pilnībā noņem instalēšanas āķa vektoru pakotnēm, kurām tas nav nepieciešams.

Aizstāvjiem praktiskās pārbaudes ir šādas: brīdinājumi par izejošajiem savienojumiem no būvējuma/CI konteineriem uz neatļauto publisko IP adresēm laikā, kad npm instalēt; vērojiet IMDS piekļuvi, kas rodas no pakotnes dzīves cikla skriptiem; un jebkuru instalēšanas āķi, kas pāradresē uz mākoņa komandrindas saskarni, uztveriet kā aizdomīgu, līdz tiek pierādīts pretējais.

Divas papildu piezīmes, kas attiecas uz šo klasteri. Pirmkārt, tā kā aktivizācija ir piesaistīta konteinerizētām vidēm, pakotne, kas, pārbaudot darbstacijā, šķiet inerta, joprojām var būt pieejama ražošanas vidē — pārbaudei ir jāatveido konteinera resursdatora nosaukums un ceļa nosacījumi vai jānolasa avots tieši, nevis jāpaļaujas uz "Es to instalēju, un nekas nenotika". Otrkārt, publiska pieprasījumu pārbaudes pakalpojuma izmantošana kā bākugunsu savācējs nozīmē, ka daļu no izfiltrētajiem datiem var atgūt incidentu reaģēšanai: organizācija, kas savā atkarību kokā atrod kādu no šīm pakotnēm, var spriest par to, ko veiksmīgs bākuguns būtu saturējis, pamatojoties uz lietderīgās slodzes apkopošanas loģiku, un tai vajadzētu mainīt visus IAM lomas akreditācijas datus, reģistra marķierus un pārvaldītos noslēpumus, kas bija sasniedzami no skartās būvējuma vai izpildlaika vides. Akreditācijas rotācija, nevis pakotnes noņemšana, ir operatīvā korekcija pēc instalēšanas palaišanas.

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