Ektoplasma npm installimine Hooks See varastab AWS-i volitusi

Ektoplasma: npm installimine hooks mis koguvad AWS-i volitusi ainult konteineripõhise päästiku tagant

TL; DR

Kobar viis npm paketti, avaldatud kahe konto kaudu, saatis välja postinstall konks, mis loeb hostilt pilve volikirju ja saadab need otse karbist välja. Paketid kannavad kummitus- ja piraatnimesid — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — ja serialiseerivad kõik, mida nad koguvad, võltsinguks ecto_module: YAML-i manifest enne selle edastamist. Jälgime klastri järgmiselt ectoplasm.

Kasulik koormus käivitub ainult siis, kui see tuvastab kindla keskkonna: hosti, mille nimi on 12-tähemärgiline heksateade ja töökataloog all /app/node_modules — konteineriseeritud ehituse või CI-töötaja kuju. Kui see värav läbib, küsib konks AWS-i eksemplari metaandmete teenus (IMDSv2) IAM-rolli volituste puhul loetleb AWS-i saladuste haldur kolmes piirkonnas, loob keskkonnamuutujate koopiaid, loeb faile alt /appja otsib lipu püüdmise stringe. Seejärel filtreerib see tulemuse kahel viisil: majakana a-le webhook.site koguja ja manifesti PUT toores IP-aadressiga lõpp-punktile koos localhost-first varuvariantide loendiga.

Hilisemates paketikirjeldustes seisab „CTF kasulik koormus Verdaccio tarneahela testimiseks“. Me esitame selle enesekirjelduse vaadeldava faktina. Käitumine ise – reaalajas väljumine avalikule IP-aadressile, päris IMDS-i mandaatide lugemised, päris Secrets Manageri kõned – on see, mis see on, olenemata sildist, ja see on põhjus, miks need versioonid pahatahtlikuks liigitati.

Üks nimi klastris, coral-wraith, ei piirdunud ühe väljalaskega. See avaldati kiiresti üksteise järel kümnete versioonidena mõne tunniga – 1.0.0 ronimine 6.0.0 — ja varasem samanimeline jooks oli kasutanud täispuhutud 9999.0.x versiooninumbrid, klassikaline kuju sõltuvuse-segaduse katseSelle käigus küpses kasulik koormus nähtavalt: ühekordsest hostiloenduse majakast täielikuks AWS-i mandaadi pöördepunktiks, mis on mähitud keskkonnakontrollidega, mis hoiavad selle kavandatud sihtmärgist väljaspool vaikselt.

Paketid 5 nime; coral-wraith üksi uuesti avaldatud kümnetes versioonides
Ökosüsteemi npm
Paigalda vektor postinstall elutsükli skript
Esmane sihtmärk AWS IAM rolli volikirjad + Secrets Manageri salajased väärtused, keskkonnamuutujad, /app failid
Exfil webhook.site majakas + toores IP C2 PUT
Päästikuvärav 12-kuubiksüsteemis hostinimi + /app/node_modules cwd, millele lisandub keskkonnakontroll, mis pärsib kontekstist väljaspool olevat kasulikku koormust
Tõsidus suur — pilvepõhise volikirja ja hallatud salajaste andmete avalikustamine konteinerdatud ehitus- ja käituskeskkonnad

Rünnaku anatoomia

Iga klastri pakett on ehitatud samamoodi: peaaegu tühi index.js (moodul.ekspordid = {}), üherealine pakett.json skript — „järelinstall”: „sõlm järelinstall.js” — ja kasulik koormus postinstall.jsKonksu käivitamiseks piisab paketi installimisest; importimist ega kutsumist pole vaja.

Sihtimisvärav. Enne kui midagi ette võtate, kontrollib ektoperekonna kasulik koorem oma ümbrust:

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

