JulesJacker: Gefälschten NPM-Wuerm imitéiert Jules AI

JulesJacker: E Fake-PoC npm-Wurm, deen sech als de Jules Agent vu Google ausgëtt - an d'Sandbox analyséiert.

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/v1
kubernetes.default.svc
storage.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-p9
malysis-* 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.
sca-tools-software-zesummesetzungsanalyse-tools
Prioritäriséiert, behënnert a séchert Är Softwarerisiken
Kritt Äre gratis Kont.
Kee Kreditkaart erfuerderlech.

Séchert Är Softwareentwécklung a Liwwerung

mat der Xygeni Produkt Suite