JulesJacker: Cacing npm palsu menyamar sebagai Jules AI

JulesJacker: Cacing npm PoC Palsu Yang Menyamar Sebagai Ejen Jules Google — Dan Menghidupkan Kotak Pasir Menganalisisnya

TL; DR

Satu pengendali npm menghabiskan masa enam minggu menerbitkan pakej "utiliti" TypeScript palsu seperti ts-form-utils, ts-project-lint, dan ts-enum-helper.

Walaupun pakej mendedahkan pembantu pengesahan kecil yang kelihatan sah, muatan sebenar dilaksanakan semasa pemasangan atau keperluan pertama dan melakukan cap jari hos, penemuan organisasi GitHub, pengklonan repositori dan penapisan kod sumber.

Perisian hasad ini secara khusus menyasarkan organisasi GitHub bernilai tinggi, termasuk pelbagai Shopify repositori, kemudian mengarkibkan dan mengeluarkan penyusupan pokok sumber yang boleh dicapai ke titik akhir koleksi berpusat.

Sebagai sebahagian daripada aliran kerja kompromi, muatan commitfail sa kembali ke repositori mangsa sambil menyamar sebagai identiti pengekodan autonomi Google google-labs-jules[bot].

Kami menjejaki kempen tersebut — dinamakan JulesJacker — merentasi pelbagai skop penerbit dan sekurang-kurangnya lima generasi muatan, termasuk varian yang disulitkan dan yang peka kotak pasir.

Varian terbaharu ini secara khusus menyasarkan infrastruktur analisis perisian hasad: ia hanya mengaktifkan persekitaran analisis dalam, mencuri token akaun perkhidmatan metadata awan dan menyiasat satah kawalan Kubernetes dan baldi storan awan.

IOC utama yang dikongsi merentasi semua generasi muatan ialah titik akhir pengumpulan aaronstack[.]com/jules-collect.

Keterukan: kritikal.

Serangan: Bagaimana Ia Berfungsi

Setiap pakej JulesJacker mengikuti templat yang sama. package.json mengiklankan pembantu TypeScript yang tidak berbahaya dengan lesen MIT dan tiada repositori sumber yang dipautkan. indeks.js mengeksport beberapa fungsi sebenar yang berfungsi — regex e-mel, peta enum, jadual peraturan lint — supaya pembangun yang benar-benar mengimport pakej melihat tingkah laku yang munasabah. Kebencian itu berada di tempat lain: dalam a selepas pemasangan cangkuk, atau dalam blok di bahagian bawah indeks.js yang dilaksanakan sebaik sahaja modul diperlukan.

Muatan telah berkembang melalui peringkat dalaman yang dinomborkan dengan jelas (operator melabelkan peristiwa telemetrinya sendiri sc1-, sc3-, sc4-, dan sebagainya), dan memerhatikan evolusi itu adalah cara paling jelas untuk memahami kempen tersebut.

 Generasi 1–2: peninjauan dan kecurian git-config

Pakej terawal merupakan pencuri maklumat yang mudah. ​​Semasa pemasangan, mereka telah mengumpul pembolehubah persekitaran, fail hos GitHub CLI dan konfigurasi git global (git config –global –list, git jauh -v), kemudian POST pakej tersebut ke titik akhir koleksi. Ini mewujudkan tandatangan operator: cerita muka depan “utiliti pengesahan borang TypeScript”, suar keluar ke domain tunggal dan citarasa untuk kelayakan pembangun dan bukannya data pengguna.

Generasi 3: prob hipervisor dan kernel escape

Satu versi pertengahan kempen beralih kepada serangan infrastruktur. Daripada mencuri konfigurasi, ia menjalankan peninjauan abah-abah AF_VSOCK soket, kawasan virtio MMIO, / dev / mem, dan bendera pengerasan kernel, dan juga percubaan ranap kernel yang dicetuskan oleh sysrq — tingkah laku yang berkaitan dengan percubaan untuk keluar dari mesin maya atau bekas. Tag telemetri (peninjauan-s0-vmm, s1-vmm-vsock-fuzz, s2-vmm-mmio, prob-kernel-s3) menyatakan niat tersebut secara eksplisit. Varian ini jelas ditujukan kepada persekitaran kotak pasir awan dan pelari tanpa pelayan — jenis VM sementara yang membina dan menguji kod yang tidak dipercayai.

Generasi 3 (SC3): cacing penulisan repo silang

