TL; DR
Jeden operátor npm strávil šesť týždňov publikovaním falošných „úžitkových“ balíkov TypeScript, ako napríklad ts-form-utils, ts-project-linta ts-enum-helper.
Zatiaľ čo balíky sprístupňujú malé, legitímne vyzerajúce pomocné programy na overovanie, skutočné užitočné zaťaženie sa spustí pri inštalácii alebo pri prvom vyžiadaní a vykoná odtlačky hostiteľa, objavenie organizácie GitHub, klonovanie repozitárov a exfiltráciu zdrojového kódu.
Malvér sa zameriava najmä na hodnotné organizácie GitHub vrátane viacerých Shopify repozitáre, potom archivuje a exfiltruje dostupné zdrojové stromy do centralizovaného koncového bodu kolekcie.
Ako súčasť pracovného postupu kompromisu, užitočné zaťaženie commitvracať súbor sa späť do repozitárov obetí a zároveň sa vydávať za autonómnu kódovaciu identitu spoločnosti Google google-labs-jules[bot].
Sledovali sme kampaň s názvom JulesJacker — naprieč viacerými rozsahmi vydavateľov a najmenej piatimi generáciami užitočného zaťaženia vrátane šifrovaných variantov a variantov s podporou sandboxu.
Najnovší variant sa špecificky zameriava na infraštruktúru analýzy škodlivého softvéru: aktivuje sa iba v analytických prostrediach, kradne tokeny služieb cloudových metadát a skúma riadiace roviny Kubernetes a cloudové úložiská.
Primárny IOC zdieľaný medzi všetkými generáciami užitočného zaťaženia je koncový bod kolekcie. aaronstack[.]com/jules-collect.
Závažnosť: kritická.
Útok: Ako to funguje
Každý balík JulesJacker sa riadi rovnakou šablónou. package.json propaguje neškodný pomocník TypeScript s licenciou MIT a bez prepojeného repozitára zdrojového kódu. index.js exportuje niekoľko skutočných, funkčných funkcií – regulárne výrazy pre e-maily, mapy výčtov, tabuľky pravidiel pre lint – aby vývojár, ktorý balík skutočne importuje, videl vierohodné správanie. Zlomyseľnosť sa skrýva niekde inde: v po inštalácii háčik alebo v bloku v spodnej časti index.js ktorý sa vykoná v momente, keď je modul potrebný.
Užitočné zaťaženie prešlo jasne očíslovanými internými fázami (operátor si označuje vlastné telemetrické udalosti sc1-, sc3-, sc4-, a tak ďalej), a sledovanie tohto vývoja je najjasnejší spôsob, ako pochopiť kampaň.
Generácia 1–2: prieskum a krádež konfigurácie git
Najstaršie balíčky boli priamočiare informačno-kradnúce balíčky. Pri inštalácii zhromažďovali premenné prostredia, súbor hosts z rozhrania CLI GitHub a globálnu konfiguráciu gitu (git config –globálny –zoznam, git remote -v), potom odoslal balík do koncového bodu kolekcie. Tým sa vytvoril podpis operátora: titulný príbeh „nástroje na overovanie formulárov TypeScript“, odchádzajúci signál do jednej domény a záľuba v povereniach vývojárov namiesto údajov o spotrebiteľoch.
Generácia 3: hypervízor a únikové sondy jadra
Jedna verzia v polovici kampane sa tvrdo zamerala na útoky na infraštruktúru. Namiesto krádeže konfigurácie spustila prieskumné sondovanie postrojov. AF_VSOCK sokety, regióny Virtio MMIO, / dev / mem, a príznaky sprísňovania jadra a dokonca aj pokusy o zlyhanie jadra vyvolané funkciou sysrq – správanie spojené s pokusmi o opustenie virtuálneho počítača alebo kontajnera. Značky telemetrie (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-jadro-sonda) explicitne uviedol zámer. Tento variant bol jednoznačne zameraný na cloudové sandboxové a serverless-runnerové prostredia — druh prchavého virtuálneho počítača, ktorý vytvára a testuje nedôveryhodný kód.
Generácia 3 (SC3): červ na zápis medzi úložiskami
Ťažisko kampane sa stalo samovoľne sa šíriacim zlodejom repozitárov. Po inštalácii sa užitočné zaťaženie spustí v päťstupňovej časovo ohraničenej sekvencii:
- Stage 0 (~100 ms): odtlačok prsta hostiteľa — názov hostiteľa, informácie o používateľovi, identita git.
- Stage 1 (~3 s): určiť, do ktorej organizácie patrí obeť, na základe kontroly git remote -v, potom vyhľadajte pevne zakódovaný ORG_CONFIG prístup k tabuľke a testovaciemu repozitáru s git ls-vzdialený — smerované cez útočníkom ovládaný SSRF proxy server na adrese http://git@192.168.0.1:8080.
- Stage 2 (~10 s): git klon každý dosiahnuteľný repozitár v cieľovom zozname, tarball a gzip strom, kódovanie v base64 a extrahovanie chunk.
- Stage 3 (~45 s): „dôkaz o prístupe“ – naklonovať zapisovateľný repozitár, odstrániť súbor s názvom SECURITY-POC.md a commit s autorom nastaveným na google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> a úlohou správy: aktualizovať vyrovnávaciu pamäť závislostí a potom odoslať do hlavnej vetvy obete.
Zoznam cieľov v pevnom kóde nie je všeobecný. Obsahuje viac ako tridsať Shopify úložiská podľa názvu — Shopify/shopify, Shopify/identita, Shopify/fakturácia, Shopify/trezor, Shopify/tajomstvá, Shopify/infraštruktúra, Shopify/.githuba mnoho ďalších – spolu s testovacou organizáciou, AaronStackBarnes, ktorý operátor zrejme ovláda a používa ako cieľ zápisu.
Generácia 4 (SC4): šifrovaná a zabezpečená
Najnovší variant pre vývojárov pridáva k červu SC3 dve vrstvy úniku.
Po prvé, užitočné zaťaženie sa už neposiela ako obyčajný text. Skutočná logika sa nachádza v blobe šifrovanom pomocou AES-256-CBC, lib/.perf.dat, s IV v prvých šestnástich bajtoch. Zavádzač v index.js rekonštruuje dešifrovací kľúč zo zreťazených fragmentov reťazcov, dešifruje blob a spustí ho s nová funkcia()Dokonca aj názvy modulov sú rozdelené, aby sa predišlo statickým skenerom — vyžadovať('krypta' + 'o'), vyžadovať('f' + 's').
Po druhé, je zabezpečený obmedzene. Jeden variant dešifruje a spúšťa sa iba vtedy, keď os.názovhostiteľa() rovná vývojársky box or ubuntu-fc-uvm (predvolené nastavenie Firecracker microVM) alebo obsahuje podreťazec vývojársky boxĎalšia brána za prítomnosti .jules/ pracovný adresár:
Inými slovami, užitočné zaťaženie SC4 je navrhnuté tak, aby zostalo neaktívne na bežnom notebooku vývojára a prebudilo sa iba v rámci automatizovaného agenta umelej inteligencie. prostrediach sandboxov Prevádzkovateľ v skutočnosti chce dosiahnuť kompromis.
Zapnutie laboratória: variant analytickej infraštruktúry
Najnovejší balíček v kampani, pomocník pre výpočet ts, vôbec neútočí na vývojárov ani na Shopify. Jeho postinstall.sh otvára sa bránou, ktorá prezrádza hru:
Skript nerobí nič, pokiaľ nie je nastavená premenná prostredia špecifická pre platformu na analýzu škodlivého softvéru. Keď je nastavená, užitočné zaťaženie vie, že beží v sandboxe, ktorý existuje na detonáciu a štúdium balíkov presne ako tento – a vykoná protiútok.
Najprv stiahne token OAuth servisného účtu GCP zo servera metadát inštancie a extrahuje ho. Potom pomocou tohto tokenu vyhľadá Riadiaca rovina Kubernetes dosiahnuteľný na kubernetes.default.svc:
- vypíše viazania klastrov, klastrové roly a uzly;
- skúma pody, tajné zložky a konfiguračné mapy naprieč kube-systém, štandardné, kube-public, prenájom uzla kubea menný priestor analýzy;
- vydáva volania funkcie SelfSubjectAccessReview na presné mapovanie toho, čo je ukradnutá identita oprávnená robiť.
Nakoniec hrubou silou vynúti názvy kontajnerov služby Google Cloud Storage vytvorené z pevne zakódovaného ID projektu GCP (vzácny-signer-437603-p9) a číslo projektu, hádanie kombinácií ako napríklad *-zostavuje, *-artefakty, a niekoľko malátnosť- predpony (výsledky-malýzy, balíčky-malysis, skeny malysisKaždý kód odpovede a telo sa zaznamená a odošle späť na to isté jules-collect koncový bod.
Toto je zriedkavý prípad užitočného zaťaženia dodávateľského reťazca vytvoreného špeciálne na útok na vlastnú infraštruktúru obrancov. Krycí príbeh v celej kampani – ktorého fragmenty sa objavujú vo vnútri užitočných zaťažení ako komentáre rámujúce správanie ako „PoC bezpečnostného výskumu ... zápis medzi úložiskami cez preťažený token proxy git“ – je rovnakým sebazdôvodnením, či už je cieľom runtime monorepozitár Shopify alebo server metadát analytického klastra.
Časová os a migrácia rozsahu
JulesJacker nie je jednorazový zásah. Je to trvalá operácia, ktorá prežila odstránenie z registra jednoduchou zmenou názvu.
| Kedy | udalosť |
|---|---|
| Polovica apríla 2026 | Prvé balíky sa objavujú v pôvodnom rozsahu vydavateľa: TS-utility facade, environment a git-config exfiltration. |
| Začiatkom mája 2026 | Publikovaný hypervízor a variant prieskumu s únikom jadra. |
| Polovica až koniec mája 2026 | Červ SC3, ktorý sa zapisuje do rôznych repozitárov, sa objavuje popri úložných systémoch zameraných na Shopify. google-labs-jules[bot] zosobnenie. SC4 zavádza zavádzače šifrované AES a riadené hostiteľom. |
| Koniec mája 2026 | npm odstráni pôvodný rozsah vydavateľa; názvy balíkov sa prevedú na prázdne zástupné symboly uchovávajúce zabezpečenie. |
| Ten istý týždeň | Operátor migruje do takmer identického podobného rozsahu a znova publikuje červa vrátane variantu analytickej infraštruktúry. |
Obrancovia by sa mali zmieriť s migráciou. Zrušenie prvého puškohľadu neukončilo kampaň, ani ju nespomalilo. Prevádzkovateľ už spustil paralelný puškohľad, ktorého názov sa od pôvodného líši o jeden znak, a pokračoval v publikovaní v tom istom týždni. V čase písania tohto článku bol nový puškohľad... ts-form-utils (verzie 1.0.0 až 1.1.0), jeho ts-project-lint (1.0.0 a 1.1.0) a samostatný pomocník pre výpočet ts (1.0.0) zostávajú inštalovateľné.
Indikátory kompromisu
Všetky nižšie uvedené indikátory boli potvrdené oproti zdroju balíka.
| Typ | Indikátor | Poznámky |
|---|---|---|
| Sieť (C2) | aaronstack[.]com/jules-collect | Jeden koncový bod kolekcie naprieč každou generáciou; prijíma telemetriu JSON a tarballové súbory z repozitára base64-gzip. |
| Sieť (proxy SSRF) | http://git@192.168.0.1:8080 | Predná strana pre preťažený token proxy servera git, ktorý sa používa na dosiahnutie repozitárov cieľovej organizácie. |
| Sieť (cloud) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Používa sa iba variantom analytickej infraštruktúry na krádež tokenov a prieskum riadiacej roviny Kubernetes. |
| Identita | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Kovaný commit identita autora vložená do hlavných vetiev obete. |
| rezeň | lib/.perf.dat | Blob užitočného zaťaženia šifrovaný pomocou AES-256-CBC; IV uložený v prvých 16 bajtoch a kľúč rekonštruovaný dynamicky v index.js. |
| rezeň | SECURITY-POC.md | Padol a commitvrátené späť do úložísk obetí so správou chore: update dependency cache. |
| rezeň | scripts/postinstall.sh | Uzavreté $MALYSIS_ANALYSIS_IDidentifikuje variant zameraný na analytickú infraštruktúru. |
| behaviorálna | os.hostname() kontroly pre devbox / ubuntu-fc-uvm | Ochrana prostredia sandbox a AI-agent pred dešifrovaním a spustením užitočného zaťaženia. |
| behaviorálna | .jules/ a /app/.jules čítanie adresára | Explicitné zacielenie pracovných prostredí agentov umelej inteligencie. |
| behaviorálna | sc1-, sc3-, sc4-, s0-vmm-recon | Operátorom definované označenia telemetrických etáp užitočné na detekciu a lov. |
| Cieľ v cloude | rare-signer-437603-p9malysis-* hádanie z vedier | Pevne zakódované identifikátory projektov GCP a vzory enumerácie úložných priestorov vložené do variantu analytickej infraštruktúry. |
| Tvar balenia | Fasáda balíka TS-utility bez poľa repozitára | Konzistentná šablóna kampane: falošné balíky nástrojov TypeScript so škodlivými dátami vloženými do nich postinstall hooks alebo pripojené k index.js. |




