Instalacija Ectoplasm npm-a Hooks Koji kradu AWS akreditive

Ektoplazma: npm instalacija hooks koji prikupljaju AWS akreditive iza okidača koji se odnosi samo na 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 van 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 detektuje određeno okruženje: host čije je ime Heksadecimalni niz od 12 znakova i radni direktorij pod /app/node_modules — oblik kontejnerizovane izgradnje ili CI radnika. Kada ta kapija prođe, hook ispituje Usluga metapodataka instance AWS-a (IMDSv2) za IAM uloge akreditive, nabraja AWS Secrets Manager kroz tri regije, ispisuje varijable okruženja, čita datoteke pod /appi pretražuje nizove za snimanje zastavice. Zatim izvlači rezultat na dva načina: kao beacon do webhook.site kolektor i manifestni PUT na krajnju tačku sa sirovom IP adresom, sa listom rezervnih opcija koje su prvo dostupne na lokalnom hostu.

U kasnijim opisima paketa piše "CTF korisni teret za testiranje lanca snabdijevanja Verdaccio". Taj samoopis izvještavamo kao uočljivu činjenicu. Samo ponašanje - izlaz uživo na javnu IP adresu, čitanje stvarnih IMDS akreditiva, stvarni pozivi Upravitelja tajni - je ono što jeste bez obzira na oznaku i razlog je zašto su ove verzije klasifikovane kao zlonamjerne.

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

paketi 5 imena; coral-wraith sam ponovo objavljen u desetinama verzija
Ekosistem npm
Instalirajte vektor postinstall skripta životnog ciklusa
Primarni cilj AWS IAM akreditivi uloge + tajne vrijednosti Upravitelja tajni, varijable okruženja, /app datoteke
Izbacivanje webhook.site beacon + sirova IP adresa C2 PUT
Okidačka kapija 12-heksadecimalni naziv hosta + /app/node_modules cwd, plus provjera okruženja koja potiskuje korisni teret izvan tog konteksta
Težina visok — otkrivanje podataka o akreditivima u oblaku i upravljanih tajni od kontejnerizirana okruženja za izgradnju i izvršavanje

Anatomija napada

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

Kapija za ciljanje. Prije nego što bilo šta uradi, ekto-porodicni teret 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_čvora je konvencionalna putanja instalacije unutar kontejnera. Treća klauzula se isključuje ako putanja izgleda kao direktorij za ekstrakciju u sandboxu. Krajnji efekat je da korisni teret ostaje neaktivan na laptopu programera ili sandboxu za analizu i aktivira se samo unutar kontejnerizovanog builda ili runtime workera - vrste okruženja koje najvjerovatnije nosi aktivne cloud akreditive. Najraniji paket u klasteru, koraljni duh, nema takav prolaz i bezuvjetno pokreće svoju (jednostavniju) kolekciju.

kolekcijaKada kapija prođe, kuka se izvuče kroz nju. 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 na bazi tokena, što je AWS-ova preporučena zaštita. Akreditivi vraćeni korakom 3 su kratkotrajni. AccessKeyId/SecretAccessKey/žeton trojke ograničene na ulogu instance; šta god ta uloga može da uradi, vlasnik tih ključeva može da uradi tokom životnog vijeka akreditiva.

Koraci 4–6 proširuju opseg. env dump bilježi sve što je proces izgradnje ili izvršavanja naslijedio — u praksi se ovdje najčešće nalaze tokeni registra, stringovi za povezivanje s bazom podataka i API ključevi. / aplikacija File Walk čita do petnaest datoteka aplikacije izvan node_modules, koji može površinsku konfiguraciju, .NS datoteke ili izvor. Korak 6 poziva aws tajne menadžer lista-tajni u tri regije; akreditivi preuzeti u koracima 1-3 su upravo ono što autentificira te pozive, tako da se IMDS čitanje i enumeracija 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 za sebe, u suprotnom 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 sa aws sts get-caller-identity, a zatim petljom prelazi preko svake tajne koja se vraća od strane tajne-liste pozivajući aws tajni menadžer uzmi-tajnu-vrijednost na svakom — preuzimanje tajnog sadržaja, ne samo njihovih imena. Iste verzije također čitaju binarne datoteke sa zamjenskim zastavicama procesa (/readflag i prijatelji) i pokušajte punjenje run protiv bilo kojeg Rust projekta koji se nalazi pod / aplikacija, proširujući prikupljanje podataka izvan cloud akreditiva na sve što okruženje za izgradnju otkriva.

