JulesJacker: Un vierme npm fals se dă drept IA lui Jules

JulesJacker: Un vierme npm cu fake-PoC care se dă drept agentul Jules de la Google și activează sandbox-ul în timp ce îl analizează

TL; DR

Un singur operator npm a petrecut șase săptămâni publicând pachete „utilitare” TypeScript false, cum ar fi ts-form-utils, ts-project-lint și ts-enum-helper.

În timp ce pachetele expun mici instrumente de validare cu aspect legitim, sarcina utilă reală se execută la instalare sau la prima solicitare și efectuează amprentarea gazdei, descoperirea organizațiilor GitHub, clonarea depozitului și exfiltrarea codului sursă.

Malware-ul vizează în mod specific organizațiile GitHub de mare valoare, inclusiv mai multe Shopify depozite, apoi arhivează și exfiltrează arborii sursă accesibili către un endpoint de colectare centralizat.

Ca parte a fluxului de lucru compromis, sarcina utilă commitfișierul sa înapoi în depozitele victimelor, în timp ce se preface că este identitatea de codare autonomă a Google google-labs-jules[bot].

Am urmărit campania — numită JulesJacker — în mai multe domenii de aplicare ale editorilor și în cel puțin cinci generații de sarcini utile, inclusiv variante criptate și compatibile cu sandbox-ul.

Cea mai nouă variantă vizează în mod specific infrastructura de analiză a programelor malware: se activează doar în mediile de analiză, fură token-uri de cont de serviciu pentru metadatele cloud și sondează planurile de control Kubernetes și compartimentele de stocare în cloud.

IOC-ul principal, partajat între toate generațiile de sarcini utile, este punctul final de colectare. aaronstack[.]com/jules-collect.

Severitate: critică.

Atacul: Cum funcționează

Fiecare pachet JulesJacker urmează același șablon. pachet.json promovează un instrument TypeScript benign cu o licență MIT și fără un depozit de surse conectat. index.js exportă o serie de funcții reale, funcționale — expresii regulate pentru e-mail, hărți enum, tabele de reguli lint — astfel încât un dezvoltator care importă efectiv pachetul să vadă un comportament plauzibil. Răutatea se află în altă parte: într-un postinstalare cârlig sau într-un bloc în partea de jos a index.js care se execută în momentul în care modulul este necesar.

Sarcinile utile au evoluat prin etape interne clar numerotate (operatorul își etichetează propriile evenimente de telemetrie sc1-, sc3-, sc4-... și așa mai departe), iar urmărirea acestei evoluții este cea mai clară modalitate de a înțelege campania.

 Generația 1–2: recunoaștere și furt de configurații git

Primele pachete erau informații simple, furând informații. La instalare, acestea colectau variabile de mediu, fișierul gazdă din interfața de comandă GitHub și configurația globală git (git config –global –list, git remote -v), apoi a trimis pachetul la punctul final al colecției. Aceasta a stabilit semnătura operatorului: o poveste de copertă „utilitare de validare a formularelor TypeScript”, un semnalizator de ieșire către un singur domeniu și o preferință pentru acreditările dezvoltatorului, mai degrabă decât pentru datele consumatorilor.

Generația 3: sonde de evadare hypervisor și kernel

O versiune din mijlocul campaniei a intrat puternic în atacuri de infrastructură. În loc să fure configurația, a rulat o sondare a hameiului de recunoaștere. AF_VSOCK socluri, regiuni virtio MMIO, / dev / memși semnalizări de consolidare a kernelului, și chiar tentative de blocări ale kernelului declanșate de sysrq — comportament asociat cu încercările de ieșire dintr-o mașină virtuală sau un container. Etichetele de telemetrie (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, sondă-kernel-s3) a făcut intenția explicită. Această variantă viza în mod clar medii cloud-sandbox și serverless-runner — tipul de mașină virtuală efemeră care construiește și testează cod nesigur.

Generația 3 (SC3): viermele de scriere cross-repo

