Instalacija ektoplazme npm-a Hooks Koji kradu AWS vjerodajnice

Ektoplazma: npm instalacija hooks koji prikupljaju AWS vjerodajnice iza okidača samo za kontejner

TL; DR

Skupina pet npm paketa, objavljeno na dva korisnička računa, poslano postinstall kuka koja čita cloud vjerodajnice s hosta i šalje ih izvan kutije. Paketi nose lažna imena - coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — i serijaliziraju sve što prikupe u lažnjak ecto_module: YAML manifest prije slanja. Pratimo klaster kao ektoplazma.

Korisni teret se pokreće samo kada otkrije određeno okruženje: host čije je ime Heksadecimalni niz od 12 znakova i radni direktorij pod /app/node_modules — oblik kontejnerizirane izgradnje ili CI workera. Kada ta vrata prođu, hook ispituje Usluga metapodataka instance AWS-a (IMDSv2) za vjerodajnice IAM uloge, nabraja AWS Secrets Manager kroz tri regije, ispisuje varijable okruženja, čita datoteke pod /appi traži nizove za hvatanje zastavice. Zatim izvlači rezultat na dva načina: kao beacon do webhook.site kolektor i manifestni PUT na krajnju točku s sirovom IP adresom, s popisom localhost-first rezervnih opcija.

U kasnijim opisima paketa piše "CTF teret za testiranje lanca opskrbe Verdaccio". Taj samoopis izvještavamo kao uočljivu činjenicu. Samo ponašanje - izlaz uživo na javnu IP adresu, očitavanje stvarnih IMDS vjerodajnica, stvarni pozivi Upravitelja tajni - jest ono što jest bez obzira na oznaku i razlog je zašto su te verzije klasificirane kao zlonamjerne.

Jedno ime u grupi, coral-wraith, nije se zaustavio na jednom izdanju. Ponovno je objavljen u brzom slijedu kroz desetke verzija u roku od nekoliko sati — 1.0.0 penjući se na 6.0.0 — a ranija serija istog naziva koristila je napuhane 9999.0.x brojevi verzija, klasični oblik pokušaj zabune ovisnostiKroz tu zbrku, korisni teret je vidljivo sazrio: od jednokratnog beacon-a za nabrajanje hostova do potpunog pivota AWS vjerodajnica obavijenog provjerama okruženja koje ga drže tihim izvan predviđenog cilja.

Paketi 5 imena; coral-wraith sam ponovno objavljen u desecima verzija
ekosustav NPM
Instalirajte vektor postinstall skripta životnog ciklusa
Primarni cilj Vjerodajnice za ulogu AWS IAM + tajne vrijednosti Upravitelja tajni, varijable okruženja, /app slika
Izbacivanje webhook.site beacon + sirovi IP C2 PUT
Okidačka vrata 12-heksadecimalni naziv hosta + /app/node_modules cwd, plus provjera okruženja koja potiskuje korisni teret izvan tog konteksta
Ozbiljnost visok — otkrivanje vjerodajnica u oblaku i upravljane tajne od kontejnerizirana okruženja za izgradnju i izvođenje

Anatomija napada

Svaki paket u klasteru izgrađen je na isti način: gotovo prazan index.js (modul.izvozi = {}), jednolinijski paket.json skripta — „postinstall”: „čvor postinstall.js” — i korisni teret u postinstall.jsInstaliranje paketa je dovoljno za pokretanje hook-a; nije potreban uvoz ili poziv.

Vrata za ciljanje. Prije nego što išta poduzme, teret ekto-obitelji provjerava svoju okolinu:

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-heksadecimalni naziv hosta je zadani oblik koji Docker dodjeljuje kontejneru i /aplikacija/moduli_čvorova je konvencionalna putanja instalacije unutar kontejnera. Treća klauzula se isključuje ako putanja izgleda kao direktorij za ekstrakciju u sandboxu. Krajnji učinak je da korisni teret ostaje neaktivan na prijenosnom računalu razvojnog programera ili sandboxu za analizu i aktivira se samo unutar kontejnerizirane izgradnje ili runtime workera - vrste okruženja koje najvjerojatnije nosi aktivne cloud vjerodajnice. Najraniji paket u klasteru, koraljni prikaz, nema takva vrata i bezuvjetno pokreće svoju (jednostavniju) kolekciju.

KolekcijaKad vrata prođu, kuka se izvuče kroz njih. execFileSync(“/bin/sh”, [“-c”, …]) i pokreće jednu složenu naredbu koja, redom:

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)

