Inštalácia ektoplazmy npm Hooks Ktoré kradnú poverenia AWS

Ektoplazma: inštalácia npm hooks ktoré zhromažďujú prihlasovacie údaje AWS za spúšťačom typu iba kontajner

TL; DR

Zhluk päť npm balíkov, publikované na dvoch účtoch, odoslané postinstall hook, ktorý číta cloudové prihlasovacie údaje z hostiteľa a odosiela ich z krabice. Balíky majú fiktívne názvy – coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — a serializujú všetko, čo zhromaždia, do falzifikátu ecto_module: manifest YAML pred jeho odoslaním. Klaster sledujeme ako ektoplazmy.

Úžitková záťaž sa spustí iba vtedy, keď zistí konkrétne prostredie: hostiteľa, ktorého názov je 12-miestny hexadecimálny reťazec a pracovný adresár pod /app/node_modules — tvar kontajnerového zostavovacieho alebo CI workera. Keď táto brána prejde, hook sa dopýta na Služba metadát inštancií AWS (IMDSv2) pre poverenia roly IAM vymenúva Správca tajomstiev AWS v troch oblastiach, vypíše premenné prostredia, načíta súbory pod /appa zoškrabáva reťazce typu „capture-the-flag“. Výsledok potom extrahuje dvoma spôsobmi: ako maják do webhook.site kolektor a manifest PUT do koncového bodu s nerafinovanou IP adresou so zoznamom záložných nastavení typu localhost-first.

V neskorších popisoch balíkov sa uvádza „CTF payload for verdaccio supply-chain testing“. Tento vlastný popis uvádzame ako pozorovateľný fakt. Samotné správanie – živý výstup na verejnú IP adresu, skutočné čítanie poverení IMDS, skutočné volania Secrets Manager – je to, čím je, bez ohľadu na označenie, a je dôvodom, prečo boli tieto verzie klasifikované ako škodlivé.

Jedno meno v klastri, coral-wraith, sa nezastavil pri jedinom vydaní. V rýchlom slede sa v priebehu niekoľkých hodín znovu vydal v desiatkach verzií – 1.0.0 lezenie na 6.0.0 — a skoršia séria s rovnakým názvom používala nafúknuté 9999.0.x čísla verzií, klasický tvar pokus o zámenu závislostíNapriek tomuto chaosu sa užitočné zaťaženie viditeľne vyvinulo: z jednorazového majáku na enumeráciu hostiteľov sa stal plnohodnotný pivot poverení AWS obalený kontrolami prostredia, ktoré ho udržiavajú v tichosti mimo zamýšľaného cieľa.

Balíčky 5 mien; coral-wraith sám znovu publikovaný v desiatkach verzií
ekosystém NPM
Inštalácia vektora postinstall skript životného cyklu
Primárny cieľ Prihlasovacie údaje role AWS IAM + tajné hodnoty Správcu tajomstiev, premenné prostredia, /app súbory
Exfil webhook.site maják + surová IP adresa C2 PUT
Spúšťacia brána 12-hexový názov hostiteľa + /app/node_modules cwd plus kontrola prostredia, ktorá potlačí užitočné zaťaženie mimo tohto kontextu
Prísnosť vysoký — zverejnenie cloudových poverení a spravovaného tajomstva z kontajnerizované prostredia pre zostavovanie a beh

Anatómia útoku

Každý balík v klastri je zostavený rovnakým spôsobom: takmer prázdny index.js (modul.exports = {}), jednoriadkový package.json skript — „postinstall“: „uzol postinstall.js“ — a užitočné zaťaženie v postinstall.jsNa spustenie hooku stačí nainštalovať balík; nie je potrebný žiadny import ani volanie.

