Tl; DR
Isang operator ng npm ang gumugol ng anim na linggo sa paglalathala ng mga pekeng pakete ng "utility" ng TypeScript tulad ng ts-form-utils, ts-project-lint, at ts-enum-helper.
Bagama't inilalantad ng mga package ang maliliit at mukhang lehitimong mga validation helper, ang tunay na payload ay isinasagawa sa pag-install o unang pag-require at nagsasagawa ng host fingerprinting, GitHub organization discovery, repository cloning, at source-code exfiltration.
Partikular na tinatarget ng malware ang mga organisasyong may mataas na halaga sa GitHub, kabilang ang marami Shopify mga repositoryo, pagkatapos ay ini-archive at ini-exfiltrate ang mga maaabot na source tree patungo sa isang sentralisadong collection endpoint.
Bilang bahagi ng daloy ng trabaho ng kompromiso, ang payload commitibinabalik ang sa file sa mga repositoryo ng biktima habang ginagaya ang autonomous coding identity ng Google google-labs-jules[bot].
Sinubaybayan namin ang kampanya — pinangalanang JulesJacker — sa maraming saklaw ng publisher at hindi bababa sa limang henerasyon ng payload, kabilang ang mga naka-encrypt at sandbox-aware na variant.
Ang pinakabagong variant ay partikular na nagta-target sa imprastraktura ng pagsusuri ng malware: ina-activate lamang nito ang mga loob ng mga kapaligirang pagsusuri, ninanakaw ang mga token ng serbisyo ng account sa cloud metadata, at sinusuri ang mga control plane at cloud storage bucket ng Kubernetes.
Ang pangunahing IOC na ibinabahagi sa lahat ng henerasyon ng payload ay ang collection endpoint. aaronstack[.]com/jules-collect.
Kalubhaan: kritikal.
Ang Pag-atake: Paano Ito Gumagana
Ang bawat pakete ng JulesJacker ay sumusunod sa parehong template. package.json nag-aanunsyo ng isang hindi kapani-paniwalang TypeScript helper na may lisensya ng MIT at walang naka-link na source repository. Ang index.js nag-e-export ng ilang tunay at gumaganang mga function — mga email regexe, enum maps, lint rule table — para makita ng isang developer na aktwal na nag-i-import ng package ang kapani-paniwalang pag-uugali. Ang malisya ay nasa ibang lugar: sa isang postinstall kawit, o sa isang bloke sa ilalim ng index.js na isinasagawa sa sandaling kinakailangan ang modyul.
Ang mga payload ay umunlad sa pamamagitan ng malinaw na bilang ng mga panloob na yugto (tinatawagan ng operator ang sarili nitong mga kaganapan sa telemetrya sc1-, sc3-, sc4-, at iba pa), at ang panonood sa ebolusyong iyon ang pinakamalinaw na paraan upang maunawaan ang kampanya.
Henerasyon 1–2: pagmamanman at pagnanakaw ng git-config
Ang mga pinakaunang pakete ay mga prangka at madaling magnanakaw ng impormasyon. Sa pag-install, kinuha nila ang mga environment variable, ang GitHub CLI hosts file, at ang global git configuration (git config –global –list, git remote -v), pagkatapos ay ipinOST ang bundle sa collection endpoint. Itinatag nito ang lagda ng operator: isang cover story na “TypeScript form validation utilities”, isang outbound beacon sa iisang domain, at isang panlasa para sa mga kredensyal ng developer sa halip na data ng consumer.
Henerasyon 3: mga hypervisor at kernel escape probe
Isang bersyon sa kalagitnaan ng kampanya ang direktang lumipat sa mga pag-atake sa imprastraktura. Sa halip na magnakaw ng config, nagpatakbo ito ng isang recon harness probing AF_VSOCK mga socket, mga rehiyon ng virtio MMIO, / dev / mem, at mga flag ng pagpapatigas ng kernel, at maging ang mga pagtatangkang pag-crash ng kernel na pinati-trigger ng sysrq — pag-uugali na nauugnay sa mga pagtatangkang lumabas sa isang virtual machine o container. Ang mga tag ng telemetry (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) ginawang malinaw ang layunin. Ang variant na ito ay malinaw na naglalayong mga kapaligirang cloud-sandbox at serverless-runner — ang uri ng panandaliang VM na bumubuo at sumusubok sa hindi mapagkakatiwalaang code.
Henerasyon 3 (SC3): ang cross-repo write worm
Ang sentro ng grabidad ng kampanya ay naging isang magnanakaw ng repo na kusang lumalaganap. Sa pag-install, ang payload ay nagpapatakbo ng limang yugtong nakatakdang pagkakasunod-sunod:
- Stage 0 (~100 ms): fingerprint ng host — hostname, impormasyon ng user, git identity.
- Stage 1 (~3 segundo): tukuyin kung saang organisasyon kabilang ang biktima sa pamamagitan ng pagsisiyasat git remote -v, pagkatapos ay maghanap ng isang hardcoded ORG_CONFIG pag-access sa talahanayan at test repo gamit ang git ls-remote — dinadala sa pamamagitan ng isang SSRF proxy na kontrolado ng attacker sa http://git@192.168.0.1:8080.
- Stage 2 (~10 segundo): git clone bawat maaabot na repositoryo sa target list, i-tarball at i-gzip ang tree, i-base64-encode ito, at i-chunk-exfiltrate ito.
- Stage 3 (~45 segundo): ang "patunay ng pag-access" — mag-clone ng isang writable repo, mag-drop ng file na pinangalanang SECURITY-POC.md, at commit ito kasama ang awtor na nakatakda sa google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> at ang mensaheng chore: update dependency cache, pagkatapos ay i-push sa mainline branch ng biktima.
Ang hardcoded target list ay hindi pangkaraniwan. Nagsasama ito ng mahigit tatlumpung Shopify mga repositoryo ayon sa pangalan — Shopify/shopify, Shopify/pagkakakilanlan, Shopify/pagsingil, Shopify/vault, Shopify/mga sikreto, Shopify/imprastraktura, Shopify/.github, at marami pang iba — kasama ang isang organisasyon ng pagsubok, AaronStackBarnes, na tila kinokontrol at ginagamit ng operator bilang target na isulat.
Henerasyon 4 (SC4): naka-encrypt at naka-gate
Ang pinakabagong variant na nakaharap sa developer ay nagdaragdag ng dalawang patong ng pag-iwas sa ibabaw ng SC3 worm.
Una, ang payload ay hindi na ipinapadala bilang plaintext. Ang tunay na lohika ay nasa isang AES-256-CBC-encrypted blob, lib/.perf.dat, kasama ang IV sa unang labing-anim na byte nito. Ang loader ay nasa index.js muling binubuo ang decryption key mula sa pinagsama-samang mga fragment ng string, idine-decrypt ang blob, at pinapatakbo ito gamit ang bagong Tungkulin()Kahit ang mga pangalan ng modyul ay hinati upang maiwasan ang mga static scanner — nangangailangan('crypt' + 'o'), nangangailangan('f' + 's').
Pangalawa, ito ay host-gated. Ang isang variant ay nagde-decrypt at tumatakbo lamang kapag os.hostname() katumbas ng devbox or ubuntu-fc-uvm (isang default na Firecracker microVM) o naglalaman ng substring devboxIsa pang mga tarangkahan sa presensya ng isang .jules/ gumaganang direktoryo:
Sa madaling salita, ang SC4 payload ay idinisenyo upang manatiling hindi aktibo sa laptop ng isang ordinaryong developer at gumising lamang sa loob ng awtomatikong AI-agent at mga kapaligiran ng sandbox gusto talagang makipagkompromiso ng operator.
Pag-on ng Lab: ang Baryante ng Pagsusuri-Imprastraktura
Ang pinaka-bagong pakete sa kampanya, ts-enum-helper, ay hindi umaatake sa mga developer o Shopify. Ito postinstall.sh bubukas gamit ang isang gate na nagbibigay ng laro:
Walang ginagawa ang script maliban na lang kung may nakatakdang environment variable na partikular sa isang malware-analysis platform. Kapag nakatakda ito, alam ng payload na tumatakbo ito sa loob ng sandbox na umiiral para paputukin at pag-aralan ang mga package na eksaktong katulad nito — at gagawa ito ng counter-attack.
Una nitong kinukuha ang GCP service-account OAuth token mula sa instance metadata server at ini-exfiltrate ito. Pagkatapos, gamit ang token na iyon, nililinis nito ang Plane ng kontrol ng Kubernetes maabot sa kubernetes.default.svc:
- naglilista ng ClusterRoleBindings, ClusterRoles, at Nodes;
- sinusuri ang mga pod, sikreto, at mga configmap sa kabuuan sistemang kube, default, kube-publiko, kube-node-lease, at ang namespace ng pagsusuri;
- Nag-iisyu ng mga tawag ang SelfSubjectAccessReview upang imapa kung ano mismo ang pinapayagang gawin ng ninakaw na pagkakakilanlan.
Sa wakas, pinipilit nitong gamitin ang mga pangalan ng bucket ng Google Cloud Storage na binuo mula sa isang hardcoded na GCP project ID (rare-signer-437603-p9) at numero ng proyekto, paghula ng mga kumbinasyon tulad ng *-builds, *-mga artifact, at marami malysis- mga unlapi (mga resulta ng malysis, mga pakete ng malysis, mga pag-scan ng malysis). Ang bawat code at katawan ng tugon ay naka-log at nai-POST pabalik sa pareho. jules-collect endpoint.
Ito ang pambihirang kaso ng isang supply-chain payload na partikular na ginawa upang atakehin ang sariling imprastraktura ng mga tagapagtanggol. Ang kuwento sa buong kampanya — mga fragment nito na lumilitaw sa loob ng mga payload bilang mga komento na nagbabalangkas sa pag-uugali bilang isang "Security Research PoC ... cross-repo write via overscoped git proxy token" — ay ang parehong self-justification, maging ang runtime target ay isang Shopify monorepo o metadata server ng analysis cluster.
Timeline at ang Paglipat ng Saklaw
Ang JulesJacker ay hindi isang biglaang pagkatalo. Ito ay isang patuloy na operasyon na nakaligtas sa isang pagtanggal sa registry sa pamamagitan lamang ng pagpapalit ng pangalan nito.
| Kailan | pangyayari |
|---|---|
| Kalagitnaan ng Abril 2026 | Ang mga unang pakete ay lilitaw sa ilalim ng orihinal na saklaw ng publisher: TS-utility façade, environment at git-config exfiltration. |
| Maagang bahagi ng Mayo 2026 | Nailathala na ang variant ng hypervisor at kernel-escape reconnaissance. |
| Kalagitnaan hanggang huling bahagi ng Mayo 2026 | Lumilitaw ang SC3 cross-repo write worm kasama ng mga payload na naka-target sa Shopify at google-labs-jules[bot] pagpapanggap. Ipinakikilala ng SC4 ang mga AES-encrypted at host-gated loader. |
| Huling bahagi ng Mayo 2026 | Inaalis ng npm ang orihinal na saklaw ng publisher; ang mga pangalan ng pakete ay nag-aalis ng laman sa mga placeholder na may hawak ng seguridad. |
| Parehong linggo | Lumilipat ang operator sa isang halos magkaparehong saklaw at muling inilalathala ang worm, kasama na ang variant ng analysis-infrastructure. |
Ang paglipat ang dapat na bahagi ng mga tagapagtanggol. Ang pagtanggal sa unang saklaw ay hindi nagtapos sa kampanya o nagpabagal man lang dito. Ang operator ay nakapagtanghal na ng isang parallel scope na ang pangalan ay naiiba sa orihinal dahil sa isang karakter lamang, at nagpatuloy sa paglalathala sa loob ng parehong linggo. Sa pagsulat nito, ang bagong saklaw ay ts-form-utils (mga bersyon 1.0.0 hanggang 1.1.0), nito ts-project-lint (1.0.0 at 1.1.0), at ang nakapag-iisang ts-enum-helper (1.0.0) ay mananatiling maaaring i-install.
Mga Tagapagpahiwatig ng Kompromiso
Kinumpirma ang lahat ng indikasyon sa ibaba laban sa pinagmulan ng pakete.
| uri | Nagtuturo | Mga Tala |
|---|---|---|
| Network (C2) | aaronstack[.]com/jules-collect | Isang endpoint ng koleksyon sa bawat henerasyon; tumatanggap ng JSON telemetry at mga tarball chunks ng base64-gzip repository. |
| Network (SSRF proxy) | http://git@192.168.0.1:8080 | Harap para sa isang overscoped na git proxy token na ginagamit upang maabot ang mga repositoryo ng target na organisasyon. |
| Network (ulap) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Ginagamit lamang ng variant na analysis-infrastructure para sa token theft at Kubernetes control-plane reconnaissance. |
| Pagkakakilanlan | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Peke commit itinulak ang pagkakakilanlan ng may-akda sa mga pangunahing sangay ng biktima. |
| talaksan | lib/.perf.dat | AES-256-CBC-encrypted payload blob; IV na nakaimbak sa unang 16 bytes at ang key ay dynamic na muling binuo sa index.js. |
| talaksan | SECURITY-POC.md | Nahulog at commitibinalik sa mga repositoryo ng biktima kasama ang mensahe chore: update dependency cache. |
| talaksan | scripts/postinstall.sh | Naka-gate $MALYSIS_ANALYSIS_ID; tinutukoy ang variant na nagta-target sa pagsusuri-imprastraktura. |
| Pag-uugali | os.hostname() mga tseke para sa devbox / ubuntu-fc-uvm | Pag-gate ng sandbox at AI-agent environment bago ang pag-decrypt at pagpapatupad ng payload. |
| Pag-uugali | .jules/ at /app/.jules mga pagbasa ng direktoryo | Tahasang pag-target ng mga kapaligiran sa workspace ng AI-agent. |
| Pag-uugali | sc1-, sc3-, sc4-, s0-vmm-recon | Mga label ng yugto ng telemetry na tinukoy ng operator na kapaki-pakinabang para sa pagtukoy at pangangaso. |
| Target ng ulap | rare-signer-437603-p9malysis-* mga hula sa balde | Mga hardcoded na GCP project identifier at storage-bucket enumeration pattern na naka-embed sa analysis-infrastructure variant. |
| Hugis ng pakete | Harapang TS-utility package na walang field ng repositoryo | Pare-parehong template ng kampanya: mga pekeng pakete ng utility ng TypeScript na may mga malisyosong payload na naka-embed sa postinstall hooks o idinaragdag sa index.js. |