Docker määrab konteinerile vaikimisi 12-kuubikulise hostinime ja /rakendus/node_modules on tavapärane konteinerisisene installitee. Kolmas klausel tuleb välja, kui tee näeb välja nagu liivakastis olev ekstraktimiskataloog. Lõpptulemuseks on see, et kasulik koormus jääb arendaja sülearvutisse või analüüsi liivakasti ja aktiveerub ainult konteinerdatud ehitus- või käituskeskkonnas – keskkonnas, kus on kõige tõenäolisemalt reaalajas pilveandmeid. Klastri varaseim pakett korallide-vaimu, ei oma sellist väravat ja käitab oma (lihtsama) kogumit tingimusteta.

kogumineKui värav möödub, avaneb konks. execFileSync("/bin/sh", ["-c", …]) ja käivitab ühe liitkäsu, mis järgmises järjekorras:

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)

Sammud 1–3 on õpiku IMDSv2 hankimise moodi: taotlege seansi tunnust ja seejärel lisage see X-aws-ec2-metadata-token päis eksemplari IAM-rolli ja selle rolli ajutiste juurdepääsuvõtmete hankimiseks. Valik rakendada IMDSv2 lihtsama autentimata IMDSv1 asemel GET väärib märkimist — see tähendab, et kasulik koormus töötab isegi eksemplaridel, mis on konfigureeritud nõudma token-põhist metaandmete juurdepääsu, mis on AWS-i soovitatud kaitse. 3. etapis tagastatud volitused on lühiajalised. JuurdepääsuvõtmeId/Salajane juurdepääsuvõti/Sümboolne kolmikud, mis on piiratud eksemplari rolliga; mida iganes see roll teha saab, saab nende võtmete omanik teha kogu volituse eluea jooksul.

Sammud 4–6 laiendavad vaadet. env prügimägi jäädvustab kõik, mille ehitus- või käitusprotsess päris – praktikas asuvad siin enamasti registritokenid, andmebaasiühenduse stringid ja API-võtmed. / rakendus failikäik loeb kuni viisteist rakenduse faili väljaspool sõlme_moodulid, mis võib pinna konfiguratsiooni muuta, .env failid või allikas. 6. samm kutsub esile aws secretsmanager loendi-saladused kolmes piirkonnas; etappides 1–3 hangitud volitused on täpselt need, mis neid kõnesid autentivad, seega IMDS-i lugemine ja saladuste halduri loendamisahel ühendatakse üheks eskalatsiooniks: eksemplari roll → hallatavate salajaste andmete inventuur. 7. etapp on viide lipu püüdmise raamistikule – kui HTB{…} Kui lipp leitakse, saadetakse see eraldi, vastasel juhul jagatakse kogutud toorfail neljaks tükiks ja saadetakse ära.

Klastri hilisemad versioonid viivad eskalatsiooni edasi. Inventuuri asemel parsivad nad IMDS-vastust, ekspordivad ajutised võtmed kujul AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN keskkonnamuutujatega, kinnitage identiteet aws sts get-caller-identityja seejärel tsükliga läbi iga tagastatud saladuse loendisaladused kutsudes aws secretsmanager get-salajane-väärtus igaühe kohta — hankides salajase sisu, mitte ainult nende nimesid. Samad versioonid loevad ka protsessiga asendatud lipubinaarfaile (/lugemislipp ja sõbrad) ja proovige a laadimisjooks mis tahes Rust projekti vastu, mis leitakse alt / rakendus, laiendades saagikoristust pilvepõhistest volitustest kõigele, mida ehituskeskkond pakub.

Need hilisemad versioonid lüüsivad end ka agressiivsemalt. Lisaks 12-kuubikulisele hostinimele ja /rakendus/node_modules Kontrollide käigus kontrollib kasulik koormus aktiivset paketiregistri konfiguratsiooni ja töökataloogi teed ning väljub vaikselt, kui need viitavad analüüsi- või peegelduskontekstile, mitte aktiivsele sihtmärgile. Kombineeritud efekt on kasulik koormus, mis enamikus kontrollikeskkondades midagi jälgitavat ei tee ja käivitab kogu oma kollektsiooni ainult siis, kui see hindab end olevat ehtsal konteinerdatud hostil.