Pusat graviti kempen menjadi pencuri repo yang merambat sendiri. Semasa pemasangan, muatan menjalankan urutan masa lima peringkat:

  • Peringkat 0 (~100 ms): cap jari hos — nama hos, maklumat pengguna, identiti git.
  • Peringkat 1 (~3 s): tentukan organisasi mana mangsa tergolong dengan memeriksa git jauh -v, kemudian cari yang dikodkan secara keras ORG_CONFIG akses jadual dan repo ujian dengan git ls-remote — dihalakan melalui proksi SSRF yang dikawal oleh penyerang di http://git@192.168.0.1:8080.
  • Peringkat 2 (~10 saat): klon git setiap repositori yang boleh dicapai dalam senarai sasaran, tarball dan gzip pokok, base64-encode dan chunk-exfiltratekannya.
  • Peringkat 3 (~45 s): "bukti akses" — klon repo yang boleh ditulis, lepaskan fail bernama SECURITY-POC.md, dan commit ia dengan pengarang ditetapkan kepada google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> dan mesej tugas: kemas kini cache kebergantungan, kemudian tekan ke cawangan talian utama mangsa.

Senarai sasaran berkod keras tidak generik. Ia menyenaraikan lebih daripada tiga puluh Shopify repositori mengikut nama — Shopify/shopify, Shopify/identiti, Shopify/pengebilan, Shopify/peti besi, Shopify/rahsia, Shopify/infrastruktur, Shopify/.github, dan banyak lagi — bersama-sama organisasi ujian, AaronStackBarnes, yang nampaknya dikawal dan digunakan oleh operator sebagai sasaran tulis.

Generasi 4 (SC4): disulitkan dan dipagar

Varian terbaru yang menghadap pembangun menambah dua lapisan pengelakan di atas cacing SC3.

Pertama, muatan tidak lagi dihantar sebagai teks biasa. Logik sebenar terletak pada gumpalan yang disulitkan AES-256-CBC, lib/.perf.dat, dengan IV dalam enam belas bait pertamanya. Pemuat dalam indeks.js membina semula kunci penyahsulitan daripada serpihan rentetan yang digabungkan, menyahsulit gumpalan dan menjalankannya dengan Fungsi baharu()Malah nama modul juga dipecahkan untuk mengelakkan pengimbas statik — memerlukan('crypt' + 'o'), memerlukan('f' + 's').

Kedua, ia berpagar hos. Satu varian hanya menyahsulit dan berjalan apabila os.namahos() sama dengan devbox or ubuntu-fc-uvm (microVM Firecracker lalai) atau mengandungi subrentetan devboxSatu lagi pintu gerbang atas kehadiran a .jules/ direktori kerja:

Dalam erti kata lain, muatan SC4 direka bentuk untuk kekal tidak aktif pada komputer riba pembangun biasa dan hanya terjaga di dalam ejen AI automatik dan persekitaran kotak pasir pengendali sebenarnya mahu berkompromi.

Menghidupkan Makmal: Varian Analisis-Infrastruktur

Pakej paling baharu dalam kempen ini, pembantu-enum-ts, langsung tidak menyerang pembangun atau Shopify. Ia postinstall.sh dibuka dengan pintu gerbang yang memberikan permainan itu:

Skrip tidak melakukan apa-apa melainkan pembolehubah persekitaran khusus untuk platform analisis perisian hasad ditetapkan. Apabila ia ditetapkan, muatan tahu ia sedang berjalan di dalam kotak pasir yang wujud untuk meletupkan dan mengkaji pakej seperti ini — dan ia akan melakukan serangan balas.

Ia mula-mula menarik token OAuth akaun perkhidmatan GCP daripada pelayan metadata tika dan mengeluarkannya. Kemudian, menggunakan token tersebut, ia menyapu Satah kawalan Kubernetes boleh dihubungi di kubernetes.default.svc:

  • menyenaraikan ClusterRoleBindings, ClusterRoles dan Nod;
  • menyiasat pod, rahsia dan peta konfigurasi merentasi sistem kube, lalai, kube-awam, pajakan nod-kube, dan ruang nama analisis;
  • mengeluarkan panggilan SelfSubjectAccessReview untuk memetakan dengan tepat apa yang dibenarkan dilakukan oleh identiti yang dicuri.

