TL; DR
Usa ka pungpong sa lima ka npm nga pakete, gipatik sa duha ka account handle, nagpadala og postinstall hook nga nagbasa sa mga kredensyal sa cloud gikan sa host ug nagpadala niini gikan sa kahon. Ang mga pakete nagdala og mga ngalan nga ghost-and-pirate — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — ug i-serialize ang bisan unsa nga ilang gikolekta ngadto sa peke ecto_module: Ang YAML manifest sa dili pa kini ipadala. Atong gisubay ang cluster isip Ektoplasma.
Ang payload modagan lang kung makamatikod kini og usa ka piho nga palibot: usa ka host kansang ngalan kay usa ka 12-ka-karakter nga hex string ug usa ka working directory ubos sa /app/node_modules — ang porma sa usa ka containerized build o CI worker. Kung moagi kana nga gate, ang kaw-it mangutana sa Serbisyo sa metadata sa AWS instance (IMDSv2) para sa mga kredensyal sa papel sa IAM, gilista Tigdumala sa mga Sekreto sa AWS sa tulo ka rehiyon, naglabay sa mga variable sa palibot, nagbasa sa mga file ubos sa /app, ug mga scrape para sa mga kuwerdas sa pagdakop sa bandila. Dayon kini mopagawas sa resulta sa duha ka paagi: usa ka beacon ngadto sa usa ka webhook.site collector ug usa ka manifest nga PUT ngadto sa usa ka raw-IP endpoint, nga adunay lista sa localhost-first fallbacks.
Ang ulahing mga deskripsyon sa pakete nagbasa og "CTF payload para sa verdaccio supply-chain testing." Among gitaho kana nga paghulagway sa kaugalingon isip usa ka makita nga kamatuoran. Ang kinaiya mismo — live egress ngadto sa usa ka public IP, tinuod nga IMDS credential reads, tinuod nga Secrets Manager calls — mao kini bisan unsa pa ang label, ug mao kini ang hinungdan nga kini nga mga bersyon giklasipikar nga malisyoso.
Usa ka ngalan sa pundok, coral-wraith, wala mohunong sa usa ka pagpagawas. Kini gipatik pag-usab sa paspas nga sunod-sunod nga mga bersyon sulod lang sa pipila ka oras — 1.0.0 pagsaka ngadto sa 6.0.0 — ug ang naunang paggamit sa parehas nga ngalan migamit og inflated 9999.0.x mga numero sa bersyon, ang klasiko nga porma sa usa ka pagsulay sa pagsalig-kalibog. Sa ingon niana, ang payload klaro nga nahinog na: gikan sa usa ka one-shot host-enumeration beacon ngadto sa usa ka kompleto nga AWS credential pivot nga giputos sa mga environment check nga nagpahilom niini gawas sa gituyo nga target niini.
| packages | 5 ka ngalan; coral-wraith nga nag-inusarang gimantala pag-usab sa dose-dosenang mga bersyon |
| Ecosystem | npm |
| I-install ang vector | postinstall iskrip sa siklo sa kinabuhi |
| Pangunang target | Mga kredensyal sa papel sa AWS IAM + Mga sekreto nga kantidad sa Secrets Manager, mga variable sa palibot, /app file |
| Exfil | webhook.site beacon + raw-IP C2 PUT |
| Ganghaan sa gatilyo | 12-hex nga ngalan sa host + /app/node_modules cwd, dugang usa ka pagsusi sa palibot nga nagpugong sa payload sa gawas sa maong konteksto |
| Kalisud | hatag-as nga — kredensyal sa panganod ug gidumala nga sekreto nga pagbutyag gikan sa mga containerized nga build ug runtime environment |
Anatomiya sa pag-atake
Ang matag pakete sa cluster gitukod sa parehas nga paagi: usa ka hapit walay sulod index.js (module.exports = {}), usa ka linya package.json iskrip — "postinstall": "node postinstall.js" — ug ang kargamento sa postinstall.jsAng pag-instalar sa pakete igo na aron mapadagan ang hook; dili na kinahanglan ang import o call.
Ang ganghaan sa pag-target. Sa dili pa mobuhat og bisan unsa, ang ecto-family payload mosusi sa palibot niini:
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 Ang 12-hex hostname mao ang default nga porma nga gi-assign sa Docker sa usa ka container, ug /app/node_modules usa ka naandan nga in-container install path. Ang ikatulong clause mo-bail out kon ang path morag sandboxed extraction directory. Ang net effect mao nga ang payload magpabilin nga dormant sa usa ka developer laptop o usa ka analysis sandbox ug mo-activate lang sulod sa usa ka containerized build o runtime worker — ang klase sa environment nga lagmit magdala og live cloud credentials. Ang pinakaunang package sa cluster, korales nga multo, walay ingon nga ganghaan ug gipadagan ang (mas simple) nga koleksyon niini nga walay kondisyon.
collection. Inig-agi sa ganghaan, ang kaw-it mogawas agi sa execFileSync(“/bin/sh”, [“-c”, …]) ug modagan og usa ka compound command nga, sa han-ay:
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) Ang mga lakang 1–3 usa ka pagkuha sa IMDSv2 sa libro: pangayo og session token, dayon i-attach kini isip Token sa X-aws-ec2-metadata header aron makuha ang IAM role sa instance ug ang temporaryo nga access keys sa maong role. Ang pagpili nga ipatuman ang IMDSv2 imbes sa mas simple nga wala gi-authenticate nga IMDSv1 GET angayan nga matikdan — kini nagpasabot nga ang payload mogana bisan sa mga instance nga gi-configure aron manginahanglan og token-based metadata access, nga mao ang AWS-recommended hardening. Ang mga credential nga gibalik sa step 3 dili magdugay. AccessKeyId/SekretoAccessKey/Token mga triple nga gisakup sa papel sa instance; bisan unsa ang mahimo sa maong papel, mahimo sa naghupot niadtong mga yawe sa tibuok kinabuhi sa kredensyal.
Ang mga lakang 4–6 mopalapad sa agianan. Ang env Ang dump mokuha sa bisan unsa nga napanunod sa proseso sa pagtukod o runtime — sa praktis dinhi kasagaran nagpuyo ang mga token sa registry, mga string sa koneksyon sa database, ug mga yawe sa API. / app Ang file walk mobasa hangtod sa kinse ka application files sa gawas node_modules, nga mahimong mo-configurate sa ibabaw, .env mga file, o tinubdan. Mga tawag sa Lakang 6 aws secretsmanager list-secrets sa tulo ka rehiyon; ang mga kredensyal nga nakuha sa mga lakang 1–3 mao gyud ang nag-authenticate niadtong mga tawag, mao nga ang IMDS nagbasa ug ang Secrets Manager enumeration chain gihiusa ngadto sa usa ka escalation: instance role → managed-secret inventory. Ang Lakang 7 usa ka pag-uyon sa capture-the-flag framing — kung ang usa ka HTB{…} Kon makit-an ang bandila, kini ipadala sa iyang kaugalingon, kon dili, ang hilaw nga nakolekta nga blob bahinon sa upat ka piraso ug ipadala.
Ang mas bag-ong mga bersyon sa cluster nagdala sa escalation sa dugang nga paagi. Imbis nga mohunong sa usa ka imbentaryo, ilang gi-parse ang tubag sa IMDS, gi-export ang temporaryo nga mga yawe isip AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN mga variable sa palibot, kumpirmahi ang identidad gamit ang aws sts pagkuha-sa-identidad-sa-tigtawag, ug dayon balik-balika ang matag sekreto nga gibalik ni mga sekreto sa lista gitawag aws secretsmanager kuha-og-sekreto-nga-bili sa matag usa — pagkuha sa sekreto nga mga sulod, dili lang ang ilang mga ngalan. Ang parehas nga mga bersyon nagbasa usab sa mga binary sa flag nga gipulihan sa proseso (/readflag ug mga higala) ug mosulay og pagdagan sa kargamento batok sa bisan unsang proyekto sa Rust nga nakit-an ubos sa / app, pagpalapad sa ani lapas sa mga kredensyal sa panganod ngadto sa bisan unsa nga gibutyag sa palibot sa pagtukod.
Kini nga mga bag-ong bersyon mas agresibo usab nga nag-gate sa ilang kaugalingon. Gawas pa sa 12-hex-hostname ug /app/node_modules Kon susihon, ang payload mo-inspeksyon sa aktibong package-registry configuration ug sa working-directory path ug mogawas nga hilom kon kini magpakita og analysis o mirror context imbes nga live target. Ang hiniusa nga epekto usa ka payload nga walay gibuhat nga maobserbahan sa kadaghanan sa mga inspection environment ug modagan sa tibuok nga koleksyon niini kon kini mohukom sa iyang kaugalingon nga anaa sa usa ka tinuod nga containerized host.
ExfiltrationAng nakolekta nga datos mobiya sa host sa duha ka channel. Una, usa ka beacon POST ngadto sa usa ka gitakdang webhook.site kolektor, nga nagdala sa hostname, numeric UID, working directory, ug hangtod sa 120 KB nga nakolekta nga datos. Ikaduha, ang datos gipilo ngadto sa usa ka peke nga YAML nga "module manifest" ug ibutang sa /api/mga modyul/ sa usa ka target nga server:
ecto_module: name: "<flag-or-chunk-0>" version: "1.0.0" power_level: "<chunk-1>" ship_deck: "<chunk-2>" cargo_hold: "<chunk-3>" Ang mga ngalan sa manifest field (lebel sa gahum, kubyerta sa barko, cargo_hold) kay dekorasyon — ang gikawat nga datos mosakay sulod sa mga kantidad sa string, mao nga ang usa ka network monitor makakita og morag dili makadaot nga package-registry manifest upload imbes nga usa ka klaro nga data dump. Ang beacon channel nagdala og dugang: ang POST lawas ngadto sa webhook.site naglakip sa hostname, numeric UID, working directory, ug hangtod sa 120 KB sa nakolekta nga blob, busa bisan ang usa ka malampuson nga beacon makahatag sa tibuok nga pagkuha. webhook.site usa ka libre nga serbisyo sa pag-inspeksyon sa hangyo; ang paggamit niini isip usa ka kolektor nagpasabot nga ang operator dili na kinahanglan nga mobarog sa ilang kaugalingong imprastraktura sa pagdawat alang niana nga channel, ug ang narekord nga mga hangyo magpabilin sa bin sa serbisyo.
Ang manifesto ibutang naglakaw sa usa ka fallback list nga nagsugod sa pipila 127.0.0.1/localhost mga pantalan ug dayon mahulog ngadto sa tulo ka publikong adres sa `154.57.164.0/24` range, mohunong sa unang endpoint nga motubag nga adunay 2xx status. Ang localhost-first ordering nahiuyon sa "verdaccio testing" self-description (usa ka local registry sa loopback), apan ang public-IP fallbacks nagpasabot nga ang data mobiya sa host bisan kanus-a ang loopback dili maminaw — nga sa ato pa, sa bisan unsang makina nga dili kaugalingong test rig sa awtor.
Timeline
Ang cluster nagpakita og hinay-hinay nga pagtubo sa kapabilidad imbes nga usa ka pag-ubos. Atong gihan-ay kini pinaagi sa naobserbahan nga pamatasan, dili pinaagi sa pagmantala sa orasan sa dingding:
| stage | Mga Pakete / Bersyon | Paggawi |
|---|---|---|
| Sayo nga pagdagan | coral-wraith 9999.0.x | Gipaburot nga mga numero sa bersyon nga nahiuyon sa usa ka pagsulay sa dependency-confusion; pag-ihap sa oras sa pag-install ug exfil |
| Binhi | coral-wraith 1.0.0 | Ang postinstall mokolekta og id/env/flag files; single PUT to 154[.]57[.]164[.]71:30782, marka ECT-472839 |
| Paspas nga pag-uli | coral-wraith 1.0.1 → 6.0.0 | Dosena ka mga pagpagawas sulod sa mga oras; ang payload makakuha sa isAppWorker() ganghaan, IMDSv2 credential pull, ang bug-os get-secret-value pivot, ang pagsusi sa palibot sa registry/path, ug mga dual sink marker |
| Mga ngalan nga parehas | ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 | Parehas nga gated payload; webhook.site lista sa beacon ug multi-endpoint fallback |
| variants | ecto-rust-read-f3a9c1 1.0.1–1.0.2 | Nagdugang og dugang nga mga marker sa lababo ECT-987654, ECT-654321, ECT-839201 |
| variants | ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 | Parehas nga gated payload, parehas nga C2 ug beacon |
Ang nag-unang kinaiya sa cluster mao ang ritmo sa pagmantala niini: imbes nga usa ka pakete ug usa ka bersyon, ang parehas nga ngalan gimantala pag-usab sa sunod-sunod nga sunod-sunod, ang matag usa nagpagawas ug gamay nga kalainan sa naulahi, uban sa pipila ka managsoon nga lainlain ang ngalan nga nagdala sa parehas nga kargamento. Sulod sa paghunghong pamilya ang code nabahin sa duha ka close fingerprints — usa ka set nga nag-tripping sa duha ka kritikal nga detection, laing tulo (usa ka dugang nga file-read sink) — apan pareho silang nag-resolve sa parehas nga payload; ang kalainan mao ang code drift, dili usa ka behavioral fork. Mga Bersyon sa paghunghong lapas sa gisusi nga range (hangtod sa labing menos 1.0.25 sa panahon sa pagsulat) naobserbahan nga live sa registry, ug ang korales nga multo ang ngalan nagpadayon sa pagsaka sa kaugalingon niining hagdanan sa bersyon latas sa samang bintana.
Mga timailhan sa kompromiso
Ang tanang mga indikasyon sa ubos gikuha gikan sa tinubdan sa pakete sa disk. Ang mga indikasyon sa network wala na gamita.
network
| timailhan | papel |
|---|---|
hxxp://154[.]57[.]164[.]71:30782 | Target sa C2 PUT (coral-wraith) |
hxxp://154[.]57[.]164[.]80:30543 | C2 PUT nga fallback (ecto-*) |
hxxp://154[.]57[.]164[.]82:31250 | C2 PUT nga fallback (ecto-*) |
hxxp://154[.]57[.]164[.]71:31289 | C2 PUT nga fallback (ecto-*) |
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 | Tigkolekta og suga |
169[.]254[.]169[.]254/latest/... | Pagbasa sa kredensyal sa IMDSv2 (target-side, AWS metadata) |
Papel/panggawi
| timailhan | papel |
|---|---|
"postinstall": "node postinstall.js" | I-install ang vector |
ecto_module: YAML uban sa power_level / ship_deck / cargo_hold mga yawe | Eskema sa manifest sa Exfil |
Mga marker sa lababo ECT-472839, ECT-987654, ECT-654321, ECT-839201 | Bahin sa agianan sa C2 /api/modules/<marker> |
isAppWorker() ganghaan: tagbalay /^[0-9a-f]{12}$/, ang cwd adunay sulod /app/node_modules | Kondisyon sa pagpaaktibo |
aws secretsmanager list-secrets sa ibabaw sa us-east-1, eu-west-1, eu-central-1 | Pag-ihap sa mga sekreto |
HTB{...} regex scrape | Pag-ani sa pagdakop sa bandila |
Mga hash sa file (sha256, nakuha sa oras sa pag-analisar)
| file | sha256 |
|---|---|
coral-wraith/postinstall.js | ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824 |
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js | b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3 |
Pag-ila ug naobserbahan nga pamatasan
Ang lima ka ngalan sa pakete gipatik ubos sa duha ka npm account handles, apan parehas sila og imprastraktura aron matratar kini isip usa ka cluster: parehas ra. ecto_module eskema sa manifest, parehas ra ECT-472839 pangunang marker sa lababo, parehas ra webhook.site collector ID, ug C2 endpoints sa parehas nga 154.57.164.0/24` nga bloke. Ang pakete sa liso (`coral-wraith, mas simple ug walay gate) ug ang gated ecto-family busa mabasa isip mga iterasyon sa usa ka toolkit imbes nga independente nga mga paningkamot.
Ang mga pakete naghulagway sa ilang kaugalingon, sa mas bag-ong mga bersyon, isip “CTF payload para sa pagsulay sa supply-chain sa verdaccio.” Among gipakita kana nga label isip usa ka makita nga kamatuoran ug wala kini gisubli isip usa ka nakaplagan bahin sa katuyoan. Ang gibuhat sa code klaro ug independente kung giunsa kini pag-label: gibasa niini ang mga kredensyal sa papel sa IAM gikan sa serbisyo sa metadata sa instance, gilista ang mga gidumala nga mga sekreto sa tulo ka rehiyon sa AWS, ug gipadala ang mga resulta ngadto sa usa ka publikong IP ug usa ka third-party nga webhook collector. Ang usa ka tinuod nga loopback-only test harness dili magkinahanglan sa public-IP fallback list, ang mga pagbasa sa kredensyal sa IMDS, o ang mga tawag sa cross-region Secrets Manager. Tungod kay ang egress ug credential reach tinuod, ang mga gated nga bersyon giklasipikar nga malisyoso.
Ang container-only gate mao ang labing nailhan sa operasyon. Kini usa ka lakang sa paglikay — pagpahilom sa mga laptop ug sa mga analysis sandbox — ug usa ka lakang sa pag-target, nga nagpadagan lamang kung diin ang usa ka tinuod nga papel sa IAM ug mga live nga sekreto lagmit nga naa. Ang mga analista nga nagpadagan niini nga mga pakete sa usa ka generic sandbox dili makamatikod bisan unsa; ang pamatasan makita lamang ubos sa usa ka Docker-style hostname ug usa ka in-container install path.
Epekto, mga uso ug giya para sa mga tigpanalipod
Ang exposure dinhi mao ang cloud-credential ug secret disclosure sulod sa build ug runtime containers. Ang IAM role credential nga gikuha gikan sa IMDS nagdala sa bisan unsang permiso nga anaa sa maong role; secretsmanager:ListSecrets (ug bisan unsang sunod nga Kuhaa ang Sekreto nga Bili) nagpalapad niana ngadto sa gitipigan nga mga sekreto sa aplikasyon. Ang mga environment-variable dumps kanunay nga nagdala og mga registry token, database URL, ug API key. Sa konteksto sa CI o container — eksakto kung unsa ang gipili sa gate — ang usa ka transitive install sa usa niini nga mga pakete igo na aron mogawas ang maong materyal.
Ang Ectoplasm mohaom sa usa ka sumbanan nga padayon natong nakita: mga payload sa panahon sa pag-install nga mokuha sa metadata sa cloud ug mga gidumala nga sekreto imbes nga mga lokal nga file, ug nga mo-gate sa ilang kaugalingon aron mo-fire lamang sa mga palibot nga taas og bili. Duha ka depensiba nga obserbasyon ang mosunod.
- Makita ang pormaUsa ka npm/PyPI install hook kansang call graph moabot sa usa ka cloud secrets API (aws secretsmanager, mga sekreto sa gcloud, az keyvault) o ang IMDS address ug ang network egress sink usa ka pig-ot, taas nga signal pattern — halos dili kini mahitabo sa usa ka lehitimong lifecycle script. Pag-analisar sa estatikong pag-agos mahimo kining i-flag nga dili magdepende sa bisan unsang piho nga domain o IP.
- Ang pagtig-a sa palibot makapahinay niini. Ang pagpatuman sa IMDSv2 nga adunay hop limit nga 1 makapugong sa mga workload sa container nga makaabot sa metadata sa instance; ang pag-scoping sa mga IAM roles ngadto sa least privilege naglimite sa blast radius sa bisan unsang credential nga mo-leak; ug pagpadagan sa mga install gamit ang –ignore-scripts sa CI, hingpit nga gitangtang ang install-hook vector para sa mga pakete nga wala magkinahanglan niini.
Para sa mga tigpanalipod, ang praktikal nga mga pagsusi mao ang: alerto sa mga outbound nga koneksyon gikan sa mga build/CI container ngadto sa mga non-allowlisted nga pampublikong IP atol sa npm pag-instalar; bantayi ang IMDS access nga gikan sa mga package lifecycle script; ug isipa ang bisan unsang install hook nga mo-expose sa usa ka cloud CLI isip kadudahan hangtod nga mapamatud-an nga dili.
Duha pa ka dugang nga mga nota nga espesipiko niining cluster. Una, tungod kay ang activation gi-gated sa mga containerized environment, ang usa ka package nga daw inert kung gi-vet sa usa ka workstation mahimo gihapon nga live sa production — ang vetting kinahanglan nga kopyahon ang container hostname ug path conditions, o basahon direkta ang source, imbes nga mosalig sa "Gi-install nako kini ug walay nahitabo." Ikaduha, ang paggamit sa usa ka public request-inspection service isip beacon collector nagpasabot nga ang pipila sa exfiltrated data mahimong mabawi alang sa incident response: ang usa ka organisasyon nga makakita sa usa niini nga mga package sa dependency tree niini mahimong mangatarungan mahitungod sa kung unsa ang sulod sa usa ka malampuson nga beacon gikan sa collection logic sa payload, ug kinahanglan nga i-rotate ang bisan unsang IAM role credentials, registry tokens, ug managed secrets nga maabot gikan sa apektadong build o runtime environment. Pag-rotate sa kredensyal, dili ang pagtangtang sa pakete, mao ang operasyonal nga remediation kung nahuman na og padagan ang instalasyon.





