JulesJacker: Fałszywy robak npm podszywa się pod sztuczną inteligencję Julesa

JulesJacker: robak npm o nazwie Fake-PoC, który podszywa się pod agenta Jules firmy Google i uruchamia piaskownicę, aby go przeanalizować

TL; DR

Jeden operator npm spędził sześć tygodni na publikowaniu fałszywych pakietów narzędziowych TypeScript, takich jak ts-form-utils, ts-project-lint, ts-enum-helper.

Podczas gdy pakiety udostępniają niewielkie, wyglądające na legalne, narzędzia pomocnicze do walidacji, prawdziwy ładunek jest wykonywany podczas instalacji lub pierwszego żądania i przeprowadza odcisk palca hosta, wyszukiwanie organizacji w serwisie GitHub, klonowanie repozytoriów i eksfiltrację kodu źródłowego.

Szkodliwe oprogramowanie jest szczególnie wymierzone w organizacje GitHub o dużej wartości, w tym wiele Shopify repozytoria, a następnie archiwizuje i eksfiltruje dostępne drzewa źródłowe do scentralizowanego punktu końcowego kolekcji.

W ramach przepływu pracy kompromisowego ładunek commitplik sa z powrotem do repozytoriów ofiar, podszywając się pod autonomiczną tożsamość kodowania Google google-labs-jules[bot].

Śledziliśmy kampanię — nazwaną JulesJacker — w zakresach wielu wydawców i co najmniej pięciu generacji danych, w tym wariantów szyfrowanych i obsługujących środowisko testowe.

Najnowsza wersja jest ukierunkowana konkretnie na infrastrukturę analizy złośliwego oprogramowania: aktywuje się tylko w środowiskach analitycznych, kradnie tokeny kont usług metadanych w chmurze i bada płaszczyzny sterowania Kubernetes oraz kontenery pamięci masowej w chmurze.

Podstawowym wskaźnikiem IOC współdzielonym przez wszystkie generacje ładunków jest punkt końcowy zbioru aaronstack[.]com/jules-collect.

Stopień zagrożenia: krytyczny.

Atak: Jak to działa

Każdy pakiet JulesJacker opiera się na tym samym szablonie. pakiet.json reklamuje nieszkodliwy program pomocniczy TypeScript z licencją MIT i bez powiązanego repozytorium źródłowego. indeks.js Eksportuje garść prawdziwych, działających funkcji — wyrażenia regularne e-mail, mapy wyliczeń, tabele reguł lint — dzięki czemu programista, który faktycznie importuje pakiet, widzi prawdopodobne zachowanie. Złośliwość tkwi gdzie indziej: w po instalacji haczyk lub w bloku na dole indeks.js który jest wykonywany w momencie, gdy wymagany jest moduł.

Ładunki ewoluowały poprzez wyraźnie ponumerowane etapy wewnętrzne (operator oznacza własne zdarzenia telemetryczne) sc1-, sc3-, sc4-itd.), a obserwowanie tej ewolucji jest najwyraźniejszym sposobem zrozumienia kampanii.

 Generacja 1–2: rozpoznanie i kradzież git-config

Najwcześniejsze pakiety były prostymi kradnącymi informacje. Podczas instalacji zbierały zmienne środowiskowe, plik hosts GitHub CLI i globalną konfigurację git (git config –global –list, git remote -v), a następnie przesłał pakiet do punktu końcowego kolekcji. To ustanowiło podpis operatora: historię o „narzędziach do walidacji formularzy TypeScript”, sygnał wychodzący do pojedynczej domeny i preferencję dla danych uwierzytelniających programistów zamiast danych konsumentów.

Generacja 3: sondy ucieczki hiperwizora i jądra

Jedna z wersji w trakcie kampanii mocno skupiła się na atakach na infrastrukturę. Zamiast kraść konfigurację, uruchomiła sondę rozpoznawczą AF_VSOCK gniazda, regiony MMIO virtio, / dev / mem, flagi utwardzania jądra, a nawet próby awarii jądra wywołane przez sysrq — zachowania związane z próbami wyjścia z maszyny wirtualnej lub kontenera. Tagi telemetryczne (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) wyraźnie określił intencję. Ten wariant miał wyraźnie na celu środowiska chmurowe-sandbox i serwerless-runner — rodzaj tymczasowej maszyny wirtualnej, która tworzy i testuje niezaufany kod.

Generacja 3 (SC3): robak zapisujący dane międzyrepozycyjnie

