4 poin oleh GN⁺ 2025-12-15 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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.

Belum ada komentar.