flawopen.com/Incidents/shai-hulud-npm-worm-september-2025
Shai-Hulud: worm npm September 2025 dan kepercayaan saat instalasi
Kampanye Shai-Hulud pada September 2025 menggunakan akun maintainer npm yang disusupi dan hook postinstall berbahaya untuk mencuri kredensial serta menerbitkan lebih banyak paket terinfeksi.[1]
Bayangkan pabrik menerima kotak suku cadang dengan petunjuk membuka yang berjalan sendiri. Petunjuk itu menyalin lencana pengiriman pabrik dan memakainya untuk mengirim kotak yang diubah ke pabrik lain. Mematikan petunjuk otomatis menutup pintu masuk itu, tetapi suku cadangnya tetap perlu diperiksa sebelum dipakai.[1]
Konsep Kunci & Istilah
Lifecycle hook- Dalam gelombang September, postinstall npm menjalankan kode berbahaya saat instalasi. Ini perilaku dari paket, bukan cacat memori npm bernomor CVE.
Publishing credential- Token npm memberikan hak yang ditetapkan untuk akun atau paket. Hak penerbitan yang dicuri membantu penyebaran; masa berlaku, cakupan, dan MFA mengikuti kebijakan.
Trusted publishing / OIDC- OIDC memungkinkan alur CI yang berwenang memperoleh hak penerbitan singkat tanpa menyimpan token npm. Alur berwenang yang disusupi tetap berbahaya.
Pemetaan kerangka kerja
Kronologi Insiden
GitHub menyatakan menerima pemberitahuan tentang Shai-Hulud.[1]
GitHub melaporkan penghapusan lebih dari 500 paket yang disusupi dan pemblokiran unggahan yang cocok dengan indikator program berbahaya.[1]
Alur Serangan Langkah demi Langkah
Kode Sumber: Rentan vs Aman
Perbandingan rencana instalasi Python yang aman: kedua fungsi tidak menjalankan npm, membaca kredensial, atau menghubungi registri. Contoh mengikuti dokumentasi npm v10. Rencana yang diperkuat mensyaratkan berkas pengunci yang ditinjau, menekan skrip siklus hidup, dan tidak mewarisi lingkungan. Pelaksana sebenarnya perlu menyediakan npm yang diketahui serta direktori rumah dan konfigurasi terisolasi tanpa rahasia atau pemasangan sensitif. --ignore-scripts tidak mengamankan impor setelah instalasi atau skrip yang dijalankan langsung; berkas pengunci tidak membuktikan kode aman.
def install_plan(reviewed_lockfile, inherited_env):
# Hanya mengembalikan rencana: tidak memasang paket atau menjalankan perintah.
return {"argv": ["npm", "ci"],
"env": dict(inherited_env)}
def install_plan(reviewed_lockfile, inherited_env):
# Hanya mengembalikan rencana: tidak memasang paket atau menjalankan perintah.
if reviewed_lockfile is not True:
raise ValueError("Review the lockfile before installation")
return {"argv": ["npm", "ci", "--ignore-scripts"],
"env": {}}
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Wajibkan berkas pengunci yang ditinjau dan npm ci --ignore-scripts pada pekerjaan instalasi; uji kebijakan CI harus memeriksa perintah dan lingkungan tanpa rahasia. Jalankan kait yang diperlukan hanya setelah peninjauan dalam pekerjaan terisolasi terpisah.[3]
- ✓Jauhkan hak penerbitan dan kredensial awan dari pekerjaan dependensi, termasuk berkas rumah, berkas terpasang, dan identitas pelaksana. Uji bahwa pekerjaan tidak bisa memperoleh hak penerbitan.[1], [2]
- ✓Gunakan penerbitan tepercaya bila tersedia; batasi alur, cabang, dan lingkungan yang diberi izin serta tinjau perubahan. Wajibkan MFA tahan phishing dan cabut token tak dipakai.[1]
- ✓Jika paparan dipastikan, isolasi dan bangun ulang pelaksana, cabut kredensial yang terpapar, serta audit versi paket dan perubahan alur. Tinjau kode dependensi: berkas pengunci atau jeda menerima versi baru saja tidak menjamin keamanan.[1], [2]