TL; DR
Üks npm-i operaator veetis kuus nädalat võltsitud TypeScripti „utiliidi” pakettide, näiteks ts-form-utils, ts-project-lintja ts-enum-helper.
Kuigi paketid pakuvad väikeseid, legitiimse välimusega valideerimisabilisi, käivitub tegelik koormus installimisel või esimesel nõudmisel ning teostab hosti sõrmejälgede võtmise, GitHubi organisatsiooni tuvastamise, repositooriumi kloonimise ja lähtekoodi väljafiltreerimise.
Pahavara on suunatud just kõrge väärtusega GitHubi organisatsioonidele, sealhulgas mitmele Shopify hoidlaid, seejärel arhiveerib ja filtreerib kättesaadavad lähtekoodipuud tsentraliseeritud kogumise lõpp-punkti.
Kompromissi töövoo osana on kasulik koormus commitsa faili tagasi ohvrite hoidlatesse, imiteerides Google'i autonoomset kodeerimisidentiteeti google-labs-jules[bot].
Jälgisime kampaaniat – nimega JulesJacker — mitme avaldaja ulatuse ja vähemalt viie kasuliku koormuse põlvkonna ulatuses, sealhulgas krüpteeritud ja liivakastiteadlikud variandid.
Uusim variant on suunatud spetsiaalselt pahavara analüüsi infrastruktuurile: see aktiveerub ainult analüüsikeskkondades, varastab pilve metaandmete teenusekonto tokeneid ning uurib Kubernetes'i juhtimistasandit ja pilvesalvestusämbrit.
Kõigi kasuliku andme genereerimiste vahel jagatud peamine IOC on kogumise lõpp-punkt. aaronstack[.]com/jules-collect.
Raskusaste: kriitiline.
Rünnak: kuidas see toimib
Iga JulesJackeri pakett järgib sama malli. pakett.json reklaamib healoomulist TypeScripti abilist MIT-litsentsiga ja ilma lingitud lähtekoodihoidlata. index.js ekspordib käputäie reaalseid, töötavaid funktsioone – e-posti regulaareksemplare, enum-kaardid, lint-reeglite tabelid –, et arendaja, kes paketi tegelikult impordib, näeks usutavat käitumist. Pahatahtlikkus peitub mujal: pärast installimist konksu või ploki allosas index.js mis käivitub hetkel, kui moodulit vaja on.
Koormused on arenenud läbi selgelt nummerdatud sisemiste etappide (operaator märgistab oma telemeetriasündmused sc1-, sc3-, sc4-ja nii edasi) ning selle arengu jälgimine on kampaania mõistmiseks kõige selgem viis.
1.–2. põlvkond: luure ja git-config'i vargus
Varaseimad paketid olid otsekohesed infovarastajad. Installimisel kogusid nad keskkonnamuutujaid, GitHubi CLI hostfaili ja globaalset giti konfiguratsiooni (git config –global –list, git remote -v), seejärel POST-is paketi kogumise lõpp-punkti. See lõi operaatori allkirja: kaanelugu „TypeScripti vormi valideerimise utiliidid”, väljaminev märguanne ühele domeenile ja eelistus arendaja volituste, mitte tarbijaandmete järele.
3. põlvkond: hüperviisori ja kerneli põgenemisproovid
Üks kampaania keskel toimunud versioon pöördus jõuliselt infrastruktuurirünnakute poole. Konfiguratsiooni varastamise asemel käivitati luure- ja rakmete uurimise analüüs. AF_VSOCK soklid, virtio MMIO piirkonnad, / dev / memja kerneli kõvendamislipud ning isegi sysrq-käivitamisega kerneli krahhid – käitumine, mis on seotud virtuaalmasinast või konteinerist väljamurdmiskatsetega. Telemeetriasildid (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) tegi kavatsuse selgeks. See variant oli selgelt suunatud pilve-liivakasti ja serverita jooksja keskkonnad — selline lühiajaline virtuaalmasin, mis loob ja testib usaldamatut koodi.
3. põlvkond (SC3): ristrepo kirjutamise uss
Kampaania raskuskeskmeks sai ise leviv repo varas. Installimisel käivitab kasulik koormus viieastmelise ajastatud jada:
- Stage 0 (~100 ms): hosti sõrmejälg — hostinimi, kasutajainfo, giti identiteet.
- Stage 1 (~3 s): kontrollimise teel määrake kindlaks, millisesse organisatsiooni ohver kuulub git remote -v, seejärel otsi üles kõvakodeeritud ORG_CONFIG tabeli ja testrepositooriumi juurdepääs koos git ls-remote — suunatud ründaja kontrollitava SSRF-proksi kaudu aadressil http://git@192.168.0.1:8080.
- Stage 2 (~10 sekundit): git kloon iga sihtloendis oleva kättesaadava repositooriumi jaoks, paki puu tarball-vormingusse ja gzip-vormingusse, kodeeri see base64-kodeeringusse ja filtreeri see tükkidena välja.
- Stage 3 (~45 s): „juurdepääsu tõend” – kloonige kirjutatav hoidla, kustutage fail nimega SECURITY-POC.md ja commit autoriks on määratud google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> ja sõnum chore: update dependency cache, then push to victim's mainline branch.
Kõvakodeeritud sihtmärkide loend ei ole üldine. See loetleb üle kolmekümne. Shopify hoidlad nime järgi — Shopify/shopify, Shopify/identiteet, Shopify/arveldus, Shopify/vault, Shopify/saladused, Shopify/taristu, Shopify/.githubja palju muud – koos testimisorganisatsiooniga, AaronStackBarnes, mida operaator näib kontrollivat ja kasutab kirjutamise sihtmärgina.
4. põlvkond (SC4): krüpteeritud ja suletud
Uusim arendajatele suunatud variant lisab SC3 ussile kaks vältimise kihti.
Esiteks ei saadeta enam lihttekstina. Tegelik loogika asub AES-256-CBC-krüptitud plokis. lib/.perf.dat, kusjuures IV asub selle esimeses kuueteistkümnes baitis. Laadur index.js rekonstrueerib dekrüpteerimisvõtme liidetud stringifragmentidest, dekrüpteerib blobi ja käivitab selle uus funktsioon()Isegi moodulite nimed on jagatud, et staatilisi skannereid vältida — nõuda('krüpt' + 'o'), nõuda('f' + 's').
Teiseks on see hosti poolt juhitav. Üks variant dekrüpteerib ja töötab ainult siis, kui os.hostname() võrdub arenduskast or ubuntu-fc-uvm (Firecrackeri microVM-i vaikeseade) või sisaldab alamstringi arenduskastTeine värav a olemasolu kohta .jules/ töökataloog:
Teisisõnu, SC4 kasulik koormus on loodud jääma tavalise arendaja sülearvutisse uinuma ja ärkama alles automatiseeritud tehisintellekti agendi sees. liivakasti keskkonnad Operaator soovib tegelikult kompromissi teha.
Labori sisselülitamine: analüüsi infrastruktuuri variant
Kampaania kõige uudsem pakett ts-enum-helper, ei ründa arendajaid ega Shopifyd üldse. Selle postinstall.sh avaneb väravaga, mis reedab mängu ära:
Skript ei tee midagi, kui pole määratud pahavara analüüsi platvormile omast keskkonnamuutujat. Kui see on määratud, teab kasulik koormus, et see töötab liivakastis, mis on loodud just selliste pakettide detoneerimiseks ja uurimiseks – ning alustab vasturünnakut.
Esmalt tõmbab see eksemplari metaandmete serverist GCP teenusekonto OAuth-tokeni ja filtreerib selle välja. Seejärel, kasutades seda tokenit, kontrollib see Kubernetes'i juhtimistasandil kättesaadav aadressil kubernetes.default.svc:
- loetleb ClusterRoleBindings, ClusterRoles ja Nodes;
- uurib pod'e, saladusi ja konfiguratsioonikaarte kõikjal kube-süsteem, vaikimisi, kube-public, kube-node-leaseja analüüsi nimeruum;
- väljastab SelfSubjectAccessReview päringuid, et täpselt kaardistada, mida varastatud identiteedil on lubatud teha.
Lõpuks sunnib see jõuga Google Cloud Storage'i ämbrinimed üles kodeeritud GCP projekti ID-st (haruldane-allkirjastaja-437603-p9) ja projekti number, selliste kombinatsioonide äraarvamine nagu *-ehitused, *-artefaktidja mitu malüüs- eesliited (malüüsi tulemused, malysis-paketid, malüüsi skaneeringud). Iga vastusekood ja sisu logitakse ning saadetakse tagasi samale aadressile. jules-collect lõpp-punkt.
See on haruldane juhtum, kus tarneahela kasulik koormus on loodud spetsiaalselt kaitsjate enda infrastruktuuri ründamiseks. Kogu kampaania kaanelugu – mille fragmendid ilmuvad kasulike koormuste sees kommentaaridena, mis raamivad käitumist kui „Security Research PoC … ristrepo kirjutamine üleulatuva git proxy tokeni kaudu” – on sama eneseõigustus, olenemata sellest, kas käitusaja sihtmärgiks on Shopify monorepo või analüüsiklastri metaandmete server.
Ajajoon ja ulatuse migratsioon
JulesJacker ei ole ühekordne rünnak. See on järjepidev operatsioon, mis pääses registri sulgemisest lihtsalt nime muutes.
| Kui | sündmus |
|---|---|
| 2026. aasta aprilli keskpaik | Esimesed paketid ilmuvad algse avaldaja ulatuse all: TS-utility facade, environment ja git-config exfiltration. |
| 2026. aasta mai algus | Avaldatud hüperviisori ja kernel-escape luurevariant. |
| Mai keskpaigast lõpuni 2026 | SC3 ristrepo kirjutamisuss ilmub Shopify-sihitud kasulike koormuste kõrval ja google-labs-jules[bot] kellegi teise isiku tuvastamine. SC4 tutvustab AES-krüptitud ja hosti poolt juhitavaid laadureid. |
| Mai lõpus 2026 | npm eemaldab algse avaldaja ulatuse; paketinimed lahendatakse tühjadeks turvalisust hoidvateks kohahoidjateks. |
| Samal nädalal | Operaator migreerub peaaegu identsele sarnasele ulatusele ja avaldab ussi uuesti, sealhulgas analüüsi infrastruktuuri variandi. |
Kaitsjad peaksid leppima migratsiooniga. Esimese sihiku eemaldamine ei lõpetanud kampaaniat ega isegi aeglustanud seda. Operaator oli juba loonud paralleelse sihiku, mille nimi erineb originaalist ühe tähemärgi võrra, ja jätkas avaldamist samal nädalal. Selle kirjutamise seisuga on uue sihiku... ts-form-utils (versioonid 1.0.0 kuni 1.1.0), selle ts-project-lint (1.0.0 ja 1.1.0) ning eraldiseisev ts-enum-helper (1.0.0) jäävad installitavaks.
Kompromissi näitajad
Kõik allolevad näitajad kinnitati paketi allika suhtes.
| KASUTUSALA | Indikaator | märkused |
|---|---|---|
| Võrk (C2) | aaronstack[.]com/jules-collect | Üks kogumise lõpp-punkt igas põlvkonnas; võtab vastu JSON-telemeetriat ja base64-gzip-hoidla tarball-juppe. |
| Võrk (SSRF-puhverserver) | http://git@192.168.0.1:8080 | Sihtorganisatsiooni repositooriumidesse jõudmiseks kasutatava üleulatuva git-puhverserveri tokeni esikülg. |
| Võrk (pilv) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Kasutab ainult analüüsiinfrastruktuuri variant tokenivarguste ja Kubernetes'i juhttasandi luure jaoks. |
| Identity | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Võltsitud commit autori identiteet lükatakse ohvri pealiini harudesse. |
| Fail | lib/.perf.dat | AES-256-CBC-krüptitud kasuliku andmeblokk; IV salvestatud esimesse 16 baiti ja võti rekonstrueeritud dünaamiliselt index.js. |
| Fail | SECURITY-POC.md | Kukkus maha ja committagasi ohvrite hoidlatesse koos sõnumiga chore: update dependency cache. |
| Fail | scripts/postinstall.sh | Väravaga sisse lülitatud $MALYSIS_ANALYSIS_ID; tuvastab analüüsi infrastruktuurile suunatud variandi. |
| Käitumist | os.hostname() kontrollib devbox / ubuntu-fc-uvm | Liivakasti ja tehisintellekti agendi keskkonna lüüsimine enne kasuliku koormuse dekrüpteerimist ja käivitamist. |
| Käitumist | .jules/ ja /app/.jules kataloog loeb | Tehisintellekti agendi tööruumi keskkondade selgesõnaline sihtimine. |
| Käitumist | sc1-, sc3-, sc4-, s0-vmm-recon | Operaatori määratletud telemeetria etapi sildid, mis on kasulikud avastamiseks ja otsimiseks. |
| Pilve sihtmärk | rare-signer-437603-p9malysis-* ämbrite oletused | Analüüsiinfrastruktuuri variandisse manustatud kõvakodeeritud GCP projekti identifikaatorid ja salvestusämbrite loendamise mustrid. |
| Paki kuju | TS-utiliidipaketi fassaad ilma hoidlaväljata | Järjepidev kampaaniamall: võltsitud TypeScripti utiliidipaketid, millesse on manustatud pahatahtlikku kasulikku teavet postinstall hooks või lisatud index.js. |