Ove kasnije verzije se također agresivnije zatvaraju. Pored 12-hex-hostname-a i /aplikacija/moduli_čvora Provjerava, korisni teret pregledava aktivnu konfiguraciju registra paketa i putanju radnog direktorija i tiho izlazi kada ukazuju na kontekst analize ili mirrora, a ne na aktivni cilj. Kombinirani efekat 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 kolektor, koji sadrži naziv hosta, numerički UID, radni direktorij i do 120 KB prikupljenih podataka. Drugo, podaci se sastavljaju u lažni YAML "manifest modula" i PUT to /api/moduli/ na ciljnom serveru:

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 (nivo_snage, brodska paluba, teretni prostor) su dekoracija — ukradeni podaci se nalaze unutar string vrijednosti, zbog čega mrežni monitor vidi ono što izgleda kao benigno učitavanje manifesta registra paketa, a ne očigledan damp podataka. Beacon kanal nosi više: POST tijelo do 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 puni prikaz. webhook.site je besplatna usluga pregleda zahtjeva; korištenje kao sakupljača znači da operater nikada ne mora izgraditi vlastitu infrastrukturu za prijem tog kanala, a zabilježeni zahtjevi ostaju u spremniku usluge.

Manifest PUT prolazi rezervnu listu koja počinje s nekoliko 127.0.0.1/localhost portova, a zatim se probija do tri javne adrese u `154.57.164.0/24` raspon, zaustavljajući se na prvoj krajnjoj tački koja odgovori sa statusom 2xx. Redoslijed localhost-first je u skladu sa samoopisom "verdaccio testiranje" (lokalni registar na loopbacku), ali public-IP rezervne adrese znače da podaci napuštaju host kad god loopback ne sluša - što znači, na bilo kojoj mašini koja nije autorova vlastita testna platforma.

Timeline

Klaster pokazuje postepeni rast kapaciteta, a ne pojedinačni pad. Poredali smo ga prema uočenom ponašanju, a ne prema vremenu objavljivanja:

faza Paketi / Verzije ponašanje
Rano trčanje coral-wraith 9999.0.x Napuhani brojevi verzija u skladu s pokušajem zabune oko zavisnosti; 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 Desetine ispuštanja u roku od nekoliko sati; korisni teret dobija isAppWorker() kapija, IMDSv2 preuzimanje akreditiva, puni get-secret-value pivot, provjera okruženja registra/putanje i markeri dvostrukog odvoda
Paralelna imena ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Isti ograničeni korisni teret; webhook.site rezervna lista za beacon i više krajnjih tačaka
Varijante ecto-rust-read-f3a9c1 1.0.1–1.0.2 Dodaje dodatne markere za sudoper 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 koja definiše klaster je njegov ritam objavljivanja: umjesto jednog paketa i jedne verzije, isto ime se ponovo objavljuje iznova i iznova u brzom slijedu, pri čemu svako izdanje predstavlja malu varijaciju prethodnog, uz nekoliko različito nazvanih srodnih verzija koje nose isti korisni teret. Unutar šapat Kod porodice se podijelio na dva bliska otiska prsta - jedan set aktivira dvije kritične detekcije, drugi tri (dodatni odvod za čitanje datoteke) - ali oba se rješavaju istim korisnim teretom; razlika je u pomjeranju koda, a ne u ponašanju. Verzije šapat izvan analiziranog raspona (do najmanje 1.0.25 u vrijeme pisanja) su uočeni uživo u registru, i koraljni duh Ime je nastavilo da se penje na vlastitu ljestvicu verzija preko istog prozora.

Indikatori kompromisa

Svi dolje navedeni indikatori su izdvojeni iz izvornog koda paketa na disku. Mrežni indikatori su defaultirani.

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/... Očitavanje IMDSv2 akreditiva (na strani cilja, AWS metapodaci)

Bihevioralni/datotečni

pokazatelj uloga
"postinstall": "node postinstall.js" Instalirajte vektor
ecto_module: YAML sa power_level / ship_deck / cargo_hold ključeve Shema manifesta Exfil-a
Markeri sudopera ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 segment puta /api/modules/<marker>
isAppWorker() kapija: domaćin /^[0-9a-f]{12}$/, sadrži /app/node_modules Uslov aktivacije
aws secretsmanager list-secrets više us-east-1, eu-west-1, eu-central-1 Nabrajanje tajni
HTB{...} skidanje regularnih izraza Žetva po principu "Osvoji zastavu"