Välja filtreerimineKogutud andmed lahkuvad hostist kahel kanalil. Esiteks, majakas POST fikseeritud webhook.site koguja, mis sisaldab hostinime, numbrilist UID-d, töökataloogi ja kuni 120 KB kogutud andmeid. Teiseks volditakse andmed võltsitud YAML-i „mooduli manifesti“ ja PUT et /api/moodulid/ sihtserveris:

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

Manifesti väljade nimed (võimsustase, laevatekk, lastiruum) on dekoratiivsed – varastatud andmed paiknevad stringiväärtuste sees, mistõttu võrgumonitor näeb pigem healoomulise paketiregistri manifesti üleslaadimist kui ilmselget andmeväljavõtet. Majakakanal kannab edasi enamat: POST keha kuni webhook.site sisaldab hostinime, numbrilist UID-d, töökataloogi ja kuni 120 KB kogutud blobist, seega annab isegi üks edukas majakas täieliku ülevaate. webhook.site on tasuta päringute kontrollimise teenus; selle kasutamine kogujana tähendab, et operaator ei pea selle kanali jaoks kunagi oma vastuvõtuinfrastruktuuri looma ning salvestatud päringud jäävad teenuse prügikasti.

Manifest PUT käib läbi varunimekirja, mis algab mitmega 127.0.0.1/localhost pordid ja seejärel langeb see kolmele avalikule aadressile `154.57.164.0/24` vahemik, peatudes esimese lõpp-punkti juures, mis vastab olekuga 2xx. Localhost-first järjestus on kooskõlas „verdaccio testimise” enesekirjeldusega (kohalik register loopbackil), kuid avaliku IP varuvalikud tähendavad, et andmed lahkuvad hostist alati, kui loopback ei kuula – see tähendab mis tahes masinal, mis ei ole autori enda testimisseade.

Timeline

Klaster näitab pigem võimekuse järkjärgulist kasvu kui ühekordset langust. Järjestame selle vaadeldava käitumise, mitte avaldatud seinakella järgi:

Stage Paketid / Versioonid Käitumine
Varajane jooks coral-wraith 9999.0.x Paisutatud versiooninumbrid, mis on kooskõlas sõltuvuse segiajamise katsega; installimise ajal loendatud ja exfil
Seeme coral-wraith 1.0.0 pärast installimist kogub id/env/flag failid; üks PUT-käsk 154[.]57[.]164[.]71:30782, marker ECT-472839
Kiire iteratsioon coral-wraith 1.0.1 → 6.0.0 Kümneid väljalaseid tundide jooksul; kasulik koormus suureneb isAppWorker() värav, IMDSv2 volituste tõmme, täielik get-secret-value pivot, registri/tee keskkonna kontroll ja kahekordsed neeldumismarkerid
Paralleelsed nimed ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Sama suletud kasulik koormus; webhook.site majaka ja mitme lõpp-punkti varuloend
variante ecto-rust-read-f3a9c1 1.0.1–1.0.2 Lisab täiendavaid valamu markereid ECT-987654, ECT-654321, ECT-839201
variante ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Sama vändatud kasulik koormus, sama C2 ja majakas

Klastri iseloomulikuks tunnuseks on avaldamise rütm: ühe paketi ja ühe versiooni asemel avaldatakse sama nime ikka ja jälle kiirelt järjest, kusjuures iga väljalase on eelmisest väike variatsioon, lisaks käputäis erineva nimega õdesid-vendi, millel on sama kasulik koormus. sosin perekonnas jagunes kood kaheks sarnaseks sõrmejäljeks – üks komplekt käivitas kaks kriitilist tuvastust, teine ​​kolm (täiendav faili lugemise neel) –, kuid mõlemad lahendasid sama kasuliku koormuse; erinevus seisneb koodi triivis, mitte käitumuslikus hargnemises. Versioonid sosin registris täheldati reaalajas analüüsitud vahemikust väljaspool (kirjutamise ajal vähemalt 1.0.25) olevaid väärtusi ja korallide-vaimu nimi ronis sama akna kaudu oma versiooniredelil edasi.