Cieľová brána. Predtým, ako čokoľvek urobí, užitočné zaťaženie ektorodiny skontroluje svoje okolie:

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-hexový názov hostiteľa je predvolený tvar, ktorý Docker priraďuje kontajneru, a /app/node_modules je konvenčná cesta inštalácie v kontajneri. Tretia klauzula sa zruší, ak cesta vyzerá ako adresár extrakcie v sandboxe. Čistým efektom je, že užitočné zaťaženie zostane neaktívne na notebooku vývojára alebo v analytickom sandboxe a aktivuje sa iba v kontajnerizovanom zostavovacom alebo runtime workerovi – v prostredí, ktoré s najväčšou pravdepodobnosťou obsahuje aktívne cloudové poverenia. Najstarší balík v klastri, koralový prízrak, nemá takúto bránu a spúšťa svoju (jednoduchšiu) kolekciu bezpodmienečne.

kolekciaKeď brána prejde, hák sa vysunie von execFileSync("/bin/sh", ["-c", ...]) a spustí jeden zložený príkaz, ktorý v tomto poradí:

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)

Kroky 1–3 sú učebnicovým postupom pre získanie IMDSv2: vyžiadajte si token relácie a potom ho pripojte ako Token metadát X-aws-ec2 hlavička na stiahnutie roly IAM inštancie a dočasných prístupových kľúčov tejto roly. Možnosť implementovať IMDSv2 namiesto jednoduchšej neoverenej IMDSv1 GET stojí za zmienku – to znamená, že užitočné zaťaženie funguje aj na inštanciách nakonfigurovaných tak, aby vyžadovali prístup k metadátam na základe tokenov, čo je AWS odporúčané posilnenie. Prihlasovacie údaje vrátené v kroku 3 sú krátkodobé. ID prístupového kľúča/Tajný prístupový kľúč/Známka trojice viazané na rolu inštancie; čokoľvek môže táto rola robiť, držiteľ týchto kľúčov môže robiť počas životnosti prihlasovacích údajov.

Kroky 4–6 rozširujú záber. ca. Súbor dump zachytáva všetko, čo zdedil proces zostavovania alebo runtime – v praxi sa tu najčastejšie nachádzajú tokeny registra, reťazce pripojenia k databáze a kľúče API. / app prechádzanie súborov prečíta až pätnásť súborov aplikácie mimo node_modules, ktorý môže mať povrchovú konfiguráciu, .env súbory alebo zdroj. Krok 6 volania AWS SecretsManager zoznam tajomstiev v troch regiónoch; poverenia získané v krokoch 1 – 3 sú presne to, čo overuje tieto hovory, takže čítanie IMDS a enumerácia Správcu tajomstiev sa spoja do jednej eskalácie: rola inštancie → inventár spravovaných tajomstiev. Krok 7 je odkazom na rámovanie zachytenia vlajky – keď HTB{…} Ak sa nájde príznak, odošle sa samostatne, inak sa surový zozbieraný blob rozdelí na štyri časti a odošle sa.

Neskoršie verzie v klastri prenášajú eskaláciu ďalej. Namiesto zastavenia na inventári analyzujú odpoveď IMDS a exportujú dočasné kľúče ako AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN premenné prostredia, potvrďte identitu s AWS STS - Získanie identity volajúcehoa potom prejde každým tajným kódom, ktorý vráti tajné zoznamy volanie AWS SecretsManager - Získanie tajnej hodnoty na každom z nich – získava tajný obsah, nielen ich názvy. Tie isté verzie tiež čítajú binárne súbory s príznakmi nahradené procesmi (/readflag a priatelia) a pokúsiť sa o nabíjací beh proti akémukoľvek projektu Rust, ktorý sa nachádza pod / app, čím sa zber údajov rozšíri nad rámec cloudových poverení na čokoľvek, čo prostredie zostavy sprístupňuje.

Tieto novšie verzie sa tiež agresívnejšie bránia. Okrem 12-hexového názvu hostiteľa a /app/node_modules Pri kontrolách užitočné zaťaženie kontroluje aktívnu konfiguráciu registra balíkov a cestu k pracovnému adresáru a ticho ukončí proces, keď indikujú kontext analýzy alebo zrkadlenia namiesto aktívneho cieľa. Kombinovaný efekt je užitočné zaťaženie, ktoré vo väčšine inšpekčných prostredí nerobí nič pozorovateľné a spúšťa celú svoju kolekciu iba tam, kde sa považuje za skutočne kontajnerového hostiteľa.

