Register File Data Sampling / RFDS (CVE-2023-28746)¶
Intel Atom (E-)core'larında bir domain-bypass transient-execution saldırısı; attacker'ın integer, floating-point ve vector register file'larında geride bırakılan stale değerleri çıkarsamasını sağlar.
Mechanism¶
Sınır neden kırılıyor
RFDS bir MDS tarzı sampling leak'idir, ama sızdıran yapı bir load/store/fill buffer değil register file'dır. Etkilenen Intel Atom (efficiency) core'larında, belirli transient (mis-speculated) operasyonlar önceki bir context'e — başka bir process, kernel ya da aynı core'daki önceki bir task'a — ait olan register file entry'lerinde hâlâ yerleşik stale veriyi okuyabilir.
Kırılan invariant, bir context/domain geçişinde register-file scrubbing'idir. CPU, farklı bir security domain onu transient olarak gözlemleyebilmeden önce bir register-file entry'sinin temizlendiğini garanti etmez, dolayısıyla:
- Leak: faulting/assisting/transient bir instruction bir register-file slot'unu okur ve bir stale değer elde eder (tüm etkilenen core'larda FP/vector; Gracemont'ta integer da).
- Transmit: stale değer, onu cache state'e encode eden bağımlı bir transient erişimde kullanılır.
- Decode: Flush+Reload gibi bir cache-timing oracle byte'ı geri çıkarır. Sampling olduğundan attacker belirli bir secret'ı adresleyemez — yalnızca register file'dan yakın zamanda geçen şeyi gözlemler — bu yüzden saldırı tekrarlanır ve ortalaması alınır.
Etkilenen core'lar arasında Goldmont, Goldmont Plus, Tremont ve Gracemont bulunur — Alder Lake ve Raptor Lake'teki E-core'lar. Dikkat çekici biçimde bu core'ların hiçbiri SMT desteklemez, dolayısıyla cross-thread bir varyant yoktur; sızıntı aynı logical core üzerinde ardışık context switch'ler boyuncadır.
Walkthrough¶
Intel'in advisory'sinden ve Linux kernel dokümantasyonundan, kavramsal akış MDS'i yansıtır:
// Conceptual RFDS sampling loop (transient; requires affected Atom core).
flush(probe); // clear covert-channel buffer
transient_window { // fault/assist that mis-speculates
v = read_some_register(); // transiently reads a STALE register-file slot
(void) probe[v * 4096]; // encode stale byte into cache state
}
// time probe[] -> fastest line index == sampled stale byte
Yüksek seviyeli reprodüksiyon:
- Bir register okumasının stale veri forward edebileceği bir transient pencere tetikle.
- Sample'lanan byte'ı cache-indexed bir probe array üzerinden encode et.
- Onu Flush+Reload ile geri çıkar ve yakın zamanda bir register'dan geçmiş bir victim secret'ını (örn. bir syscall ya da context switch boyunca kopyalanan crypto state) yeniden birleştirmek için tekrarla.
Sample'lanan çıktı (kavramsal)
Warning
Threat model aynı core üzerinde cross-domain'dir: user-to-kernel, guest-to-host (VM entry/exit) ve task-to-task geçişleri, stale register verisinin bir sınırı aştığı yerlerdir.
Detection¶
- RFDS kendisi architectural seviyede sessizdir; Linux'ta enumeration'ı sysfs
dosyası
/sys/devices/system/cpu/vulnerabilities/reg_file_data_samplingüzerinden kontrol et; bu dosyaNot affected,Vulnerable,Vulnerable: No microcodeya daMitigation: Clear Register Fileraporlar. - Bir host'un clearing microcode'a ihtiyacı olup olmadığını bilmek için
RFDS_NO(IA32_ARCH_CAPABILITIES bit 27) ileRFDS_CLEAR(bit 28) durumunu doğrula. - Davranışsal olarak, cache-probing pattern'leriyle eşleşmiş yüksek oranda faulting/assisting instruction üreten process'leri izle (generic MDS/Flush+Reload detection sezgisi), örn. machine-clear ya da page-fault oranlarında ani sıçramalar.
Mitigation¶
- INTEL-SA-00898 için microcode update'i uygula; etkilenen part'lar sonra
RFDS_CLEARenumerate eder, bu daVERWinstruction'ının etkilenen register-file entry'lerini de overwrite etmesini sağlar. - OS, stale register verisini scrub etmek için mevcut MDS/
VERWclearing dizisini return-to-user'da ve VM entry'den önce yeniden kullanır; yeni Linux kernel'leri bunureg_file_data_samplingmitigation'ına bağlar. - Workload izin verdiğinde, MDS için kullanılan aynı scheduling sertleştirmesi (untrusted kodu co-schedule etmekten kaçın; domain geçişinde flush'la) geçerli olur; etkilenen Atom core'larında SMT olmadığı için SMT burada bir faktör değildir.