Centrul de greutate al campaniei a devenit un hoț de repozitorii care se autopropagă. La instalare, sarcina utilă rulează o secvență temporizată în cinci etape:

  • Etapă 0 (~100 ms): amprentează gazda — numele gazdei, informațiile utilizatorului, identitatea git.
  • Etapă 1 (~3 s): determinarea organizației căreia îi aparține victima prin inspectare git remote -v, apoi căutați un cod hardcoded ORG_CONFIG acces la tabel și la depozitul de testare cu git ls-remote — rutat printr-un proxy SSRF controlat de atacator la http://git@192.168.0.1:8080.
  • Etapă 2 (~10 secunde): git clone fiecare repozitoriu accesibil din lista de ținte, arhivați arborele în format tarball și zip-ul, codificați-l în base64 și exfiltrați-l în blocuri.
  • Etapă 3 (~45 s): „dovada accesului” — clonează un depozit inscriptibil, elimină un fișier numit SECURITY-POC.md și commit cu autorul setat la google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> și sarcina de mesaj: actualizarea memoriei cache a dependenței, apoi trimiterea către ramura principală a victimei.

Lista de ținte codificată fix nu este generică. Ea enumeră mai mult de treizeci Shopify depozite după nume — Shopify/shopify, Shopify/identitate, Shopify/facturare, Shopify/seif, Shopify/secrete, Shopify/infrastructură, Shopify/.githubși multe altele — alături de o organizație de testare, AaronStackBarnes, pe care operatorul pare să o controleze și o folosește ca țintă de scriere.

Generația 4 (SC4): criptată și protejată prin porți

Cea mai nouă variantă orientată către dezvoltatori adaugă două niveluri de evitare a atacurilor pe lângă viermele SC3.

În primul rând, sarcina utilă nu se mai livrează ca text simplu. Adevărata logică se află într-un blob criptat cu AES-256-CBC, lib/.perf.dat, cu IV-ul în primii șaisprezece octeți. Încărcătorul din index.js reconstruiește cheia de decriptare din fragmente de șiruri concatenate, decriptează blob-ul și îl rulează cu Funcție nouă()Chiar și numele modulelor sunt separate pentru a evita scanerele statice — necesită('criptare' + 'o'), necesită('f' + 's').

În al doilea rând, este controlată de gazdă. O variantă decriptează și rulează doar atunci când os.hostname() este egală devbox or ubuntu-fc-uvm (o microVM Firecracker implicită) sau conține subșirul devboxO altă portiță pune în pericol prezența unui .jules/ director de lucru:

Cu alte cuvinte, sarcina utilă SC4 este concepută să rămână inactivă pe laptopul unui dezvoltator obișnuit și să se trezească doar în interiorul agentului de inteligență artificială automat și medii sandbox operatorul vrea de fapt să facă un compromis.

Pornirea laboratorului: varianta analiză-infrastructură

Cel mai inovator pachet din campanie, ts-enum-helper, nu atacă deloc dezvoltatorii sau Shopify. Acesea postinstalare.sh se deschide cu o poartă care dă de gol jocul:

Scriptul nu face nimic decât dacă este setată o variabilă de mediu specifică unei platforme de analiză a programelor malware. Când este setată, sarcina utilă știe că rulează în interiorul sandbox-ului care există pentru a detona și studia pachete exact ca acesta - și contraatacă.

Mai întâi extrage tokenul OAuth al contului de serviciu GCP de pe serverul de metadate al instanței și îl exfiltrează. Apoi, folosind acel token, verifică Planul de control Kubernetes accesibil la kubernetes.default.svc:

  • listează ClusterRoleBindings, ClusterRoles și Nodurile;
  • sondează pod-uri, secrete și hărți de configurare în sistem kube, lipsă, kube-public, kube-node-leaseși spațiul de nume de analiză;
  • emite apeluri SelfSubjectAccessReview pentru a cartografia exact ce are permisiunea de a face identitatea furată.

