- Paket npm berbahaya Shai-Hulud 2.0 menginfeksi mesin developer dan mencuri akses organisasi GitHub milik Trigger.dev
- Infeksi dimulai saat developer menjalankan
pnpm install, yang mengeksekusi skrip preinstall dari paket berbahaya dan mencuri kredensial menggunakan alat TruffleHog
- Selama 17 jam, penyerang mengkloning 669 repositori, lalu dalam 10 menit mencoba force-push ke 199 branch dan menutup 42 PR
- Paket dan sistem produksi tidak terdampak, dan serangan terdeteksi dalam 4 menit sehingga akses akun segera diblokir
- Setelah insiden, pengamanan diperkuat dengan menonaktifkan skrip npm, upgrade ke pnpm 10, publikasi npm berbasis OIDC, dan penerapan perlindungan branch secara menyeluruh
Gambaran serangan
- Pada 25 November 2025, saat debugging internal di Slack, muncul anomali berupa commit “init” atas nama Linus Torvalds di beberapa repositori
- Hasil investigasi menunjukkan worm supply chain Shai-Hulud 2.0 telah menginfeksi mesin developer dan mencuri kredensial GitHub
- Worm ini dilaporkan telah menginfeksi lebih dari 500 paket npm dan berdampak pada lebih dari 25.000 repositori
- Paket npm resmi Trigger.dev (
@trigger.dev/*, CLI) tidak terinfeksi
Timeline serangan
- 24 November 04:11 UTC: distribusi paket berbahaya dimulai
- 20:27 UTC: mesin developer di Jerman terinfeksi
- 22:36 UTC: akses pertama penyerang dan dimulainya kloning massal repositori
- 15:27~15:37 UTC (25 November): serangan destruktif dilakukan selama 10 menit
- 15:32 UTC: anomali terdeteksi dan akses diblokir dalam 4 menit
- 22:35 UTC: pemulihan semua branch selesai
Proses infeksi
- Saat developer menjalankan
pnpm install, skrip preinstall dari paket berbahaya dijalankan, mengunduh dan mengeksekusi TruffleHog
- TruffleHog memindai lalu mengekfiltrasi token GitHub, kredensial AWS, token npm, variabel environment, dan lainnya
- Pada mesin yang terinfeksi ditemukan direktori
.trufflehog-cache dan file terkait
- Paket yang menjadi sumber infeksi telah dihapus sehingga tidak bisa lagi dilacak
Aktivitas penyerang
- Setelah infeksi, penyerang melakukan aktivitas reconnaissance selama 17 jam
- Menggunakan infrastruktur berbasis AS dan India untuk mengkloning 669 repositori
- Memantau aktivitas developer sambil mempertahankan akses melalui token GitHub
- Membuat repositori bernama “Sha1-Hulud: The Second Coming”, yang diduga digunakan untuk menyimpan kredensial
- Setelah itu, selama 10 menit dilakukan aksi destruktif
- Mencoba force-push ke 199 branch di 16 repositori
- Menutup 42 PR, sebagian diblokir oleh pengaturan perlindungan branch
- Semua commit ditampilkan dalam format “Linus Torvalds <email> / init”
Deteksi dan respons
- Anomali terdeteksi secara real-time melalui notifikasi Slack
- Dalam 4 menit, akses GitHub untuk akun yang terinfeksi diblokir, lalu seluruh akses layanan seperti AWS, Vercel, dan Cloudflare juga dicabut
- Analisis log AWS CloudTrail menunjukkan hanya ada panggilan API read-only, tanpa akses ke data produksi
- AWS juga secara terpisah mendeteksi aktivitas mencurigakan terkait Shai-Hulud dan mengirimkan peringatan
Dampak dan pemulihan
- 669 repositori dikloning, 199 branch di-force-push, 42 PR ditutup
- Pemulihan sulit dilakukan karena GitHub tidak memiliki reflog sisi server, namun dengan memanfaatkan Event API dan reflog lokal, semuanya berhasil dipulihkan dalam 7 jam
- Paket npm dan infrastruktur produksi tidak mengalami kerusakan
Kebocoran kunci GitHub App
- Selama investigasi, private key GitHub App ditemukan di trash laptop developer
- Kunci tersebut memiliki izin read/write ke repositori pelanggan dan segera dirotasi
- Database (penyimpanan installation ID) tidak terdampak sehingga tidak ada bukti akses ke repositori pelanggan, namun kemungkinan itu tidak bisa sepenuhnya dikesampingkan
- Tim meminta log tambahan ke dukungan GitHub dan mengirim pemberitahuan email ke pelanggan
Analisis teknis Shai-Hulud
- Saat
setup_bun.js dijalankan, ia menginstal runtime Bun dan mengeksekusi bun_environment.js di background
- TruffleHog digunakan untuk mengumpulkan kredensial di direktori
$HOME
- Data yang dikumpulkan (
contents.json, cloud.json, truffleSecrets.json, dan lainnya) diunggah ke repositori GitHub acak dalam bentuk triple base64-encoded
- Jika ada token npm, worm akan memodifikasi dan memublikasikan ulang paket milik akun yang terinfeksi untuk memperluas penyebaran
- Jika tidak ada kredensial, worm mencoba menghapus direktori home
- File indikator infeksi:
setup_bun.js, bun_environment.js, .trufflehog-cache/, dan lainnya
Langkah penguatan keamanan
- Menonaktifkan seluruh skrip npm (
ignore-scripts=true)
- Upgrade ke pnpm 10: skrip dinonaktifkan secara default, dan
minimumReleaseAge (3 hari) diatur untuk menunda instalasi paket baru
- Mengadopsi npm Trusted Publishers berbasis OIDC untuk menghapus token jangka panjang
- Menerapkan perlindungan branch di semua repositori
- Mengadopsi Granted untuk AWS SSO, dengan enkripsi token sesi
- Di GitHub Actions, workflow dari kontributor eksternal kini wajib mendapat persetujuan sebelum dijalankan
Pelajaran untuk tim lain
- Struktur eksekusi kode arbitrer saat instalasi npm itu sendiri merupakan permukaan serangan
- Perlu mengaktifkan
ignore-scripts=true dan mengelola whitelist hanya untuk paket yang benar-benar diperlukan
- Gunakan pnpm minimumReleaseAge untuk menunda instalasi paket baru
- Perlindungan branch dan deployment berbasis OIDC adalah langkah keamanan yang wajib
- Jangan menyimpan kredensial jangka panjang di mesin lokal; izinkan deployment hanya melalui CI
- Noise dari notifikasi Slack menjadi kunci deteksi
Sisi manusiawi
- Developer yang terinfeksi tidak bersalah; insiden terjadi hanya karena menjalankan
npm install
- Selama serangan, ditemukan jejak bahwa akun tersebut otomatis memberi ‘star’ ke ratusan repositori acak
- Insiden ini menunjukkan kerentanan struktural dalam ekosistem, bukan kesalahan individu
Metrik ringkas
- Dari infeksi awal ke serangan pertama: sekitar 2 jam
- Lama penyerang mempertahankan akses: 17 jam
- Durasi aksi destruktif: 10 menit
- Waktu ke deteksi: 5 menit, waktu ke pemblokiran: 4 menit
- Waktu hingga pemulihan penuh: 7 jam
- Repositori yang dikloning: 669 / branch terdampak: 199 / PR yang ditutup: 42
Referensi
- Socket.dev: Shai-Hulud Strikes Again V2
- Laporan analisis dari PostHog, Wiz, Endor Labs, dan HelixGuard
- Dokumentasi npm Trusted Publishers, pnpm
onlyBuiltDependencies, minimumReleaseAge, dan Granted
Belum ada komentar.