Centrum ciężkości kampanii stało się samonapędzającym się złodziejem repozytorium. Po instalacji ładunek uruchamia pięcioetapową sekwencję czasową:

  • Etap 0 (~100 ms): odcisk palca hosta — nazwa hosta, informacje o użytkowniku, tożsamość git.
  • Etap 1 (~3 s): poprzez inspekcję określ, do której organizacji należy ofiara git remote -v, a następnie wyszukaj zakodowany na stałe ORG_CONFIG dostęp do tabeli i repozytorium testowego za pomocą git ls-remote — kierowane przez serwer proxy SSRF kontrolowany przez atakującego http://git@192.168.0.1:8080.
  • Etap 2 (~10 sekund): git clone każde osiągalne repozytorium na liście docelowej, spakuj drzewo za pomocą tarballa i gzipa, zakoduj je przy użyciu base64 i wyekstrahuj fragment.
  • Etap 3 (~45 s): „dowód dostępu” — sklonuj repozytorium z możliwością zapisu, upuść plik o nazwie SECURITY-POC.md i commit z autorem ustawionym na google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> i zadaniem komunikatu: aktualizuj pamięć podręczną zależności, a następnie prześlij do głównej gałęzi ofiary.

Zakodowana na stałe lista celów nie jest generyczna. Zawiera ponad trzydzieści Shopify repozytoria według nazwy — Shopify/Shopify, Shopify/tożsamość, Shopify/rozliczenia, Shopify/Vault, Shopify/secrets, Shopify/infrastruktura, Shopify/.githubi wiele innych — wraz z organizacją testową, AaronStackBarnes, który operator wydaje się kontrolować i używać jako celu zapisu.

Generacja 4 (SC4): szyfrowana i bramkowana

Najnowsza wersja przeznaczona dla deweloperów dodaje dwie warstwy obejścia robaka SC3.

Po pierwsze, ładunek nie jest już wysyłany w postaci zwykłego tekstu. Prawdziwa logika znajduje się w blobie zaszyfrowanym algorytmem AES-256-CBC, lib/.perf.dat, z IV w pierwszych szesnastu bajtach. Ładowarka w indeks.js rekonstruuje klucz deszyfrujący z połączonych fragmentów ciągu, odszyfrowuje obiekt i uruchamia go za pomocą nowa Funkcja()Nawet nazwy modułów są podzielone, aby uniknąć statycznych skanerów — wymagaj('crypt' + 'o'), wymagaj('f' + 's').

Po drugie, jest bramkowany przez hosta. Jedna z wersji odszyfrowuje i uruchamia się tylko wtedy, gdy os.hostname() równa się devbox or ubuntu-fc-uvm (domyślny Firecracker microVM) lub zawiera podciąg devbox. Kolejne bramy o obecności .jules/ katalog roboczy:

Innymi słowy, ładunek SC4 został zaprojektowany tak, aby pozostawał uśpiony na laptopie zwykłego programisty i budził się dopiero w zautomatyzowanym agencie AI i środowiska piaskownicy operator tak naprawdę chce pójść na kompromis.

Włączanie laboratorium: wariant analizy i infrastruktury

Najbardziej nowatorski pakiet w kampanii, ts-enum-helper, w ogóle nie atakuje programistów ani Shopify. postinstall.sh rozpoczyna się bramą, która zdradza zasady gry:

Skrypt nie robi nic, dopóki nie zostanie ustawiona zmienna środowiskowa specyficzna dla platformy do analizy złośliwego oprogramowania. W takim przypadku ładunek wie, że działa w piaskownicy, której celem jest detonowanie i badanie pakietów dokładnie takich jak ten — i kontratakuje.

Najpierw pobiera token OAuth konta usługi GCP z serwera metadanych instancji i go eksfiltruje. Następnie, używając tego tokenu, Płaszczyzna sterowania Kubernetes osiągalny w kubernetes.domyślny.svc:

  • wyświetla ClusterRoleBindings, ClusterRoles i Nodes;
  • sonduje kontenery, sekrety i mapy konfiguracji system kube, domyślnym, kube-public, dzierżawa węzła kubei przestrzeń nazw analizy;
  • wydaje polecenia SelfSubjectAccessReview w celu dokładnego odwzorowania tego, co skradziona tożsamość może zrobić.

Na koniec wymusza nazwy kontenerów Google Cloud Storage utworzone na podstawie zakodowanego na stałe identyfikatora projektu GCP (rzadki-sygnatariusz-437603-p9) i numer projektu, odgadując kombinacje takie jak *-buduje, *-artefaktyi kilka malysis- prefiksy (wyniki-malise, pakiety malysis, skany malysis-scans). Każdy kod i treść odpowiedzi są rejestrowane i wysyłane z powrotem do tego samego jules-collect punkt końcowy.

To rzadki przypadek ładunku łańcucha dostaw stworzonego specjalnie w celu zaatakowania infrastruktury obrońców. Historia okładkowa całej kampanii – której fragmenty pojawiają się wewnątrz ładunków jako komentarze opisujące zachowanie jako „PoC badań bezpieczeństwa… zapis międzyrepozycyjny za pośrednictwem tokena proxy Git o rozszerzonym zakresie” – jest tym samym samousprawiedliwieniem, niezależnie od tego, czy celem środowiska wykonawczego jest monorepozytorium Shopify, czy serwer metadanych klastra analitycznego.