Koraci 1–3 su udžbenik za preuzimanje IMDSv2: zatražite token sesije, a zatim ga priložite kao X-aws-ec2-metadata-token zaglavlje za preuzimanje IAM uloge instance i privremenih pristupnih ključeva te uloge. Mogućnost implementacije IMDSv2 umjesto jednostavnijeg neautentificiranog IMDSv1 GET vrijedi napomenuti - to znači da korisni teret radi čak i na instancama konfiguriranim da zahtijevaju pristup metapodacima temeljen na tokenima, što je AWS-ova preporučena zaštita. Vjerodajnice vraćene korakom 3 kratkotrajne su. ID pristupnog ključa/TajniKljučPristupa/Žeton trojke ograničene na ulogu instance; što god ta uloga može učiniti, nositelj tih ključeva može učiniti tijekom životnog vijeka vjerodajnice.

Koraci 4–6 proširuju opseg. eNV dump bilježi sve što je proces izgradnje ili izvođenja naslijedio - u praksi se ovdje najčešće nalaze tokeni registra, nizovi za povezivanje s bazom podataka i API ključevi. / app file walk čita do petnaest datoteka aplikacije izvan čvorovi_moduli, koji može površinsku konfiguraciju, .NS datoteke ili izvor. Korak 6 poziva aws tajne upravitelja popisa tajni u tri regije; vjerodajnice izvučene u koracima 1-3 upravo su ono što autentificira te pozive, pa se IMDS čitanje i nabrajanje Upravitelja tajni povezuju u jednu eskalaciju: uloga instance → inventar upravljanih tajni. Korak 7 je aluzija na okvir hvatanja zastavice - kada HTB{…} Ako se pronađe zastavica, šalje se sama po sebi, inače se sirovi prikupljeni blob dijeli na četiri dijela i šalje.

Kasnije verzije u klasteru prenose eskalaciju dalje. Umjesto da se zaustave na inventaru, one parsiraju IMDS odgovor, izvoze privremene ključeve kao AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN varijable okruženja, potvrdite identitet s aws sts dobivanje identiteta pozivatelja, a zatim petljom pređite preko svake tajne koja se vrati od strane tajne-liste nazivajući aws tajni upravitelj dobiva tajnu vrijednost na svakom - dohvaćajući tajni sadržaj, ne samo njihova imena. Iste verzije također čitaju binarne datoteke sa zamjenskim zastavicama procesa (/readflag i prijatelji) i pokušajte punjenje punjenja protiv bilo kojeg Rust projekta koji se nalazi pod / app, proširujući prikupljanje podataka izvan cloud vjerodajnica na sve što okruženje za izgradnju otkriva.

Ove kasnije verzije također se agresivnije zatvaraju. Uz 12-hex-hostname i /aplikacija/moduli_čvorova provjerava, korisni teret pregledava aktivnu konfiguraciju registra paketa i putanju radnog direktorija te tiho izlazi kada ukazuju na kontekst analize ili zrcaljenja, a ne na aktivni cilj. Kombinirani učinak je korisni teret koji ne radi ništa uočljivo u većini okruženja za inspekciju i pokreće svoju punu kolekciju samo tamo gdje procijeni da se nalazi na pravom kontejneriziranom hostu.

EksfiltracijaPrikupljeni podaci napuštaju host na dva kanala. Prvo, beacon POST na fiksni webhook.site kolekcionar, koji sadrži naziv hosta, numerički UID, radni direktorij i do 120 KB prikupljenih podataka. Drugo, podaci se sažimaju u lažni YAML "manifest modula" i PUT do /api/moduli/ na ciljnom poslužitelju:

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

Nazivi polja manifesta (razina_snage, brodska paluba, teretni prostor) su ukras - ukradeni podaci nalaze se unutar niza vrijednosti, zbog čega mrežni monitor vidi ono što izgleda kao benigni prijenos manifesta registra paketa, a ne očiti izvatak podataka. Kanal beacon nosi više: POST tijelo prema webhook.site uključuje naziv hosta, numerički UID, radni direktorij i do 120 KB prikupljenog bloba, tako da čak i jedan uspješan beacon isporučuje cijeli snimak. webhook.site je besplatna usluga pregleda zahtjeva; korištenje kao sakupljača znači da operater nikada ne mora izgraditi vlastitu infrastrukturu za primanje tog kanala, a zabilježeni zahtjevi ostaju u spremniku usluge.

Manifest PUT prolazi rezervni popis koji počinje s nekoliko 127.0.0.1/localhost portova, a zatim pada na tri javne adrese u `154.57.164.0/24` raspon, zaustavljajući se na prvoj krajnjoj točki koja odgovori statusom 2xx. Redoslijed localhost-first u skladu je s opisom "verdaccio testiranja" (lokalni registar na loopbacku), ali public-IP zamjenske adrese znače da podaci napuštaju host kad god loopback ne sluša - što jest, na bilo kojem računalu koje nije autorova vlastita testna platforma.

