Shai-Hulud Muncul Lagi: Lebih dari 300 Paket NPM Terinfeksi
(helixguard.ai)- Di registri NPM, lebih dari 1.000 komponen terinfeksi dengan pola yang sama dalam hitungan jam, lalu versi baru yang berisi kode berbahaya didistribusikan
- Paket berbahaya menyamar sebagai skrip instalasi runtime Bun dengan menambahkan
setup_bun.jsdanbun_environment.jsyang diobfuscate; saat dijalankan, ia menggunakan TruffleHog untuk mencuri kredensial lokal - Informasi sensitif yang dikumpulkan, seperti token AWS/GCP/Azure·GitHub·NPM, dikirim keluar melalui runner GitHub Action bernama
SHA1HULUD - Skrip berbahaya secara otomatis menjalankan
npm publishuntuk melakukan replikasi diri berbentuk worm, yang pada akhirnya menginfeksi lebih dari 27.000 repositori GitHub - Kasus ini dinilai kembali menyoroti ancaman keamanan rantai pasok di seluruh ekosistem open source
Ringkasan serangan
- Pada 24 November 2025, HelixGuard mendeteksi lebih dari 1.000 paket di registri NPM yang terinfeksi dengan teknik yang sama dalam beberapa jam
- Versi baru tersebut menyamar seolah-olah menambahkan runtime Bun dan menyertakan skrip
preinstall: node setup_bun.js - File
bun_environment.jsyang didistribusikan bersama merupakan kode berbahaya yang diobfuscate, yang saat dijalankan akan mengunduh dan mengeksekusi TruffleHog
- Versi baru tersebut menyamar seolah-olah menambahkan runtime Bun dan menyertakan skrip
- TruffleHog memindai dan mencuri token NPM, kredensial AWS/GCP/Azure, variabel lingkungan, dan lainnya dari lingkungan lokal
- Informasi yang dicuri dieksfiltrasi dengan membuat runner GitHub Action
SHA1HULUD, lalu dikirim keluar melalui repositori GitHub dengan deskripsiSha1-Hulud: The Second Coming. - HelixGuard mengindikasikan bahwa serangan ini kemungkinan dilakukan oleh pelaku yang sama dengan insiden “Shai-Hulud” pada September 2025
Analisis cara kerja malware
- Dari analisis terhadap paket
@asyncapi/specs, versi yang dipublikasikan ke NPM terbukti telah terinfeksi, sementara repositori sumber asli di GitHub tetap aman - Penyerang memodifikasi
package.jsonuntuk menambahkansetup_bun.js, lalu mengatur agar skrip tersebut memanggilbun_environment.js bun_environment.jsadalah file JavaScript yang sangat diobfuscate dengan ukuran lebih dari 10MB, dengan fungsi utama sebagai berikut- Mengumpulkan kredensial cloud dan token dari variabel lingkungan
- Memindai secret key menggunakan TruffleHog
- Mengeksfiltrasi data melalui GitHub Actions
- Selain itu,
package.jsonjuga dimodifikasi untuk menyisipkan kode infeksi, lalunpm publishdijalankan otomatis guna melakukan penyebaran berbentuk worm
Infeksi GitHub dan eksfiltrasi data
- Skrip berbahaya membuat file
.github/workflows/formatter_123456789.ymldan mendaftarkan runnerSHA1HULUD - Workflow tersebut mengemas secret repositori ke dalam file
actionsSecrets.jsonyang dienkode Base64 ganda - Setelah itu, data diunggah dengan membuat repositori GitHub bernama acak yang memiliki deskripsi
Sha1-Hulud: The Second Coming. - HelixGuard mengonfirmasi bahwa lebih dari 27.000 repositori GitHub telah terinfeksi
- Informasi rahasia yang dicuri mencakup berbagai kredensial layanan seperti
AWS_ACCESS_KEY_ID,SLACK_WEBHOOK_URL,CODECOV_TOKEN,WEBFLOW_TOKEN, dan lainnya
Daftar paket yang terinfeksi
- HelixGuard melaporkan bahwa ratusan paket NPM telah terinfeksi
- Contohnya mencakup paket dari organisasi besar seperti
@asyncapi,@ensdomains,@posthog,@zapier,@postman,@voiceflow - Tiap paket memiliki banyak versi yang terinfeksi, misalnya
@asyncapi/specs@6.8.2,@postman/csv-parse@4.0.5
- Contohnya mencakup paket dari organisasi besar seperti
- Sebagian besar paket yang terinfeksi menyamar sebagai proyek open source normal, dengan kode berbahaya disisipkan dalam proses distribusi otomatis
Implikasi keamanan
- Serangan ini merupakan contoh infeksi skala besar pada ekosistem open source dengan memanfaatkan kelemahan keamanan rantai pasok
- Ini menunjukkan perlunya penguatan pengelolaan keamanan di seluruh infrastruktur pengembangan, termasuk NPM, GitHub, dan kredensial cloud
- HelixGuard menyarankan untuk segera menghentikan instalasi paket yang terinfeksi dan segera mencabut token serta kredensial terkait
5 komentar
Ekosistem js memang benar-benar tempat sampah yang kacau balau.
https://github.com/search/…
Saya sudah membuat skrip pemindai real-time.
Di path repositori yang dicurigai,
jalankan
npx sha1-hulud-scanner.Kode sumber: https://github.com/developerjhp/sha1-hulud-scanner
Komentar Hacker News
Berbagi satu tip: lebih baik pakai PNPM daripada NPM
PNPM 10.x memblokir beberapa vektor serangan
1️⃣ Secara default tidak menjalankan skrip post-install, dan perlu persetujuan manual
2️⃣ Bisa diatur agar instalasi baru dilakukan setelah lewat jangka waktu tertentu sejak rilis baru dipublikasikan, misalnya 4 hari
NPM terlalu rapuh untuk lingkungan CLI produksi
Sebaiknya kunci publisher dibatasi dengan hak akses minimum, diikat hanya ke paket tertentu, dan IP-nya dibatasi ke runner CI/CD
Jangan simpan kunci publikasi di lokal; bila perlu pertimbangkan OIDC Trusted Publisher atau akses berbasis token
Hanya untuk lockfile saja sudah dicoba lima kali, tapi tetap belum sempurna
Kalau melihat struktur dan riwayat commit-nya, timnya jelas bekerja keras untuk memperbaikinya, tapi terasa seperti memulai dari lubang yang terlalu dalam
Sampai sekarang masih gagal mendeteksi EOF dini saat transfer file, dan meninggalkan file yang tidak lengkap di cache, jadi pada koneksi internet lambat banyak waktu terbuang karena pembaruan gagal
Awalnya memang rumit, tapi rahasia bisa dikelola dengan konsep lease
Setiap build CI membuat lease, lalu otomatis dibuang saat selesai, dan juga mendukung TTL serta rotasi otomatis
Hasilnya, kredensial jangka panjang bisa disembunyikan, dan token berumur pendek hanya diterbitkan pada saat build
Sisi positif dari serangan seperti ini adalah diskusi keamanan yang benar-benar serius jadi lebih hidup di dalam perusahaan
npm ciKarena hanya menginstal versi yang tercantum di package-lock.json, risikonya terhadap serangan akibat pembaruan otomatis bisa dikurangi
Yang penting adalah membiasakan diri melakukan pembaruan yang disengaja saja
pip install --only-binary=:all:Ini memblokir distribusi source sepenuhnya dan hanya memasang wheel
Tapi memang bisa menimbulkan keterbatasan versi
Di
uv, opsi--exclude-newerbisa dipakai untuk meniru fitur “masa rilis minimum” ala PNPMSaya mengunci semua dependensi dan meninjau notifikasi dependabot secara manual
Saya masih bertanya-tanya apakah ini berlebihan atau justru kebiasaan yang benar
Ada tulisan yang sangat relevan hari ini: “We should all be using dependency cooldowns”
Pembaruan dependensi otomatis bisa lebih berbahaya daripada kerentanan satu hari
Jauh lebih sulit membalikkan paket yang terinfeksi yang sudah menyebar ke ribuan lock file
Kalau semuanya berjalan baik, tidak ada alasan untuk menyentuhnya
uvuntuk Python, efek serupa bisa didapat dengan perintahuv lock --exclude-newer $(date --iso -d "24 hours ago")Ada diskusi terkait di issue #14992
Perintah
npx npm-check-updates -c 7bisa mengatur cooldown 7 hariLihat dokumentasi npm-check-updates
Cooldown bisa memperpanjang waktu penyebaran kerentanan 0-day
Kalau semua orang memakai cooldown yang sama, yang terjadi hanya keterlambatan penemuan
Saya adalah co-founder PostHog
Kami termasuk korban serangan ini
Versi yang terinfeksi adalah posthog-node 4.18.1, 5.13.3, 5.11.3 / posthog-js 1.297.3 / posthog-react-native 4.11.1 / posthog-docusaurus 2.0.6
Kami sudah mengganti semua kunci dan kata sandi, lalu merilis versi baru
Kami sedang menganalisis penyebabnya dan akan memberi pembaruan di status.posthog.com
Jika situs web menyajikan versi yang terinfeksi, saya ingin tahu apakah pengunjung ikut terdampak
Pertanyaan serius: apakah masuk akal memulai proyek baru dengan Node
Saya sedang membuat frontend SaaS dengan Astro, dan setiap kali memperbarui dependensi rasanya cemas
Kurangnya keamanan di ekosistem npm terasa terlalu parah
Ekosistem seperti Rust yang juga bergantung pada banyak subpaket suatu hari akan mengalami hal yang sama
Tidak punya package manager seperti C, C++, atau Odin mungkin justru pilihan yang lebih bijak dari sisi keamanan
Belakangan ini saya lebih percaya pada JSR milik Deno
Paket berbasis JSR juga didistribusikan silang ke npm, dan ada pula paket khusus Deno
Misalnya Lume memberi kesan sebagai SSG yang lambat tetapi stabil
npm hanyalah repositori terbesar, jadi dari sudut pandang penyerang nilainya lebih tinggi
Hal yang sama sangat mungkin terjadi di RubyGems atau Cargo
Hanya karena ini ekosistem yang paling banyak dipakai, serangannya jadi terkonsentrasi di sini
Cukup kelola dependensi dengan hati-hati dan jangan memperbarui setiap hari
Keuntungannya adalah rendering halaman tidak membutuhkan lebih dari 100 dependensi
Lihat tautan proyek
Sekarang saya melakukan semua pengembangan hanya di dalam kontainer Podman
Kode yang belum saya baca pasti dijalankan di lingkungan terisolasi
Ini memang tidak sempurna, tapi menurut saya setidaknya merupakan kebiasaan keamanan dasar
Keamanan biasanya adalah bidang yang didelegasikan ke para ahli, jadi secara realistis sulit diubah
Dua belas tahun lalu NPM pernah down total sekali
Waktu itu masih proyek open source biasa, tapi sekarang dimiliki Microsoft
Kalau sudah dimiliki salah satu perusahaan terbesar di dunia, bukankah masalah seperti ini seharusnya bisa diselesaikan?
Tapi sampai sekarang tampaknya tidak banyak yang berubah
Hal yang tidak menghasilkan uang lewat lisensi enterprise dibiarkan begitu saja
Karena itu Windows 11 terasa seperti sekadar tumpukan pemasaran
Kami sedang memantau aktivitas serangan saat ini, dan memperbarui daftar paket yang terinfeksi di blog Wiz
Kami sedang merekayasa balik payload berbahaya tersebut, dan berencana membagikan hasilnya dalam beberapa jam ke depan
Fitur chat “Talk to a human” milik PostHog ternyata hanya memberi respons robot, jadi terasa menyebalkan
Tautan dukungan darurat juga tidak memberi arahan yang jelas
Jadi saya ingin bertanya — versi mana yang harus dihindari?
Versi yang terinfeksi adalah posthog-node 4.18.1, 5.13.3, 5.11.3 / posthog-js 1.297.3 / posthog-react-native 4.11.1 / posthog-docusaurus 2.0.6
Aman jika diperbarui ke versi terbaru
Saya penasaran kenapa kekacauan paket seperti ini selalu terjadi di ekosistem Node
Saya tidak mengerti kenapa komunitas ini menganggap hook instalasi yang rumit dan pembaruan otomatis sebagai rekayasa yang baik
Saya jadi paham kenapa pencipta Node sudah pergi sejak lama
Ekosistem raksasa, didominasi developer pemula, kesadaran keamanan rendah, dan bahkan fitur kecil pun bergantung pada library
Seperti Debian, harus ada pengelola tepercaya yang memverifikasi, tetapi komunitas JS menolak ini sebagai gatekeeping
Karena itu kejadian seperti ini terus berulang
Dengan sikap seperti itu, tidak ada yang akan berubah
Sedikit di luar topik, tapi saya penasaran siapa sebenarnya HelixGuard
Situs webnya berantakan dan hampir tidak ada informasinya
Katanya pelanggannya adalah bursa kripto, jadi terasa agak mencurigakan
Akun X HelixGuard
2️⃣ Bisa diatur agar instalasi baru dilakukan setelah jangka waktu tertentu berlalu sejak rilis baru didistribusikan (misalnya: 4 hari)
Fitur yang sangat bagus. Google juga kadang mengunggah versi yang bermasalah karena bug ke NPM, jadi ada saat-saat saya panik sambil bertanya-tanya apakah ini bug di pihak saya.