Oś czasu i zakres migracji

JulesJacker nie jest jednorazowym wybrykiem. To ciągła operacja, która przetrwała usunięcie z rejestru, po prostu zmieniając nazwę.

Kiedy wydarzenie
Połowa kwietnia 2026 r. Pierwsze pakiety pojawiają się w zakresie oryginalnego wydawcy: TS-utility fasada, środowisko i eksfiltracja git-config.
Początek maja 2026 r. Opublikowano wariant rozpoznawczy hiperwizora i ucieczki jądra.
Od połowy do końca maja 2026 r. Robak SC3 do zapisu międzyrepozycyjnego pojawia się obok ładunków ukierunkowanych na Shopify i google-labs-jules[bot] podszywanie się. SC4 wprowadza szyfrowane AES i bramkowane przez hosta ładowarki.
Koniec maja 2026 r. npm usuwa oryginalny zakres wydawcy; nazwy pakietów są rozwiązywane jako puste symbole zastępcze zabezpieczające.
Ten sam tydzień Operator migruje do niemal identycznego zakresu i ponownie publikuje robaka, łącznie z wariantem infrastruktury analitycznej.

Migracja to część, na której powinni skupić się obrońcy. Zlikwidowanie pierwszego zakresu nie zakończyło kampanii ani nawet jej nie spowolniło. Operator przygotował już równoległy zakres, którego nazwa różni się od oryginału o jeden znak, i kontynuował publikację w tym samym tygodniu. W chwili pisania tego tekstu, nowy zakres… narzędzia ts-form (wersje od 1.0.0 do 1.1.0), jego ts-projekt-lint (1.0.0 i 1.1.0) oraz wersja samodzielna ts-enum-helper (1.0.0) pozostają możliwe do zainstalowania.

Wskaźniki kompromisu

Wszystkie poniższe wskaźniki zostały potwierdzone w odniesieniu do źródła pakietu.

Typ Wskaźnik Komentarz
Sieć (C2) aaronstack[.]com/jules-collect Pojedynczy punkt końcowy kolekcji dla każdego pokolenia; odbiera dane telemetryczne w formacie JSON i fragmenty archiwum tarball repozytorium base64-gzip.
Sieć (serwer proxy SSRF) http://git@192.168.0.1:8080 Strona główna dla tokena proxy git o rozszerzonym zakresie, używanego do uzyskiwania dostępu do repozytoriów organizacji docelowych.
Sieć (chmura) metadata.google.internal/computeMetadata/v1
kubernetes.default.svc
storage.googleapis.com/storage/v1/b
Używane wyłącznie przez wariant infrastruktury analitycznej do kradzieży tokenów i rozpoznania płaszczyzny sterowania Kubernetes.
tożsamość google-labs-jules[bot]
161369871+google-labs-jules[bot]@users.noreply.github.com
Sfałszowany commit tożsamość autora została przeniesiona do głównych gałęzi linii ofiary.
filet lib/.perf.dat Blob danych zaszyfrowany algorytmem AES-256-CBC; IV zapisany w pierwszych 16 bajtach i klucz zrekonstruowany dynamicznie w index.js.
filet SECURITY-POC.md Upuszczono i commitz powrotem do repozytoriów ofiar z wiadomością chore: update dependency cache.
filet scripts/postinstall.sh Zamknięte $MALYSIS_ANALYSIS_ID; identyfikuje wariant ukierunkowany na infrastrukturę analizy.
Behawioralny os.hostname() czeki na devbox / ubuntu-fc-uvm Środowisko sandbox i agenta AI jest blokowane przed odszyfrowaniem i wykonaniem ładunku.
Behawioralny .jules/ oraz /app/.jules odczyty katalogowe Wyraźne ukierunkowanie na środowiska robocze agentów AI.
Behawioralny sc1-, sc3-, sc4-, s0-vmm-recon Zdefiniowane przez operatora etykiety etapów telemetrii, przydatne do wykrywania i polowania.
Cel chmury rare-signer-437603-p9
malysis-* zgadywanie wiader
Zakodowane na stałe identyfikatory projektu GCP i wzorce wyliczania kontenerów pamięci masowej osadzone w wariancie infrastruktury analizy.
Kształt opakowania Fasada pakietu TS-utility bez pola repozytorium Spójny szablon kampanii: fałszywe pakiety narzędzi TypeScript z osadzonymi w nich złośliwymi ładunkami postinstall hooks lub dołączone do index.js.
sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz swoje oprogramowanie i dostarczanie

z pakietem produktów Xygeni