TL; DR
'n Enkele npm-operateur het ses weke lank vals TypeScript-"nutsprogram"-pakkette gepubliseer, soos ts-form-utils, ts-project-lint, en ts-enum-helper.
Terwyl die pakkette klein, wettige validasiehulpmiddels blootstel, word die werklike vrag uitgevoer tydens installasie of eerste vereiste en voer gasheervingerafdrukke, GitHub-organisasie-opsporing, bewaarplek-kloning en bronkode-ekfiltrasie uit.
Die wanware teiken spesifiek hoëwaarde GitHub-organisasies, insluitend verskeie Shopify bewaarplekke, argiveer en eksfiltreer dan bereikbare bronbome na 'n gesentraliseerde versamelingseindpunt.
As deel van die kompromie-werkvloei, die vrag commitsa-lêer terug in slagofferbewaarplekke terwyl Google se outonome koderingsidentiteit nageboots word google-labs-jules[bot].
Ons het die veldtog gevolg — genaamd JulesJacker — oor verskeie uitgewersbestek en ten minste vyf generasies van vragte, insluitend geïnkripteerde en sandput-bewuste variante.
Die nuutste variant teiken spesifiek wanware-analise-infrastruktuur: dit aktiveer slegs binne analise-omgewings, steel wolkmetadata-diensrekeningtokens en ondersoek Kubernetes-beheervlakke en wolkbergingsemmers.
Die primêre IOC wat oor alle generasies van vragte gedeel word, is die versamelingseindpunt aaronstack[.]com/jules-collect.
Ernstigheid: kritiek.
Die Aanval: Hoe Dit Werk
Elke JulesJacker-pakket volg dieselfde sjabloon. pakket.json adverteer 'n goedaardige TypeScript-helper met 'n MIT-lisensie en geen gekoppelde bronbewaarplek nie. index.js voer 'n handvol werklike, werkende funksies uit — e-pos regexes, enum-kaarte, lint-reëltabelle — sodat 'n ontwikkelaar wat die pakket eintlik invoer, geloofwaardige gedrag sien. Die kwaadwilligheid leef elders: in 'n na-installasie haak, of in 'n blok onderaan index.js wat uitvoer die oomblik as die module benodig word.
Die vragte het ontwikkel deur duidelik genommerde interne stadiums (die operateur benoem sy eie telemetrie-gebeurtenisse sc1-, sc3-, sc4-, ensovoorts), en om daardie evolusie dop te hou, is die duidelikste manier om die veldtog te verstaan.
Generasie 1–2: verkenning en git-config diefstal
Die vroegste pakkette was eenvoudige inligtingsdiefstalprogramme. Tydens installasie het hulle omgewingveranderlikes, die GitHub CLI-gasheerlêer en die globale git-konfigurasie () geoes.git-konfigurasie –globaal –lys, git afstandbeheer -v), en toe die bundel na die versamelingseindpunt GEPLAAS. Dit het die operateur se handtekening gevestig: 'n voorbladverhaal oor "TypeScript-vormvalideringshulpprogramme", 'n uitgaande baken na 'n enkele domein, en 'n voorliefde vir ontwikkelaarsbewyse eerder as verbruikersdata.
Generasie 3: hipervisor- en kern-ontsnappingsondes
Een middelveldtogweergawe het sterk na infrastruktuuraanvalle oorgeskakel. In plaas daarvan om konfigurasie te steel, het dit 'n verkenningstuig-ondersoek uitgevoer. AF_VSOK sokke, virtio MMIO-streke, / dev / mem, en kernverhardingsvlae, en selfs pogings tot sysrq-geaktiveerde kernineenstortings — gedrag wat verband hou met pogings om uit 'n virtuele masjien of houer te breek. Die telemetrie-etikette (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kern-sonde) het die bedoeling eksplisiet gemaak. Hierdie variant was duidelik daarop gemik wolk-sandkas- en bedienerlose-runner-omgewings — die soort kortstondige VM wat onbetroubare kode bou en toets.
Generasie 3 (SC3): die kruis-repo skryfwurm
Die veldtog se swaartepunt het 'n selfverspreidende repo-dief geword. Tydens installasie loop die vrag 'n vyfstadium-tydsbepaalde reeks:
- Stadium 0 (~100 ms): vingerafdruk die gasheer — gasheernaam, gebruikersinligting, git-identiteit.
- Stadium 1 (~3 s): bepaal aan watter organisasie die slagoffer behoort deur te inspekteer git afstandbeheer -v, soek dan 'n hardgekodeerde op ORG_CONFIG tabel- en toetsrepotoegang met git ls-remote — gerig deur 'n aanvaller-beheerde SSRF-instaanbediener by http://git@192.168.0.1:8080.
- Stadium 2 (~10 sekondes): git kloon elke bereikbare bewaarplek in die teikenlys, tarball en gzip die boom, base64-enkodeer dit, en chunk-ekfiltreer dit.
- Stadium 3 (~45 s): die "bewys van toegang" - kloon 'n skryfbare repo, laat val 'n lêer met die naam SECURITY-POC.md, en commit dit met die outeur gestel op google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> en die boodskap chore: update dependency cache, en druk dan na die slagoffer se hooftak.
Die hardgekodeerde teikenlys is nie generies nie. Dit bevat meer as dertig Shopify bewaarplekke volgens naam — Shopify/shopify, Shopify/identiteit, Shopify/fakturering, Shopify/kluis, Shopify/geheime, Shopify/infrastruktuur, Shopify/.github, en vele meer — saam met 'n toetsorganisasie, AaronStackBarnes, wat die operateur blyk te beheer en as die skryfteiken gebruik.
Generasie 4 (SC4): geïnkripteer en beheer
Die nuutste ontwikkelaar-gerigte variant voeg twee lae van ontduiking bo-op die SC3-wurm by.
Eerstens word die vrag nie meer as gewone teks gestuur nie. Die werklike logika sit in 'n AES-256-CBC-geënkripteerde blob, lib/.perf.dat, met die IV in sy eerste sestien grepe. Die laaier in index.js rekonstrueer die dekripsiesleutel uit saamgevoegde stringfragmente, dekripteer die blob en voer dit uit met nuwe Funksie()Selfs die modulename is verdeel om statiese skandeerders te ontduik — vereis('kript' + 'o'), vereis('f' + 's').
Tweedens, dit is gasheer-gereguleer. Een variant dekripteer en loop slegs wanneer os.gasheernaam() gelyk ontwikkelaarsboks or ubuntu-fc-uvm (’n Firecracker microVM-standaard) of bevat die substring ontwikkelaarsboksNog 'n poort na die teenwoordigheid van 'n .jules/ werkgids:
Met ander woorde, die SC4-vrag is ontwerp om dormant op 'n gewone ontwikkelaar se skootrekenaar te bly en slegs binne die outomatiese KI-agent wakker te word. sandbox omgewings die operateur wil eintlik 'n kompromis aangaan.
Aanskakeling van die laboratorium: die analise-infrastruktuurvariant
Die mees nuwe pakket in die veldtog, ts-enum-helper, val glad nie ontwikkelaars of Shopify aan nie. Sy postinstall.sh maak oop met 'n hek wat die spel weggee:
Die skrip doen niks tensy 'n omgewingveranderlike spesifiek vir 'n wanware-analiseplatform gestel is nie. Wanneer dit wel is, weet die vrag dat dit binne die sandput loop wat bestaan om pakkette presies soos hierdie een te ontplof en te bestudeer – en dit doen teenaanvalle.
Dit trek eers die GCP-diensrekening OAuth-token van die instansie-metadatabediener en verwyder dit. Dan, met behulp van daardie token, vee dit die Kubernetes beheer vliegtuig bereikbaar by kubernetes.default.svc:
- lys ClusterRoleBindings, ClusterRoles, en Nodes;
- ondersoek peule, geheime en konfigurasiekaarte oor kube-stelsel, verstek, kube-publiek, kube-node-huurkontrak, en die ontledingsnaamruimte;
- reik SelfSubjectAccessReview-oproepe uit om presies te karteer wat die gesteelde identiteit mag doen.
Uiteindelik forseer dit Google Cloud Storage-emmername wat gebou is vanaf 'n hardgekodeerde GCP-projek-ID (seldsame-ondertekenaar-437603-p9) en projeknommer, raai kombinasies soos *-boue, *-artefakte, en verskeie malyse- voorvoegsels (malyse-resultate, malysis-pakkette, malyse-skanderings). Elke reaksiekode en -liggaam word aangeteken en teruggeplaas na dieselfde jules-versamel eindpunt.
Dit is die seldsame geval van 'n voorsieningsketting-vrag wat spesifiek gebou is om die verdedigers se eie infrastruktuur aan te val. Die dekmantelstorie oor die hele veldtog – waarvan fragmente binne die vragte verskyn as kommentare wat die gedrag raam as 'n "Sekuriteitsnavorsing-PoC ... kruis-repo-skryf via oorbeperkte git-instaanbediener" – is dieselfde selfregverdiging, of die looptydteiken nou 'n Shopify-monorepo of die ontledingskluster se metadata-bediener is.
Tydlyn en die Omvangmigrasie
JulesJacker is nie 'n eenmalige verwydering nie. Dit is 'n volgehoue operasie wat 'n registerverwydering oorleef het deur bloot die naam te verander.
| Wanneer | Event |
|---|---|
| Middel April 2026 | Eerste pakkette verskyn onder die oorspronklike uitgewer se omvang: TS-utility-fasade, omgewing en git-config-eksfiltrasie. |
| Vroeg Mei 2026 | Hipervisor en kern-ontsnapping verkenningsvariant gepubliseer. |
| Middel tot laat Mei 2026 | SC3 kruis-repo skryfwurm verskyn langs Shopify-geteikende vragte en google-labs-jules[bot] nabootsing. SC4 stel AES-geënkripteerde en gasheer-beheerde laaiers bekend. |
| Laat Mei 2026 | npm verwyder die oorspronklike uitgewer se omvang; pakketname los dit op na leë sekuriteitsbehoudende plekhouers. |
| Dieselfde week | Die operateur migreer na 'n byna identiese omvang en herpubliseer die wurm, insluitend die analise-infrastruktuur-variant. |
Die migrasie is die deel waarmee verdedigers moet saamleef. Die verwydering van die eerste teleskoop het nie die veldtog beëindig of selfs vertraag nie. Die operateur het reeds 'n parallelle teleskoop opgestel waarvan die naam met 'n enkele karakter van die oorspronklike verskil, en het binne dieselfde week voortgegaan met publikasie. Ten tyde van hierdie skrywe is die nuwe teleskoop se ts-vorm-utils (weergawes 1.0.0 tot 1.1.0), sy ts-projek-lint (1.0.0 en 1.1.0), en die losstaande ts-enum-helper (1.0.0) bly installeerbaar.
Aanwysers van Kompromie
Alle aanwysers hieronder is teen die pakketbron bevestig.
| Tipe | Indicator | Notes |
|---|---|---|
| Netwerk (C2) | aaronstack[.]com/jules-collect | Enkele versamelingseindpunt oor elke generasie; ontvang JSON-telemetrie en base64-gzip-bewaarplek-tarballe. |
| Netwerk (SSRF-instaanbediener) | http://git@192.168.0.1:8080 | Voorkant vir 'n oorbeperkte git-proxy-token wat gebruik word om teikenorganisasie-bewaarplekke te bereik. |
| Netwerk (wolk) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Word slegs deur die analise-infrastruktuurvariant gebruik vir tekendiefstal en Kubernetes-beheervlakverkenning. |
| Identiteit | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Vervalste commit outeuridentiteit in slagoffer-hooftakke gestoot. |
| File | lib/.perf.dat | AES-256-CBC-geënkripteerde vragblob; IV gestoor in die eerste 16 grepe en sleutel dinamies gerekonstrueer in index.js. |
| File | SECURITY-POC.md | Laat val en committeruggevoer na slagofferbewaarplekke met die boodskap chore: update dependency cache. |
| File | scripts/postinstall.sh | Toegesluit $MALYSIS_ANALYSIS_ID; identifiseer die analise-infrastruktuur-teikenvariant. |
| gedrags- | os.hostname() tjeks vir devbox / ubuntu-fc-uvm | Sandput- en KI-agent-omgewingpoorte voor dekripsie en uitvoering van vrag. |
| gedrags- | .jules/ en /app/.jules gids lees | Eksplisiete teikenstelling van KI-agent-werkruimteomgewings. |
| gedrags- | sc1-, sc3-, sc4-, s0-vmm-recon | Operateur-gedefinieerde telemetrie-stadiumetikette wat nuttig is vir opsporing en jag. |
| Wolkteiken | rare-signer-437603-p9malysis-* emmer raaiskote | Hardgekodeerde GCP-projekidentifiseerders en stooremmer-opsommingspatrone ingebed in die analise-infrastruktuurvariant. |
| Pakketvorm | TS-nutspakketfasade sonder bewaarplekveld | Konsekwente veldtogsjabloon: vals TypeScript-nutspakkette met kwaadwillige vragte ingebed daarin postinstall hooks of aangeheg aan index.js. |




