- CVE-2024-YIKES adalah insiden pembajakan dependensi JavaScript yang meluas ke rantai pasok Rust dan Python
- Phishing
left-justify membocorkan kredensial .npmrc, .pypirc, Cargo, dan Gem
build.rs berbahaya di vulpine-lz4 mengunduh dan menjalankan skrip shell di host CI
- Malware
snekpack 3.7.0 menyebar ke sekitar 4,2 juta mesin dan menambahkan kunci SSH serta reverse shell
- Worm cryptobro-9000 secara tak sengaja meng-upgrade ke
snekpack 3.7.1 sehingga malware terhapus
Ringkasan kejadian
- CVE-2024-YIKES adalah insiden keamanan ketika dependensi yang dikompromikan di ekosistem JavaScript berujung pada pencurian kredensial, lalu meluas menjadi serangan rantai pasok pada pustaka kompresi Rust dan distribusi malware pada alat build Python
- Insiden diterima pada 03:47 UTC, statusnya berubah menjadi “terselesaikan secara kebetulan”, dan tingkat keparahannya berganti dari “Critical → Catastrophic → Somehow Fine”
- Durasi berlangsung selama 73 jam, dan sistem yang terdampak tetap tercatat sebagai “Yes”
- Paket dan toolchain yang dikompromikan berurutan mencakup
left-justify, vulpine-lz4, dan snekpack, dengan malware didistribusikan ke sekitar 4 juta pengembang
- Pada akhirnya, worm penambang kripto terpisah
cryptobro-9000 menjalankan pembaruan pada mesin yang terinfeksi, meng-upgrade snekpack ke versi normal dan secara tak sengaja menghapus malware
Perkembangan insiden
-
Hari 1: Pencurian kredensial dari paket JavaScript
- Pada 03:14 UTC, maintainer
left-justify Marcus Chen menulis di Twitter bahwa kartu transportasinya, laptop lamanya, dan “sesuatu yang tampak penting seperti hasil muntahan Kubernetes” telah dicuri, tetapi ini tidak langsung dikaitkan dengan masalah keamanan paket
- Pada 09:22 UTC, Chen mencoba login ke registri nmp dan menyadari kunci 2FA hardware-nya tidak ada, lalu AI Overview di hasil teratas Google mengarahkannya ke situs phishing
yubikey-official-store.net yang baru terdaftar 6 jam sebelumnya
- Pada 09:31 UTC, Chen memasukkan kredensial nmp ke situs phishing tersebut, dan situs itu berterima kasih atas pembeliannya serta menjanjikan pengiriman dalam 3–5 hari kerja
- Pada 11:00 UTC,
[email protected] dirilis dengan changelog bertuliskan “performance improvements”
- Paket tersebut menyertakan skrip post-install yang mengekfiltrasi
.npmrc, .pypirc, ~/.cargo/credentials, dan ~/.gem/credentials ke server pilihan penyerang
- Pada 13:15 UTC, sebuah tiket dukungan dibuka untuk
left-justify dengan judul “why is your SDK exfiltrating my .npmrc”, tetapi ditandai “low priority - user environment issue” lalu ditutup otomatis setelah 14 hari tanpa aktivitas
-
Hari 1: Serangan rantai pasok meluas ke pustaka Rust
- Di antara kredensial yang bocor terdapat kredensial milik maintainer pustaka Rust
vulpine-lz4
vulpine-lz4 adalah pustaka untuk “blazingly fast Firefox-themed LZ4 decompression”, memiliki 12 bintang GitHub, tetapi merupakan dependensi transitif dari cargo sendiri
- Pada 22:00 UTC,
vulpine-lz4 0.4.1 dirilis dengan pesan commit “fix: resolve edge case in streaming decompression”
- Perubahan sebenarnya adalah penambahan skrip
build.rs yang mengunduh lalu menjalankan skrip shell jika nama host mengandung “build”, “ci”, “action”, “jenkins”, “travis”, atau “karen”
-
Hari 2: Kegagalan deteksi dan respons
- Pada 08:15 UTC, peneliti keamanan Karen Oyelaran menemukan commit berbahaya itu setelah payload berjalan di laptop pribadinya
- Karen Oyelaran membuka issue berjudul “your build script downloads and runs a shell script from the internet?” tetapi tidak menerima balasan
- Maintainer sah sedang memenangkan €2.3 million di EuroMillions dan meneliti peternakan kambing di Portugal
- Pada 10:00 UTC, VP of Engineering di perusahaan pelanggan
snekpack Fortune 500 mengetahui insiden ini dari postingan LinkedIn berjudul “Is YOUR Company Affected by left-justify?”, dan ingin tahu mengapa dirinya tidak diberi tahu lebih cepat, padahal sebenarnya sudah terdampak lebih cepat
- Pada 10:47 UTC, kanal Slack
#incident-response sempat beralih menjadi thread 45 pesan yang memperdebatkan apakah “compromised” harus dieja dengan huruf ‘z’ ala Amerika
-
Hari 2: Alat build Python snekpack terinfeksi
- Pada 12:33 UTC, skrip shell itu menargetkan pipeline CI
snekpack pada korban tertentu
snekpack adalah alat build Python yang digunakan oleh 60% paket PyPI yang namanya mengandung kata “data”
snekpack telah mem-vendor vulpine-lz4 karena “Rust is memory safe”
- Pada 18:00 UTC,
snekpack 3.7.0 dirilis, dan malware mulai terpasang pada mesin pengembang di seluruh dunia
- Malware itu menambahkan kunci SSH ke
~/.ssh/authorized_keys, memasang reverse shell yang hanya aktif pada hari Selasa, dan mengubah shell default pengguna menjadi fish
- Perubahan shell default ke
fish dianggap sebagai bug
- Pada 19:45 UTC, peneliti keamanan lain menerbitkan tulisan blog 14.000 kata berjudul “I found a supply chain attack and reported it to all the wrong people”, yang memuat frasa “in this economy?” sebanyak 7 kali
-
Hari 3: Patch tak sengaja dan akhir insiden
- Pada 01:17 UTC, seorang pengembang junior di Auckland menemukan malware saat men-debug masalah lain dan membuka PR untuk membalikkan
vulpine-lz4 yang di-vendor di snekpack
- PR tersebut memerlukan 2 approval, tetapi kedua approver sedang tidur
- Pada 02:00 UTC, maintainer
left-justify menerima YubiKey dari yubikey-official-store.net, yang ternyata adalah USB drive seharga 4 dolar dengan README bertuliskan “lol”
- Pada 06:12 UTC, worm penambang kripto terpisah
cryptobro-9000 mulai menyebar melalui kerentanan jsonify-extreme
jsonify-extreme dideskripsikan sebagai paket yang “makes JSON even more JSON, now with nested comment support”
- Payload
cryptobro-9000 sendiri tidak istimewa, tetapi metode penyebarannya termasuk menjalankan npm update dan pip install --upgrade pada mesin yang terinfeksi untuk memperluas permukaan serangan di masa depan
- Pada 06:14 UTC,
cryptobro-9000 secara kebetulan meng-upgrade snekpack ke 3.7.1
snekpack 3.7.1 adalah rilis sah yang dipublikasikan oleh co-maintainer yang kebingungan, dan mengembalikan vulpine-lz4 yang di-vendor ke versi sebelumnya
- Pada 06:15 UTC, reverse shell hari Selasa aktif, tetapi server command-and-control sudah dikompromikan oleh
cryptobro-9000 sehingga tidak bisa merespons
- Pada 09:00 UTC, maintainer
snekpack menerbitkan advisory keamanan empat kalimat yang memuat frasa “out of an abundance of caution” dan “no evidence of active exploitation”
- Frasa “no evidence of active exploitation” dianggap benar secara teknis karena memang tidak ada yang mencari buktinya
- Pada 11:30 UTC, seorang pengembang men-tweet “I updated all my dependencies and now my terminal is in fish???” dan mendapat 47.000 likes
- Pada 14:00 UTC, kredensial
vulpine-lz4 yang telah dikompromikan diganti
- Maintainer sah menerima email di peternakan kambing barunya dan menjawab, “I haven’t touched that repo in two years” dan “I thought Cargo 2FA was optional”
- Pada 15:22 UTC, insiden dinyatakan selesai, dan jadwal postmortem ditetapkan lalu diundur tiga kali
Penetapan CVE dan skala dampak
- Pada minggu ke-6, CVE-2024-YIKES resmi ditetapkan
- Advisory tetap berada dalam embargo sementara MITRE dan GitHub Security Advisories berdebat soal klasifikasi CWE
- Sebelum CVE dipublikasikan, insiden ini sudah dibahas rinci oleh 3 tulisan Medium dan satu presentasi DEF CON
- Total kerugian tetap tidak diketahui
- Jumlah mesin yang dikompromikan diperkirakan 4,2 juta
- Jumlah mesin yang “diselamatkan” oleh worm kripto juga diperkirakan 4,2 juta
- Perubahan bersih pada postur keamanan tetap tercatat sebagai “ketidaknyamanan”
Akar penyebab dan faktor yang berkontribusi
-
Akar penyebab
- Seekor anjing bernama Kubernetes yang memakan YubiKey dianggap sebagai akar penyebab
-
Faktor yang berkontribusi
- Registri nmp masih mengizinkan autentikasi hanya dengan kata sandi untuk paket dengan unduhan mingguan di bawah 10 juta
- Google AI Overviews dengan percaya diri menautkan URL yang seharusnya tidak pernah ada
- Filosofi “small crates” di ekosistem Rust ditiru dari ekosistem npm, sehingga paket seperti
is-even-number-rs dengan 3 bintang GitHub bisa masuk sebagai dependensi transitif empat tingkat di infrastruktur penting
- Alat build Python mem-vendor pustaka Rust demi “kinerja”, lalu tidak pernah memperbaruinya
- Dependabot menggabungkan PR secara otomatis setelah CI lolos, dan CI lolos karena malware telah menginstal
volkswagen
- Worm kripto memiliki kebersihan CI/CD yang lebih baik daripada kebanyakan startup
- Tidak ada satu pemilik tunggal, tetapi PR Dependabot tersebut di-approve oleh kontraktor yang hari Jumat itu adalah hari kerjanya yang terakhir
- Hari terjadinya insiden adalah hari Selasa
Tindakan perbaikan dan pilihan yang tersisa
- Penerapan penandatanganan artefak adalah action item dari insiden Q3 2022, tetapi masih berada di backlog
- Penerapan 2FA wajib sudah pernah diminta, tetapi tidak membantu
- Audit dependensi transitif dicoret karena cakupannya 847 item
- Mengunci semua versi dependensi akan mencegah penerimaan patch keamanan
- Tidak mengunci versi dependensi akan membuka peluang serangan rantai pasok
- Opsi menulis ulang dengan Rust dicoret sambil menunjuk ke
vulpine-lz4
- Tindakan yang tersisa hanyalah berharap pada worm baik hati atau mempertimbangkan alih profesi ke peternakan kambing
Dampak pelanggan dan respons organisasi
- Sebagian pelanggan mungkin mengalami “hasil keamanan yang kurang optimal”
- Pihak terkait yang terdampak dihubungi secara proaktif untuk memberikan visibilitas atas situasi tersebut
- Kepercayaan pelanggan tetap dijaga sebagai “north star”
- Sebuah working group lintas fungsi dibentuk untuk meninjau ulang postur keamanan, tetapi belum pernah rapat
- Setelah tinjauan hukum, ditambahkan keterangan bahwa shell
fish bukan malware, meski kadang terasa seperti itu
- Laporan insiden ini adalah laporan insiden ketiga pada kuartal tersebut
- Permintaan penambahan personel untuk tim keamanan masih tertahan di backlog sejak Q1 2023
Ucapan terima kasih
- Karen Oyelaran menemukan masalah ini karena nama host-nya cocok dengan regex
- PR dari pengembang junior di Auckland disetujui 4 jam setelah insiden sebenarnya sudah terselesaikan
- Beberapa peneliti keamanan menemukan masalah lebih dulu, tetapi melaporkannya kepada orang yang salah
- Penulis
cryptobro-9000 tidak ingin disebutkan namanya, tetapi meminta agar SoundCloud miliknya disebut
- Anjing bernama Kubernetes menolak berkomentar
- Tim keamanan tetap memenuhi SLA laporan ini, terlepas dari semua yang terjadi
1 komentar
Komentar Hacker News
Biar jelas buat yang sempat bingung, tulisan ini adalah fiksi yang ditulis cukup bagus tentang insiden supply chain
Waktu dibaca sekilas aku kira ini kejadian nyata, jadi sempat cukup khawatir dan akhirnya baca lebih teliti :)
nmpAku penasaran dengan bagian kutipan yang bilang “vulpine-lz4 dengan 12 bintang di GitHub adalah dependensi transitif cargo itu sendiri”, jadi aku asal pilih beberapa crate yang bisa menyusup ke build cargo dan sudah punya
build.rs, sehingga bakal kurang mencolok:flate2,tar,curl-sys,libgit2-sys,openssl-sys,libsqlite3-sys,blake3,libz-sys,zstd-sys,ccBonusnya, kalau dapat akses ke
xz2, kamu juga bisa mencemari rustupMeski begitu, setidaknya mereka memang melacak
Cargo.lock-sysitu pada dasarnya cuma binding, jadi kalau melakukan hal lain di sana akan terlihat cukup mencurigakanSetahuku yang lain dimiliki maintainer inti Rust seperti
alexcrichtonataurustlangsendiriMudah sekali jadi sinis, karena setelah semuanya terjadi, masalah dan solusinya terlihat terlalu jelas
Tapi untuk waktu yang lama, dan mungkin bahkan sampai sekarang, kredo budaya hacker adalah move fast and break things
Bagus bahwa semakin besar dorongan untuk memperbaiki masalah yang jelas pada sistem supply chain seperti
npm, tetapi aku khawatir kita sedang memasuki era masalah keamanan baru yang sebagian besar dipicu oleh pengembangan berbasis agenBukan cuma soal Mythos/Glasswing yang tampaknya menemukan kerentanan di hampir semua yang mereka sentuh, tetapi juga cara kita membangun perangkat lunak, menarik dependensi, dan kehilangan model berpikir manusia terhadap sistem yang kompleks, yang rasanya akan menghasilkan banyak perangkat lunak dan infrastruktur tambal sulam yang sebenarnya tidak dipahami dengan baik oleh manusia
Semoga beberapa tahun dari sekarang kita tidak menoleh ke hari ini dan menyesal betapa naifnya kita, serta bagaimana kita gagal benar-benar menyiapkan diri untuk ekor panjang pengembangan AI tanpa justru mencoba menyelesaikan masalah dengan membangun ulang sistem kompleks memakai AI
Tapi tetap saja, tulisannya lucu
Sebagai penggemar Fish, kalimat ini terasa seperti diserang sekaligus dipahami: “mohon diperjelas bahwa shell fish bukan malware, hanya kadang terasa seperti itu”
Terlepas dari shell-nya, bagian “permintaan penambahan personel tim keamanan sudah ada di backlog sejak Q1 2023” juga terasa terlalu familiar
figletlewatapt-getataudnf, lalu menimpa isi/etc/motddengan all your base are belong to us dalam font ASCII art raksasaAku benar-benar tertawa keras di bagian maintainer left-justify menerima YubiKey dari
yubikey-official-store.net, yang ternyata hanyalah USB drive seharga 4 dolar dengan tulisan “lol” diREADMEBenar-benar trolling total
Aku suka bahwa tindakan mencolokkan perangkat USB yang datang dari situs phishing itu sendiri merupakan vektor serangan lain
Ini bukan SCP sungguhan, tapi ini tulisan paling terasa seperti SCP yang pernah kubaca belakangan ini
Aku tertawa keras di bagian Karen :D ;)
Ini mengingatkanku pada skrip build berbasis
makeyang pernah kuterima saat meninjau proyek teman sekelas; kalau hostname mengandungbpavuk, skrip itu akan mencobarm -rfdi folder home-kuItu waktu aku kelas 1 SMP!!
Insiden supply chain memang benar-benar menyebalkan dan kita harus berbuat lebih baik
Secara pribadi, untuk Rust aku mendukung pendekatan di mana yayasan membantu beberapa crate inti agar menjalani proses audit yang sama seperti bahasa Rust itu sendiri, dan mendanai proyek untuk mengurangi kerentanan supply chain
Menurutku jawaban yang tepat bukan menghapus sistem seperti
cratesataunpm.cratesdannpmsangat membantu banyak pengembangcratesjuga sudah berupaya memasukkanrustsec, tetapi terlepas dari itu, akan bagus jika komunitas bergerak dari pola banyak dependensi kecil ke lebih sedikit dependensi besar sepertitokiocrates.iosebenarnya sudah merupakan crate pihak pertama yang disediakan organisasi RustHal ini sering terlewat saat orang khawatir soal graf crate Rust
Kalau lihat 10 teratas unduhan di halaman depan
crates.io, satu-satunya yang bukan dibuat oleh organisasi Rust atau maintainer inti Rust adalah cratebase64npmdannmpsekaligus“Maintainer resminya menang EuroMillions sebesar 2,3 juta euro dan sedang mencari tahu soal beternak kambing di Portugal”, lalu “akar masalahnya: seekor anjing bernama Kubernets memakan YubiKey”
Ah ya, tentu saja. Kena serangan terkenal klasik, sungguh ceroboh
Maksudku teknik yang dikenal sebagai “membuat seseorang linglung dengan uang lotere, lalu membuat dongle orang lain tampak sangat lezat bagi hewan peliharaan mereka”
Kapan orang-orang akan belajar
Syukurlah aku tidak pakai
npmataupip, cuma pakai cara yang direkomendasikan yaitucurl ... | bashcurl | sudo bashAmatiran