ExfiltráciaZhromaždené dáta opúšťajú hostiteľa na dvoch kanáloch. Najprv cez maják. POST na pevnú webhook.site zberač, ktorý obsahuje názov hostiteľa, číselné UID, pracovný adresár a až 120 KB zozbieraných údajov. Po druhé, údaje sú zložené do falošného YAML „manifestu modulov“ a PUT na /api/moduly/ na cieľovom serveri:

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

Názvy polí manifestu (úroveň výkonu, paluba_lode, nákladný priestor) sú dekorácia – ukradnuté dáta sa nachádzajú vo vnútri reťazcových hodnôt, a preto sieťový monitor vidí niečo, čo vyzerá ako neškodný upload manifestu z registra balíkov, a nie ako zjavný výpis dát. Kanál beacon prenáša viac: POST telo k webhook.site zahŕňa názov hostiteľa, číselné UID, pracovný adresár a až 120 KB zozbieraného blobu, takže aj jeden úspešný beacon poskytne kompletný záznam. webhook.site je bezplatná služba na kontrolu požiadaviek; jej použitie ako zberateľa znamená, že prevádzkovateľ nikdy nemusí budovať vlastnú prijímaciu infraštruktúru pre daný kanál a zaznamenané požiadavky zostávajú v zásobníku služby.

Manifest PUT prechádza záložný zoznam, ktorý začína niekoľkými 127.0.0.1/localhost porty a potom prechádza na tri verejné adresy v `154.57.164.0/24` rozsah, zastaví sa na prvom koncovom bode, ktorý odpovie so stavom 2xx. Poradie localhost-first je v súlade so samopopisom „verdaccio testing“ (lokálny register v loopbacku), ale záložné verejné IP adresy znamenajú, že dáta opúšťajú hostiteľa vždy, keď loopback nepočúva – to znamená na akomkoľvek počítači, ktorý nie je vlastným testovacím zariadením autora.

časová os

Klaster vykazuje skôr postupný rast schopností než ojedinelý pokles. Zoradíme ho podľa pozorovaného správania, nie podľa dátumu publikovania:

Situácia Balíky / Verzie Správanie
Skorý beh coral-wraith 9999.0.x Nafúknuté čísla verzií zodpovedajúce pokusu o zámenu závislostí; enumerácia a exfil počas inštalácie
Semienko coral-wraith 1.0.0 postinstall zhromažďuje súbory id/env/flag; jeden PUT do 154[.]57[.]164[.]71:30782, značka ECT-472839
Rýchla iterácia coral-wraith 1.0.1 → 6.0.0 Desiatky vypustení za hodiny; užitočné zaťaženie získava isAppWorker() brána, stiahnutie poverení IMDSv2, úplné get-secret-value pivot, kontrola prostredia registra/cesty a značky duálneho umývadla
Paralelné názvy ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Rovnaké hradlované užitočné zaťaženie; webhook.site zoznam beaconov a záložných multiendpointov
Varianty ecto-rust-read-f3a9c1 1.0.1–1.0.2 Pridáva ďalšie značky drezu ECT-987654, ECT-654321, ECT-839201
Varianty ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Rovnaké hradlované užitočné zaťaženie, rovnaké C2 a maják

Charakteristickým znakom klastra je jeho publikačná frekvencia: namiesto jedného balíka a jednej verzie sa rovnaký názov vydáva znova a znova v rýchlom slede, pričom každé vydanie je malou variáciou predchádzajúceho, spolu s hŕstkou inak pomenovaných súrodencov nesúcich rovnaký úžitok. V rámci šepot V rodine kód rozdelil na dva blízke odtlačky prstov – jedna sada spúšťa dve kritické detekcie, ďalšia tri (ďalší zdroj na čítanie súborov) – ale obe sa rozhodujú o rovnakom užitočnom zaťažení; rozdiel je v posune kódu, nie v behaviorálnej fork. Verzie šepot mimo analyzovaného rozsahu (v čase písania tohto článku najmenej do 1.0.25) boli v registri pozorované naživo a koralový prízrak Názov pokračoval v stúpaní po vlastnom rebríčku verzií cez to isté okno.

