Ilustrasi teknis abstrak di atas bidang biru laut gelap: sebuah kubus paket vektor datar kecil di kiri tengah, dengan garis kuning kecokelatan tipis yang melengkung turun ke representasi ringkas dari stasiun kerja pengembang; kipas filamen halus berwarna sian dan biru baja menyebar ke kanan dari stasiun kerja menuju banyak simpul lingkaran kecil pada kisi longgar, dua di antaranya melengkung kembali ke atas menuju kubus paket, dan satu simpul di paling kanan berdiri sendiri dan terputus. Tidak ada orang, logo, atau teks yang muncul. Logo OrcaRouter dikompositkan di sudut kanan bawah.
AI Safety Incidents

SDK npm Tensorlake Diracuni untuk Mencuri Kredensial Agen AI — dan untuk Menghapus Direktori Home Anda Jika Anda Mencabut Token

Penulis

Alistair Wren

Tanggal Terbit

Model terbaru · 20Lihat semua model →
Benchmark: Artificial Analysis · diperbarui setiap hari
Kembali ke semua artikel

Pada 8 Oktober 2026, rilis yang diracuni dari tensorlake — SDK npm untuk platform Tensorlake, yang menjalankan kode tidak tepercaya yang dihasilkan LLM di dalam sandbox terisolasi — mencapai registri npm. Versi 0.5.144 dipublikasikan pada 01:12:07 UTC; peneliti Socket mengatakan bahwa mereka menandainya sekitar sebelas menit kemudian. Itu bukan rilis yang diotorisasi. Tensorlake menyatakan bahwa penyerang mendorong kode langsung ke repositori GitHub perusahaan dan mempublikasikannya melalui alur kerja rilis proyek itu sendiri, sehingga paket tersebut membawa provenans npm yang valid — atestasi bertanda tangan yang menunjukkan di mana ia dibangun, untuk sumber yang sudah teracuni. Perusahaan mengatakan versi itu aktif selama 1 jam 40 menit, dari 01:12 hingga 02:54 UTC, sebelum npm menghapusnya.

Payload tersebut tidak memerlukan impor dan tidak membutuhkan agen yang berjalan. Sebuah preinstall hook di manifes paket menjalankan node lib/setup.mjs, sebuah loader terabfuskasi yang menanamkan runtime Bun ke dalam mesin dan menggunakannya untuk menjalankan lib/Math_Symbol.js, pencuri kredensial berukuran 856.501 byte sekaligus worm yang menyebarkan dirinya sendiri. Siapa pun yang menjalankan instalasi biasa atas versi tersebut akan mengeksekusinya. Karena itu adalah latest tag dari paket tersebut, versi itulah yang dihasilkan oleh instalasi default selama versi itu masih aktif.

Yang membuat catatan ini layak disimpan bukanlah ukuran payload-nya — keluarga Shai-Hulud sudah didokumentasikan sebelumnya. Yang penting adalah daftar targetnya. Selain token npm dan GitHub, kredensial AWS, secret Kubernetes dan Vault, kunci SSH, .env file, kata sandi peramban dan dompet mata uang kripto, build ini secara khusus mengumpulkan konfigurasi perkakas pengembangan AI dan file MCP — yang terkait dengan Claude Code, Cursor, Kiro, Windsurf, dan Zed, menurut Socket. Ia juga menulis sendiri .claude/settings.json dan .vscode/tasks.json ke repositori yang bisa dijangkau, sehingga kode itu akan berjalan lagi saat pengembang membuka proyek tersebut di Claude Code atau VS Code. Ini adalah serangan rantai pasok yang secara langsung menyasar mesin-mesin tempat orang membangun agen.

Bagaimana rilis itu keluar dari akun seorang maintainer

Socket, SafeDep, dan Aikido masing-masing menerbitkan analisis mereka sendiri pada 8 Oktober, dan uraian mereka tentang mekanisme tersebut sejalan. Tingkat keyakinan arsip untuk catatan ini adalah A, catatan ini tidak ditandai sebagai diperdebatkan, dan tidak ada yang ditemukan dalam sumber-sumber yang bertentangan dengan salah satu dari mereka.

