Paket berbahaya yang diunduh lebih dari 86 ribu kali disebarkan secara massal di NPM
(arstechnica.com)- Di repositori NPM, terkonfirmasi bahwa lebih dari 100 paket berbahaya pencuri kredensial diunggah tanpa terdeteksi sejak Agustus, dan total telah diunduh lebih dari 8.6000 kali
- Perusahaan keamanan Koi melaporkan bahwa kampanye serangan yang dinamai PhantomRaven mendistribusikan 126 paket berbahaya dengan menyalahgunakan fitur Remote Dynamic Dependencies (RDD) milik NPM
- RDD adalah struktur yang memungkinkan paket mengunduh kode dependensi secara dinamis dari domain yang tidak tepercaya, sehingga tidak terdeteksi oleh alat analisis statis
- Penyerang memanfaatkan fitur ini untuk mengunduh kode berbahaya melalui koneksi HTTP, sementara metadata paket menampilkan “0 Dependencies” sehingga pengembang dan pemindai keamanan tidak menyadarinya
- Kerentanan struktural ini menyoroti batas pengelolaan keamanan ekosistem NPM dan risiko mekanisme instalasi otomatis
Penyebaran paket berbahaya di repositori NPM
- Penyerang mengunggah lebih dari 100 paket pencuri kredensial sejak Agustus dengan memanfaatkan kelemahan struktural pada repositori kode NPM
- Sebagian besar paket didistribusikan tanpa terdeteksi, dengan total unduhan kumulatif lebih dari 86.000 kali
- Perusahaan keamanan Koi menamai serangan ini sebagai kampanye PhantomRaven dan menganalisis bahwa fitur tertentu di NPM telah disalahgunakan
- Menurut Koi, dari 126 paket berbahaya, sekitar 80 di antaranya masih tetap ada di NPM saat artikel ditulis
Struktur rentan pada Remote Dynamic Dependencies (RDD)
- RDD adalah fitur yang memungkinkan paket mengunduh kode dependensi secara dinamis dari situs web eksternal
- Biasanya dependensi diunduh dari infrastruktur tepercaya milik NPM, tetapi RDD juga mengizinkan pengunduhan melalui koneksi yang tidak terenkripsi seperti HTTP
- Penyerang PhantomRaven memanfaatkan fitur ini dengan mengatur paket agar mengunduh kode dari URL berbahaya, misalnya
http://packages.storeartifact.com/npm/unused-imports- Dependensi semacam ini tidak terlihat oleh pengembang maupun pemindai keamanan, dan pada informasi paket ditampilkan sebagai “0 Dependencies”
- Karena fitur instalasi otomatis NPM, kode dependensi yang ‘tak terlihat’ ini otomatis dijalankan
Batas kemampuan deteksi alat keamanan
- Oren Yomtov dari Koi menyebut, “PhantomRaven adalah contoh yang secara cermat mengeksploitasi titik buta alat keamanan yang ada”
- RDD tidak terdeteksi oleh alat analisis statis
- Akibatnya, penyerang dapat melewati verifikasi keamanan dan menyebarkan kode berbahaya
Faktor kerentanan tambahan
- Koi menjelaskan bahwa dependensi yang diunduh melalui RDD diunduh ulang dari server penyerang pada setiap instalasi
- Karena tidak ada cache atau pengelolaan versi, bahkan untuk paket yang sama pun ada kemungkinan kode berbahaya berbeda disuntikkan pada setiap waktu instalasi
- Struktur unduhan dinamis semacam ini menyulitkan verifikasi integritas paket
Struktur dan latar belakang NPM
- NPM adalah manajer paket untuk JavaScript yang dikelola oleh anak perusahaan GitHub, npm, Inc.
- Ini adalah manajer paket bawaan untuk Node.js, dan terdiri dari klien baris perintah serta npm registry
- Registry menyimpan paket publik dan paket privat berbayar, dan dapat ditelusuri melalui situs web
- Insiden ini disebut sebagai contoh bagaimana struktur pengelolaan dependensi otomatis NPM dapat disalahgunakan dalam serangan
Penyebutan lain
- Di bagian akhir artikel, disebutkan pendapat bahwa eksekusi JavaScript yang tidak perlu harus diblokir
- Namun, serangan kali ini juga disebut sebagai kasus penyalahgunaan bahkan terhadap kode JavaScript yang esensial
2 komentar
Saya sudah membuat skrip pemindai real-time.
Di path repositori yang dicurigai,
jalankan
npx sha1-hulud-scannerlalu tekan Enter.
Kode sumber: https://github.com/developerjhp/sha1-hulud-scanner
Komentar Hacker News
Akhir-akhir ini saya memasang alias agar perintah
npmdijalankan di dalam kontainer DockerDengan begitu, variabel lingkungan saya tidak terekspos, tidak bisa mengakses file di luar direktori saat ini, dan juga tidak bisa mengakses file konfigurasi seperti
.bashrcReferensi: Run tools inside Docker
npmtetap mengunduh kode arbitrer yang akan langsung dijalankanSebagai gantinya saya merekomendasikan
pnpm. Secara bawaan ia tidak menjalankan lifecycle script, dan skrip yang diizinkan bisa ditentukan dengan whitelistKalau benar-benar ingin perlindungan, bukan hanya instalasinya, tetapi seluruh proses eksekusi harus dijalankan di dalam sandbox
Memblokir hanya post-install seperti sekarang hanyalah setengah solusi. Serangan rantai pasok makin berbahaya
Jika
neovimatauvscodeterinfeksi, itu sudah cukup berbahaya hanya dengan hak akses pengguna biasaAlias sederhana memang cocok untuk
node/npm, tetapi sulit diterapkan ke program lain. Soalnya resource yang dibutuhkan harus di-mount ke kontainerSaya sudah lama penasaran. Kenapa orang-orang santai saja menjalankan
npmlangsung di sistemDari sudut pandang yang terbiasa dengan build yang dapat direproduksi seperti
make, saya kaget melihatnpmselalu mengunduh hal berbeda dan menghasilkan hasil berbedaBahkan mengikat pembuatan CSS ke dependensi npm terasa aneh. Jadi saya pernah mencoba membekukan (freeze) seluruh lingkungan npm di dalam Docker, tetapi rasanya seperti perang yang tak mungkin dimenangkan
maven,nuget,pip,npm, semuanya samaKalau masih bergantung pada package manager distribusi seperti dulu, ekosistem yang bergerak cepat seperti sekarang mungkin tidak akan ada
Meski begitu, package manager baru dengan keamanan yang lebih kuat mulai bermunculan. Tidak tepat menyalahkan sarana tanpa memahami alasannya
npmdi Docker, saya ingin tahu apakah lingkungan itu diverifikasi setiap kali dependensi diperbaruiSebenarnya
npmdanpnpmsudah membekukan dependensi secara default lewat file locknpm install thing” terlalu mudah dan murahBanyak open source dipenuhi kode untuk CV ketimbang kualitas, lalu akhirnya dipakai untuk membuat hal-hal seperti pelacak iklan perusahaan raksasa atau aplikasi dompet
npm installbukan sekadar mengunduh paket, tetapi juga menjalankan kodeHook preinstall, install, dan postinstall di
package.jsonbenar-benar dieksekusiApa alasan sah untuk perlu menjalankan perintah arbitrer saat proses instalasi?
Laporan terkait: PhantomRaven npm malware
Contoh lain: blog Socket.dev
Misalnya, paket kernel Linux menjalankan skrip post-install untuk membangun ulang initramfs, memperbarui GRUB, dan sebagainya
Kebanyakan paket DEB/RPM memang menyertakan skrip seperti ini. Jadi ini masalah desain itu sendiri
npmsiapa pun bisa mengunggah paketDistribusi Linux punya sistem maintainer yang tepercaya, bahkan ada yang membangun root of trust berbasis PGP sendiri
Sementara
npm,pip,rubygems,cargo, dan lainnya pada dasarnya hanya versi mewah dari “curl | bash”Build post-install seperti ini dibutuhkan untuk mengurangi beban pemeliharaan
Package.swiftHanya saja saya dengar ia di-sandbox dengan ketat, jadi sulit disalahgunakan
Referensi: dokumentasi SwiftPM, PackageDescription
pnpm v10secara default menonaktifkan semua lifecycle script, dan pengguna harus mengizinkannya secara manualDiskusi terkait
Melihat serangan
npmbelakangan ini, saya jadi bertanya-tanya apakah mengembangkan dengannpmmasih amanSetiap kali memulai proyek React, ratusan paket terpasang, dan saya bahkan tidak tahu apa yang mereka lakukan
Di backend, biasanya hanya paket yang benar-benar dibutuhkan yang dipasang secara eksplisit, tetapi frontend terasa seperti kotak Pandora kerentanan
npmyang paling besar dan paling sering masuk beritajjdi Rust dan terpasang 470 paket, sedangkanwan2gpdi Python memasang 211 paket. Kurang lebih sama sajaSeperti insiden
xz, setiap dependensi bergantung pada orang acak di internet, dan kita harus percaya mereka tidak akan terkena rekayasa sosialPyPIjuga tidak aman. Ada kasus paket sah disisipi kode berbahaya lewat peretasan GitHub ActionsSetiap kali mengembangkan dengan framework seperti Angular atau Vue, saya merasa cemas
Melihat ribuan dependensi di
node_modulesterasa seperti pertanda bencanaKalau satu pengembang open source kena phishing, semuanya bisa langsung terinfeksi
Ekosistem JavaScript rusak secara mendasar. Satu salah ketik saja bisa membuka jalan bagi serangan rantai pasok
Di NuGet atau Maven itu juga mungkin, tetapi di sana standard library lebih besar sehingga dependensinya lebih sedikit dan ada rasa kontrol
Memang tidak sempurna, tetapi setidaknya selangkah lebih baik
Dari 86.000 unduhan, kemungkinan besar sebagian besar bukan pengguna nyata melainkan scanner otomatis atau bot
Kalau merilis versi baru, dalam satu-dua hari bisa diunduh ratusan kali, tetapi mungkin bukan manusia sungguhan
Artinya, bisa jadi hampir tidak ada pengguna yang benar-benar terinfeksi
Ada juga banyak serangan yang menargetkan nama paket yang dihalusinasi oleh chatbot AI. Jadi ini lebih dari sekadar statistik sederhana
Untuk penjelasan serangan yang lebih rinci, lihat artikel BleepingComputer
Saya penasaran apakah ada cara untuk mendeteksi atau memfilter paket yang menggunakan dependensi URL HTTP saat
npm installKarena payload bisa dikirim berbeda untuk tiap peminta, deteksinya sulit dilakukan dengan scanner biasa
Sebagai pengembang hobi, saya memikirkan bagaimana seharusnya bersiap menghadapi serangan rantai pasok seperti ini
Saat mengikuti tutorial populer dan memasang dependensi, lama-lama kita jadi tidak peka terhadap keamanan
Saya juga menjalankan berbagai layanan di homelab, dan khawatir bot bisa menyusup. Harus mulai dari mana?
Memang bukan jaminan sempurna, tetapi jauh lebih baik daripada seluruh server dibobol
Menyalin langsung kode yang dibutuhkan untuk dipakai sendiri juga bisa jadi cara belajar yang baik sekaligus lebih aman
Dengan struktur seperti itu, keandalan bisa dijamin di tingkat distribusi tanpa setiap pengguna harus memverifikasi semuanya sendiri
Contohnya: Hono, Zod
Saya belakangan beralih ke Bun, karena driver DB, klien S3, dan hal-hal semacam itu sudah bawaan sehingga unduhan tambahan berkurang
Struktur yang mengambil dependensi dari lifecycle hook bisa menjadi titik balik serangan kapan saja
Hari ini mungkin masih normal, tetapi nanti pemiliknya bisa diretas atau berubah pikiran lalu menjadikannya berbahaya
Hook instalasi seperti ini pada akhirnya adalah desain yang tidak berkelanjutan