Worm NPM Kembali dan Kali Ini Jauh Lebih Buruk (TanStack Diretas)
BBetter Stack
Computing/SoftwareManagementInternet Technology
Transcript
00:00:00Shai Hulud kembali dengan sekuel keempat.
00:00:02Kali ini sasarannya adalah paket seperti TanStack,
00:00:04hanya beberapa jam setelah saya mempublikasikan video tentang Next.js ini,
00:00:07yang kebetulan memiliki waktu yang sangat tepat.
00:00:08Ini sebenarnya adalah serangan rantai pasok NPM berskala besar
00:00:11yang berdampak lebih dari sekadar TanStack.
00:00:13Serangan ini juga menyerang paket seperti UiPath, Mistral,
00:00:15dan 160 paket lainnya,
00:00:17bahkan termasuk paket PyPy seperti Guardrails.ai.
00:00:20Yang membuat ini lebih menarik
00:00:22adalah adanya mekanisme Deadman switch,
00:00:24jadi jika ia mendeteksi Anda mengganti kunci curian Anda,
00:00:26ia akan menghapus seluruh isi PC Anda,
00:00:28dan bahkan memiliki muatan politik global di dalamnya.
00:00:30Mari kita bahas lebih dalam.
00:00:36Untuk sekuel ini, The Worm memiliki tujuan yang sama,
00:00:39mencuri kredensial dari mesin pengembang dan runner CI/CD,
00:00:42lalu menggunakan kredensial tersebut untuk mencapai paket lainnya.
00:00:44Untuk TanStack, itu berarti mempublikasikan 84 versi berbahaya
00:00:47di 42 paket TanStack hanya dalam beberapa menit.
00:00:51Sekarang, saya akan menjelaskan bagaimana mereka berhasil
00:00:52menginfeksi TanStack sejak awal,
00:00:54namun mari kita lihat apa yang dilakukan malware tersebut
00:00:56jika Anda menginstal salah satu paket yang terdampak.
00:00:58Di dalam paket berbahaya tersebut,
00:00:59Anda akan menemukan file baru bernama routerinit.js,
00:01:02serta dependensi opsional yang disuntikkan,
00:01:04yang mengarah ke tautan yang terlihat seperti
00:01:05tautan GitHub router TanStack yang sah,
00:01:08namun sebenarnya adalah commit yatim di fork penyerang.
00:01:10Ini hanyalah cara GitHub menangani tautan fork,
00:01:13jadi URL tersebut bisa terlihat
00:01:14seolah-olah milik proyek asli,
00:01:16meskipun commit tersebut sebenarnya berasal dari sebuah fork.
00:01:18Di dalam fork itu, ada skrip siklus hidup,
00:01:20prepare, yang menjalankan bun run task runner JS,
00:01:22dan memiliki perintah exit 1 di bagian akhir.
00:01:24Itu hanyalah cara cerdas untuk membuat dependensi opsional gagal
00:01:27setelah muatan telah dijalankan,
00:01:28sehingga instalasi tetap berjalan seperti biasa,
00:01:30dan meninggalkan jejak yang tidak terlalu mencolok di log instalasi Anda.
00:01:33Selain itu, Anda mungkin menyadari bahwa ini tidak menjalankan
00:01:35file routerinit.js yang saya sebutkan telah disuntikkan
00:01:37ke dalam paket di awal,
00:01:38tapi untuk saat ini, anggap saja kedua file ini
00:01:40memainkan peran yang sama dengan nama yang berbeda.
00:01:42Intinya adalah, saat Anda menginstal ini,
00:01:44skrip ini akan dijalankan.
00:01:46Hal pertama yang coba dilakukan skrip itu
00:01:47adalah memisahkan diri dari alur instalasi yang jelas,
00:01:50sehingga ia akan memeriksa apakah ia sudah berjalan
00:01:51di latar belakang, dan jika belum,
00:01:53ia akan membuat salinan terpisah dari dirinya sendiri
00:01:54dan keluar dari skrip utama dengan bersih.
00:01:57Dengan cara ini, log npm install Anda
00:01:58tidak menunjukkan output skrip tersebut
00:02:00karena malware tersebut sekarang telah memisahkan diri
00:02:01dari proses tersebut dan berjalan di latar belakang.
00:02:04Setelah ini, ia melakukan sesuatu yang sangat cerdik.
00:02:06Ia menulis salinan dirinya
00:02:07ke dalam direktori hook clawed code Anda,
00:02:08kemudian mengonfigurasi pengaturan clawed Anda
00:02:10untuk menjalankan hook ini kapan pun Anda menggunakan clawed code
00:02:12di proyek tersebut.
00:02:13Dengan cara ini, ia bisa bertahan setelah instalasi awal
00:02:16dan terus memicu setiap kali
00:02:17Anda membuka clawed code di proyek tersebut.
00:02:20Ia sebenarnya melakukan hal yang sama dengan task runner VS Code,
00:02:22menggandakan dirinya di sana,
00:02:23jadi jika Anda menggunakan fitur auto-run workspace VS Code,
00:02:26Anda akan mengalami masalah yang sama.
00:02:28Ia bahkan menyiapkan layanan tingkat OS
00:02:29bernama GitHub Token Monitor,
00:02:31tapi kita akan kembali ke hal itu
00:02:32karena itu sangat kejam.
00:02:34Juga cukup kejam
00:02:35bahwa Anda belum berlangganan.
00:02:37Hal berikutnya yang dilakukan muatan tersebut
00:02:38adalah mulai mencuri kredensial Anda,
00:02:40dan ia mencoba segalanya.
00:02:41Di GitHub Actions, ia mencari kredensial
00:02:43dan rahasia di lingkungan runner.
00:02:45Lebih khusus lagi, mengikis memori proses worker
00:02:47runner GitHub Actions
00:02:48untuk rahasia alur kerja Anda
00:02:50yang menyertakan rahasia yang disamarkan,
00:02:52dan bahkan menyisipkan alur kerja GitHub palsu yang terlihat seperti code QL
00:02:55yang menserialisasi rahasia repositori Anda
00:02:57dan mengeksfiltrasi mereka nanti.
00:02:58Ia juga mencari rahasia AWS,
00:03:00pertama-tama mencari variabel lingkungan
00:03:02dan file konfigurasi lokal,
00:03:03tetapi kemudian juga mencari layanan metadata AWS
00:03:06seperti IMDS v2 dan metadata tugas ECS.
00:03:09Untuk Kubernetes, ia mencuri token akun layanan
00:03:11dan sertifikat yang memungkinkan akses API dalam klaster
00:03:14sesuai dengan hak istimewa kontrol akses berbasis peran
00:03:17yang dimiliki akun layanan pod tersebut,
00:03:19yang dalam klaster yang dikonfigurasi dengan buruk
00:03:21bisa menjadi sangat luas,
00:03:22terkadang secara efektif menjadi admin.
00:03:24Dan untuk membuat itu lebih buruk,
00:03:25ia juga mencari HashiCorp Vault,
00:03:27mengumpulkan semua variabel lingkungan terkait vault
00:03:29dan token,
00:03:30kemudian menggunakan akses Kubernetes apa pun yang dimilikinya
00:03:32untuk mengambil semua rahasia yang dikelola vault Anda.
00:03:34Dan semua itu hanyalah apa yang dilakukannya
00:03:35terhadap penyebaran CI Anda.
00:03:37Jika itu ada di workstation Anda,
00:03:38ia akan mencari semua kunci SSH Anda,
00:03:39kredensial NPM Anda,
00:03:41kredensial Git Anda,
00:03:42riwayat shell,
00:03:43kredensial penyedia cloud,
00:03:44kunci kripto,
00:03:45Signal,
00:03:45Slack,
00:03:45dan file Discord.
00:03:46Dan di atas semua itu,
00:03:47ia mengekstrak riwayat sesi clawed code Anda.
00:03:49Jadi jika Anda pernah memberikan kredensial clawed
00:03:51atau membiarkannya membaca file yang berisi kredensial,
00:03:53ia memiliki akses ke kredensial tersebut juga.
00:03:55Jadi ya, seperti yang saya katakan,
00:03:56mereka mengincar benar-benar segalanya
00:03:57yang bisa mereka dapatkan,
00:03:58dan kemudian mereka akan mengeksfiltrasi data ini
00:04:00melalui jaringan pengirim pesan sesi.
00:04:02Dan sebagai cadangan,
00:04:02mereka juga menjatuhkan data curian ini
00:04:04ke repositori GitHub.
00:04:05Dan sesuai dengan tema semua serangan mereka,
00:04:07cabang-cabang ini dinamai berdasarkan referensi Dune.
00:04:09Jadi, ia sudah mendapatkan kredensial Anda.
00:04:11Tidak mungkin bisa lebih buruk lagi, bukan?
00:04:12Yah, ya.
00:04:13Ya, bisa saja.
00:04:14Di atas semua itu,
00:04:15jika Anda ingat layanan itu
00:04:16yang saya katakan ia siapkan di mesin Anda,
00:04:18nah, layanan itu memantau token GitHub Anda
00:04:19dan terus mengeksfiltrasi mereka kembali.
00:04:21Tapi juga setiap menit,
00:04:22ia memeriksa apakah token tersebut masih valid.
00:04:24Dan jika tidak,
00:04:25ia menjalankan RMRF pada direktori pengguna Anda,
00:04:27menghapus semuanya.
00:04:28Ia juga mencoba membuat token NPM
00:04:30dengan kredensial Anda,
00:04:31dengan deskripsi,
00:04:32jika Anda mencabut token ini,
00:04:33kami akan menghapus komputer pemiliknya,
00:04:35menyiratkan bahwa ia melakukan hal yang sama
00:04:36untuk token NPM juga.
00:04:38Jadi jika Anda mencabut token ini
00:04:39sebelum mengisolasi mesin Anda
00:04:40dan menghapus proses latar belakang itu,
00:04:42muatan tersebut bisa menghancurkan PC Anda sendiri,
00:04:44yang benar-benar sangat kejam.
00:04:46Dan sebagai catatan tambahan di sini,
00:04:47varian Python dari serangan ini
00:04:48melakukan hal yang kira-kira sama,
00:04:49tetapi juga menyertakan pemeriksaan
00:04:51untuk melihat apakah bahasa mesin Anda adalah bahasa Rusia.
00:04:53Jika ya,
00:04:53ia akan berhenti.
00:04:54Dan jika mesin Anda tampaknya
00:04:55berasal dari Israel atau Iran,
00:04:56ia akan menghasilkan angka acak
00:04:58antara 1 dan 6.
00:04:59Dan jika angka itu adalah 2,
00:05:00ia akan menjalankan perintah hapus yang destruktif
00:05:01dan mencoba memutar MP3
00:05:03dengan volume penuh.
00:05:04Sayangnya,
00:05:05saya tidak bisa mencari tahu
00:05:05apa MP3 itu.
00:05:07Bagaimanapun,
00:05:07sekarang setelah melakukan semua itu,
00:05:08hal terburuk masih akan datang
00:05:09karena itu baru tahap 1.
00:05:11Tahap 2 adalah propagasi diri
00:05:13dan itu adalah bagian paling berbahaya
00:05:15dari serangan ini.
00:05:16Pertama,
00:05:16ia akan mencari di mesin Anda
00:05:17untuk token NPM valid apa pun
00:05:19di mana ia bisa mempublikasikan
00:05:19tanpa autentikasi dua faktor.
00:05:21Dan jika ia menemukannya,
00:05:22ia akan memindai semua paket
00:05:24yang memiliki akses ke akun tersebut,
00:05:26lalu menggunakan kredensial tersebut
00:05:26untuk menambahkan dirinya ke paket-paket tersebut
00:05:28dan mempublikasikan versi terinfeksi yang baru.
00:05:30Itu jelas cukup buruk,
00:05:32tetapi Anda juga mungkin tidak seharusnya
00:05:33memiliki token yang dipublikasikan
00:05:33yang tergeletak
00:05:34yang bisa melewati
00:05:35otentikasi dua faktor.
00:05:36Jadi versi yang jauh lebih menakutkan dari ini
00:05:38adalah apa yang terjadi
00:05:39ketika ia berjalan di dalam CI-CD Anda.
00:05:41Karena di dalam CI,
00:05:42penyerang tidak butuh
00:05:43token NPM yang tahan lama
00:05:44karena pengaturan yang baik
00:05:45sering mengandalkan OIDC,
00:05:47yang dimaksudkan agar lebih aman.
00:05:48Intinya,
00:05:49alih-alih menyimpan
00:05:50token NPM sebagai rahasia,
00:05:51GitHub Actions membuktikan kepada NPM,
00:05:53hei,
00:05:53saya adalah repo ini
00:05:54yang menjalankan alur kerja ini
00:05:55di cabang ini,
00:05:56dan NPM kemudian memberikannya
00:05:57token publikasi jangka pendek.
00:05:59Masalahnya, namun,
00:06:00adalah jika skrip mendapatkan akses
00:06:01ke lingkungan GitHub Actions yang tepercaya,
00:06:03ia bisa berdiri di tempat yang sama
00:06:04sebagai penerbit yang sah.
00:06:06Jadi malware bisa menggunakan
00:06:07lingkungan terkait OIDC
00:06:08yang diekspos GitHub ke pekerjaan tersebut
00:06:10untuk meminta token OIDC JWT
00:06:12dari titik akhir token GitHub,
00:06:14kemudian menukar token JWT itu
00:06:16dengan NPM
00:06:17untuk mendapatkan token publikasi jangka pendek
00:06:18melalui sistem publikasi
00:06:19yang tepercaya dari NPM,
00:06:20dan sekarang ia bisa menerbitkan
00:06:22tanpa pernah mencuri
00:06:22token NPM permanen
00:06:24dan terlihat sepenuhnya sah.
00:06:26Dalam kasus ini,
00:06:26malware membundel salinan
00:06:27file router init.js itu
00:06:29ke dalam tabel paket,
00:06:30kemudian menambahkan dependensi
00:06:31opsional yang berbahaya,
00:06:32lalu menerbitkan semuanya
00:06:33sebagai tag terbaru
00:06:34untuk paket itu,
00:06:35jadi ketika seseorang
00:06:35atau beberapa pipeline CI-CD
00:06:37menginstal paket-paket itu,
00:06:38lingkaran itu dimulai lagi,
00:06:40menyebar sejauh
00:06:40yang ia bisa.
00:06:42Jadi itu semua
00:06:42cukup gila, bukan?
00:06:43Tapi sekarang mari fokus
00:06:44pada pasien nol,
00:06:46TanStack.
00:06:46Bagaimana mereka terinfeksi
00:06:47sejak awal?
00:06:48Yah,
00:06:49menurut post-mortem mereka sendiri,
00:06:50penyerang menyalahgunakan
00:06:51pipeline GitHub Actions tersebut.
00:06:53Mereka memulainya sehari
00:06:53sebelum paket berbahaya
00:06:54benar-benar diterbitkan,
00:06:56di mana mereka membuat fork
00:06:57dari TanStack router,
00:06:58tapi mereka sebenarnya mengganti nama
00:06:59ini menjadi configuration
00:06:59untuk mencoba dan membuatnya lebih sulit
00:07:01ditemukan jika Anda mencari
00:07:02melalui nama fork yang jelas.
00:07:04Kemudian mereka menambahkan
00:07:04commit berbahaya
00:07:05ke fork ini,
00:07:06yang mereka buat seolah-olah penulisnya
00:07:07adalah Claude,
00:07:07dan memiliki pesan commit
00:07:08yang diawali
00:07:09oleh skip CI,
00:07:10agar tidak langsung
00:07:11menjalankan CI pada peristiwa push.
00:07:13Keesokan harinya,
00:07:13mereka kemudian membuka PR
00:07:14terhadap TanStack router
00:07:15yang disebut Work in Progress
00:07:16Simplify History Build.
00:07:18Dan di sinilah
00:07:18serangan yang sebenarnya terjadi.
00:07:20TLDR-nya adalah
00:07:21TanStack memiliki alur kerja
00:07:22GitHub Actions untuk ukuran bundle
00:07:23yang menggunakan pull request target,
00:07:25dan itu patut dicatat
00:07:26karena pull request target
00:07:27sebenarnya berjalan
00:07:28dalam konteks keamanan
00:07:29repo basis,
00:07:30bukan fork.
00:07:31Itu berarti ia memiliki akses
00:07:32ke cakupan cache repo basis
00:07:33dan token GitHub-nya.
00:07:35Jadi alur kerja ini
00:07:35memeriksa PR tersebut,
00:07:36menginstal dependensinya,
00:07:38dan menjalankan build benchmark.
00:07:39Namun masalahnya adalah,
00:07:40fork itu berisi
00:07:40kode berbahaya.
00:07:41Dalam kasus ini,
00:07:42itu adalah skrip pengaturan V
00:07:43yang meracuni
00:07:44penyimpanan paket PMPM
00:07:45di bawah kunci cache yang tepat
00:07:47yang akan digunakan nanti
00:07:48oleh tindakan rilis.
00:07:49Mereka sebenarnya telah menghitung
00:07:50ini sebelumnya dari file kunci
00:07:51PMPM publik
00:07:52menggunakan rumus yang sama persis
00:07:54yang juga digunakan oleh alur kerja itu.
00:07:56Begitu cache yang diracuni itu
00:07:57disimpan,
00:07:57mereka sebenarnya mereset
00:07:58cabang itu kembali
00:07:59agar sesuai dengan
00:07:59cabang utama saat ini,
00:08:00jadi PR yang terlihat
00:08:01tampak seperti file nol
00:08:02no-op,
00:08:03dan kemudian mereka menutup PR itu
00:08:04dan menghapus
00:08:05cabang berbahaya itu.
00:08:06Jadi dari luar,
00:08:07terlihat seperti
00:08:07sama sekali tidak ada
00:08:08yang terjadi,
00:08:09tetapi mereka telah meracuni
00:08:10cache GitHub action itu.
00:08:11Ini berarti bahwa
00:08:12delapan jam kemudian,
00:08:13ketika seorang pemelihara biasa
00:08:14menggabungkan PR yang tidak terkait
00:08:15ke dalam utama,
00:08:16itu memicu alur kerja rilis
00:08:17TanStack,
00:08:18yang memulihkan
00:08:19cache PMPM yang diracuni,
00:08:20dan sekarang kode yang dikendalikan penyerang
00:08:22berjalan di dalam
00:08:23tindakan rilis itu.
00:08:24Itu kemudian menggunakan logika yang sama
00:08:25dengan OIDC
00:08:26untuk mendapatkan token publikasi NPM,
00:08:28dan berhasil menerbitkan
00:08:2984 versinya sendiri
00:08:30di 42 paket Tanstack,
00:08:32dan itu bahkan tidak perlu
00:08:33sampai ke langkah
00:08:34paket yang diterbitkan
00:08:35dari tindakan tersebut.
00:08:36Lucunya,
00:08:36tindakan itu sebenarnya gagal
00:08:37karena beberapa tes gagal,
00:08:39jadi tidak pernah mencapai langkah itu,
00:08:40tetapi kode berbahaya itu berjalan
00:08:41dan menerbitkan semuanya
00:08:43terlepas dari itu.
00:08:43Jadi penyerang berhasil
00:08:44merantai tiga batasan kepercayaan.
00:08:46Pertama,
00:08:47kode PR fork
00:08:47bisa meracuni
00:08:48cache repo basis,
00:08:49kemudian cache repo basis itu
00:08:51dipulihkan di dalam
00:08:52alur kerja rilis yang sebenarnya,
00:08:53kemudian alur kerja rilis yang sebenarnya
00:08:54memiliki izin OIDC,
00:08:56yang berubah menjadi
00:08:57akses publikasi NPM,
00:08:58jadi mereka bisa menerbitkan
00:08:59apa yang terlihat
00:08:59paket-paket yang sepenuhnya sah.
00:09:01Dan itulah yang saya pikir
00:09:02menjadi sangat menakutkan
00:09:03tentang serangan rantai pasokan.
00:09:05Mereka beralih
00:09:05dari mencuri
00:09:06token satu pemelihara
00:09:07menjadi menyalahgunakan
00:09:08seluruh sistem CI-CD itu sendiri,
00:09:10dan itu berarti
00:09:11bahwa semua sinyal kepercayaan kita
00:09:12mulai bekerja
00:09:13untuk penyerang.
00:09:14Ini adalah paket yang ditandatangani
00:09:15dengan bukti asal yang valid
00:09:16yang diterbitkan oleh alur kerja nyata.
00:09:18Jadi begitulah,
00:09:19itu adalah ShaiHalud4,
00:09:20dan jika Anda ingin memeriksa
00:09:21apakah Anda telah dikompromikan
00:09:21oleh salah satu paket ini,
00:09:23saya akan meninggalkan tautan
00:09:23ke postingan blog di bawah,
00:09:25yang akan mencakup
00:09:25bagaimana Anda bisa tahu
00:09:26dan apa yang bisa Anda lakukan
00:09:27jika Anda telah menginstal
00:09:28salah satunya.
00:09:29Beri tahu saya di kolom komentar
00:09:30apa pendapat Anda
00:09:30tentang semua ini
00:09:31dan ekosistem NPM,
00:09:33selagi Anda di sana,
00:09:33berlangganan,
00:09:34dan seperti biasa,
00:09:34sampai jumpa di video berikutnya.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video