Tulisan SafeDep melacak delapan commit ke main branch repositori tersebut antara pukul 01:20 dan 03:57 UTC pada 7 Oktober, yang diatribusikan kepada seorang administrator repositori dan dibuat melalui antarmuka web GitHub. Commit yang dikutip arsip sebagai yang pertama nakal adalah 41b38f0, revisi empat berkas dari 03:44 UTC pada 7 Oktober yang pesannya "Add files via upload" dan yang membawa tanda tangan verified dari GitHub — GitHub menandatangani commit yang dibuat di editor webnya sendiri, jadi "verified" mencatat permukaan penyuntingan, bukan orangnya. Commit itu tidak menyentuh berkas apa pun selain typescript/lib/Math_Symbol.js dan typescript/lib/setup.mjs, menurut API GitHub: muatannya, dan tidak ada yang lain.

SafeDep menawarkan pembacaan atas perilaku operator, yang dilabeli sebagai inferensinya sendiri: suntingan pertama pada hook preinstall merusak sintaks JSON file tersebut dan commit perbaikan menyusul sembilan belas menit kemudian, yang digambarkannya konsisten dengan seseorang yang menyunting file di peramban alih-alih pipeline berskrip. Tidak ada yang diterbitkan oleh Socket, SafeDep, Aikido, StepSecurity, atau Tensorlake yang menyebutkan metode yang digunakan untuk mengambil alih akun maintainer.

Penyerang tidak memerlukan token npm. SafeDep melaporkan bahwa akun tersebut memulai alur kerjapublish_npm.yaml milik proyek secara manual pada 8 Oktober pukul 00:08 UTC; log build menunjukkan file payload di dalam tarball yang diterbitkan. Rilis tersebut menggunakan npm trusted publishing, dan paket sejenis tensorlake-native-* yang diterbitkan dari proses yang sama membawa provenance SLSA yang valid — provenance yang benar-benar valid untuk build dari sumber yang diracuni. Rilis itu terjadi dua belas menit setelah alur kerja dimulai.

Arsip mencatat bahwa repositori tersebut telah dikompromikan selama kurang lebih 20 jam sebelum publikasi dijalankan — selang waktu yang diuraikan oleh garis waktu di bawah ini commit demi commit — yang konsisten dengan pernyataan Tensorlake sendiri bahwa penyerang mempublikasikannya "melalui alur kerja rilis kami sendiri".

Apa yang dilakukan payload setelah dijalankan

A screenshot of a card titled 'A credential stealer with an AI-tooling list', kicked 'tensorlake@0.5.144 · what the payload collected', subtitled 'Per Socket, SafeDep and Tensorlake's advisory — grouped by what each collector reached for'. Three columns of paired labels sit side by side. 'Publishing and source control' lists npm tokens from .npmrc, the token API and the OIDC exchange; GitHub tokens with a repository and workflow permission check; GitHub Actions secrets read from Runner.Worker memory; and cryptocurrency browser wallets across 14 extensions. 'AI agent tooling' lists ~/.claude.json for Claude Code settings; ~/.kiro/settings/mcp.json for Kiro MCP config; .cursor, Windsurf and Zed config and MCP files; and .claude/settings.json and .vscode/tasks.json written back into reachable repositories. 'Cloud, cluster and endpoint' lists AWS via STS, SSM Parameter Store and Secrets Manager; Kubernetes service-account tokens and kubeconfigs; HashiCorp Vault at 127.0.0.1:8200; SSH and GPG keys, .env files and Docker and CLI files; the Wallets row, wallet.dat, Exodus, Electrum and MetaMask; and saved passwords via a downloaded HackBrowserData binary. A footer reads 'Collector list per Socket's initial assessment, SafeDep's decoded payload analysis and the Tensorlake advisory (GHSA-8g63-53c9-65j2). Socket flags AI development tooling for Claude Code, Cursor, Kiro, Windsurf and Zed by name.'

Penilaian Socket mengidentifikasi pemanenan di seluruh file lokal, lingkungan CI, sumber Kubernetes dan Vault, serta eksfiltrasi, persistensi, dan eksekusi kode yang dipasok dari jarak jauh. SafeDep mereproduksi payload yang telah didekode: lib/setup.mjs mengunduh Bun 1.3.13 dari rilis GitHub resmi dan menggunakannya untuk menjalankan worm, dan ia keluar pada runner CI — targetnya adalah mesin pengembang, bukan agen build. SafeDep juga menemukan bahwa payload tersebut membawa salinan biasa dari loader yang sama, yang ditanamkannya ke dalam paket dan repositori lain.

Payload ini menjalankan tiga lapisan obfuscation, yang didekode SafeDep tanpa mengeksekusi sampel: sebuah array string obfuscator, cipher kustom yang menggunakan salt svksjrhjkcejg — identik dengan yang dilaporkan dalam keyv kompromi sebelumnya — dan AES-256-GCM pada sebelas file yang disematkan, termasuk skrip, hook, dan dua kunci publik RSA. Baris pertamanya memuat tag build WORMTAG='tensrlake', salah eja, yang menjadi cara SafeDep membedakan build ini dari infeksi ulang yang sedang berlangsung.

Selain konfigurasi perkakas AI, daftar koleksinya luas dan spesifik: ~/.claude.json dan ~/.kiro/settings/mcp.json untuk pengaturan agen; kunci SSH, file CLI cloud, .npmrc, .env, file Docker dan Kubernetes, serta riwayat shell; wallet.dat plus data Exodus, Electrum, dan Ledger Live serta ekstensi dompet peramban seperti MetaMask dan Phantom; AWS STS, SSM Parameter Store, dan Secrets Manager; rahasia GitHub Actions yang dibaca dari memori proses Runner.Worker; dan token akun layanan Kubernetes serta token Vault. Ia mengambil biner per platform dari iseekaigogo[.]com/hbd/<platform> dan menjalankannya dengan argumen "dump -b all -c password -f json" — argumen yang cocok dengan alat HackBrowserData, meskipun SafeDep mencatat bahwa biner itu sendiri tidak ditemukan dan menyebut identifikasi tersebut sebagai inferensi. SafeDep menambahkan, worm tersebut keluar pada locale Rusia.

A screenshot of a card titled 'Persistence, resolution, and the wipe trigger', kicked 'tensorlake@0.5.144 · staying power', subtitled 'The release was removed in under two hours; the implant it installed was built to outlive that.' Three columns sit side by side. 'Persistence: gh-token-monitor' lists a systemd user service on Linux, a LaunchAgent com.user.gh-token-monitor on macOS, a scheduled task with a PowerShell monitor on Windows, and files left behind in ~/.local/bin, ~/.config and %LOCALAPPDATA%. 'Endpoint resolution order' lists, in numbered order, the primary endpoint iseekaigogo[.]com:443/router; an Ethereum contract 0xb614155Fd88...1Df091B9; the public RPC endpoints that contract is read through, given as ~30 by Socket and 35 by SafeDep; signed GitHub commits found by the string thebeautifulmarchoftime; and public dead-drop repositories described as 'Shai-Hulud: Here We Go Again'. 'The dead-man switch' lists a poll of api.github.com/user every 60s, for 24 hours, firing on a 40x response to that token, with the effect rm -rf ~/ (advisory: home dir), armed only if the account has no orgs, and the order that matters: remove monitor, then revoke. A footer reads 'Per Socket's blog and SafeDep's analysis, with the C2 endpoint, the contract and the gh-token-monitor service confirmed in Tensorlake's advisory. Socket and SafeDep give different counts of the public RPC endpoints the contract is read through.'

Persistensi bersifat sengaja. Socket menulis tentang payload tersebut: "Kombinasi itu memperluas risiko melampaui sekadar satu kunci API yang dicuri," dan menambahkan bahwa "persistensi dapat mempertahankan akses penyerang setelah dependensi yang terdampak dihapus." SafeDep melaporkan bahwa worm tersebut meng-commit file hook Claude Code dan VS Code sebagai penulis git claude, dan menanam workflow "Run Copilot" yang membocorkan semua secret repositori lalu menghapus run dan branch tersebut. Advisory Tensorlake memberi tahu pengembang yang memeriksa log mereka agar mencari branch bernama dependabot/github_actions/format/setup-formatter dan commit yang dibuat dengan identitas yang sama.

Penyebaran berjalan dengan token yang dicuri, bukan dengan kerentanan kedua. Socket mengatakan worm tersebut mengenumerasi paket-paket yang terkait dengan identitas penerbitan korban, membangun provenans Sigstore, dan menerbitkan ulang versi-versi yang telah diracuni. SafeDep menambahkan perincian bahwa di dalam CI ia menambahkan dependensi git dan menandatangani outputnya dengan Fulcio dan Rekor — sehingga provenans pada paket yang diterbitkannya berikutnya sama validnya dengan provenans pada 0.5.144.

Dua puluh jam sebelum penerbitan

Jarak antara komit jahat pertama dan rilis adalah bagian dari linimasa yang menjelaskan bagaimana paket beracun bisa membawa provenans yang valid. Semua waktu dalam UTC; waktu komit adalah milik SafeDep dan API GitHub, sedangkan waktu publikasi, penghapusan, dan advisori adalah milik Tensorlake.

A screenshot of a card titled 'Compromised source in the repo, then one manual publish', kicked 'tensorlake@0.5.144 · the ~20-hour window', subtitled 'All times UTC. Commit times per SafeDep's timeline and the GitHub API; publish and removal times per the Tensorlake advisory.' Three columns sit side by side. '7 October 2026 — source, main branch' lists 01:20 setup.mjs and Math_Symbol.js added; 01:24 the preinstall script added; 01:43 package.json JSON repaired; 02:13 to 03:44 four loader and payload revisions; 03:44 commit 41b38f0, the payload commit; 03:57 the version set to 0.5.144. '8 October 2026 — release and removal' lists 00:08 publish_npm.yaml started by hand; 01:12:07 version 0.5.144 published to npm; 01:22:02 issue #1014 opened by StepSecurity; 01:23:10 flagged by Socket, about eleven minutes in; 02:54 the version removed, after roughly 1h 40m live; 20:24 version 0.5.145 published next. '9 October 2026 — disclosure closed' lists advisory GHSA-8g63-53c9-65j2; pull request #1016, source reverted and 0.5.145 cut; issue #1014 closed as completed; 0.5.143 as the last version stated unaffected; and no usage seen, per Tensorlake's user-agent telemetry. A footer reads 'The ~20-hour gap between the first rogue commit and the publish is SafeDep's commit timeline, and matches the archive's own upstream record.'

Baca secara menyeluruh: file-file payload masuk ke cabang utama repositori pada 7 Oktober, versinya ditetapkan ke 0.5.144 pada 03:57 pagi itu, dan tidak ada yang diterbitkan sampai sebuah akun menjalankan alur kerja rilis secara manual pada 00:08 keesokan harinya. Kode sumber yang dikompromikan berada di cabang itu selama kira-kira dua puluh jam sebelum pipeline milik proyek sendiri membangunnya. Itulah keseluruhan serangan pada jalur rilis — tidak ada atestasi palsu, tidak ada tarball yang diterbitkan ulang. Provenans itu akurat tentang sebuah build dari kode yang seharusnya tidak pernah berada di cabang tersebut.

Saklar orang mati

Bagian dari insiden ini yang belum memiliki preseden dalam kompromi npm sebelumnya adalah apa yang terjadi setelah korban bereaksi dengan benar. Jika token GitHub yang dicuri itu milik akun tanpa organisasi, menurut SafeDep, worm akan memasang gh-token-monitor: sebuah layanan yang melakukan polling api.github.com/user dengan token yang dicuri itu setiap 60 detik, selama 24 jam. Ketika GitHub mengembalikan 40x — seperti yang terjadi saat token dicabut — monitor menjalankan handler yang dipasok penyerang dan menghapus direktori home pengguna.

Socket menggambarkan komponen yang sama sebagai penggunaan monitor PowerShell yang bertahan melalui ONLOGON tugas terjadwal, menjalankan handler yang dipasok penyerang melalui Invoke-Expression, dan mencatat bahwa kode tersebut memuat string literal "IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner", yang terlihat pada gelombang Shai-Hulud sebelumnya. SafeDep menyebut handler tersebut sebagai rm -rf ~/. Pilihan kata Socket secara eksplisit menyatakan bahwa ini terpicu terlepas dari di mana pencabutan terjadi; monitornya lokal, dan pencabutannya tidak. Keempat sumber — Socket, SafeDep, StepSecurity, dan laporan resmi Tensorlake sendiri — memberikan urutan operasi yang sama: hapus monitor terlebih dahulu, lalu cabut.

Apa yang sudah mapan, dan apa yang hanya disimpulkan

Arsip mencatat tidak ada bahaya yang terkonfirmasi untuk entri ini, dan sumber-sumbernya mendukung hal itu, bukan sekadar tidak membantahnya.

• Tensorlake menyatakan tidak ada penggunaan versi tersebut.Advisory-nya menyatakan bahwa perusahaan memantau penggunaan SDK melalui header user-agent dan "belum melihat penggunaan apa pun atas versi ini sejak dirilis". Itu adalah pernyataan vendor tentang telemetrinya sendiri, bukan hitungan yang diaudit.

• Angka unduhan itu bukan jumlah infeksi. Socket melaporkan bahwa paket tersebut memiliki sekitar 12.000 unduhan mingguan dan mencatat bahwa ini menggambarkan penggunaan paket secara keseluruhan, bukan unduhan versi berbahaya; SafeDep menyebutkan sekitar 106.000 unduhan bulanan pada paket yang sama. Tidak satu pun dari itu menjadi bukti bahwa 0.5.144 pernah dijalankan di mana pun. Jendela rilis yang ditandai Socket dan jendela dua jam Tensorlake konsisten dengan versi yang dihapus sebelum menyebar.

• Bug pada payload itu sendiri mungkin telah membatasinya. SafeDep menemukan dua: jalur propagasi npm memerlukan ./dist/Math_Symbol.js di disk dan berhenti tanpanya, dan loader yang ditanam mencari ai_init.js sementara worm menulis math_init.js. SafeDep menyebut temuan ini sebagai keterbatasan pada penyebaran, dan artikel tersebut memperlakukannya sebagai pembacaan satu analisis terhadap kode, bukan sebagai jaminan bahwa tidak ada yang menyebar.

• Atestasi provenans itu asli. Ini bukan klaim yang diperdebatkan: provenans npm mencatat di mana sebuah paket dibangun dan oleh alur kerja mana, dan dalam kasus ini ia mencatat kebenarannya — alur kerja rilis milik proyek itu sendiri, yang membangun sumber yang telah dicemari. Advisory dari Tensorlake menyatakannya secara eksplisit: “paket tersebut membawa provenans npm yang valid”. Socket menyampaikan poin yang sama dengan gamblang saat mencatat bahwa provenans “menyatakan di mana sebuah paket dibangun. Itu tidak menyatakan bahwa kodenya aman.”

Beberapa detail yang beredar merupakan klaim dari analisis tunggal dan harus dibaca sebagai demikian. Mekanisme spesifik yang digunakan penyerang untuk memperoleh akun maintainer belum dipublikasikan oleh salah satu firma investigasi maupun oleh Tensorlake. Alamat kontrak Ethereum dan perannya dalam menyelesaikan endpoint muncul dalam catatan SafeDep dan Socket — Socket menyatakan bahwa payload menyelesaikan endpoint-nya melalui kontrak Ethereum menggunakan sekitar 30 endpoint RPC publik dengan fallback GitHub, sedangkan SafeDep menetapkan jumlah RPC sebanyak 35 dan melaporkan bahwa pada 8 Oktober kontrak tersebut mengembalikan iseekaigogo.com — dan Tensorlake mengonfirmasi endpoint serta kontrak tersebut dalam advisory-nya. Jumlah RPC yang tepat berbeda antara kedua tulisan tersebut; desainnya tidak.

Satu celah dalam catatan publik perlu dinyatakan secara gamblang. Tidak ada satu pun sumber yang ditinjau untuk artikel ini yang melaporkan infeksi hilir yang terkonfirmasi — paket atau repositori lain yang diracuni oleh worm tersebut menggunakan kredensial yang dicuri dari paket ini. Kode propagasinya ada dan SafeDep telah membacanya; apakah kode itu menghasilkan korban kedua, tidak diketahui.

Apa yang berubah setelahnya?

Respons itu lebih cepat dan lebih terkoordinasi daripada insiden itu.

• Versi itu sudah tidak ada. Versi itu aktif dari 01:12 hingga 02:54 UTC pada 8 Oktober, menurut Tensorlake; SafeDep melaporkan bahwa npm menghapusnya. Saat melakukan kueri ke registri npm secara langsung pada 10 Oktober untuk artikel ini, 0.5.144 tidak lagi muncul di antara versi paket yang dipublikasikan, dan tag terbaru paket tersebut adalah 0.5.148. Advisory Tensorlake mengarahkan para pengembang ke 0.5.143 sebagai versi terakhir yang tidak terdampak.

• Advisori tersebut diterbitkan dengan perbaikan. Advisori GHSA-8g63-53c9-65j2 dari Tensorlake menyatakan bahwa paket tensorlake di PyPI dan crates.io serta CLI tensorlake tidak terpengaruh — hanya paket npm yang terpengaruh — dan versi 0.5.143 dan sebelumnya tidak terpengaruh. SafeDep melaporkan bahwa pengelola mengembalikan kode sumber di pull request #1016 dan merilis 0.5.145.

• Utas pengungkapan ini luar biasa lengkap. Peneliti StepSecurity, Ashish Kurmi, membuka issue GitHub #1014 pada 01:22:02 UTC pada 8 Oktober — sekitar sepuluh menit setelah publikasi — menunjuk ke tulisan StepSecurity sendiri tentang apa yang disebutnya sebagai cacing "hostage token". Oliver Smith dari Aikido berkomentar bahwa payload diperkenalkan dalam commit 41b38f0 dan mengidentifikasinya sebagai pencuri informasi Shai-Hulud baru. Maintainer David Lorenzo — identitas maintainer yang terdaftar pada paket npm sebagai calavera — membalas pada 9 Oktober mengonfirmasi advisory keamanan dan menutup issue sebagai selesai pada hari yang sama. Judul issue itu sendiri mencerminkan bukti: awalnya berupa laporan "kemungkinan berbahaya" dan diganti namanya, pada saat ditutup, untuk menggambarkan payload sebagai berbahaya tanpa syarat.

• Kampanye yang mencakup ini lebih besar daripada paket ini. Socket, SafeDep, dan Aikido sama-sama menempatkan rilis Tensorlake dalam gelombang ChainDrop / Mini Shai-Hulud yang pertama kali didokumentasikan pada awal Agustus 2026, yang korbannya di npm mencakup keyv, cacheable dan paket-paket terkait. Advisory Tensorlake menyatakan hal yang sama, mengutip Socket, SafeDep, dan Aikido.

Panduan Socket untuk siapa pun yang menginstal versi tersebut adalah bahwa host harus diperlakukan sebagai terkompromi: periksa lockfile, manifes, dan log build untuk versi tersebut; hapus gh-token-monitorlayanan sebelum mencabut token apa pun; lalu rotasi kredensial dari mesin yang bersih. Peringatan Tensorlake menambahkan urutan yang sama dan menyarankan memeriksa registri paket dan repositori yang dapat ditulis oleh token yang terekspos untuk rilis tak terduga. Tulisan Aikido menyarankan menyetel ignore-scripts=true di .npmrc untuk memblokir hook instalasi, dan memperlakukan setiap mesin tempat hook tersebut berjalan sebagai terkompromi sepenuhnya.

Ini adalah satu catatan, dilaporkan oleh pihak lain dan dikutip di sini kepada mereka. Insiden agen lain yang terdokumentasi, masing-masing dengan sumbernya sendiri, tingkat keparahan, tingkat kepercayaan, dan penanda sengketa, berada di arsip insiden AI — sehingga kompromi rantai pasok yang ditujukan pada peralatan agen dapat dibaca berdampingan dengan peristiwa lain yang benar-benar telah terjadi.