Indikátory kompromisu

Všetky nižšie uvedené indikátory boli extrahované zo zdrojového kódu balíka na disku. Sieťové indikátory sú odstránené.

sieť

Indikátor Úloha
hxxp://154[.]57[.]164[.]71:30782 Cieľ C2 PUT (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 Záložný kód C2 PUT (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 Záložný kód C2 PUT (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 Záložný kód C2 PUT (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Zberateľ majákov
169[.]254[.]169[.]254/latest/... Čítanie poverení IMDSv2 (na strane cieľa, metadáta AWS)

Behaviorálne/súborové

Indikátor Úloha
"postinstall": "node postinstall.js" Inštalácia vektora
ecto_module: YAML s power_level / ship_deck / cargo_hold kľúče Schéma manifestu exfilu
Značky drezu ECT-472839, ECT-987654, ECT-654321, ECT-839201 Segment cesty C2 /api/modules/<marker>
isAppWorker() brána: hostiteľ /^[0-9a-f]{12}$/, cwd obsahuje /app/node_modules Aktivačná podmienka
aws secretsmanager list-secrets cez us-east-1, eu-west-1, eu-central-1 Výčet tajomstiev
HTB{...} zoškrabávanie regulárnych výrazov Zber úrody podľa pravidiel „Capture-the-flag“

Haše súborov (sha256, zaznamenané v čase analýzy)

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

Pripisovanie a pozorované správanie

Päť názvov balíkov bolo publikovaných pod dvoma identifikátormi účtov npm, ale zdieľajú dostatok infraštruktúry na to, aby sa s nimi zaobchádzalo ako s jedným klastrom: rovnakým ecto_module schéma manifestu, rovnaká ECT-472839 primárny marker drez, rovnaký webhook.site ID kolektora a koncové body C2 v tom istom Blok 154.57.164.0/24`. Balík semien (`coral-wraith, jednoduchšie a nezapojené) a zatvorená ektorodina sa teda čítajú skôr ako iterácie na jednej sade nástrojov než ako nezávislé úsilie.

Balíky sa v neskorších verziách opisujú ako „Úžitkové zaťaženie CTF pre testovanie dodávateľského reťazca Verdaccio.“ Toto označenie uvádzame ako pozorovateľný fakt a neopakujeme ho ako zistenie o účele. To, čo kód robí, je jednoznačné a nezávislé od toho, ako je označený: číta poverenia roly IAM zo služby metadát inštancie, vymenúva spravované tajné údaje v troch regiónoch AWS a prenáša výsledky na verejnú IP adresu a do zberača webhookov tretej strany. Skutočne testovací systém iba so spätnou slučkou by nepotreboval záložný zoznam verejných IP adries, čítanie poverení IMDS ani volania Správcu tajných údajov medzi regiónmi. Keďže výstupný a poverení dosahujú skutočné, uzavreté verzie boli klasifikované ako škodlivé.

Brána typu „kontajner-only“ je z prevádzkového hľadiska najvýznamnejšou vlastnosťou. Je to zároveň opatrenie na vyhýbanie sa – zostáva ticho na notebookoch a v analytických sandboxoch – a tiež opatrenie na zacielenie, ktoré sa spúšťa iba tam, kde je najpravdepodobnejšia prítomnosť skutočnej role IAM a živých tajomstiev. Analytici, ktorí spúšťajú tieto balíky v generickom sandboxe, by si nič nevšimli; toto správanie sa prejavuje iba pod názvom hostiteľa v štýle Docker a cestou inštalácie v kontajneri.

Dopad, trendy a usmernenia pre obhajcov

