- Registry npm mengalami serangan rantai pasok yang membahayakan jutaan aplikasi perusahaan dan mengekspos miliaran catatan pengguna, tetapi ekosistem menerimanya seolah itu tak terhindarkan
- Senior Frontend Engineer Mark Vance menyindir kenyataan bahwa bahkan untuk mengubah satu string menjadi huruf besar, orang bergantung pada 40 tingkat dependensi bersarang dari paket yang tidak tervalidasi
- Ketika paket utilitas yang lama terbengkalai dibajak lalu crypto-miner disuntikkan ke build produksi di seluruh dunia, situasi itu diperlakukan seperti bencana alam
- Ekosistem Node.js menerima remote code execution berbahaya sebagai tragedi yang tak dapat diprediksi, sementara tim DevOps sibuk mengganti kunci AWS
- Ekosistem Go, Rust, dan Web API native menjadi kontras karena memiliki standard library yang kuat dan verifikasi kriptografis untuk mengurangi ketergantungan pada pihak ketiga
Sindiran terhadap serangan rantai pasok npm
- Registry npm terkena serangan rantai pasok yang mengompromikan jutaan aplikasi perusahaan dan mengekspos miliaran catatan pengguna, tetapi para pengembang di ekosistem JavaScript menerimanya dengan sikap seolah “memang tidak mungkin dihindari”
- Senior Frontend Engineer Mark Vance melihat kenyataan bahwa untuk mengubah satu string menjadi huruf besar saja orang mengandalkan pohon dependensi bersarang 40 tingkat dari paket yang tidak tervalidasi sebagai harga yang harus dibayar dalam pengembangan aplikasi web modern
- Ketika paket utilitas yang lama terbengkalai dibajak dan crypto-miner disuntikkan ke build produksi di seluruh dunia, situasi itu diperlakukan seperti bencana alam
- Ekosistem Node.js menerima remote code execution berbahaya sebagai tragedi yang tak dapat diprediksi, sambil mengirimkan “pikiran dan doa” kepada tim DevOps yang sibuk mengganti kunci AWS
Kontras antara ekosistem lain dan npm
- Ekosistem Go, Rust, dan Web API native memiliki standard library yang kuat sehingga sangat mengurangi ketergantungan pada kode pihak ketiga, dan menyertakan verifikasi kriptografis yang ketat dalam toolchain inti
- Di ekosistem tersebut, kontrasnya digambarkan sebagai “hari ini jumlah kasus proyek akhir pekan buatan mahasiswa dropout yang merusak infrastruktur logistik global adalah 0”
- Juru bicara npm menegaskan bahwa di dunia tempat pelaku jahat memang ada, hal seperti ini harus diterima, dan tidak ada kebijakan registry atau guardrail sandbox build yang bisa mencegahnya
- Registry npm digambarkan sebagai registry open source yang secara default menjalankan install script sewenang-wenang di mesin lokal, sehingga pernyataan juru bicara itu bertemu langsung dengan risiko strukturalnya
- Di bagian akhir, tulisan itu menyampaikan simpati kepada para korban sambil menutup dengan nada bahwa mereka harus tetap tangguh sampai “pelanggaran tak terelakkan berikutnya besok pagi”
1 komentar
Komentar Hacker News
Orang bisa punya pendapat masing-masing soal cooldown, tetapi banyak serangan rantai pasok npm belakangan ini, termasuk axios dan tanstack, kemungkinan besar bisa dihindari dengan cooldown
Jika memakai Artifactory / Nexus, kemungkinan besar cooldown sudah ada, dan kalau belum pun pengaturannya mudah
Karena sebagian besar kompromi npm atau PyPI diturunkan dalam hitungan jam, maksud cooldown adalah “abaikan paket yang dirilis kurang dari N hari yang lalu”. Bahkan 1 hari pun efektif, 3 hari cukup baik, dan 7 hari agak berlebihan tetapi tetap berfungsi
Untuk cara mengaturnya, bisa memakai pnpm terbaru yang sudah memiliki cooldown bawaan 1 hari https://pnpm.io/supply-chain-security, atau kalau ingin memperbaiki semuanya sekaligus, bisa memakai https://depsguard.com yang menambahkan cooldown dan pengaturan yang direkomendasikan ke npm, pnpm, yarn, bun, uv, dan dependabot. Saya adalah maintainer-nya
Atau ada juga https://cooldowns.dev yang lebih berfokus pada cooldown, serta skrip untuk membantu pengaturan lokal. Semuanya open source atau gratis
Kalau Anda sudah bisa mengedit ~/.npmrc dan sejenisnya secara manual, ini mungkin tidak perlu, tetapi bagi orang-orang di sekitar Anda yang membutuhkan solusi sekali klik, ini kemungkinan besar bisa membantu mereka menghindari serangan berikutnya
Tentu saja, saat harus menambal CVE kritis yang baru, cooldown perlu dilewati, dan masing-masing punya caranya. Tidak ada angka pastinya, tetapi dalam beberapa minggu terakhir tampaknya risiko yang lebih besar datang dari serangan rantai pasok perangkat lunak daripada CVE zero-day baru
Hal yang sama berlaku untuk upgrade dependensi berkala. Memang ada kasus yang harus segera dinaikkan, seperti respons terhadap kerentanan, tetapi saat itu saya rasa tidak masalah jika developer harus secara eksplisit menentukan versi baru yang diinginkan
Kalau semua orang memasang cooldown 7 hari, bukankah ledakannya cuma jadi terlambat?
Setelah dipikir-pikir lagi sambil menulis ini, saya tetap setuju dengan cooldown 10 hari untuk tidak memasang apa pun yang dirilis dalam 10 hari terakhir. Hanya saja, menurut saya ini tidak boleh dianggap sebagai satu-satunya mitigasi
Saya penasaran apa yang sebenarnya dijamin Go atau Rust dibanding Python/npm. Bisa jadi Python/npm hanya target yang lebih menggiurkan
Saya makin lama makin berusaha menghindari semua paket pihak ketiga
Maven Central sudah ada selama puluhan tahun, tetapi insiden pencurian namespace sangat sedikit
Anda tidak bisa mengunggah paket dengan groupId "com.ycombinator" tanpa verifikasi bahwa Anda memiliki domain ycombinator.com. Dan begitu paket diunggah, paket itu 100% immutable meskipun berisi kode berbahaya. Tentu saja, library seperti itu akan ditandai sebagai rentan di mana-mana
Sulit dimengerti kenapa NPM selama ini belum juga menyalin pengaman seperti Maven Central
Alih-alih ada kumpulan library tepercaya yang didistribusikan bersama bahasa, aplikasi harus membuat sendiri atau mengambil dari repositori paket pihak ketiga. Karena kita terus diajari untuk menghindari NIH, orang cenderung langsung mengambil paket
Itu sendiri belum tentu buruk, tetapi sering kali menarik kode jauh lebih banyak daripada yang diperlukan. Ekosistem JS juga menyukai modul-modul kecil, jadi butuh banyak modul, lalu semua orang menumpuk lagi di atasnya sehingga graf dependensinya menjadi sangat besar. Entah disengaja atau tidak, permukaan untuk timbulnya masalah jadi terlalu luas
Bahasa lain menyediakan jauh lebih banyak hal secara bawaan. Bukan berarti tidak pernah ada bug dan isu keamanan, tetapi dibanding yang terlihat di ekosistem JS, itu hanya setetes air di lautan. Graf dependensi eksternal jauh lebih kecil dan fungsi inti datang dari pihak ketiga yang tepercaya
Ini bukan pembelaan untuk NPM, malah hanya menambah satu faktor yang merugikan NPM
Bisa juga dibilang serangan seperti ini makin memperjelas perbedaan antara developer frontend dan backend, tetapi saya tidak akan melangkah sejauh itu
Di beberapa tempat kerja, saya pernah repot memasang pengaturan npm global yang aman di semua mesin developer, meminta orang agar tidak mematikannya, dan memverifikasinya lewat alat MDM
Pengaturan bawaan yang lebih aman seharusnya sudah ada sejak lama
Tidak ada alasan yang benar-benar sah mengapa skrip postinstall harus ada. Tim npm sekarang sudah cukup matang untuk menyatakan, “mulai npm versi sekian, skrip postinstall hanya akan dijalankan untuk versi paket yang dipublikasikan sebelum ${today}”
Ini karena toolchain developer seperti esbuild dibuat dalam bahasa terkompilasi dan didistribusikan sebagai binary lewat repositori npm. Kalau Anda memakai Node/npm terbaru serta OS/platform modern yang umum, seharusnya semua skrip postinstall bisa dinonaktifkan tanpa masalah yang sah
Hampir tanpa pengecualian, kode npm yang dipasang pada akhirnya akan dijalankan
Tetapi hal yang sama juga berlaku untuk kode biasa di dalam paket itu. Memang tidak dijalankan pada saat instalasi, tetapi pada akhirnya sesuatu di dalamnya akan dijalankan. Kalau tidak, sejak awal tidak akan dimasukkan sebagai dependensi
Mengira bahwa menghapus skrip postinstall akan memberi dampak lebih dari sesaat terhadap tingkat penyalahgunaan adalah tanda bahwa masalah ini belum dipikirkan sampai tuntas. Sayangnya, masalah ini jauh lebih bernuansa daripada yang disiratkan tulisan aslinya
Ini bukan soal seperti “jangan taruh tombol yang membuat sayap pesawat lepas di sebelah sakelar lampu”, melainkan inti persoalannya adalah tidak ada cara, tanpa kerja manual yang sangat melelahkan, untuk membedakan antara “kode buruk orang lain yang berjalan di komputer saya” dan “kode baik orang lain yang berjalan di komputer saya”. Dan justru untuk menghindari kerja manual yang melelahkan itulah kita menjalankan kode orang lain
Semua proyek Node.js dimulai dengan npm install, lalu tiba-tiba muncul 500 paket yang bahkan tidak diinginkan. Separuhnya sudah bertahun-tahun tidak disentuh
Ada masalah budaya yang ingin selalu menaikkan bahkan hal-hal yang sebenarnya sudah berjalan baik ke paket paling baru sebisa mungkin. Kadang changelog pun tidak dibaca untuk melihat apakah perubahan itu memang relevan
Cooldown hanyalah cara memaksa maintainer punya sedikit kesabaran, dan itu memang efektif
Paket Lisp bisa dipakai baik-baik saja selama 15 tahun tanpa perubahan, tetapi paket JS diperlakukan seolah-olah tidak dipelihara berarti masalah besar. Meski sebenarnya sudah selesai sejak 15 tahun lalu, orang tetap menaikkan versinya tanpa menambah apa pun, atau kadang malah memasukkan perubahan yang merusak, agar terlihat seperti masih dikelola di npm dan GitHub. Lalu semuanya ikut ter-update
Cooldown 7 hari terasa seperti tambalan sementara yang bisa dipasang dengan sedikit usaha. Solusi yang sesungguhnya mungkin adalah build yang reproducible dan attestasi yang ditandatangani, tetapi kebanyakan tim tampaknya tidak akan membayar biayanya sampai mereka sendiri menjadi korban
Ini terasa seperti artikel Onion
Tautan ini adalah versi yang jelas-jelas dicuci lewat AI dari lelucon lama Xe Iaso. Disayangkan
https://xeiaso.net/shitposts/no-way-to-prevent-this/CVE-2024...
https://news.ycombinator.com/item?id=40438408
[0]: https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...
https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...