Akhirnya ia memaksa nama baldi Storan Awan Google yang dibina daripada ID projek GCP berkod keras (penandatangan-jarang-437603-p9) dan nombor projek, meneka kombinasi seperti *-binaan, *-artifak, dan beberapa malisis- awalan (keputusan-malisis, pakej-malisis, imbasan-malisisSetiap kod dan isi respons direkodkan dan diposkan kembali ke kod yang sama. jules-collect titik akhir.

Ini merupakan kes yang jarang berlaku bagi muatan rantaian bekalan yang dibina khusus untuk menyerang infrastruktur pembela sendiri. Cerita muka depan merentasi keseluruhan kempen — serpihan yang muncul di dalam muatan sebagai komen yang membingkaikan tingkah laku tersebut sebagai “PoC Penyelidikan Keselamatan … penulisan repo silang melalui token proksi git yang diskopkan secara berlebihan” — adalah justifikasi kendiri yang sama, sama ada sasaran masa jalan ialah monorepo Shopify atau pelayan metadata kluster analisis.

Garis Masa & Migrasi Skop

JulesJacker bukanlah satu kejatuhan sekali gus. Ia adalah operasi berterusan yang terselamat daripada penghapusan pendaftaran dengan hanya menukar namanya.

Bila Acara
Pertengahan April 2026 Pakej pertama muncul di bawah skop penerbit asal: fasad utiliti TS, persekitaran dan penapisan git-config.
Awal Mei 2026 Varian peninjauan hipervisor dan kernel-escape telah diterbitkan.
Pertengahan hingga akhir Mei 2026 Cacing penulisan repo silang SC3 muncul bersama muatan yang disasarkan Shopify dan google-labs-jules[bot] penyamaran. SC4 memperkenalkan pemuat yang disulitkan AES dan berpagar hos.
Penghujung Mei 2026 npm mengalih keluar skop penerbit asal; nama pakej diselesaikan untuk mengosongkan ruang letak pemegangan keselamatan.
Minggu yang sama Operator berhijrah ke skop yang hampir serupa dan menerbitkan semula cacing tersebut, termasuk varian infrastruktur analisis.

Migrasi adalah bahagian yang perlu ditangani oleh pembela. Penyingkiran skop pertama tidak menamatkan kempen atau memperlahankannya. Pengendali telah pun mengadakan skop selari yang namanya berbeza daripada yang asal dengan satu aksara, dan terus menerbitkan dalam minggu yang sama. Sehingga penulisan ini, skop baharu ts-form-utils (versi 1.0.0 hingga 1.1.0), ia ts-project-lint (1.0.0 dan 1.1.0), dan yang berdiri sendiri pembantu-enum-ts (1.0.0) kekal boleh dipasang.

Petunjuk Kompromi

Semua penunjuk di bawah telah disahkan terhadap sumber pakej.

Jenis Petunjuk Nota
Rangkaian (C2) aaronstack[.]com/jules-collect Titik akhir koleksi tunggal merentasi setiap generasi; menerima telemetri JSON dan ketulan tarball repositori base64-gzip.
Rangkaian (proksi SSRF) http://git@192.168.0.1:8080 Bahagian hadapan untuk token proksi git yang diskopkan secara berlebihan yang digunakan untuk mencapai repositori organisasi sasaran.
Rangkaian (awan) metadata.google.internal/computeMetadata/v1
kubernetes.default.svc
storage.googleapis.com/storage/v1/b
Hanya digunakan oleh varian infrastruktur analisis untuk kecurian token dan peninjauan satah kawalan Kubernetes.
Identiti google-labs-jules[bot]
161369871+google-labs-jules[bot]@users.noreply.github.com
Palsu commit identiti pengarang ditolak ke dalam cabang aliran utama mangsa.
File lib/.perf.dat Gumpalan muatan yang disulitkan AES-256-CBC; IV disimpan dalam 16 bait pertama dan kunci dibina semula secara dinamik dalam index.js.
File SECURITY-POC.md Dijatuhkan dan commitdimasukkan semula ke dalam repositori mangsa dengan mesej tersebut chore: update dependency cache.
File scripts/postinstall.sh Berpagar di $MALYSIS_ANALYSIS_ID; mengenal pasti varian penyasaran analisis-infrastruktur.
Kelakuan os.hostname() memeriksa untuk devbox / ubuntu-fc-uvm Penggerudian persekitaran kotak pasir dan ejen AI sebelum penyahsulitan dan pelaksanaan muatan.
Kelakuan .jules/ dan /app/.jules bacaan direktori Penyasaran eksplisit persekitaran ruang kerja ejen AI.
Kelakuan sc1-, sc3-, sc4-, s0-vmm-recon Label peringkat telemetri yang ditakrifkan oleh operator berguna untuk pengesanan dan pemburuan.
Sasaran awan rare-signer-437603-p9
malysis-* tekaan baldi
Pengecam projek GCP berkod keras dan corak penghitungan baldi penyimpanan yang terbenam dalam varian infrastruktur analisis.
Bentuk pakej Bahagian hadapan pakej utiliti TS tanpa medan repositori Templat kempen yang konsisten: pakej utiliti TypeScript palsu dengan muatan berniat jahat yang terbenam dalam postinstall hooks atau dilampirkan kepada index.js.
alat-analisis-komposisi-perisian-alat-sca
Utamakan, pulihkan dan lindungi risiko perisian anda
Dapatkan Akaun Percuma anda.
Tiada kad kredit yang diperlukan.

Lindungi Pembangunan dan Penghantaran Perisian Anda

dengan Suit Produk Xygeni