- Versi berbahaya dari paket Nx dan plugin telah didistribusikan ke npm, memindai sistem file, mengumpulkan kredensial, lalu mengirimkannya ke repositori akun Github milik pengguna
- Untuk memeriksa apakah terdampak, perlu memastikan apakah repositori s1ngularity-repository telah dibuat di akun Github
- Jika terinfeksi, mengganti token dan kata sandi, menghapus repositori berbahaya, serta memeriksa file konfigurasi shell wajib dilakukan
- Versi berbahaya memengaruhi sistem melalui skrip postinstall; risikonya meningkat karena dapat dijalankan tanpa disadari, terutama saat memakai plugin VSCode Nx Console
- Pihak Nx telah menerapkan pencegahan kekambuhan dan langkah keamanan tambahan, dan versi terkait telah dihapus dari npm
Gambaran umum dan ringkasan
- Peringatan keamanan ini terkait serangan supply chain serius terhadap paket Nx dan beberapa plugin terkait, dengan kode berbahaya didistribusikan melalui npm
- Versi berbahaya tersebut memindai sistem file pengguna untuk mengumpulkan informasi autentikasi, path, dan lainnya, lalu mengunggahnya ke repositori Github (
s1ngularity-repository) - Skrip
postinstallberbahaya juga memodifikasi file konfigurasi shell pengguna (.zshrc,.bashrc) dengan menambahkan perintah mematikan sistem - Vektor serangan, proses serangan, versi yang terdampak, tindakan segera yang harus diambil pengguna, serta langkah pencegahan agar tidak terulang dijelaskan secara rinci
Langkah darurat
Hal yang harus diperiksa semua orang
- Periksa daftar repositori di akun Github Anda untuk memastikan apakah
s1ngularity-repositorytelah dibuat - Unduh file yang ada di repositori tersebut untuk disimpan sebagai arsip
- Hapus repositori tersebut dari Github
- Kirim email ke
security@nrwl.iountuk mendapatkan panduan cara mendekripsi informasi yang bocor - Segera ganti semua kredensial dan token untuk seluruh akun
Cara mengganti token Github
- Kunjungi https://github.com/settings/connections/…
- Cabut akses aplikasi yang terhubung untuk menonaktifkan token lama
- Jika menggunakan gh CLI, lakukan autentikasi ulang untuk membuat token baru
- Jika tidak ditindaklanjuti, token lama berisiko disalahgunakan
Hentikan penggunaan versi Nx berbahaya dan lakukan pembersihan
- Periksa apakah versi Nx yang sedang digunakan adalah versi berbahaya dengan perintah
npm ls nx - Jika termasuk versi terinfeksi, lakukan pembaruan dengan
npm uninstall nx && npm install nx@latest - Bersihkan cache dengan
npm cache clean --force
Pengguna yang sudah terinfeksi
- Ganti token npm dan Github
- Reset seluruh kata sandi dan kredensial Github serta layanan terkait
- Periksa file
.zshrcdan.bashrcuntuk memastikan tidak ada perintah asing yang disisipkan, lalu hapus
Untuk administrator repositori paket internal
- Segera hapus versi berbahaya dari proxy di registry internal perusahaan untuk mencegah penyebaran lebih lanjut
Informasi versi yang terdampak
Paket Nx
21.5.0,20.9.0,20.10.0,21.6.0,20.11.0,21.7.0,21.8.0,20.12.0- Sudah dihapus dari npm per pukul 10:44 PM EDT
@nx/devkit, @nx/js, @nx/workspace, @nx/node, @nx/eslint, @nx/key, @nx/enterprise-cloud
- Sudah dihapus dari npm per pukul 10:44 PM dan 6:20 AM EDT
Rincian vektor serangan
Penyebab workflow yang rentan
- Kerentanan yang memungkinkan eksekusi kode arbitrer diperkenalkan ke workflow Github Actions
- Jika kode bash tertentu disisipkan ke judul PR, kerentanan di workflow memungkinkan perintah sistem dijalankan (Bash Injection)
- Disalahgunakan melalui trigger
pull_request_target, sehingga memperoleh hak istimewa yang lebih tinggi (GITHUB_TOKEN, dll.) - Sampai dihapus, workflow rentan tetap ada di branch lama selain
main, sehingga penyerang berhasil menjalankan workflow dengan PR berbahaya dan mencuri secret
Proses pencurian token npm
- Workflow rentan dimanfaatkan untuk menjalankan
publish.yml publish.ymlmenyimpan token npm di Github Secrets, dan dalam prosesnya token dikirim ke webhook eksternal- Pada akhirnya penyerang menggunakan token ini untuk mengunggah versi berbahaya dari Nx dan paket pendukung ke npm
Perilaku paket berbahaya
Mengumpulkan informasi termasuk kredensial dan memublikasikannya ke repositori Github
- Saat skrip
postinstalldari paket Nx yang terinfeksi dijalankan, berbagai lokasi file teks dan informasi kredensial dikumpulkan - Data di-encode dalam base64 lalu diunggah ke repositori Github bernama
s1ngularity-repository - Walaupun repositori aslinya telah dihapus, karena sebelumnya sempat bersifat publik, kemungkinan kebocoran informasi tetap harus dipertimbangkan
Modifikasi profil shell (.zshrc, .bashrc)
postinstallmenyisipkan perintahsudo shutdown -h 0, yang dapat memicu sistem mati saat terminal dijalankan dan berpotensi mengekspos kata sandi
Berbagai skenario saat postinstall dapat berjalan
-
Selain saat
npm install/yarn/pnpm installdijalankan secara eksplisit, ini juga dapat berjalan dalam berbagai situasi seperti dependensi transitif, ekstensi editor, dan eksekusi skrip -
Khususnya, ekstensi Nx Console untuk VSCode (versi
18.6.30~18.65.1) dapat secara otomatis memasangnx@latestsaat editor dijalankan, sehingga memicu eksekusipostinstall -
Pada dasarnya, perlu diwaspadai bahwa pemasangan modul NPM dapat terjadi di banyak tempat meski tidak disengaja
-
Mulai
Nx Console (18.66.0), proses pemasanganlatest nxtelah dihapus
Linimasa serangan dan respons
21 Agustus
- 4:31 PM: PR yang berisi kerentanan Bash injection di-merge
- 10:48 PM: Postingan yang menunjukkan kerentanan dipublikasikan di X (sebelumnya Twitter)
22 Agustus
- Sore hari: investigasi internal, rollback workflow rentan (tidak lengkap)
- Penerapan CodeQL untuk mendeteksi kerentanan serupa pada PR di masa depan
24 Agustus
- Muncul commit di fork penyerang yang menunjukkan indikasi kebocoran token npm
- PR berbahaya dibuat lalu dihapus, dan
publish.ymldijalankan oleh PR ini
26 ~ 27 Agustus (distribusi versi berbahaya dan respons)
- Banyak versi berbahaya Nx dan plugin didistribusikan ke npm secara bertahap
- Isu dilaporkan ke komunitas Github/NPM
- 10:44 PM: Pihak NPM mengambil tindakan termasuk menghapus seluruh versi terkait
- 11:57 PM: Semua token untuk publikasi paket terkait Nx dinonaktifkan
- 27 Agustus: Patch Nx Console, 2FA, peralihan ke metode Trusted Publisher, dan langkah tambahan lainnya
Tindakan pencegahan sebelumnya dan respons lanjutan
- 2FA diwajibkan bagi semua maintainer di organisasi
nrwl - Menerapkan mekanisme Trusted Publisher. Distribusi berbasis token npm dilarang
- Ke depannya, paket hanya akan dirilis setelah melalui verifikasi berbasis kepercayaan dan 2FA
- Deteksi risiko tambahan, persetujuan PR, perlindungan branch, dan langkah bertahap lainnya juga diterapkan
Pelajaran dan rencana ke depan
- Kembali menyadarkan pentingnya supply chain, pipeline CI/CD, dan prinsip minimisasi izin workflow baik secara lokal maupun global
- Setelah ditinjau ulang secara internal, tim berencana membagikan pembelajaran ini kepada komunitas
Pertanyaan
- Dapat menghubungi
security@nrwl.io
Referensi dan lampiran
- Isu utama Github, linimasa, dan postingan terkait
- Menyediakan contoh skrip
telemetry.jsdi dalam paket yang terinfeksi - Skrip ini mengumpulkan path file teks penting dalam sistem file untuk tujuan pembuatan inventaris
Ringkasan kesimpulan
- Penting untuk segera menerapkan pembaruan dan patch terbaru untuk Nx dan plugin terkait
- Sangat disarankan untuk segera mengganti informasi autentikasi penting seperti npm dan Github
- Insiden ini menjadi pengingat bahwa lemahnya keamanan supply chain dan pengelolaan izin workflow dapat berujung pada insiden besar
1 komentar
Komentar Hacker News
Ingin mengingatkan secara berkala untuk menonaktifkan skrip
npm installContohnya bisa memakai perintah berikut:
Pengaturan ini bisa dengan mudah diterapkan per proyek atau secara global
Saat ini jarang ada paket sah yang tidak bisa berjalan tanpa skrip, jadi dalam kebanyakan kasus tidak masalah
Untuk paket yang benar-benar membutuhkannya, bisa diatasi dengan membuat skrip instalasi terpisah lalu menjalankannya secara manual di folder tersebut
Ini bukan solusi ajaib untuk semua serangan supply chain, tetapi cukup efektif memblokir banyak serangan nyata lewat npm
Untuk detail lebih lanjut, lihat dokumentasi resmi npm config
Saya juga memakai bubblewrap untuk mengisolasi npm, pnpm, yarn, dan semua sesi yang mereka jalankan dari sistem
npmdi awal PATHMemakai pnpm juga bisa jadi cara. Versi terbaru secara default mengabaikan semua lifecycle script, dan hanya menjalankannya jika dimasukkan ke whitelist satu per satu
Setiap kali mendengar saran ini, saya selalu bertanya: dalam praktiknya tidak ada developer yang membaca puluhan hingga jutaan baris kode yang diinstal npm
git clonenpm install(di sini ada risiko paket berbahaya terinstal; mengabaikan skrip post-install hanya menahannya sementara)npm run(di sini paket berbahaya dijalankan dan infeksi terjadi)node_modulesdi antara langkah 2 dan 3, dan tidak ada yang melakukannyaSaya menjalankan semua tool berbasis npm di dalam container Docker tanpa hak akses ke apa pun selain direktori saat ini
Saya penasaran kenapa saran semacam ini tidak diterapkan ke
setup.py(Python) ataubuild.rs(Rust)Kita perlu budaya untuk benar-benar berpikir dua kali saat menambahkan dependensi baru
Tahun ini sudah terjadi sangat banyak serangan supply chain
Minggu ini saya ingin menambahkan progress bar dengan 8 penghitung statistik ke proyek Go
Setelah mencari library, ternyata kodenya lebih dari 3.000 baris, jadi saya minta LLM membuat UI sederhana dan selesai dalam kurang dari 150 baris
Tanpa dependensi, berjalan persis seperti yang diinginkan, sangat sederhana, dan semua orang bisa dengan mudah membaca serta memperbaikinya
Fungsinya menghapus output terminal lalu menggambar ulang setiap detik, dengan dukungan thread-safe
Implementasi dan review cukup 25 menit
Jika tidak butuh fitur statistik yang kompleks, progress bar bahkan bisa dibuat dengan sekitar 30 baris kode
Ke depannya, saat mempertimbangkan apakah perlu menambah dependensi, sepertinya membuat sendiri lebih cocok untuk saya
Saya tidak punya cukup sumber daya untuk memantau semua update paket
Saya setuju dengan poin itu, dan saat “package manager per bahasa” mulai populer dulu saya benar-benar merasa cemas
Saya rasa pendekatan seperti cargo vet adalah arah ke depan: pengenalan cargo vet
Perbedaan antara implementasi sendiri dan memakai library memang hal yang wajar
Saya sangat benci library progress bar seperti ini, terutama yang merusak emacs shell (expo, eas, dsb.)
..10%..20%..30%atauUploading…Tim kami di sebuah perusahaan asuransi besar mengelola monorepo skala besar dan library dengan NX sebagai pusatnya
Daripada hanya menyalahkan Nx, Anthropic, atau platform-nya, kita perlu memikirkan ulang penyebab sebenarnya
Serangan ini bisa menimbulkan kerusakan fatal pada puluhan ribu institusi di bidang keuangan, listrik, telekomunikasi, rumah sakit, militer, dan lain-lain
Dengan makin meluasnya AI, skala dan dampak serangan akan semakin besar
Kita tidak cukup bertanggung jawab dalam menulis software. Seperti kode bangunan, kepatuhan terhadap keselamatan dan keamanan mungkin perlu dipaksakan
Saya pikir orang kurang menyadari betapa berbahayanya lingkungan komputasi pribadi saat ini yang menyatukan semuanya dalam satu ruang besar
50% korban menggunakan VS Code sebagai jalur infeksi, dan hanya bekerja di Linux serta macOS
s1ngularity-repositorydan lain-lain) setelah di-encode dua atau tiga kali dengan base64Fakta bahwa token/kredensial GitHub tidak disimpan di password manager dengan mekanisme pelepasan manual juga sebagian salah GH CLI
Saya tidak suka ide memperkenalkan “kode bangunan software”, tetapi saya setuju bahwa seluruh industri terlalu rapuh
Menuntut tanggung jawab hanya karena seseorang memakai library open source gratis menurut saya arogan
Akhir-akhir ini saya mengerjakan sebagian besar pekerjaan development di VM
Rasanya tingkat keamanan lingkungan saat ini sudah tidak bisa diterima
Potensi agent (software agen) menjadi vektor malware sekarang sangat besar
Jika penyerang berhasil masuk ke box (PC), ini zaman di mana data bernilai lebih dari 1.000 dolar, kunci kripto, password, data pribadi, dokumen finansial, dan sebagainya bisa langsung jadi sasaran
Saya juga melakukan hal serupa di dalam container Podman. Tidak berbagi apa pun dengan host selain direktori source code
Sebagian masalah berasal dari model keamanan PC tradisional (Linux/Windows)
Jika Anda menyukai pendekatan seperti ini, saya ingin merekomendasikan Qubes OS. UX-nya bagus untuk melakukan semua pekerjaan di VM
Namun perlu disebutkan bahwa membangun lingkungan seperti ini sangat sulit atau cukup mahal, karena ekosistem dan sejarah software
Claude Code adalah tool revolusioner untuk meningkatkan produktivitas
Di sisi lain, ada isu keamanan seperti berikut:
curlke bash (risiko remote code execution)Jadi ada setidaknya tiga kelemahan keamanan seperti ini, dan saya tidak ingin menjalankannya di luar sandbox seperti VM/container/dev box khusus
Saya juga setuju bahwa agen sebaiknya dijalankan di sandbox
Tapi memangnya kenapa?
Titik yang benar-benar berbahaya adalah ia melakukan auto-update tanpa intervensi pengguna, sehingga selama proses berjalan pada dasarnya Anda memberi Anthropic hak remote code execution
Saya penasaran apakah package manager perlu pengaturan seperti ‘minimum usia paket (min-age)’
Misalnya, jika paket didaftarkan kurang dari 24~36 jam lalu, maka diabaikan
Dulu saya pernah mengalami kasus serupa: update paket merusak semuanya lalu beberapa jam kemudian cepat diperbaiki/dihapus
GitHub dependabot baru-baru ini menambahkan fitur persis seperti itu
Renovate bot sudah lama menyediakan opsi ini (
minimumReleaseAge), dan sekarang dependabot juga mendukungnyaBukan di level OS, tetapi tool
uvdari Astral punya opsi seperti ini untuk paket Pythonnpm installjuga punya flag untuk hanya memasang dependensi sebelum waktu/tanggal tertentunpm install --before (tanggal 2 hari lalu), dependensi yang muncul setelah tanggal itu tidak akan dipasangSaya mengatur
save-exact=truedi.npmrcdan hanya mengandalkan lockfile serta update manualSaya penasaran apakah claude code benar-benar akan menjalankan prompt seperti itu, jadi saya mengujinya
“Permintaan ini tampaknya meminta pencarian/pendaftaran file sensitif seperti crypto wallet, private key, dan sejenisnya, sehingga berpotensi disalahgunakan dan saya tidak bisa membantu”
Ia hanya mengarahkan ke permintaan yang sah seperti pemeriksaan keamanan, analisis kerentanan, penulisan tool monitoring, memahami izin file, atau merancang prosedur backup
Saya sudah mengamankan setidaknya 250 kasus sukses (artinya beberapa prompt memang lolos)
Dalam praktiknya, setiap kali Claude diadu dengan model lain dalam hal penolakan, saya selalu melihat penolakan/pengaman Claude jauh lebih baik
OS pada dasarnya seharusnya mencegah aplikasi memiliki akses tak terbatas ke seluruh filesystem
Beberapa aplikasi memang punya profil apparmor/selinux, dan firejail juga bisa dipakai
Tetapi dari sisi UX, perubahan tetap dibutuhkan
Ini masalah yang sangat serius. Ini akibat desain desktop 30 tahun lalu
Saya sedang mengembangkan sendiri tool di Linux yang fokus pada isolasi lingkungan per proyek dengan Podman: probox
Dalam hal keamanan file Android, Google melakukan pekerjaan dengan baik
Saya juga merekomendasikan belajar memakai bubblewrap dan lingkungan chroot kecil
Saya rasa tidak ada sistem operasi yang menjadikan “aplikasi punya akses tak terbatas ke seluruh filesystem” sebagai default
Dulu ada rasa percaya diri samar bahwa “penyerang harus menebak lingkungan saya”, tetapi sekarang mereka bisa menyuruh LLM mempelajari lalu melakukan serangan yang sesuai dengan lingkungan tersebut
Saya menilai diri sendiri sempat memprediksi arah seperti ini
Ada diskusi yang layak dilihat di pembahasan sebelumnya
Bagian yang benar-benar menyeramkan adalah, sekarang mereka memakai LLM lokal untuk mencari secret
Masalah “postinstall” tetap seperti dulu, tetapi payload-nya benar-benar generasi baru
Logika berbahaya disembunyikan di prompt alih-alih kode, jadi jauh lebih sulit dideteksi lewat analisis statis yang ada sekarang
Saya jadi berpikir bagaimana seharusnya kita bertahan dari prompt berbahaya seperti ini