TL, DR
Egyetlen npm operátor hat hetet töltött hamis TypeScript „segédprogram” csomagok közzétételével, mint például ts-form-utils, ts-project-lintés ts-enum-helper.
Míg a csomagok kis, legitimnek tűnő validációs segítőket tesznek elérhetővé, a valódi hasznos tartalom telepítéskor vagy első igényléskor fut le, és elvégzi a gazdagép ujjlenyomat-vizsgálatát, a GitHub-szervezet felderítését, a tárház klónozását és a forráskód kiszűrését.
A rosszindulatú program kifejezetten a nagy értékű GitHub szervezeteket célozza meg, beleértve a több Shopify adattárakat, majd archiválja és kiszűri az elérhető forrásfákat egy központosított gyűjtővégpontba.
A kompromisszumos munkafolyamat részeként a hasznos teher commitsa fájl visszaállítása az áldozatok adattáraiba, miközben a Google autonóm kódoló identitását adta ki google-labs-jules[bot].
Nyomon követtük a kampányt – elnevezve JulesJacker — több kiadói hatókörön és legalább öt hasznos adatgeneráción keresztül, beleértve a titkosított és a sandbox-kompatibilis változatokat is.
A legújabb variáns kifejezetten a kártevő-elemző infrastruktúrát veszi célba: csak az elemzési környezetekben aktiválódik, ellopja a felhő metaadatainak szolgáltatásfiók-tokenjeit, és Kubernetes vezérlősíkokat és felhőtárhely-tárolóegységeket vizsgál.
Az összes hasznos adatgeneráció között megosztott elsődleges IOC a gyűjtési végpont. aaronstack[.]com/jules-collect.
Súlyosság: kritikus.
A támadás: Hogyan működik
Minden JulesJacker csomag ugyanazt a sablont követi. csomag.json egy jóindulatú TypeScript segítőt hirdet MIT licenccel és nem csatolt forráskódú adattárral. A index.js exportál egy maroknyi valós, működő függvényt – e-mail regexeket, enumerálási térképeket, lint szabálytáblákat –, hogy a csomagot importáló fejlesztő hihető viselkedést lásson. A rosszindulat máshol él: egy telepítés után horog, vagy egy blokk alján index.js amely akkor hajtódik végre, amikor a modulra szükség van.
A hasznos adatok egyértelműen számozott belső szakaszokon keresztül fejlődtek (az operátor saját telemetriai eseményeit címkézi fel sc1-, sc3-, sc4-, és így tovább), és ennek az evolúciónak a megfigyelése a kampány megértésének legtisztább módja.
1–2. generáció: felderítés és git-config lopás
A legkorábbi csomagok egyszerű információlopók voltak. Telepítéskor learatták a környezeti változókat, a GitHub CLI hosts fájlját és a globális git konfigurációt (git config –global –list, git remote -v), majd POST-olta a csomagot a gyűjtemény végpontjának. Ez létrehozta az operátor aláírását: egy „TypeScript űrlap-érvényesítési segédprogramok” címlapsztorit, egy kimenő jelzőt egyetlen domainhez, és ízlést a fejlesztői hitelesítő adatokra a fogyasztói adatok helyett.
3. generáció: hipervizor és kernel escape próbák
Az egyik kampány közbeni verzió erőteljesen az infrastrukturális támadások felé fordult. A konfiguráció ellopása helyett felderítő hardware-vizsgálatot futtatott. AF_VSOCK socketek, virtio MMIO régiók, / dev / mem, és kernel edzési jelzőket, sőt még sysrq által kiváltott kernel összeomlási kísérleteket is – ezek a virtuális gépből vagy konténerből való kitörési kísérletekhez kapcsolódó viselkedések. A telemetria címkék (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) egyértelművé tette a szándékot. Ez a változat egyértelműen a következőre irányult: felhőalapú sandbox és szerver nélküli futtatókörnyezetek — az a fajta rövid életű virtuális gép, amely nem megbízható kódot épít és tesztel.
3. generáció (SC3): a kereszt-repo író féreg
A kampány súlypontja egy önmagát terjesztő repo-tolvaj lett. Telepítéskor a hasznos adat egy ötlépcsős időzített sorozatot futtat le:
- Stage 0 (~100 ms): ujjlenyomat a gazdagépről — gazdagépnév, felhasználói információk, git identitás.
- Stage 1 (~3 s): az áldozat szervezethez való tartozásának meghatározása vizsgálattal git remote -v, majd keressen rá egy fixen kódolt ORG_CONFIG tábla- és tesztadattár-hozzáférés git ls-remote — egy támadó által vezérelt SSRF proxyn keresztül irányítva a következő címen: http://git@192.168.0.1:8080.
- Stage 2 (~10 s): git klón minden elérhető repositoryt a céllistában, tarball és gzip fájlokba csomagold a fát, base64 kódolásba helyezd, majd chunk-exfiltrate-eld.
- Stage 3 (~45 s): a „hozzáférés igazolása” – klónozunk egy írható adattárat, eldobunk egy SECURITY-POC.md nevű fájlt, és commit úgy, hogy a szerző a google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> legyen, és a következő üzenetet kell megjeleníteni: chore: update dependency cache, then push to the victim mainline ága.
A fixen kódolt céllista nem általános. Több mint harmincat sorol fel. Shopify név szerinti adattárak — Shopify/Shopify, Shopify/identitás, Shopify/számlázás, Shopify/boltozat, Shopify/titkok, Shopify/infrastruktúra, Shopify/.github, és még sok más – egy tesztszervezet mellett, AaronStackBarnes, amelyet az operátor látszólag vezérel, és írási célpontként használ.
4. generáció (SC4): titkosított és kapuzott
A legújabb, fejlesztőknek szánt változat kétféle elkerülési réteget ad hozzá az SC3 féreghez.
Először is, a hasznos adat már nem sima szövegként érkezik. A valódi logika egy AES-256-CBC titkosítású blobban található, lib/.perf.dat, az IV-vel az első tizenhat bájtban. A betöltő a index.js összefűzött karakterlánc-töredékekből rekonstruálja a visszafejtési kulcsot, visszafejti a blobot, és lefuttatja azt a következővel: új függvény()Még a modulnevek is fel vannak osztva, hogy elkerüljék a statikus szkennereket — require('kripta' + 'o'), require('f' + 's').
Másodszor, host-függő. Az egyik változat csak akkor dekódolja és fut le, amikor os.hostname() egyenlő fejlesztői doboz or ubuntu-fc-uvm (a Firecracker microVM alapértelmezett beállítása) vagy tartalmazza az alkarakterláncot fejlesztői dobozEgy másik kapu a jelenlétén múlik. .jules/ munkakönyvtár:
Más szóval, az SC4 hasznos adata úgy van kialakítva, hogy egy átlagos fejlesztő laptopján szunnyadjon, és csak az automatizált MI-ügynökben ébredjen fel. sandbox környezetek az üzemeltető valójában kompromisszumot akar kötni.
Laboratórium bekapcsolása: az elemzési infrastruktúra változat
A kampány legújszerűbb csomagja, ts-enum-helper, egyáltalán nem támadja a fejlesztőket vagy a Shopify-t. A postinstall.sh egy kapuval nyílik, ami elárulja a játékot:
A szkript nem csinál semmit, hacsak nincs beállítva egy, a kártevő-elemző platformra jellemző környezeti változó. Amikor ez megtörténik, a hasznos adat tudja, hogy a sandboxon belül fut, amely pontosan az ehhez hasonló csomagok felrobbantására és tanulmányozására szolgál – és ellentámadást indít.
Először lekéri a GCP szolgáltatásfiók OAuth tokenjét a példány metaadat-kiszolgálójáról, és kiszűri azt. Ezután a token segítségével átfésüli a Kubernetes vezérlősík elérhető itt: kubernetes.default.svc:
- felsorolja a ClusterRoleBindings, ClusterRoles és Node elemeket;
- probes podokat, titkokat és konfigurációs térképeket vizsgál kube-rendszer, alapértelmezett, kube-public, Kube-node-lease, és az elemzési névtér;
- SelfSubjectAccessReview hívásokat küld ki, hogy pontosan feltérképezze, mit tehet az ellopott identitás.
Végül brute-forcerekkel kényszeríti a Google Cloud Storage tárolóneveit, amelyek egy fixen kódolt GCP projektazonosítóból épülnek fel (ritka-aláíró-437603-p9) és a projekt száma, olyan kombinációk kitalálása, mint például *-buildek, *-tárgyak, és több malízis- előtagok (malysis-eredmények, malysis-csomagok, malysis-szkennelések). Minden válaszkód és törzs naplózásra kerül, és POST-ként visszaküldésre kerül ugyanarra a címre. jules-collect végpont.
Ez az a ritka eset, amikor egy ellátási láncban tárolt hasznos adatot kifejezetten a védők saját infrastruktúrájának megtámadására terveztek. A teljes kampányra kiterjedő fedősztori – amelynek részletei a hasznos adatokban megjegyzésekként jelennek meg, amelyek a viselkedést „Biztonsági kutatási PoC … kereszt-repo írás túlméretezett git proxy tokenen keresztül” keretezik – ugyanaz az önigazolás, függetlenül attól, hogy a futásidejű célpont egy Shopify monorepo vagy az elemzőklaszter metaadat-kiszolgálója.
Idővonal és a hatókör-migráció
A JulesJacker nem egyszeri eset. Egy tartós művelet, amely túlélte a rendszerleíró adatbázis eltávolítását egyszerűen a nevének megváltoztatásával.
| Amikor | esemény |
|---|---|
| 2026. április közepe | Az első csomagok az eredeti kiadói hatókör alatt jelennek meg: TS-utility facade, environment és git-config exfiltration. |
| 2026 május eleje | Hipervizor és kernel-escape felderítő változat publikálása. |
| 2026. május közepe-vége | Az SC3 keresztrepo írási féreg a Shopify által célzott hasznos adatok mellett jelenik meg. google-labs-jules[bot] megszemélyesítés. Az SC4 bevezeti az AES titkosítású és a hoszt által vezérelt betöltőket. |
| 2026. május vége | Az npm eltávolítja az eredeti közzétevői hatókört; a csomagnevek üres biztonságot tároló helyőrzőkké oldódnak fel. |
| Ugyanazon a héten | Az operátor egy közel azonos, hasonló hatókörre vált, és újra közzéteszi a férget, beleértve az elemző infrastruktúra variánst is. |
A migráció az a rész, amivel a védőknek foglalkozniuk kellene. Az első látószög eltávolítása nem vetett véget a kampánynak, sőt, még csak nem is lassította azt. Az üzemeltető már elkészített egy párhuzamos látószöget, amelynek a neve egyetlen karakterben eltér az eredetitől, és még ugyanazon a héten folytatta a publikálást. E sorok írásakor az új látószög... ts-form-utils (1.0.0-tól 1.1.0-ig terjedő verziók), annak ts-project-lint (1.0.0 és 1.1.0), valamint az önálló verzió ts-enum-helper (1.0.0) továbbra is telepíthetőek.
A kiegyezés mutatói
Az alábbi összes mutatót a csomag forrásával szemben ellenőriztük.
| típus | Mutató | Megjegyzések |
|---|---|---|
| Hálózat (C2) | aaronstack[.]com/jules-collect | Egyetlen gyűjtési végpont minden generáción keresztül; JSON telemetriát és base64-gzip adattár tarball chunkokat fogad. |
| Hálózat (SSRF proxy) | http://git@192.168.0.1:8080 | Egy túlméretezett git proxy token előlapja, amelyet a célszervezet adattárainak eléréséhez használnak. |
| Hálózat (felhő) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Kizárólag az elemzési infrastruktúra változat használja tokenlopáshoz és Kubernetes vezérlősík-felderítéshez. |
| Identitás | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Kovácsolt commit a szerzői identitás az áldozat fővonalának ágaiba tolódott. |
| filé | lib/.perf.dat | AES-256-CBC titkosítású hasznos adatblokk; az IV az első 16 bájtban tárolódik, és a kulcs dinamikusan rekonstruálódik a index.js. |
| filé | SECURITY-POC.md | Leesett és commitvisszakerült az áldozatok adattárába az üzenettel chore: update dependency cache. |
| filé | scripts/postinstall.sh | Kapuval $MALYSIS_ANALYSIS_ID; az elemzési infrastruktúrát célzó változatot azonosítja. |
| viselkedési | os.hostname() ellenőrzi devbox / ubuntu-fc-uvm | A sandbox és a mesterséges intelligencia által vezérelt környezet kapuzása a hasznos adatok dekódolása és végrehajtása előtt. |
| viselkedési | .jules/ és a /app/.jules könyvtár beolvasása | Az AI-ügynök munkaterület-környezeteinek explicit célzása. |
| viselkedési | sc1-, sc3-, sc4-, s0-vmm-recon | Az operátor által definiált telemetriai szakaszcímkék hasznosak az észleléshez és a kereséshez. |
| Felhőcél | rare-signer-437603-p9malysis-* vödör tippek | Az elemzési infrastruktúra változatba ágyazott, fixen kódolt GCP projektazonosítók és tárolóvödör-enumerációs minták. |
| Csomag alakja | TS-segédprogramcsomag homlokzata tárolómező nélkül | Konzisztens kampánysablon: hamis TypeScript segédprogramcsomagok beágyazott rosszindulatú hasznos adatokkal postinstall hooks vagy hozzáfűzve index.js. |




