Reptar: Kerentanan FSRM/REX pada CPU Intel
(lock.cmpxchg8b.com)- Pada sebagian prosesor Intel, ketika
rep movsdan prefiksrex.ryang berulang bertemu dengan optimisasi FSRM, CPU dapat masuk ke keadaan “glitch” yang menyimpang dari aturan normal - Penyebabnya ada pada decoding prefiks x86 yang longgar, serta prefiks
rexyang semestinya tidak bermakna pada instruksi dengan operand implisit sepertimovsb, tetapi justru masuk ke jalur optimisasi tertentu - Pipeline validasi Google menemukan hasil yang tidak dapat diprediksi dari kombinasi ini pada Agustus 2023, dan mengamati percabangan tak terduga, pengabaian unconditional branch, serta anomali pencatatan instruction pointer pada
xsavedancall - Jika beberapa core memicu bug yang sama secara bersamaan, machine check exception dan penghentian sistem dapat terjadi; ini juga dapat direproduksi di dalam guest VM tanpa hak istimewa, sehingga penting bagi lingkungan cloud
- Intel telah merilis pembaruan microcode untuk prosesor yang terdampak; jika pembaruan tidak memungkinkan, fast strings dapat dimatikan melalui
IA32_MISC_ENABLE, tetapi akan disertai penurunan performa yang besar
Prefiks x86 dan rep movsb
rep movsbadalah cara idiomatik untuk memindahkan memori di x86; setelah sumber, tujuan, arah, dan hitungan disiapkan, prosesor menangani penyalinan berulang- Instruksi sebenarnya adalah
movsb, sedangkanrepadalah prefiks (prefix) yang mengubah instruksi tersebut agar diulang berkali-kali - Decoding instruksi x86 relatif longgar, sehingga prefiks yang tidak bermakna atau saling bertentangan biasanya diabaikan
- Compiler dapat memakai prefiks berulang seperti ini untuk melakukan padding pada satu instruksi hingga batas alignment yang diinginkan
rex,vex, danevexadalah prefiks yang mengubah cara decoding instruksi berikutnya
Kombinasi ketika prefiks rex menjadi masalah
- i386 memiliki 8 register general-purpose sehingga register dapat ditentukan dengan 3 bit, tetapi x86-64 memiliki 16 register general-purpose sehingga membutuhkan bit tambahan
- Prefiks
rexmenyediakan bit ekstra yang dapat dipinjam ketika instruksi berikutnya meng-encode operand- Biasanya ditulis seperti
rex.rxb, dengan bitb,x,r, danwdiatur secara opsional
- Biasanya ditulis seperti
movsbtidak mencantumkan operand secara eksplisit dalam instruksi dan semuanya bersifat implisit, sehingga bitrexpadarex.rxb rep movsbseharusnya tidak memiliki arti- Umumnya prosesor diam-diam mengabaikan prefiks
rexseperti ini, tetapi pada sistem yang mendukung fast short repeat move, kombinasi ini berujung pada kerentanan
FSRM dan prosesor yang terdampak
- FSRM adalah fitur yang diperkenalkan di Ice Lake, untuk melengkapi keterbatasan ERMS dalam menangani string pendek
- ERMS (enhanced repeat move/store) dapat membuat kode
rep movsblama menjadi lebih cepat dengan menangani alignment buffer dan penyimpanan lebar di microcode- Biaya setup awalnya besar, sehingga tidak cocok untuk string yang sangat pendek
- FSRM adalah fitur untuk menangani perpindahan pendek 128 byte atau kurang dengan lebih cepat
- Dukungan dapat diperiksa lewat flag
fsrmpada barisflagsdi/proc/cpuinfo - Contoh prosesor yang menyertakan FSRM adalah sebagai berikut
- Ice Lake
- Rocket Lake
- Tiger Lake
- Raptor Lake
- Alder Lake
- Sapphire Rapids
- Daftar ini tidak komprehensif, dan daftar lengkapnya harus dilihat di advisory Intel INTEL-SA-00950
Penemuan dan reproduksi
- Pipeline validasi Google menjalankan dua bentuk program yang dibuat secara acak dengan teknik Oracle Serialization, lalu membandingkan apakah state akhirnya sama
- Penjelasan terkait ada di tulisan sebelumnya Oracle Serialization
- Pada Agustus 2023, hasil yang tidak dapat diprediksi terjadi ketika prefiks
rex.rberulang ditambahkan kerep movsyang dioptimalkan FSRM - Perilaku aneh yang diamati adalah sebagai berikut
- Branch ke lokasi yang tidak terduga
- Pengabaian unconditional branch
- Instruction pointer tidak dicatat secara akurat pada instruksi
xsaveataucall - Debugger melaporkan state yang mustahil
- Jika beberapa core memicu bug yang sama, prosesor dapat melaporkan machine check exception dan berhenti
- Karena dapat direproduksi di dalam guest VM tanpa hak istimewa, ini menjadi masalah keamanan penting bagi penyedia cloud
- Tool reproduksi dan materi riset dipublikasikan di security research repository milik Google
- Mirror lokal untuk tool
icebreakjuga tersedia sebagai icebreak.tar.gz
- Mirror lokal untuk tool
icebreakmencoba reproduksi dengan menentukan pasangan core yang berbeda- Pada sistem yang tidak terdampak, seharusnya tidak ada output seperti infinite loop
- Pada sistem yang terdampak,
.dicetak setiap kali reproduksi berhasil - Pada core saudara SMT, branch acak dapat diamati
- Pada core saudara SMP dalam paket yang sama, machine check dapat diamati
- Jika tidak menentukan dua core yang berbeda, hammer thread mungkin diperlukan
Kemungkinan penyebab dan dampak yang diamati
- Perilaku microcode pada sistem modern tidak dipublikasikan, sehingga akar penyebab hanya dapat dibahas sebagai teori berbasis pengamatan
- CPU secara garis besar dibagi menjadi front-end dan back-end
- Front-end mengambil dan men-decode instruksi untuk menghasilkan μops
- Back-end mengeksekusi instruksi secara out-of-order, menyimpan hasilnya di ROB (reorder buffer), lalu merapikannya
- Bug ini tampaknya membuat front-end salah menghitung ukuran instruksi
movsb, lalu menyebabkan kondisi ketika entri ROB berikutnya terhubung ke alamat yang salah - Dalam kondisi ini, terjadi keadaan kacau ketika instruction pointer dihitung secara keliru
- Sistem pada akhirnya dapat pulih ke state yang konsisten secara internal, tetapi hasil antara dapat keliru
- Jika beberapa core SMT atau SMP masuk ke keadaan ini secara bersamaan, kerusakan state mikroarsitektur yang cukup dapat terjadi dan memaksa machine check
- State sistem dapat dirusak hingga memicu machine check, dan interferensi antarthread diamati pada eksekusi proses yang dijadwalkan di core saudara SMT
- Belum dipastikan apakah kerusakan dapat dikendalikan dengan presisi yang cukup untuk eskalasi hak akses
Cara mitigasi
- Intel telah merilis microcode yang diperbarui untuk semua prosesor terdampak melalui INTEL-SA-00950
- Vendor sistem operasi atau BIOS mungkin sudah menyediakan pembaruan
- Jika tidak dapat memperbarui, fast strings dapat dinonaktifkan melalui register model-specific
IA32_MISC_ENABLE - Menonaktifkan fast strings menyebabkan penurunan performa yang besar, sehingga tidak boleh digunakan kecuali benar-benar diperlukan
Materi terkait bug CPU
- Google memublikasikan bug CPU yang mereka temukan, dan sebagian layak dibaca meskipun tidak memiliki dampak keamanan
- Contoh materi
- movlps just doesn’t work: contoh ketika
movlpstidak berfungsi - registers can sometimes roll back: contoh ketika register kembali ke nilai sebelumnya
- movlps just doesn’t work: contoh ketika
1 komentar
Komentar Hacker News
Artikel terkait: https://cloud.google.com/blog/products/identity-security/goo...
Ini berasal dari https://news.ycombinator.com/item?id=38268043, tetapi komentarnya digabungkan ke sini
Membaca artikel ini membuat saya sadar betapa sedikitnya yang saya ketahui tentang hardware tempat software saya berjalan
Katanya “prefix memungkinkan kita mengubah perilaku instruksi dengan mengaktifkan atau menonaktifkan fitur”, jadi saya penasaran kenapa perlu “prefix” untuk mengaktifkan dan menonaktifkan fitur
Apakah itu untuk beralih fitur secara dinamis tanpa masuk ke BIOS?
Prefix REP adalah yang paling umum; fungsinya membuat instruksi yang sama diulang sebanyak jumlah yang bervariasi
Jumlah pengulangannya diambil dari register CX, sehingga loop umum seperti memindahkan objek dari memori bisa dibuat sangat singkat
Fungsi memcpy sering di-inline menjadi satu instruksi REP MOVS, dengan instruksi tambahan untuk menyalin count ke CX jika diperlukan
Prefix REX juga cukup umum karena program 64-bit sering menangani nilai dan alamat 64-bit
Tidak ada prefix yang men-toggle sesuatu yang bisa dikonfigurasi secara global lewat BIOS atau semacamnya; semuanya hanya menentukan apa yang harus dilakukan instruksi berikutnya
Mode pengalamatan yang jarang dipakai diberi “segment prefix” agar memakai segmen selain DS, dan prefix “REX” di x86_64 menambahkan bit ke field register sehingga 16 register serbaguna bisa digunakan
Demikian pula, prefix “LOCK”, meski spesifikasi awalnya kurang bagus, membuat sebagian operasi memori menjadi atomik terhadap bagian sistem lainnya, misalnya mengimplementasikan compare-and-set dengan “LOCK CMPXCHG”
Arsitektur CPU lain juga mengekspresikan operasi semacam ini, tetapi biasanya memasukkannya ke ruang instruksi yang ada sehingga butuh lebih banyak bit untuk merepresentasikan semua instruksi
Prefix “REP” yang menjadi masalah di sini agak merupakan pengecualian; ini adalah prefix pengulangan microcode peninggalan zaman kuno
Meski begitu, karena ia merepresentasikan operasi yang masih sensitif terhadap performa hingga kini seperti memset/memmove, vendor CPU tetap punya alasan untuk terus mengoptimalkannya, dan tampaknya bug kali ini muncul dalam proses itu
Masalah terbesarnya adalah ruang encoding instruksi “dimanfaatkan secara efisien”
Ketika kemudian muncul instruksi baru, dan yang lebih buruk lagi register tambahan, variasi instruksi baru itu harus dijejalkan entah bagaimana, dan caranya adalah dengan menambahkan prefix
Setiap kali instruction set diperluas, sebagian ruang opcode digali untuk menjejalkan prefix baru
Melihat Intel mengusulkan satu cara baru lagi tahun ini, tampaknya pola ini akan terus berlanjut
Proses diagnosisnya mengingatkan saya pada kejadian saat qemu bertemu repz ret: https://repzret.org/p/repzret/
Menurut saya, judul seperti ini seharusnya dilarang menurut aturan HN
Sama sekali tidak memberi tahu tautannya tentang apa, dan URL-nya malah lebih membingungkan
Kalau judulnya tidak bermakna seperti ini, menurut saya pengirimnya harus menambahkan penjelasan singkat
Saya sudah melihat bahwa jika judul memuat konteks sebanyak mungkin, orang tidak mengklik tautannya, lalu di komentar mereka hanya memoles topik minat mereka sendiri seperti bereaksi terhadap tweet
HN memilih titik tengah yang mendorong rasa ingin tahu intelektual dan klik ke tautan
Kalaupun judul yang ambigu membuat sebagian orang menolak mengklik tautan, setidaknya mereka jadi menjawab orang-orang yang benar-benar mengklik tautannya, jadi menurut saya itu lebih baik daripada tempat lain di internet
Tulisan yang imbalannya tidak cukup untuk membenarkan judul ambigu dan jenaka, tidak seperti tulisan ini, akan turun dari halaman depan
Artikelnya ditulis dengan sangat baik
Saya hampir tidak tahu pemrograman assembly dan instruction set Intel, apalagi microarchitecture, tetapi saya bisa mengikuti penjelasannya dan merasa cukup memahami apa yang terjadi di sini
Saya penasaran apakah ada yang tahu apakah CPU AMD juga terdampak
Jika masalahnya benar-benar prosesor yang keliru memahami panjang instruksi, menarik bahwa ini bisa diperbaiki dengan microcode tanpa penurunan performa besar
Bisa saja intuisi saya sepenuhnya keliru, tetapi saya mengira perhitungan panjang instruksi akan disintesis langsung sebagai gerbang logika
Kalau dipikir lagi, mungkin decoder uOP secara hardware baik-baik saja, dan rutinitas penyalinan yang dioptimalkan dengan microcode sedang mencoba menyimpulkan sesuatu yang tidak benar tentang stream uOP
Misalnya, “oh, ini rep mov, jadi untuk loop cukup mundur dua uOP”
Sepertinya tim CPU Intel tidak akan mengungkap detailnya sampai sejauh itu
Saya tidak terlalu paham “ERMS” dan “FSRM”, dan di Google pun tampaknya hampir tidak ada materi yang bagus
Saya penasaran apakah keduanya hanya flag CPUID yang memberi tahu bahwa rep movsb bisa dipakai dengan performa terbaik alih-alih implementasi SSE memcpy yang dioptimalkan, atau apakah itu encoding/prefix khusus yang membuat rep movsb lebih cepat
Kalau yang kedua, saya juga tidak mengerti kenapa itu diperlukan, atau bagaimana fsrm dimanfaatkan
Sepertinya ERMS adalah alternatif yang lebih murah untuk AVX, dan FSRM adalah versi yang lebih baik untuk blok pendek
“Kaby Lake Celeron dan Pentium yang dirilis pada 2017, versi low-end dari prosesor-prosesor berikutnya, tidak punya AVX yang bisa dipakai untuk penyalinan memori cepat, tetapi punya Enhanced REP MOVSB
Dan beberapa arsitektur mobile serta berdaya rendah Intel yang dirilis setelah 2018 tidak berbasis SkyLake, tetapi dengan REP MOVSB menyalin kira-kira dua kali lebih banyak byte per siklus CPU dibanding mikroarsitektur generasi sebelumnya”
“Sebelum Fast Short REP MOV(FSRM) pada mikroarsitektur Ice Lake, Enhanced REP MOVSB(ERMSB) hanya lebih cepat daripada penyalinan AVX atau penyalinan register serbaguna ketika ukuran blok minimal 256 byte
Untuk blok di bawah 64 byte, biaya startup internal ERMSB sekitar 35 siklus sehingga jauh lebih lambat, dan fitur FSRM ditujukan untuk membuat blok di bawah 128 byte juga menjadi cepat”
[1] https://stackoverflow.com/a/43837564
[2] http://www.intel.com/content/dam/www/public/us/en/documents/...
Pemilihan instruksi dan penjadwalan yang optimal bisa dilakukan secara statis saat kompilasi, atau secara dinamis saat runtime dengan memilih salah satu dari beberapa fungsi library atau lewat JIT
Untuk mendeteksi penjadwalan instruksi mana yang optimal saat runtime, perlu mengetahui CPU sebenarnya
Bisa saja menaruh tabel semua model CPU, tetapi bisa juga bertanya ke sistem operasi apakah CPU yang sedang berjalan mengimplementasikan optimasi itu
Linux membutuhkan patch agar CPU bisa melaporkan bahwa ia mengimplementasikan optimasi tersebut
https://www.phoronix.com/news/Intel-5.6-FSRM-Memmove
Saya melihat di advisory Intel [1] tertulis sebagai berikut
Intel berterima kasih kepada karyawan Intel yang menemukan masalah ini secara internal, dan juga berterima kasih kepada karyawan Google yang melaporkan masalah ini
[1] https://www.intel.com/content/www/us/en/security-center/advi...
Advisory Intel yang menjelaskan dampaknya juga layak dirujuk: https://www.intel.com/content/www/us/en/security-center/advi...
“Pada sebagian prosesor Intel(R), urutan instruksi prosesor dapat memicu perilaku yang tidak terduga, sehingga pengguna terautentikasi dengan akses lokal dapat memungkinkan eskalasi hak istimewa, pengungkapan informasi, atau denial of service”
Konrad Magnusson dari tim Victoria 3 di Paradox Interactive menemukan sesuatu yang berkaitan dengan ini dan mimalloc: https://github.com/microsoft/mimalloc/issues/807
Saya tidak tahu apakah sepenuhnya terkait, tetapi ada kemungkinan