TL; DR
Een eenzegen npm-Operateur huet sechs Woche laang gefälschte TypeScript-"Utility"-Pakete publizéiert, wéi zum Beispill ts-form-utils, ts-project-lint, an ts-enum-helper.
Wärend d'Packagen kleng, legitim ausgesinn Validatiounshëllefer weisen, gëtt déi richteg Payload bei der Installatioun oder der éischter Ufro ausgeführt a féiert Host-Fingerprinting, GitHub-Organisatiounsentdeckung, Repository-Klonen an Quellcode-Exfiltratioun duerch.
D'Malware zielt speziell op héichwäerteg GitHub-Organisatiounen of, dorënner verschidde ... Shopify Repositories, archivéiert an exfiltréiert dann erreechbar Quellbeem op en zentraliséierten Sammlungsendpunkt.
Als Deel vum Kompromëss-Workflow ass d'Notzlaascht commitsa-Datei zréck an d'Afferrepositories späicheren, während se sech als Google seng autonom programméierend Identitéit ausginn. google-labs-jules[bot].
Mir hunn d'Campagne verfollegt - genannt JulesJacker — iwwer verschidde Publisher-Scopes a mindestens fënnef Payload-Generatiounen, dorënner verschlësselte a Sandbox-bewosst Varianten.
Déi neist Variant zielt speziell op d'Infrastruktur vun der Malware-Analyse of: si aktivéiert nëmmen an Analyseëmfeld, klaut Cloud-Metadaten-Service-Kont-Tokens a ënnersicht Kubernetes-Kontrollplanen a Cloud-Späicherbucketen.
Den primären IOC, deen iwwer all Payload-Generatiounen gedeelt gëtt, ass den Endpunkt vun der Sammlung. aaronstack[.]com/jules-collect.
Schwéiergrad: kritesch.
Den Ugrëff: Wéi et funktionéiert
All JulesJacker-Package follegt der selwechter Schabloun. Package.json annoncéiert en net-verbonnenen TypeScript-Hëllefer mat enger MIT-Lizenz a kee verlinkte Quellcode-Repository. index.js exportéiert eng Handvoll richteg, funktionéierend Funktiounen - E-Mail-Regexen, Enum-Kaarten, Lint-Regeltabellen - sou datt en Entwéckler, deen de Pak tatsächlech importéiert, e plausibelt Verhalen gesäit. Déi béiswëlleg Situatioun ass soss anzwousch: an engem no der Installatioun Haken, oder an engem Block um Buedem vun index.js deen ausféiert soubal de Modul gebraucht gëtt.
D'Notzlaaschtunge sinn duerch kloer nummeréiert intern Etappen entwéckelt ginn (den Operateur beschreift seng eege Telemetrie-Evenementer sc1-, sc3-, sc4-, asw.), an dës Evolutioun ze beobachten ass de kloerste Wee fir d'Campagne ze verstoen.
Generatioun 1–2: Opklärung a Git-Config-Déifstall
Déi éischt Pakete waren einfach Infostealer. Bei der Installatioun hunn si Ëmweltvariablen, d'GitHub CLI Hosts Datei an déi global Git Konfiguratioun () gesammelt.git config –global –list, git Remote -v), an dann de Bundle op den Endpunkt vun der Kollektioun POSTéiert. Dëst huet d'Ënnerschrëft vum Bedreiwer etabléiert: eng Coverstory vun "TypeScript Form Validation Utilities", en Outbound Beacon op eng eenzeg Domain, an e Virléift fir Entwécklerdaten amplaz vu Konsumentendaten.
Generatioun 3: Hypervisor- a Kernel-Escape-Proben
Eng Versioun vun der Mëtt vun der Kampagne huet sech staark op Infrastrukturattacken konzentréiert. Amplaz d'Konfiguratioun ze klauen, huet se eng Erkundungs-Harnware-Sond duerchgefouert. AF_VSOCK Sockets, Virtio MMIO Regiounen, / Dev / Mem, a Kernel-Hardening-Flags, a souguer versich, vu Sysrq ausgeléist Kernel-Abstürze – Verhalen, dat mat Versich verbonnen ass, aus enger virtueller Maschinn oder engem Container erauszebriechen. D'Telemetrie-Tags (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-Kernel-Sond) huet d'Intentioun explizit gemaach. Dës Variant war kloer drop ausgeriicht Cloud-Sandbox- a Serverless-Runner-Ëmfeld — déi Zort vun ephemerer VM, déi net vertrauenswürdege Code erstellt an testt.
Generatioun 3 (SC3): de Cross-Repo-Schreiwwurm
De Schwéierpunkt vun der Kampagne ass zu engem selbstverbreetende Repo-Déif ginn. Bei der Installatioun leeft d'Payload eng fënnefstufeg Zäitsequenz:
- Stage 0 (~100 ms): Fangerofdrock vum Host - Hostnumm, Benotzerinformatiounen, Git-Identitéit.
- Stage 1 (~3 s): bestëmmt zu wéi enger Organisatioun d'Affer gehéiert andeems Dir d'Inspektioun maacht git Remote -v, da kuckt no engem Hardcode ORG_CONFIG Zougang zu Tabellen an Testrepositories mat git ls-remote — iwwer en vun Ugräifer kontrolléierten SSRF Proxy geroutéiert op http://git@192.168.0.1:8080.
- Stage 2 (~10 Sekonnen): Gitt Klon all erreechbar Repository an der Zillëscht, tarball a gzip de Bam, base64-encodéiert en, a Chunk-exfiltréiert en.
- Stage 3 (~45 s): den "Beweis vum Zougang" - e beschrëftbare Repo klonen, eng Datei mam Numm SECURITY-POC.md späicheren, an commit et mam Auteur gesat op google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> an der Noriicht chore: update dependency cache, dann push op d'Haaptbranch vum Affer.
Déi fest kodéiert Zillëscht ass net generesch. Si zielt méi wéi drësseg op. Shopify Repositories no Numm - Shopify/Shopify, Shopify/Identitéit, Shopify/Fakturatioun, Shopify/Tresor, Shopify/Geheimnisser, Shopify/Infrastruktur, Shopify/.github, a vill méi - zesumme mat enger Testorganisatioun, AaronStackBarnes, déi den Operator ze kontrolléieren schéngt a als Schreifziler benotzt.
Generatioun 4 (SC4): verschlësselt a gegated
Déi neist Variant, déi op Entwéckler geriicht ass, füügt zwou Schichten vun Ausweilung uewen um SC3-Wuerm bäi.
Éischtens gëtt d'Payload net méi als Klartext geliwwert. Déi richteg Logik läit an engem AES-256-CBC-verschlësselte Blob, lib/.perf.dat, mam IV an den éischte sechzéng Bytes. De Loader an index.js rekonstruéiert den Entschlësselungsschlëssel aus zesummegefaasste Stringfragmenter, entschlësselt de Blob a leeft en aus mat nei Funktioun()Souguer d'Modulinimm sinn opgedeelt fir statesch Scanneren ze vermeiden — erfuerderen('crypt' + 'o'), erfuerderen('f' + 's').
Zweetens, et ass Host-gated. Eng Variant entschlësselt a leeft nëmmen wann os.hostname() gläicht Devbox or ubuntu-fc-uvm (e Firecracker microVM Standard) oder enthält den Ënnerstring Devbox. En anert Paart op d'Präsenz vun engem .jules/ Aarbechtsverzeichnis:
An anere Wierder, d'SC4-Payload ass sou konzipéiert, datt se um Laptop vun engem normale Entwéckler dormant bleift an nëmmen am automatiséierten KI-Agent opweckt. Sandkëscht Ëmfeld Den Operateur wëll tatsächlech e Kompromëss maachen.
De Laboratoire uschalten: d'Variant vun der Analyse an der Infrastruktur
Déi neist Pakett an der Kampagne, ts-enum-Hëllefer, attackéiert guer keng Entwéckler oder Shopify. Seng postinstall.sh mécht mat engem Tor op, dat d'Spill verréit:
De Skript mécht näischt, ausser wann eng Ëmweltvariabel spezifesch fir eng Malware-Analyseplattform gesat ass. Wann dat de Fall ass, weess d'Payload, datt se an der Sandbox leeft, déi existéiert fir Paketen genau wéi dësen ze detonéieren an ze studéieren - an et geet an Géigeattacken.
Et zitt als éischt den OAuth-Token vum GCP-Service-Kont vum Instanz-Metadaten-Server an exfiltréiert en. Dann, mat deem Token, scannt et den Kubernetes Kontroll Fliger erreechbar um kubernetes.default.svc:
- lëscht ClusterRoleBindings, ClusterRoles an Noden op;
- ënnersicht Pods, Geheimnisser a Configuratiounskaarten Kube-System, Standarddrécker, Kube-ëffentlech, Kube-Node-Leasing, an den Analyse-Namespace;
- mécht SelfSubjectAccessReview-Uruff aus, fir genee ze kartéieren, wat déi geklaut Identitéit maache däerf.
Schlussendlech brute-forceert et Google Cloud Storage Bucket Nimm, déi aus enger hardcoded GCP Projet ID gebaut sinn (rar-ënnerschreiwer-437603-p9) an d'Projetnummer, andeems Kombinatioune wéi z.B. *-baut, *-Artefakten, a verschidde Malyse- Präfixer (Malyse-Resultater, malysis-Paketen, Malyse-Scans). All Äntwertcode a Kierper gëtt protokolléiert an zréck op déiselwecht POST geschéckt jules-collect Ennpunkt.
Dëst ass de rare Fall vun enger Supply-Chain-Payload, déi speziell fir d'Attack vun den eegenen Infrastrukture vun den Verdeedeger entwéckelt gouf. D'Coverstory iwwer déi ganz Kampagne - Fragmenter dovun erschéngen an de Payloads als Kommentarer, déi d'Verhalen als e "Security Research PoC ... Cross-Repo Write via Overscoped Git Proxy Token" definéieren - ass déiselwecht Selbstgerechtfäerdegung, egal ob d'Runtime-Zil e Shopify Monorepo oder de Metadaten-Server vum Analysecluster ass.
Zäitplang & d'Migratioun vum Scope
JulesJacker ass keen One-Shot-Drop. Et ass eng laangfristeg Operatioun, déi en Registry-Terminal iwwerstanen huet, andeems einfach säin Numm geännert gouf.
| Wéini | Héichwaasser |
|---|---|
| Mëtt Abrëll 2026 | Déi éischt Pakete erschéngen ënnert dem urspréngleche Publisher-Scope: TS-utility Facade, Environment a git-config Exfiltration. |
| Ufank Mee 2026 | Hypervisor a Kernel-Escape Reconnaissance Variant publizéiert. |
| Mëtt bis Enn Mee 2026 | De SC3 Cross-Repo-Schreiwwurm erschéngt niewent Shopify-gezielte Payloads an google-labs-jules[bot] Imitatioun. SC4 stellt AES-verschlësselte a Host-gated Loader vir. |
| Enn Mee 2026 | npm läscht den urspréngleche Publisher-Scope; Paketnimm gi fir eidel Sécherheetshalter op. |
| Déi selwecht Woch | Den Operateur migréiert op e bal identeschen Ausgesinn a publizéiert de Wuerm nei, inklusiv der Variant vun der Analyse-Infrastruktur. |
D'Migratioun ass den Deel, mat deem d'Verdeedeger sech musse beschäftegen. Den Ofbau vum éischte Scope huet d'Campagne net beendet oder souguer verlangsamt. Den Operateur hat schonn e parallele Scope inszenéiert, deem säin Numm sech ëm een eenzege Zeechen vum Original ënnerscheet, an huet an der selwechter Woch weider publizéiert. Zum Zäitpunkt vun dësem Schreiwen ass den neie Scope... ts-form-utils (Versiounen 1.0.0 bis 1.1.0), seng ts-projet-lint (1.0.0 an 1.1.0), an den Standalone-Versioun ts-enum-Hëllefer (1.0.0) bleiwen installéierbar.
Indicateuren vun Kompromëss
All Indikatoren hei ënnendrënner goufen géint d'Packagequell bestätegt.
| Type | Luucht | Notes |
|---|---|---|
| Netzwierk (C2) | aaronstack[.]com/jules-collect | Eenzel Kollektiouns-Endpunkt iwwer all Generatioun; empfängt JSON-Telemetrie a base64-gzip-Repository-Tarball-Chips. |
| Netzwierk (SSRF Proxy) | http://git@192.168.0.1:8080 | Front fir en iwwerdimensionéierten Git-Proxy-Token, deen benotzt gëtt fir d'Repositories vun der Zilorganisatioun z'erreechen. |
| Netzwierk (Cloud) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | Nëmme vun der Analyse-Infrastruktur-Variant fir Token-Déifstall a Kubernetes Kontrollplang-Erkundung benotzt. |
| Identitéit | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | Forged commit Autorenidentitéit an d'Haaptfilialen vun den Affer gedréckt. |
| Fichier | lib/.perf.dat | AES-256-CBC-verschlësselte Payload-Blob; IV an den éischten 16 Bytes gespäichert an de Schlëssel dynamesch rekonstruéiert an index.js. |
| Fichier | SECURITY-POC.md | Falen gelooss an commitmat der Noriicht zréck an d'Afferrepositories geschéckt chore: update dependency cache. |
| Fichier | scripts/postinstall.sh | Zougemaach $MALYSIS_ANALYSIS_ID; identifizéiert d'Variant vun der Analyse-Infrastruktur-Zilsetzung. |
| Verhalen | os.hostname() kontrolléiert fir devbox / ubuntu-fc-uvm | Sandbox- a KI-Agenten-Ëmfeld-Gating virun der Entschlësselung an der Ausféierung vun der Payload. |
| Verhalen | .jules/ an /app/.jules Verzeichnis liest | Explizit Zilsetzung vun KI-Agenten-Workspace-Ëmfeld. |
| Verhalen | sc1-, sc3-, sc4-, s0-vmm-recon | Vum Operator definéiert Telemetrie-Stufe-Bezeechnungen, déi nëtzlech fir Detektioun a Juegd sinn. |
| Zil an der Wollek | rare-signer-437603-p9malysis-* Eemer-Rate | Hardcodéiert GCP-Projetidentifikatoren a Späicher-Bucket-Opzielungsmuster, déi an der Analyse-Infrastruktur-Variant integréiert sinn. |
| Form vum Pak | TS-Utility-Package-Fassad ouni Repository-Feld | Konsequent Kampagnevirlag: gefälschte TypeScript-Utility-Pakete mat béiswëllege Payloads, déi agebett sinn postinstall hooks oder ugehaange ginn index.js. |




