Teknologi Zenbleed
(lock.cmpxchg8b.com)- Zenbleed adalah kerentanan yang memanfaatkan pemulihan
vzeroupperyang salah prediksi pada keluarga AMD Zen 2, sehingga memungkinkan pembacaan data yang tersisa di file register vektor pada inti fisik yang sama - Terdaftar sebagai CVE-2023-20593, dan mencakup produk Zen 2 seperti Ryzen 3000/4000/5000 with Radeon Graphics/7020 with Radeon Graphics, Ryzen PRO, Threadripper 3000, dan EPYC “Rome”
- Serangan ini terjadi ketika XMM Register Merge Optimization, register renaming, dan
vzeroupperyang salah prediksi berlangsung berurutan dalam jendela waktu yang sempit, dan operasi dasar sepertistrlen,memcpy, sertastrcmppun bisa menjadi sasaran pengamatan - Varian yang dioptimalkan dapat membocorkan sekitar 30KB per detik per inti, dan berbagi file register pada inti fisik yang sama menjadi masalah lintas batas VM, sandbox, container, dan proses
- Disarankan menerapkan pembaruan mikrokode AMD, dan sebagai langkah sementara
DE_CFG[9]chicken bit dapat diatur, tetapi bisa menimbulkan biaya performa, serta menonaktifkan SMT saja tidak cukup
Unit eksekusi yang menjadi sasaran Zenbleed
- CPU x86-64 memiliki register vektor XMM 128-bit, dan CPU modern memperluasnya menjadi YMM 256-bit dan ZMM 512-bit
- Register vektor digunakan bukan hanya untuk komputasi numerik, tetapi juga dalam fungsi pustaka C standar glibc seperti
strcmp,memcpy, danstrlen strlenyang dioptimalkan dengan AVX2 di glibc menggabungkan beberapa instruksi vektor untuk menemukan posisi byte nul pertama dalam stringvpxor xmm0,xmm0,xmm0menjadikan bagian bawahymm0bernilai 0vpcmpeqb ymm1,ymm0,[rdi]membandingkan byte string dengan byte 0vpmovmskb eax,ymm1memindahkan hasil perbandingan ke register umumtzcnt eax,eaxmenghitung posisi byte nul pertama
vzeroupper dan file register
vzeroupperadalah instruksi yang menjadikan bit-bit atas register vektor bernilai 0- Jika register
XMMdanYMMdigunakan secara campuran, registerXMMdipromosikan ke lebar penuh, dan dalam proses ini dapat muncul dependensi pada bit atas - glibc menggunakan
vzeroupperagar hasil berikutnya tidak bergantung pada bit atas, sehingga stall yang tidak perlu dapat dihindari - CPU tidak menempatkan tiap register pada lokasi fisik yang tetap, melainkan mengelola alokasi register fisik melalui Register File dan Register Allocation Table
- Saat menjadikan register
XMMbernilai 0, CPU dapat menetapkan flag z-bit di RAT tanpa benar-benar menyimpan bit fisiknya- Flag ini dapat diterapkan secara independen pada bagian atas dan bawah register
YMM vzeroupperdapat menetapkan z-bit lalu melepaskan sumber daya terkait dari file register
- Flag ini dapat diterapkan secara independen pada bagian atas dan bawah register
Kerentanan yang muncul saat pemulihan eksekusi spekulatif
- CPU modern menggunakan eksekusi spekulatif, sehingga operasi yang dijalankan pada cabang yang salah prediksi harus dibatalkan
- Masalahnya adalah ketika
vzeroupperyang salah prediksi telah dieksekusi lalu dipulihkan, mengembalikan hanya z-bit tidak cukup untuk memulihkan dengan benar status sumber daya file register yang sudah dilepas - Dengan penjadwalan yang presisi, beberapa prosesor dapat dibuat memulihkan
vzeroupperyang salah prediksi secara tidak akurat - Teknik ini adalah CVE-2023-20593 dan memengaruhi seluruh keluarga Zen 2
- AMD Ryzen 3000 Series Processors
- AMD Ryzen PRO 3000 Series Processors
- AMD Ryzen Threadripper 3000 Series Processors
- AMD Ryzen 4000 Series Processors with Radeon Graphics
- AMD Ryzen PRO 4000 Series Processors
- AMD Ryzen 5000 Series Processors with Radeon Graphics
- AMD Ryzen 7020 Series Processors with Radeon Graphics
- AMD EPYC “Rome” Processors
Syarat serangan dan cakupan kebocoran
- Untuk memicu bug ini, XMM Register Merge Optimization, register renaming, dan
vzeroupperyang salah prediksi harus berlangsung berurutan dalam jendela waktu yang presisi - Contoh urutan instruksi menggunakan struktur berikut
vcvtsi2s{s,d}memicu merge optimizationvmovdqamemicu register renaming- Jika cabang kondisional sebenarnya taken tetapi CPU memprediksi jalur not-taken,
vzeroupperdieksekusi secara salah prediksi dan bug terjadi
- Karena operasi dasar seperti
strlen,memcpy, danstrcmpjuga menggunakan register vektor, operasi tersebut dapat menjadi sasaran pengamatan di mana pun dijalankan dalam sistem - Karena file register dibagikan pada inti fisik yang sama, VM, sandbox, container, dan proses lain juga termasuk dalam cakupan dampak
- Dua hyperthread berbagi file register fisik yang sama
- Varian serangan yang dioptimalkan dapat membocorkan sekitar 30KB per detik per inti, cukup cepat untuk memantau kunci kriptografi dan kata sandi pengguna yang sedang login
- Advisori teknis dan kode terkait dipublikasikan di security research repository milik Google
- Kode uji disediakan untuk Linux, tetapi bug ini tidak bergantung pada sistem operasi tertentu, sehingga semua sistem operasi terdampak
Metode penemuan: fuzzing CPU dan Oracle Serialization
- Kerentanan ini ditemukan melalui fuzzing
- Industri CPU juga melakukan validasi pascaproduksi silikon (Post-Silicon Validation) untuk menemukan cacat perangkat keras
- Berbeda dari fuzzing berbasis coverage pada umumnya, CPU tidak memiliki metrik yang secara langsung berpadanan dengan code coverage
- Sebagai gantinya, performance counters digunakan untuk memberi umpan balik kepada fuzzer tentang peristiwa arsitektural yang menarik
- Dengan cara ini, urutan instruksi yang sulit ditemukan secara kebetulan dapat dieksplorasi
- Fitur seperti merge optimization juga dapat ditemukan secara otomatis
- Fuzzing perangkat lunak biasanya mencari crash, tetapi pada program CPU yang dihasilkan secara acak, crash itu sendiri bisa saja merupakan perilaku yang benar
- Salah satu pendekatan sebelumnya, reversi, menghasilkan operasi kebalikan untuk tiap instruksi acak lalu memeriksa apakah keadaan akhir berbeda dari keadaan awal
- Pada arsitektur CISC seperti x86, pembuatan test case menjadi lebih rumit
- Metode lain adalah menggunakan oracle untuk membandingkan hasil CPU yang diuji dengan CPU lain atau simulator
- Oracle Serialization menggabungkan kedua gagasan tersebut
- Program acak dibuat lalu secara otomatis diubah ke bentuk yang diserialkan
- Ditambahkan elemen serialisasi seperti store/load barrier, speculation fence, dan cache line flush
- Program asli dan program yang diserialkan harus menghasilkan keluaran yang sama meskipun karakteristik performanya berbeda
- Jika keadaan akhir tidak cocok, hal itu bisa menunjukkan kesalahan eksekusi mikroarsitektur, dan ketidakcocokan inilah yang mengarah pada penemuan Zenbleed
Respons dan keterbatasan deteksi
- Kerentanan ini dilaporkan ke AMD pada 15 Mei 2023
- AMD mendistribusikan pembaruan mikrokode untuk prosesor yang terdampak
- Vendor BIOS atau sistem operasi mungkin sudah menyediakan patch yang mencakup pembaruan tersebut
- Respons yang direkomendasikan adalah menerapkan pembaruan mikrokode
- Jika pembaruan tidak dapat diterapkan, solusi sementara berbasis perangkat lunak adalah mengatur
DE_CFG[9]chicken bit- Bisa menimbulkan biaya performa
- Di Linux, pengaturan dapat dilakukan pada semua inti dengan
msr-tools - Di FreeBSD, gunakan
cpucontrol(8) - Jika tidak mengetahui cara mengatur MSR pada sistem operasi lain, diperlukan dukungan vendor
- Menonaktifkan SMT saja tidak cukup
- Belum ada teknik deteksi serangan yang andal yang diketahui
- Karena tidak memerlukan system call atau hak istimewa khusus
- Juga tidak memungkinkan mendeteksi secara statis penggunaan
vzeroupperyang tidak semestinya
1 komentar
Komentar Hacker News
Ini benar-benar keren, dan bisa menjadi contoh klasik bahwa menjalankannya di VM tidak berarti aman
VM escape memang sudah lama diketahui, tetapi yang ini adalah kerentanan berskala besar dengan eksekusi yang sederhana dan imbal hasil besar bahkan tanpa escape
Fakta bahwa bug ini diperbaiki lewat microcode tidak berarti tidak ada bug serupa lainnya. Banyak 0-day sering kali sudah diketahui oleh blackhat bayaran jauh sebelum dipublikasikan
Kerentanan CPU yang ditemukan dalam beberapa tahun terakhir:
https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)
https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)
https://aepicleak.com/
https://en.wikipedia.org/wiki/Software_Guard_Extensions#SGAxe
https://en.wikipedia.org/wiki/Software_Guard_Extensions#LVI
https://en.wikipedia.org/wiki/Software_Guard_Extensions#Plundervolt
https://en.wikipedia.org/wiki/Software_Guard_Extensions/…
https://en.wikipedia.org/wiki/Software_Guard_Extensions#Enclave_attack
https://en.wikipedia.org/wiki/Software_Guard_Extensions/…
https://www.vusec.net/projects/crosstalk/
https://en.wikipedia.org/wiki/Hertzbleed
https://securityweek.com/amd-processors-expose-sensitive-data-new-squi…
Alih-alih menafsirkan instruksi dengan pernyataan
switchbesar, instruksi dijalankan di CPU sungguhan dan bergantung pada beberapa flag perangkat keras yang menjamin data atau instruksi tidak saling tumpang tindih. CPU memang berjanji demikian, tetapi dalam kenyataannya janji seperti itu sulit ditepatiPada kasus itu CPU melakukan persis apa yang seharusnya dilakukan, tetapi memungkinkan bentuk serangan yang benar-benar baru berbasis timing; sementara Zenbleed kali ini lebih mirip bug tradisional, di mana data yang seharusnya tidak ada malah tertinggal di register
Banyak kerentanan seperti ini menurut saya muncul karena pihak software dan pihak hardware tidak benar-benar saling berbicara dengan baik. Pihak software membuat asumsi soal jaminan isolasi, sementara pihak hardware tidak cukup memberi peringatan ketika asumsi seperti itu mungkin muncul
Prediksi cabang terasa secara inheren terlalu kompleks sehingga mau tidak mau selalu terekspos pada kerentanan seperti ini, atau begitu berbeda dari cara intuitif kita memahami jalur kode dan eksekusi instruksi sehingga sulit membayangkan kondisi batas sebelum semuanya terlambat
Apakah kompleksitas arsitektur CPU pada titik tertentu akan menjadi terlalu sulit untuk dipahami, sehingga kita rela menerima penurunan performa demi menjaganya tetap lebih sederhana?
Saya pernah menyoroti ini dan menyarankan agar dipisahkan dengan hypervisor terpisah sebagai air gap, tetapi selalu diabaikan. Pada akhirnya itu mungkin akan menjadi kerugian mereka sendiri
README dalam file tar exploit berisi detail lebih lanjut dan jadwal pengungkapan
2023-05-09Salah satu komponen dalam pipeline validasi CPU menghasilkan hasil yang tidak normal2023-05-12Masalah berhasil diisolasi dan direproduksi, investigasi berlanjut2023-05-14Cakupan dan tingkat keparahan masalah dipahami2023-05-15Laporan status singkat ditulis dan dibagikan ke AMD PSIRT2023-05-17AMD mengonfirmasi laporan dan mengakui bahwa masalah ini dapat direproduksi2023-05-17Pengembangan PoC yang andal selesai dan dibagikan ke AMD2023-05-19Mulai memberi tahu vendor kernel dan hypervisor utama2023-05-23Menerima pembaruan mikrokode beta untuk Rome dari AMD2023-05-24Mengonfirmasi bahwa pembaruan tersebut memperbaiki masalah dan memberi tahu AMD2023-05-30AMD memberi tahu bahwa mereka telah mengirim pemberitahuan keamanan ke para mitra2023-06-12Meeting dengan AMD untuk membahas status dan detail2023-07-20AMD merilis patch lebih awal dari tanggal embargo yang telah disepakati tanpa pemberitahuan2023-07-21Karena perbaikannya sudah dipublikasikan, diusulkan agar distro utama diberi tahu secara pribadi untuk menyiapkan pembaruan paket firmware2023-07-24Pengungkapan publikMereka merilis patch lebih awal dari embargo yang disepakati, lalu baru setelah itu muncul alur untuk memberi tahu distro utama secara pribadi bahwa mereka perlu menyiapkan paket firmware
amd-ucode 20230625.ee91452d-5milik Arch Linux menyertakan pembaruan mikrokode yang memperbaiki masalah inihttps://archlinux.org/packages/core/any/amd-ucode/ terakhir diperbarui pada 2023-07-25 11:48 UTC, dan https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin... menyebut versi perbaikannya bertanggal 2023-07-18
Awalnya saya mengira mereka masih memakai firmware 20230625 karena
_tag=20230625dansource=("git+[https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...](<https://git.kernel.org/pub/scm/…;)")di PKGBUILDNamun ada dua commit cherry-pick di array
_backportsyang diedit 20 jam lalu, danb250b32ab1d044953af2dc5e790819a7703b7ee6di https://gitlab.archlinux.org/archlinux/packaging/packages/li... adalah commit kernel.org yang ditautkan sebelumnya, jadi saya berharap Arch terbaru tidak rentan terhadap ZenbleedIni benar-benar menakutkan. Di perangkat Zen 2 saya, Ryzen 3600, saya menjalankan exploit sebagai pengguna tanpa hak istimewa, lalu menyalin dan menempelkan sebuah string ke editor teks di latar belakang (Kate), dan dalam beberapa detik potongan string itu tercatat di output zenbleed
Untungnya exploit ini tampaknya sangat bergantung pada rutinitas assembly tertentu, jadi akan sangat sulit dieksploitasi dari JS atau WASM di browser. Kalau tidak, kebocoran akan sangat mudah terjadi hanya dengan membiarkan tab berbahaya terbuka di latar belakang selama beberapa jam
Sedang menunggu maintainer Fedora mendistribusikan mikrokode baru agar kernel bisa memperbaruinya saat proses boot
Pada saat yang sama saya berharap patch perangkat lunak di V8 dan SpiderMonkey bisa datang lebih awal dan memberi mitigasi tambahan
Namun exploit JS juga akan membutuhkan cara untuk mengekfiltrasi data ke luar, dan tampaknya cukup sulit untuk menyembunyikan itu sepenuhnya
"No such file or directory"dan error 127Terasa seperti bukan kebetulan bahwa OpenBSD menambahkan pemrosesan mikrokode AMD dalam 3 hari terakhir
https://news.ycombinator.com/item?id=36838511
Sepertinya pernyataan bahwa AMD telah merilis pembaruan mikrokode untuk prosesor yang terdampak kurang tepat
AMD telah merilis pembaruan mikrokode[0] untuk family 17h model
0x31dan0xa0, dan menurut WikiChip[1] ini mengacu pada Rome, Castle Peak, dan MendocinoSejauh ini, tampaknya belum ada pembaruan mikrokode untuk Renoir, Grey Hawk, Lucienne, Matisse, dan Van Gogh. Untungnya, kernel baru dapat sekadar mengatur chicken bit untuk semuanya, dan memang melakukan itu[2]
[0] https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...
[1] https://en.wikichip.org/wiki/amd/cpuid#Family_23_.2817h.29
[2] https://github.com/torvalds/linux/commit/522b1d69219d8f08317...
good_revsmenurut kernel ada di sini: https://github.com/torvalds/linux/commit/522b1d69219d8f08317...Revisi (
Patch) yang saat ini dipublikasikan bisa dilihat di sini berdasarkan git HEAD: https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...Pada saat tulisan ini dibuat, hanya dua dari lima
good_revyang sudah dipublikasikanCeleron itu terkenal dengan overclock 50%: https://ark.intel.com/content/www/us/en/ark/products/codenam...
Jika melihat bagian terkait, teknik ini adalah CVE-2023-20593 dan bekerja pada semua prosesor kelas Zen 2, setidaknya termasuk produk berikut
AMD Ryzen 3000 Series Processors
AMD Ryzen PRO 3000 Series Processors
AMD Ryzen Threadripper 3000 Series Processors
AMD Ryzen 4000 Series Processors with Radeon Graphics
AMD Ryzen PRO 4000 Series Processors
AMD Ryzen 5000 Series Processors with Radeon Graphics
AMD Ryzen 7020 Series Processors with Radeon Graphics
AMD EPYC “Rome” Processors
Mungkin teknik yang sama atau serupa juga bisa bekerja pada core Zen/Zen+ yang lebih awal atau Zen 3 yang lebih baru, tetapi belum berhasil dibuktikan?
AMD Ryzen 9 5950x Desktop Processorsaya juga terlihat sebagai Zen 3, jadi sepertinya amanSaya memang tidak menjalankan beban kerja yang tidak tepercaya, tetapi lebih baik siap sedia daripada menyesal
Situsnya sedang tumbang karena trafik: https://web.archive.org/web/20230724143835/https://lock.cmpx...
Dalam kebanyakan kasus, trafik HN bahkan hampir tidak mencapai 100 pageview per detik
https://www.amd.com/en/resources/product-security/bulletin/a...
Menurut pengumuman keamanan AMD, pembaruan firmware untuk CPU non-EPYC tidak akan keluar sampai akhir tahun. Sampai saat itu, apakah pengguna harus mematikan chicken bit dan menerima penurunan performa?
Keren sekaligus menakutkan. Saya menjalankan sampel 10MB selama 1 menit, dan bisa “membocorkan” sebagian kata sandi Bitwarden saya, kata sandi login ssh, serta potongan kredensial bank, dan semuanya mudah direkonstruksi
Tulisannya benar-benar bagus. Saya terutama menyukai bagian yang membahas bagaimana kita bisa menilai apakah program pembangkit acak berjalan dengan benar.
Pendekatan yang paling jelas adalah menjalankannya pada oracle seperti prosesor lain atau simulator untuk melihat apakah ia berperilaku dengan cara yang sama.
Namun, untuk memeriksa efek mikroarsitektur dalam jendela timing yang sempit, kita juga bisa menulis program yang sama dengan menyisipkan berbagai stall, fence, nop, dan sebagainya. Pada kode single-thread, hal itu seharusnya tidak memengaruhi output, tetapi di dalam CPU, secara mikroarsitektur ia akan melakukan hal yang cukup berbeda. Dengan begitu, CPU bisa menjadi oracle bagi dirinya sendiri.
Saya juga suka chicken bit.