Timeline

Klaster pokazuje postupni rast sposobnosti, a ne jednokratni pad. Poredali smo ga prema uočenom ponašanju, a ne prema vremenu objave:

Stadij Paketi / Verzije Ponašanje
Rani početak coral-wraith 9999.0.x Napuhani brojevi verzija u skladu s pokušajem zabune ovisnosti; nabrajanje prilikom instalacije i exfil
Sjeme coral-wraith 1.0.0 postinstall prikuplja id/env/flag datoteke; jedan PUT za 154[.]57[.]164[.]71:30782, marker ECT-472839
Brza iteracija coral-wraith 1.0.1 → 6.0.0 Deseci ispuštanja u satima; korisni teret dobiva isAppWorker() vrata, IMDSv2 povlačenje vjerodajnica, puni get-secret-value pivot, provjera okruženja registra/puta i markeri dvostrukog odvoda
Paralelna imena ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Isti ograničeni korisni teret; webhook.site popis zamjenskih beacon-a i više krajnjih točaka
Varijante ecto-rust-read-f3a9c1 1.0.1–1.0.2 Dodaje dodatne oznake sudopera ECT-987654, ECT-654321, ECT-839201
Varijante ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Isti ograničeni korisni teret, isti C2 i beacon

Odlika klastera je njegov ritam objavljivanja: umjesto jednog paketa i jedne verzije, isto ime se ponovno objavljuje iznova i iznova u brzom slijedu, svako izdanje je mala varijacija prethodnog, uz nekoliko različito nazvanih braće i sestara koje nose isti korisni teret. Unutar šapat Obitelj koda se podijelila u dva bliska otiska prsta - jedan skup aktivira dvije kritične detekcije, drugi tri (dodatni odvod za čitanje datoteke) - ali oba se rješavaju istim korisnim teretom; razlika je u pomicanju koda, a ne u ponašanju. Verzije šapat izvan analiziranog raspona (do najmanje 1.0.25 u vrijeme pisanja) uočeni su uživo u registru i koraljni prikaz ime se nastavilo penjati vlastitom ljestvicom verzija preko istog prozora.

Pokazatelji kompromisa

Svi donji indikatori su izvučeni iz izvornog koda paketa na disku. Mrežni indikatori su defangirani.

mreža

Pokazatelj Uloga
hxxp://154[.]57[.]164[.]71:30782 C2 PUT cilj (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT rezervni (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT rezervni (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT rezervni (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Sakupljač svjetionika
169[.]254[.]169[.]254/latest/... Čitanje IMDSv2 vjerodajnica (na strani cilja, AWS metapodaci)

Bihevioralno/datotečno

Pokazatelj Uloga
"postinstall": "node postinstall.js" Instalirajte vektor
ecto_module: YAML s power_level / ship_deck / cargo_hold Tipke Shema manifesta Exfila
Oznake sudopera ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 segment puta /api/modules/<marker>
isAppWorker() vrata: domaćin /^[0-9a-f]{12}$/, cwd sadrži /app/node_modules Uvjet aktivacije
aws secretsmanager list-secrets umjesto prema us-east-1, eu-west-1, eu-central-1 Nabrajanje tajni
HTB{...} stružanje regularnih izraza Žetva po principu "Osvoji zastavu"

Hashevi datoteka (sha256, snimljeni u vrijeme analize)

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

Atribucija i opaženo ponašanje

Pet naziva paketa objavljeno je pod dva identifikatora npm računa, ali dijele dovoljno infrastrukture da se tretiraju kao jedan klaster: isti ecto_module manifestna shema, ista ECT-472839 primarni marker sudopera, isti webhook.site ID kolektora i krajnje točke C2 u istom Blok 154.57.164.0/24`. Paket sjemena (`coral-wraith, jednostavnije i neograničeno) i zatvorena ekto-obitelj stoga se čitaju kao iteracije na jednom skupu alata, a ne kao neovisni napori.

Paketi se u kasnijim verzijama opisuju kao „CTF korisni teret za testiranje lanca opskrbe Verdaccio.“ Tu oznaku ističemo kao uočljivu činjenicu i ne ponavljamo je kao nalaz o svrsi. Ono što kod radi je nedvosmisleno i neovisno o tome kako je označen: čita vjerodajnice IAM uloge iz usluge metapodataka instance, nabraja upravljane tajne podatke u tri AWS regije i prenosi rezultate na javnu IP adresu i webhook kolektor treće strane. Testni sustav koji koristi samo povratnu petlju ne bi trebao rezervni popis javnih IP adresa, čitanje IMDS vjerodajnica ili pozive Upravitelja tajni između regija. Budući da su izlazni i doseg vjerodajnica stvarni, zatvorene verzije klasificirane su kao zlonamjerne.