Kompromissi näitajad

Kõik allolevad indikaatorid on võetud kettalt paketi lähtekoodist. Võrguindikaatorid on tangidest puhastatud.

võrk

Indikaator Roll
hxxp://154[.]57[.]164[.]71:30782 C2 PUT-sihtmärk (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT varuvõimalus (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT varuvõimalus (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT varuvõimalus (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Majakakoguja
169[.]254[.]169[.]254/latest/... IMDSv2 mandaadi lugemine (sihtkoha pool, AWS metaandmed)

Käitumuslik/fail

Indikaator Roll
"postinstall": "node postinstall.js" Paigalda vektor
ecto_module: YAML koos power_level / ship_deck / cargo_hold võtmed Exfili manifesti skeem
Valamu markerid ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 raja lõik /api/modules/<marker>
isAppWorker() värav: host /^[0-9a-f]{12}$/, cwd sisaldab /app/node_modules Aktiveerimistingimus
aws secretsmanager list-secrets üle us-east-1, eu-west-1, eu-central-1 Saladuste loendamine
HTB{...} regulaaravaldise kraapimine Lipu püüdmise saak

Faili räsiväärtused (sha256, jäädvustatud analüüsi ajal)

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

Omistamine ja täheldatud käitumine

Viis paketinime avaldati kahe npm-konto käepideme all, kuid neil on piisavalt ühist infrastruktuuri, et neid käsitleda ühe klastrina: sama ektomoodul manifesti skeem, sama ECT-472839 esmane valamu marker, sama webhook.site koguja ID ja C2 lõpp-punktid samas 154.57.164.0/24` plokk. Seemnepakett (`coral-wraith, lihtsam ja piiramata) ja seega tõlgendatakse piiratud ektoperekonda pigem ühe tööriistakomplekti iteratsioonidena kui iseseisvate pingutustena.

Paketid kirjeldavad end hilisemates versioonides järgmiselt „CTF-i kasulik koormus Verdaccio tarneahela testimiseks.“ Me toome selle sildi esile vaadeldava faktina ega korda seda eesmärgiotsusena. Koodi tegevus on üheselt mõistetav ja sõltumatu sellest, kuidas see on märgistatud: see loeb IAM-rolli mandaate eksemplari metaandmete teenusest, loetleb hallatavaid saladusi kolme AWS-i piirkonna vahel ning edastab tulemused avalikule IP-aadressile ja kolmanda osapoole veebikonksu kogujale. Tõeliselt ainult tagasihelistamise põhimõttel töötav testimissüsteem ei vajaks avaliku IP-aadressi varuloendit, IMDS-i mandaatide lugemist ega piirkondadevahelisi saladuste halduri kutseid. Kuna väljuv ja mandaatide ulatus on reaalsed, liigitati suletud versioonid pahatahtlikuks.

Ainult konteinerile suunatud värav on operatiivselt kõige märkimisväärsem omadus. See on nii kõrvalehoidumismeede – sülearvutites ja analüüsi liivakastides vaikimine – kui ka sihtimismeede, mis käivitab ainult seal, kus on kõige tõenäolisemalt olemas reaalne IAM-roll ja reaalajas saladused. Analüütikud, kes käitavad neid pakette üldises liivakastis, ei märkaks midagi; käitumine avaldub ainult Dockeri-stiilis hostinime ja konteinerisisese installitee all.

Mõju, trendid ja juhised kaitsjatele

