2 poin oleh GN⁺ 2023-11-15 | 1 komentar | Bagikan ke WhatsApp
  • Pada sebagian prosesor Intel, ketika rep movs dan prefiks rex.r yang 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 rex yang semestinya tidak bermakna pada instruksi dengan operand implisit seperti movsb, 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 xsave dan call
  • 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 movsb adalah cara idiomatik untuk memindahkan memori di x86; setelah sumber, tujuan, arah, dan hitungan disiapkan, prosesor menangani penyalinan berulang
  • Instruksi sebenarnya adalah movsb, sedangkan rep adalah 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, dan evex adalah 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 rex menyediakan bit ekstra yang dapat dipinjam ketika instruksi berikutnya meng-encode operand
    • Biasanya ditulis seperti rex.rxb, dengan bit b, x, r, dan w diatur secara opsional
  • movsb tidak mencantumkan operand secara eksplisit dalam instruksi dan semuanya bersifat implisit, sehingga bit rex pada rex.rxb rep movsb seharusnya tidak memiliki arti
  • Umumnya prosesor diam-diam mengabaikan prefiks rex seperti 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 movsb lama 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 fsrm pada baris flags di /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
  • Pada Agustus 2023, hasil yang tidak dapat diprediksi terjadi ketika prefiks rex.r berulang ditambahkan ke rep movs yang 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 xsave atau call
    • 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
  • icebreak mencoba 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

1 komentar

 
GN⁺ 2023-11-15
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?

    • Coba baca https://wiki.osdev.org/X86-64_Instruction_Encoding#Legacy_Pr...
      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
    • Dalam kasus ini, “prefix” pada dasarnya berfungsi memperluas ruang encoding instruksi
      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
    • Prefix adalah modifier untuk instruksi tertentu yang dijalankan prosesor, misalnya untuk mengontrol ukuran operand atau mengaktifkan locking untuk konkurensi
    • x86 pada 1978 pada dasarnya dirancang untuk menjalankan printer laser primitif atau pekerjaan serupa
      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
    • x86 sebagai instruction set architecture telah ditambal-tambal selama lebih dari 40 tahun, dan karena memakai instruksi panjang variabel, bentuknya menjadi seperti ini
      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 tidak setuju
      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

    • Saya menemukan materi ini [1], dan manual optimasi Intel [2] juga ditautkan
      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/...
    • FSRM hanyalah nama optimasi CPU yang memengaruhi kode yang sudah ada
      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
    • Flag itu hanya memberi tahu bahwa pada CPU ini rep movsb cepat, jadi tidak perlu memakai implementasi SSE/AVX yang dioptimalkan
  • 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...

    • Saya penasaran seberapa jauh lebih awal karyawan Intel menemukan masalah ini dibanding Google
  • 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”

    • “Sebagian” di sini tampaknya berarti hampir semua CPU Intel x86 yang dibuat selama 6 tahun terakhir
  • 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

    • Kecil kemungkinan terkait kecuali entah bagaimana mereka menghasilkan prefix yang tidak perlu