Vrata koja se aktiviraju samo u kontejneru najznačajnija su operativna značajka. To je i mjera izbjegavanja - ostanak bez aktiviranja na prijenosnim računalima i u analitičkim sandboxima - i mjera ciljanja, aktivirajući samo tamo gdje je najvjerojatnije da su prisutne stvarna IAM uloga i žive tajne. Analitičari koji pokreću ove pakete u generičkom sandboxu ne bi primijetili ništa; ponašanje se manifestira samo pod Dockerovim nazivom hosta i putanjom instalacije unutar kontejnera.

Utjecaj, trendovi i smjernice za branitelje

Izloženost ovdje je otkrivanje vjerodajnica za oblak i tajni podaci unutar kontejnera za izgradnju i izvođenje. Vjerodajnica za IAM ulogu preuzeta iz IMDS-a nosi sva dopuštenja koja ta uloga ima; upraviteljSecrets:PopisSecrets (i sve naknadne DohvatiTajnuVrijednost) proširuje to na pohranjene tajne aplikacije. Izvatci varijabli okruženja često sadrže tokene registra, URL-ove baze podataka i API ključeve. U kontekstu CI-a ili kontejnera - upravo ono što vrata odabiru - jedna tranzitivna instalacija jednog od ovih paketa dovoljna je za curenje tog materijala.

Ectoplasm odgovara obrascu koji i dalje vidimo: korisni tereti u vrijeme instalacije koji posežu za metapodacima u oblaku i upravljanim tajnama umjesto za lokalnim datotekama, te se sami aktiviraju samo u okruženjima visoke vrijednosti. Slijede dva obrambena zapažanja.

  • Oblik je prepoznatljiv. npm/PyPI instalacijska kuka čiji graf poziva doseže i cloud secrets API (AWS upravitelj tajni, tajne gclouda, AZ trezor ključeva) ili IMDS adresa i izlazni mrežni odvodnik je uzak uzorak s visokim signalom - gotovo se nikada ne pojavljuje u legitimnom skriptu životnog ciklusa. Statička analiza toka može ga označiti bez ovisnosti o bilo kojoj određenoj domeni ili IP adresi.
  • Otupljivanje okoline ga otupljuje. Provođenje IMDSv2 s ograničenjem skoka od 1 sprječava da radna opterećenja kontejnera dosegnu metapodatke instance; ograničavanje IAM uloga na najmanje privilegije ograničava radijus propuštanja bilo koje vjerodajnice koja procuri; i pokretanje instalacija s –Ignoriraj-skripte U CI-ju u potpunosti uklanja vektor instalacijske hook-a za pakete kojima nije potreban.

Za branitelje, praktične provjere su: upozorenje na odlazne veze iz kontejnera za izgradnju/CI na javne IP adrese koje nisu na popisu dopuštenih tijekom npm instalirati; pratite IMDS pristup koji potječe iz skripti životnog ciklusa paketa; i tretirajte svaku instalacijsku udicu koja se šalje na cloud CLI kao sumnjivu dok se ne dokaže suprotno.

Dvije dodatne napomene specifične za ovaj klaster. Prvo, budući da je aktivacija ograničena na kontejnerizirana okruženja, paket koji se čini inertan prilikom provjere na radnoj stanici i dalje može biti aktivan u produkciji - provjera treba reproducirati naziv hosta kontejnera i uvjete putanje ili izravno pročitati izvorni kod, umjesto da se oslanja na "Instalirao sam ga i ništa se nije dogodilo". Drugo, korištenje javne usluge pregleda zahtjeva kao sakupljača beacon-a znači da se neki od izvučenih podataka mogu oporaviti za odgovor na incident: organizacija koja pronađe jedan od ovih paketa u svom stablu ovisnosti može zaključiti o tome što bi uspješan beacon sadržavao na temelju logike prikupljanja korisnog tereta i trebala bi rotirati sve vjerodajnice IAM uloge, tokene registra i upravljane tajne koje su bile dostupne iz pogođenog okruženja za izgradnju ili izvođenje. Rotacija vjerodajnica, a ne uklanjanje paketa, je operativna sanacija nakon što je instalacija pokrenuta.

alati-za-analizu-sastava-softvera-sca-tools
Prioritizirajte, sanirajte i osigurajte softverske rizike
Nabavite svoj besplatni račun.
Nije potrebna kreditna kartica.

Osigurajte svoj razvoj i isporuku softvera

s Xygeni paketom proizvoda