Heširanja datoteka (sha256, snimljeno u vrijeme analize)

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

Atribucija i uočeno ponašanje

Pet naziva paketa objavljeno je pod dva npm identifikatora 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 tačke C2 u istom Blok 154.57.164.0/24`. Paket sjemena (`coral-wraith, jednostavniji i neograničeni) i zatvorena ekto-porodica se stoga čitaju kao iteracije na jednom skupu alata, a ne kao nezavisni napori.

Paketi se, u kasnijim verzijama, opisuju kao "CTF korisni teret za testiranje lanca snabdijevanja Verdaccio." Tu oznaku ističemo kao uočljivu činjenicu i ne ponavljamo je kao nalaz o svrsi. Ono što kod radi je nedvosmisleno i nezavisno od toga kako je označen: čita IAM akreditive uloge iz servisa metapodataka instance, nabraja upravljane tajne podatke u tri AWS regije i prenosi rezultate na javnu IP adresu i kolektor webhook podataka treće strane. Zaista testni sistem koji koristi samo povratnu petlju ne bi trebao rezervnu listu javnih IP adresa, čitanje IMDS akreditiva ili pozive Upravitelja tajni između regija. Budući da su izlazni i doseg akreditiva stvarni, zatvorene verzije su klasificirane kao zlonamjerne.

Kapija koja je dostupna samo u kontejneru je najznačajnija operativna osobina. To je i mjera izbjegavanja - ostanak bez aktiviranja na laptopima i u analitičkim sandbox okruženjima - i mjera ciljanja, aktivirajući samo tamo gdje je najvjerovatnije 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 manifestuje samo pod imenom hosta u Docker stilu i putanjom instalacije unutar kontejnera.

Uticaj, trendovi i smjernice za branioce

Izloženost ovdje se ogleda u otkrivanju cloud akreditiva i tajnih podataka unutar kontejnera za izgradnju i izvođenje. IAM akreditiv uloge preuzet iz IMDS-a nosi sve dozvole koje ta uloga posjeduje; upraviteljtajni:Listatajni (i svaki nastavak GetSecretValue) proširuje to na pohranjene tajne aplikacije. Dampovi varijabli okruženja često sadrže tokene registra, URL-ove baze podataka i API ključeve. U CI ili kontekstu kontejnera - upravo ono što kapija odabire - jedna tranzitivna instalacija jednog od ovih paketa dovoljna je da procuri taj materijal.

Ectoplasm se uklapa u obrazac koji i dalje viđamo: 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 defanzivna zapažanja.

  • Oblik je prepoznatljiv. Instalacijski hook npm/PyPI čiji graf poziva doseže i API tajni u oblaku (AWS upravitelj tajni, tajne gclouda, AZ trezor ključeva) ili IMDS adresa i izlazni mrežni odvodnik je uzak obrazac visokog signala — gotovo se nikada ne javlja u legitimnom skriptu životnog ciklusa. Statička analiza toka može ga označiti bez obzira na bilo koju određenu domenu ili IP adresu.
  • Otvrdnjavanje okoline ga otupljuje. Primjena 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 eksplozije bilo kojeg akreditiva koji procuri; i pokretanje instalacija sa –ignor-skripte U CI-ju u potpunosti uklanja vektor instalacijske zakačke za pakete kojima nije potreban.

Za one koji se brane, praktične provjere su: upozorenje na odlazne veze iz kontejnera za izgradnju/CI na javne IP adrese koje nisu na dozvoljenoj listi tokom npm install; pratite IMDS pristup koji potiče iz skripti životnog ciklusa paketa; i tretirajte svaki instalacijski hook koji se usmjerava na cloud CLI kao sumnjiv 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 kada se provjerava na radnoj stanici i dalje može biti aktivan u produkciji - provjera treba reproducirati naziv hosta kontejnera i uvjete putanje ili direktno pročitati izvorni kod, umjesto da se oslanja na "Instalirao sam ga i ništa se nije dogodilo". Drugo, korištenje javne usluge za pregled 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 IAM vjerodajnice uloge, tokene registra i upravljane tajne koje su bile dostupne iz pogođenog okruženja za izgradnju ili izvođenje. Rotacija akreditiva, a ne uklanjanje paketa, je operativna sanacija nakon što je instalacija pokrenuta.

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

Osigurajte svoj razvoj i isporuku softvera

sa Xygeni paketom proizvoda