Ide o zverejnenie cloudových poverení a tajných údajov v rámci kontajnerov pre zostavenie a spustenie. Poverenie roly IAM získané z IMDS nesie všetky povolenia, ktoré táto rola má; správca_tajomstiev: Zoznam_tajomstiev (a akékoľvek následné ZískaťTajnúHodnotu) rozširuje to na uložené tajné údaje aplikácie. Výpisy premenných prostredia často obsahujú tokeny registra, adresy URL databázy a kľúče API. V kontexte CI alebo kontajnera – presne to, čo brána vyberá – stačí na únik tohto materiálu jediná tranzitívna inštalácia jedného z týchto balíkov.

Ectoplasm zodpovedá vzorcu, ktorý stále vidíme: užitočné zaťaženia v čase inštalácie, ktoré siahajú po cloudových metadátach a spravovaných tajných údajoch namiesto lokálnych súborov a ktoré sa samy aktivujú iba v prostrediach s vysokou hodnotou. Nasledujú dve obranné postrehy.

  • Tvar je detekovateľnýInštalačný hook npm/PyPI, ktorého graf volaní dosahuje API cloudových tajomstiev (správca tajomstiev AWS, tajomstvá gcloudu, trezor kľúčov AZ) alebo adresa IMDS a sieťový výstupný zdroj je úzky vzorec s vysokým signálom – takmer nikdy sa nevyskytuje v legitímnom skripte životného cyklu. Statická analýza prúdenia môžete to označiť bez závislosti od akejkoľvek konkrétnej domény alebo IP adresy.
  • Skalenie prostredia to otupuje. Vynucovanie IMDSv2 s limitom skokov 1 zabraňuje kontajnerovým pracovným záťažiam dosiahnuť metadáta inštancie; obmedzenie rolí IAM na najnižšie privilégiá obmedzuje polomer BLOCK akýchkoľvek poverení, ktoré unikajú; a spúšťanie inštalácií s –Ignorovať skripty v CI úplne odstráni vektor install-hook pre balíky, ktoré ho nepotrebujú.

Pre obrancov sú praktické kontroly nasledovné: upozornenie na odchádzajúce pripojenia z kontajnerov build/CI k verejným IP adresám, ktoré nie sú na zozname povolených, počas npm install; sledujte prístup k IMDS pochádzajúci zo skriptov životného cyklu balíkov; a považujte každý inštalačný hook, ktorý smeruje do cloudového CLI, za podozrivý, kým sa nepreukáže opak.

Dve ďalšie poznámky špecifické pre tento klaster. Po prvé, pretože aktivácia je obmedzená na kontajnerové prostredia, balík, ktorý sa pri overovaní na pracovnej stanici javí ako inertný, môže byť stále aktívny v produkcii – overovanie musí reprodukovať názov hostiteľa kontajnera a podmienky cesty alebo priamo prečítať zdrojový kód, namiesto toho, aby sa spoliehal na „Nainštaloval som ho a nič sa nestalo“. Po druhé, použitie verejnej služby kontroly požiadaviek ako zberača beaconov znamená, že niektoré z extrahovaných údajov môžu byť obnoviteľné pre reakciu na incident: organizácia, ktorá nájde jeden z týchto balíkov vo svojom strome závislostí, môže na základe logiky zberu užitočného zaťaženia uvažovať o tom, čo by úspešný beacon obsahoval, a mala by rotovať všetky poverenia role IAM, tokeny registra a spravované tajné údaje, ktoré boli dostupné z postihnutého prostredia zostavenia alebo runtime. Rotácia povereníOperatívnou nápravou po spustení inštalácie je , nie odstránenie balíka.

nástroje na analýzu zloženia softvéru SCA
Stanovte si priority, odstraňujte a zabezpečte svoje softvérové ​​riziká
Získajte svoj bezplatný účet.
Nie je potrebná kreditná karta.

Zabezpečte si vývoj a dodávku softvéru

s produktovým balíkom Xygeni