Siinne avalikustamine hõlmab pilvepõhiseid volitusi ja salastatud teabe avalikustamist ehitus- ja käitusaja konteinerites. IMDS-ist hangitud IAM-rolli volitus sisaldab kõiki õigusi, mis sellel rollil on; saladustehaldur:Saladuste loend (ja kõik järelmeetmed GetSecretValue) laiendab seda salvestatud rakenduse saladustele. Keskkonnamuutujate prügimäed sisaldavad sageli registritokeneid, andmebaasi URL-e ja API-võtmeid. CI või konteineri kontekstis – täpselt selle jaoks, milleks värav valib – piisab ühe sellise paketi ühest transitiivsest installimisest selle materjali lekkimiseks.

Ektoplasma sobib mustriga, mida me jätkuvalt näeme: installimise ajal tekkivad koormused haaravad pigem pilve metaandmeid ja hallatavaid saladusi kui kohalikke faile ning aktiveeruvad ainult väärtuslikes keskkondades. Järgnevad kaks kaitsemärkust.

  • Kuju on tuvastatav. npm/PyPI installikonks, mille kõnegraaf jõuab nii pilvesaladuste API-ni (AWS-i saladuste haldur, gcloudi saladused, az-võtmehoidla) või IMDS-aadress ja võrgu väljundpesa on kitsas, suure signaaliga muster – seda ei esine peaaegu kunagi legitiimses elutsükli skriptis. Staatiline vooluanalüüs saab selle märgistada ilma konkreetsest domeenist või IP-aadressist sõltumata.
  • Keskkonna karastamine tuimestab seda. IMDSv2 jõustamine hüppepiiranguga 1 takistab konteineri töökoormustel jõuda eksemplari metaandmeteni; IAM-rollide piiramine minimaalsete õiguste piiresse piirab lekkivate volituste levikuraadiust; ja installide käivitamine – Ignoreeri-skripte CI-s eemaldab installikonksu vektori täielikult pakettidelt, mis seda ei vaja.

Kaitsjate jaoks on praktilised kontrollid järgmised: hoiatused väljaminevate ühenduste kohta ehitus-/CI-konteineritest lubatud loendisse mittekuuluvatele avalikele IP-aadressidele npm installi; jälgige paketi elutsükli skriptidest pärinevat IMDS-i juurdepääsu; ja käsitlege iga pilvepõhisele käsureale suunatud installikonksu kahtlasena, kuni pole tõestatud vastupidist.

Kaks täiendavat märkust selle klastri kohta. Esiteks, kuna aktiveerimine on piiratud konteinerkeskkondadega, saab tööjaamas kontrollimisel inertsena tunduv pakett siiski tootmises olla – kontrollimiseks on vaja konteineri hostinime ja tee tingimusi reprodutseerida või otse lähtekoodi lugeda, selle asemel et loota väitele „Ma installisin selle ja midagi ei juhtunud“. Teiseks tähendab avaliku päringute kontrollimise teenuse kasutamine majakakogujana seda, et osa filtreeritud andmetest võib olla intsidendile reageerimiseks taastatav: organisatsioon, mis leiab oma sõltuvuspuust ühe sellise paketi, saab arvutada, mida edukas majakas oleks sisaldanud, lähtudes kasuliku koormuse kogumisloogikast, ning peaks vahetama kõik IAM-rolli mandaadid, registritokenid ja hallatavad saladused, millele oli juurdepääs mõjutatud ehitus- või käituskeskkonnast. Volituste rotatsioon, mitte paketi eemaldamine, on operatiivne parandus pärast installi käivitamist.

sca-tööriistad-tarkvara-kompositsiooni-analüüsi-tööriistad
Tarkvarariskide prioriseerimine, leevendamine ja turvamine
Hankige oma tasuta konto.
Krediitkaarti pole vaja.

Turvaline tarkvaraarendus ja -tarne

Xygeni tootekomplektiga