În cele din urmă, forțează brute numele de bucket-uri Google Cloud Storage construite dintr-un ID de proiect GCP codificat fix (semnător-rar-437603-p9) și numărul proiectului, ghicind combinații precum *-build-uri, *-artefacte, și mai multe malază- prefixe (rezultate-malezi, pachete malysis, scanări malyticeFiecare cod și corp de răspuns este înregistrat și trimis înapoi la aceeași locație. jules-collect punctul final.

Acesta este cazul rar al unei sarcini utile din lanțul de aprovizionare construite special pentru a ataca propria infrastructură a apărătorilor. Povestea de copertă din întreaga campanie - fragmente din aceasta apar în interiorul sarcinilor utile ca și comentarii care încadrează comportamentul ca o „PoC de cercetare a securității... scriere cross-repo prin intermediul unui token proxy git supraevaluat” - este aceeași autojustificare, indiferent dacă ținta de execuție este un monorepo Shopify sau serverul de metadate al clusterului de analiză.

Cronologie și migrarea domeniului de aplicare

JulesJacker nu este o lansare unică. Este o operațiune susținută care a supraviețuit unei închideri a registrului prin simpla schimbare a numelui.

Atunci când eveniment
La mijlocul lunii aprilie 2026 Primele pachete apar în domeniul de aplicare original al editorului: fațada TS-utility, mediul și exfiltrarea git-config.
La începutul lunii mai 2026 Varianta de recunoaștere Hypervisor și kernel-escape a fost publicată.
Mijlocul spre sfârșitul lunii mai 2026 Viermele de scriere SC3 cross-repo apare alături de sarcinile utile direcționate către Shopify și google-labs-jules[bot] impersonare. SC4 introduce încărcătoare criptate cu AES și cu funcție de gazdă controlată.
Sfârșitul lunii mai 2026 npm elimină domeniul de aplicare original al editorului; numele pachetelor se rezolvă în substituenți goali care dețin securitatea.
Aceeași săptămână Operatorul migrează către un domeniu de aplicare aproape identic și republică viermele, inclusiv varianta cu infrastructură de analiză.

Migrarea este partea cu care ar trebui să se ocupe apărătorii. Eliminarea primului telescop nu a încheiat campania și nici măcar nu a încetinit-o. Operatorul pusese deja în scenă un telescop paralel al cărui nume diferă de cel original cu un singur caracter și continuase să publice în aceeași săptămână. În momentul scrierii acestui articol, noul telescop... ts-form-utils (versiunile 1.0.0 până la 1.1.0), ale sale ts-project-lint (1.0.0 și 1.1.0) și versiunea independentă ts-enum-helper (1.0.0) rămân instalabile.

Indicatori de compromis

Toți indicatorii de mai jos au fost confirmați în raport cu sursa coletului.

Tip Indicator notițe
Rețea (C2) aaronstack[.]com/jules-collect Punct final unic de colectare pentru fiecare generație; primește telemetrie JSON și fragmente tarball ale repozitoriului base64-gzip.
Rețea (proxy SSRF) http://git@192.168.0.1:8080 Față pentru un token proxy git supraevaluat, folosit pentru a accesa depozitele organizației țintă.
Rețea (cloud) metadata.google.internal/computeMetadata/v1
kubernetes.default.svc
storage.googleapis.com/storage/v1/b
Folosit doar de varianta de infrastructură de analiză pentru furtul de tokenuri și recunoașterea planului de control Kubernetes.
Identitate google-labs-jules[bot]
161369871+google-labs-jules[bot]@users.noreply.github.com
Fals commit identitatea autorului împinsă în ramurile principale ale victimelor.
Fișier lib/.perf.dat Blob de date utile criptat cu AES-256-CBC; IV stocat în primii 16 octeți, iar cheia reconstruită dinamic în index.js.
Fișier SECURITY-POC.md Scăpat și commitreturnat în depozitele victimelor cu mesajul chore: update dependency cache.
Fișier scripts/postinstall.sh Închis la $MALYSIS_ANALYSIS_ID; identifică varianta analiză-infrastructură-direcționare.
Comportamental os.hostname() verifică pentru devbox / ubuntu-fc-uvm Gatering-ul mediului sandbox și al agentului AI înainte de decriptarea și execuția sarcinii utile.
Comportamental .jules/ și /app/.jules citiri de directoare Direcționarea explicită a mediilor de lucru cu agenți de inteligență artificială.
Comportamental sc1-, sc3-, sc4-, s0-vmm-recon Etichete ale etapelor de telemetrie definite de operator, utile pentru detectare și căutare.
Țintă în cloud rare-signer-437603-p9
malysis-* presupuneri despre găleată
Identificatori de proiect GCP codificați fix și modele de enumerare a compartimentelor de stocare încorporate în varianta infrastructură de analiză.
Forma pachetului Fațadă pachet TS-utility fără câmp de depozitare Șablon de campanie consistent: pachete utilitare TypeScript false cu sarcini utile rău intenționate încorporate în postinstall hooks sau adăugat la index.js.
sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni