Nasihat AD-2026-009 daripada Agensi Keselamatan Siber Singapura (CSA) diterbitkan pada 6 Ogos 2026 dan masih dikemas kini pada 7 September — sebulan berlalu dan masih bergerak, yang dengan sendirinya menunjukkan insiden ini belum berakhir. Skalanya: lebih 1,300 versi pakej dikompromi pada registri npm, mewakili kira-kira 2 bilion muat turun bulanan secara gabungan.

Pakej yang Diracun Ialah Primitif Cache yang Hampir Tiada Sesiapa Pasang Secara Langsung

Versi yang dinamakan termasuk keyv 6.0.0, cacheable 2.5.1, cacheable-request 13.0.20, flat-cache 6.1.24 dan file-entry-cache 11.1.6. Perhatikan persamaannya: hampir tiada sesiapa memasangnya dengan sengaja. Ia berada jauh di dalam pepohon kebergantungan ESLint, klien HTTP dan alat binaan. Oleh itu "saya tidak pernah pasang itu" bukan semakan yang sah — anda perlu benar-benar melihat pepohon tersebut.

Apa yang Dicurinya: Kunci Persendirian SSH Ada dalam Senarai

Perisian hasad itu ialah ChainDrop, varian menyebar sendiri daripada keluarga Shai-Hulud. Apa yang diseludupnya keluar: kelayakan awan, token GitHub, kunci SSH, konfigurasi Kubernetes dan kelayakan Terraform, dihantar ke domain npm-cache[.]com — nama yang sengaja dipilih supaya kelihatan seperti infrastruktur npm sendiri. Dengan itu di tangan, ia menggunakan kelayakan penerbit yang dicuri untuk meracuni lebih banyak pakej, dan itulah caranya ia mencapai lebih 1,300 versi.

Analisis Microsoft Threat Intelligence bertarikh 4 Ogos 2026 menambah butiran pelaksanaan: lebih 400 pakej merentasi beberapa penerbit yang tidak berkaitan, muatan JavaScript berasaskan Bun yang dikaburkan dengan berat, dilaksanakan melalui cangkuk kitaran hayat preinstall npm — sebelum pemasangan pun selesai. Fail cangkuk yang dinamakan dalam nasihat CSA ialah setup.mjs, Math_Symbol.js dan math_init.js.

Pijakan awalnya bukan sesuatu yang eksotik: e-mel pancingan data yang menyamar sebagai amaran keselamatan npm berjaya mengambil alih akaun seorang penyelenggara.

Mengapa Pentadbir Pelayan Perlu Menganggap Ini Masalah Mereka

Intinya ialah cangkuk preinstall berjalan sebagai pengguna anda. Apa sahaja yang anda boleh baca, ia boleh baca. Dan pada mesin yang menyajikan produksi sambil sekali-sekala menerima npm install, direktori rumah yang sama lazimnya menyimpan:

  • ~/.ssh/id_ed25519 — berkemungkinan kunci yang log masuk ke pelayan lain tanpa kata laluan
  • cache kelayakan CLI awan, serta kata laluan pangkalan data dan kunci API dalam .env
  • ~/.docker/config.json, ~/.kube/config, ~/.terraform.d/

Dengan kata lain: pada komputer riba pembangun, serangan rantaian bekalan mencuri akses kod; pada pelayan, ia mencuri kunci kepada keseluruhan infrastruktur.

Empat Perkara untuk Dilakukan Sekarang

  • Periksa pepohon kebergantungan: npm ls keyv cacheable cacheable-request flat-cache file-entry-cache. Anda juga boleh membaca versi yang dipin terus daripada lockfile dengan grep -n "keyv\|flat-cache\|file-entry-cache" package-lock.json.
  • Jika sepadan, anggap hos sebagai dikompromi. Panduan CSA jelas: buang versi yang terjejas, anggap sistem sebagai dikompromi, bina semula mesin yang pernah memasang pakej hasad, putar semua kelayakan yang terdedah, dan semak persekitaran awan serta kawalan sumber untuk capaian tanpa kebenaran. Putaran itu merangkumi kunci SSH, token GitHub dan kunci API awan — bukan sekadar menukar kata laluan.
  • Semak trafik keluar lampau ke npm-cache[.]com. Itu memberi bukti langsung sama ada muatan itu benar-benar berjalan.
  • Ubah tabiat: pasang dengan --ignore-scripts dalam CI dan produksi (npm ci --ignore-scripts), dan uruskan secara berasingan pakej yang benar-benar memerlukan skrip binaan; jalankan binaan dan perkhidmatan sebagai pengguna berlainan dengan keistimewaan rendah; letakkan frasa laluan pada kunci SSH; matikan agent forwarding; dan jauhkan kunci yang boleh menolak ke produksi daripada mesin produksi.

Memisahkan Binaan daripada Masa Jalan Itu Sendiri Satu Kawalan

Kesan terburuk dalam insiden begini menimpa susunan "satu mesin buat semua" — hos binaan, hos produksi dan simpanan kunci sekali gus. Pindahkan binaan ke instance berasingan yang tidak memegang kelayakan produksi mahupun laluan tanpa kata laluan ke produksi, maka pakej yang diracun hanya merugikan satu mesin yang boleh dibina semula bila-bila masa. Menggunakan PM2 untuk menggerakkan aplikasi Node.js pada VPS membincangkan pengasingan proses dan pengguna, dan strategi sandaran VPS menerangkan apa yang mesti benar sebelum "bina semula" menjadi pilihan sebenar. Instance SharkCloud dibilkan mengikut jam dan boleh dicipta semula atas permintaan — satu mesin binaan khusus jauh lebih murah daripada satu kebocoran kelayakan.