Lt; DR
Vienas npm operatorius šešias savaites publikavo netikrus „TypeScript“ „įrankių“ paketus, tokius kaip ts-form-utils, ts-project-lintir ts-enum-helper.
Nors paketai pateikia nedidelius, teisėtai atrodančius patvirtinimo pagalbininkus, tikrasis naudingasis failas paleidžiamas diegimo metu arba pirmą kartą pareikalavus ir atlieka pagrindinio kompiuterio pirštų atspaudų nuskaitymą, „GitHub“ organizacijos aptikimą, saugyklos klonavimą ir šaltinio kodo išfiltravimą.
Kenkėjiška programa specialiai nukreipta į didelės vertės „GitHub“ organizacijas, įskaitant kelias Shopify saugyklas, tada archyvuoja ir išfiltruoja pasiekiamus šaltinio medžius į centralizuotą kolekcijos galinį tašką.
Kaip kompromisinio darbo eigos dalis, naudingoji apkrova commitsa failą atgal į aukų saugyklas, apsimetant „Google“ autonomine kodavimo tapatybe google-labs-jules[bot].
Mes sekėme kampaniją, pavadintą JulesJacker — keliose leidėjų aprėptyse ir bent penkiose naudingosios apkrovos kartose, įskaitant užšifruotus ir smėlio dėžės aplinkoje veikiančius variantus.
Naujausias variantas specialiai skirtas kenkėjiškų programų analizės infrastruktūrai: jis aktyvuojamas tik analizės aplinkose, vagia debesies metaduomenų paslaugos paskyros žetonus ir tiria „Kubernetes“ valdymo plokštumas bei debesies saugyklų segmentus.
Pagrindinis IOC, bendrinamas visose naudingosios apkrovos kartose, yra surinkimo galinis taškas. aaronstack[.]com/jules-collect.
Sunkumas: kritinis.
Ataka: kaip ji veikia
Kiekvienas „JulesJacker“ paketas atitinka tą patį šabloną. paketas.json reklamuoja gerybinį „TypeScript“ pagalbininką su MIT licencija ir be susietos šaltinio saugyklos. rodyklė.js eksportuoja keletą realių, veikiančių funkcijų – el. pašto reguliariąsias išraiškas, sąrašų žemėlapius, „lint“ taisyklių lenteles – kad kūrėjas, kuris iš tikrųjų importuoja paketą, matytų tikėtiną elgesį. Piktavališkumas slypi kitur: po įdiegimo kabliu arba bloke apačioje rodyklė.js kuris vykdomas tuo metu, kai modulis yra reikalingas.
Naudingieji kroviniai vystėsi per aiškiai sunumeruotus vidinius etapus (operatorius pats žymi savo telemetrijos įvykius sc1-, sc3-, sc4-ir taip toliau), o šios evoliucijos stebėjimas yra aiškiausias būdas suprasti kampaniją.
1–2 kartos: žvalgyba ir „git-config“ vagystė
Ankstyviausi paketai buvo paprasti informacijos vagystės įrankiai. Diegimo metu jie rinko aplinkos kintamuosius, „GitHub CLI“ prieglobos failą ir visuotinę „git“ konfigūraciją (git config –global –list, git nuotolinis -v), tada išsiuntė paketą į rinkinio galinį tašką. Tai nustatė operatoriaus parašą: „TypeScript formos patvirtinimo priemonių“ viršelio istoriją, siunčiamą švyturį į vieną domeną ir skonį kūrėjo kredencialams, o ne vartotojų duomenims.
3 karta: hipervizoriaus ir branduolio išėjimo zondai
Viena kampanijos vidurio versija smarkiai nukreipta į infrastruktūros atakas. Užuot vogusi konfigūraciją, ji atliko žvalgybos duomenų rinkimo zondavimą. AF_VSOCK lizdai, „Virtio MMIO“ regionai, / dev / memir branduolio grūdinimo žymes, ir netgi bandymus sukelti „sysrq“ sukeltas branduolio gedimus – elgesį, susijusį su bandymais ištrūkti iš virtualios mašinos ar konteinerio. Telemetrijos žymės (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-branduolio-zondas) aiškiai išdėstė ketinimą. Šis variantas buvo aiškiai skirtas debesies smėlio dėžės ir serverių neturinčios vykdymo aplinkos — trumpalaikė VM, kuri kuria ir testuoja nepatikimą kodą.
3 karta (SC3): kryžminio saugyklos rašymo kirminas
Kampanijos svorio centru tapo savaime plintantis saugyklų vagis. Įdiegus, naudingoji apkrova paleidžia penkių etapų laiko seką:
- 0 Etapas (~100 ms): pirštų atspaudai apie pagrindinį kompiuterį — pagrindinio kompiuterio pavadinimas, vartotojo informacija, „git“ tapatybė.
- 1 Etapas (~3 s): patikrinkite, kuriai organizacijai priklauso auka git nuotolinis -v, tada ieškokite užkoduoto ORG_CONFIG prieiga prie lentelės ir testavimo saugyklos su git ls-remote — nukreipiamas per užpuoliko kontroliuojamą SSRF tarpinį serverį adresu http://git@192.168.0.1:8080.
- 2 Etapas (~10 s): git klonas kiekvieną pasiekiamą saugyklą tiksliniame sąraše, sukurkite medį su tarball ir gzip formatu, užkoduokite jį naudojant base64 kodą ir išfiltruokite dalimis.
- 3 Etapas (~45 s): „prieigos įrodymas“ – klonuojamas įrašomas saugyklos failas, į jį įdedamas failas pavadinimu SECURITY-POC.md ir commit nustačius autoriaus vardą google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> ir pateikiant pranešimą „chore: update dependency cache, then push to the victim's mainline branch“.
Užkoduotas taikinių sąrašas nėra bendrinis. Jame išvardyta daugiau nei trisdešimt. Shopify saugyklos pagal pavadinimą — Shopify/shopify, Shopify/tapatybė, „Shopify“ / atsiskaitymas, Shopify/vault, Shopify/paslaptys, Shopify/infrastruktūra, Shopify/.githubir daugelis kitų – kartu su bandymų organizacija, Aaronas Stackas Barnesas, kurį operatorius, regis, valdo ir naudoja kaip rašymo taikinį.
4 karta (SC4): užšifruota ir apsaugota
Naujausias kūrėjams skirtas variantas prideda du apėjimo sluoksnius prie SC3 kirmino.
Pirma, naudingoji apkrova nebesiunčiama kaip paprastas tekstas. Tikroji logika slypi AES-256-CBC užšifruotame bloke. lib/.perf.dat, o IV yra pirmuosiuose šešiolikoje baitų. Įkroviklis rodyklė.js rekonstruoja iššifravimo raktą iš sujungtų eilučių fragmentų, iššifruoja „blob“ ir paleidžia jį su nauja funkcija()Net modulių pavadinimai yra padalinti, kad būtų išvengta statinių skaitytuvų — require('kripta' + 'o'), reikalauti('f' + 's').
Antra, jis yra valdomas nuo kompiuterio. Vienas variantas iššifruoja ir veikia tik tada, kai os.hostname() lygus kūrėjų dėžutė or ubuntu-fc-uvm (numatytoji „Firecracker“ „microVM“ versija) arba jame yra poeilutė kūrėjų dėžutėKiti vartai dėl a buvimo .jules/ darbinis katalogas:
Kitaip tariant, SC4 naudingoji apkrova sukurta taip, kad liktų neveikianti įprasto kūrėjo nešiojamajame kompiuteryje ir atsibustų tik automatizuotame dirbtinio intelekto agente. smėlio dėžės aplinkos Operatorius iš tikrųjų nori kompromiso.
Įjungiame laboratoriją: analizės infrastruktūros variantas
Pats novatoriškiausias kampanijos paketas ts-enum-helper, visiškai nepuola kūrėjų ar „Shopify“. Jo postinstall.sh atsidaro vartais, kurie išduoda žaidimą:
Scenarijus nieko neveikia, nebent nustatytas kenkėjiškų programų analizės platformai būdingas aplinkos kintamasis. Kai jis nustatomas, naudingoji apkrova žino, kad jis veikia smėlio dėžėje, kuri egzistuoja tam, kad sprogdintų ir tirtų būtent tokius paketus, ir pradeda kontrataką.
Pirmiausia jis iš egzemplioriaus metaduomenų serverio ištraukia GCP paslaugos paskyros „OAuth“ prieigos raktą ir jį išfiltruoja. Tada, naudodamas tą prieigos raktą, jis peržiūri Kubernetes valdymo plokštuma pasiekiamas adresu kubernetes.default.svc:
- išvardija „ClusterRoleBindings“, „ClusterRoles“ ir „Nodes“;
- zondų, paslapčių ir konfigūracijos žemėlapių zondai kube sistema, numatytasis, kube-public, kube-node-leaseir analizės vardų erdvę;
- iškviečia „SelfSubjectAccessReview“ iškvietimus, kad tiksliai nustatytų, ką pavogta tapatybė gali daryti.
Galiausiai, jis brutaliai priverčia „Google Cloud Storage“ talpų pavadinimus, sudarytus iš užkoduoto GCP projekto ID (retas-pasirašytojas-437603-p9) ir projekto numerį, spėliojant tokius derinius kaip *-versijos, *-artefaktai, ir keli malizės priešdėliai (malizės rezultatai, malysis-paketai, malizės skenavimas). Kiekvienas atsakymo kodas ir tekstas yra registruojami ir siunčiami atgal į tą patį jules-collect galutinis taškas.
Tai retas atvejis, kai tiekimo grandinės naudingoji apkrova sukurta specialiai atakuoti gynėjų pačių infrastruktūrą. Visos kampanijos viršelio istorija – kurios fragmentai pateikiami naudingosiose apkrovose kaip komentarai, įrėminantys elgesį kaip „Saugumo tyrimų PoC... kryžminis saugyklų rašymas per perteklinį „git proxy“ žetoną“ – yra tas pats savęs pateisinimas, nesvarbu, ar vykdymo laiko taikinys yra „Shopify“ monorepo, ar analizės klasterio metaduomenų serveris.
Chronologija ir apimties perkėlimas
„JulesJacker“ nėra vienkartinis pašalinimas. Tai ilgalaikė operacija, kuri išgyveno registro pašalinimą tiesiog pakeitusi pavadinimą.
| Kada | renginys |
|---|---|
| 2026 m. Balandžio vidurys | Pirmieji paketai pasirodo pagal originalią leidėjo taikymo sritį: TS-utility facade, environment ir git-config exfiltration. |
| 2026 m. gegužės pradžia | Paskelbtas hipervizoriaus ir branduolio pabėgimo žvalgybos variantas. |
| 2026 m. gegužės vidurys–pabaiga | SC3 kryžminio saugyklos rašymo kirminas rodomas šalia „Shopify“ skirtų naudingųjų apkrovų ir google-labs-jules[bot] apsimetinėjimas. SC4 pristato AES šifruotus ir nuo kompiuterio priklausomus įkėlimo įrankius. |
| 2026 m. gegužės pabaigoje | „npm“ pašalina pradinę leidėjo taikymo sritį; paketų pavadinimai išsprendžiami pagal tuščius apsaugos reikalavimus. |
| Tą pačią savaitę | Operatorius pereina prie beveik identiškos, panašios į kitą sritį ir iš naujo publikuoja kirminą, įskaitant analizės infrastruktūros variantą. |
Gynėjai turėtų susitaikyti su migracija. Pirmojo taikiklio pašalinimas neužbaigė kampanijos ir net jos nesulėtino. Operatorius jau buvo parengęs lygiagretų taikiklį, kurio pavadinimas nuo originalo skiriasi vienu simboliu, ir tą pačią savaitę tęsė jo publikavimą. Šio straipsnio rašymo metu naujojo taikiklio... ts-form-utils (nuo 1.0.0 iki 1.1.0 versijų), jos ts-project-lint (1.0.0 ir 1.1.0) ir atskirą versiją ts-enum-helper (1.0.0) lieka diegiamos.
Kompromiso rodikliai
Visi toliau pateikti rodikliai buvo patvirtinti pagal pakuotės šaltinį.
| Tipas | rodiklis | Pastaba |
|---|---|---|
| Tinklas (C2) | aaronstack[.]com/jules-collect | Vienas surinkimo galinis taškas kiekvienoje kartoje; gauna JSON telemetrijos ir „base64-gzip“ saugyklos tarball failus. |
| Tinklas (SSRF tarpinis serveris) | http://git@192.168.0.1:8080 | Per didelės apimties „git“ tarpinio serverio prieigos rakto, naudojamo pasiekti tikslinės organizacijos saugyklas, priekis. |
| Tinklas (debesis) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Naudojamas tik analizės infrastruktūros varianto žetonų vagystei ir „Kubernetes“ valdymo plokštumos žvalgybai. |
| Tapatybė | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Suklastotas commit autoriaus tapatybė nustumta į pagrindines aukos šakas. |
| filė | lib/.perf.dat | AES-256-CBC užšifruotas naudingosios apkrovos blokas; IV saugomas pirmuosiuose 16 baitų, o raktas dinamiškai rekonstruojamas index.js. |
| filė | SECURITY-POC.md | Nukrito ir commitgrąžintas į aukų saugyklas su pranešimu chore: update dependency cache. |
| filė | scripts/postinstall.sh | Uždaryta $MALYSIS_ANALYSIS_ID; identifikuoja analizės infrastruktūros taikymo variantą. |
| Elgsenos | os.hostname() čekius devbox / ubuntu-fc-uvm | Smėlio dėžės ir dirbtinio intelekto agento aplinkos blokavimas prieš naudingosios apkrovos iššifravimą ir vykdymą. |
| Elgsenos | .jules/ bei /app/.jules katalogas skaito | Aiškus DI agento darbo aplinkos taikymas. |
| Elgsenos | sc1-, sc3-, sc4-, s0-vmm-recon | Operatoriaus apibrėžtos telemetrijos etapo etiketės, naudingos aptikimui ir paieškai. |
| Debesijos taikinys | rare-signer-437603-p9malysis-* spėlionės dėl kibiro | Į analizės infrastruktūros variantą įterpti kietojo kodo GCP projekto identifikatoriai ir saugyklos kibirų išvardijimo modeliai. |
| Pakuotės forma | TS-utilumo paketo fasadas be saugyklos lauko | Nuoseklus kampanijos šablonas: netikri „TypeScript“ programų paketai su įterptais kenkėjiškais paketais postinstall hooks arba pridėta prie index.js. |




