FlawOpen

flawopen.com/Incidents/shai-hulud-npm-worm-september-2025

● npm ecosystem · CWE-506 / CWE-829 · September 2025 · Kritis
Riset Keamanan · FlawOpen

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]

💡 Penjelasan Sederhana (ELI5)

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

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-506 CWE-829

Kronologi Insiden

2025-09-14

GitHub menyatakan menerima pemberitahuan tentang Shai-Hulud.[1]

2025-09-22

GitHub melaporkan penghapusan lebih dari 500 paket yang disusupi dan pemblokiran unggahan yang cocok dengan indikator program berbahaya.[1]

Alur Serangan Langkah demi Langkah

Langkah 1

Rilis disusupi

Akun pemelihara menerbitkan paket yang diubah. Phishing adalah dugaan jalur masuk awal, bukan sebab yang telah terbukti bagi setiap akun.[1], [2]

Langkah 2

Eksekusi saat instalasi

postinstall September berjalan dengan hak pengembang atau CI. Perilaku preinstall November tidak boleh dilekatkan surut pada gelombang ini.[1], [3], [2]

Langkah 3

Kredensial terbuka

Program berbahaya mencari kredensial npm, GitHub, dan layanan awan dalam konfigurasi serta lingkungan; bukan hanya token penerbitan yang terancam.[1], [2]

Langkah 4

Perambatan

Hak penerbitan curian memungkinkan paket lain yang dikelola korban diubah dan diterbitkan kembali.[1], [2]

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.

IMPLEMENTASI RENTAN
def install_plan(reviewed_lockfile, inherited_env):
    # Hanya mengembalikan rencana: tidak memasang paket atau menjalankan perintah.
    return {"argv": ["npm", "ci"],
            "env": dict(inherited_env)}
PERBAIKAN AMAN & KUAT
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

Sumber