Branch History Injection¶
Spectre-BHB / BHI: global branch history'yi user mode'dan zehirle, böylece kernel'e girdikten sonra bir indirect branch saldırganca seçilmiş bir disclosure gadget'ına yanlış tahmin etsin — eIBRS/CSV2 hardware Spectre-v2 mitigation'larını yenerek.
Mechanism¶
Note
Hardware Spectre-v2 mitigation'ları (Intel eIBRS, Arm CSV2), bir privilege domain'indeki saldırganın daha yüksek bir domain'in kullanacağı branch target'larını enjekte etmesini durdurur. Ama bu mitigation'lar Branch History Buffer (BHB)'yi — indirect branch predictor'ı indexleyen, yakın zamanda alınan branch yön/target'larının global kaydını — izole etmez. BHI'nin istismar ettiği değişmez nokta: BHB user→kernel sınırı boyunca paylaşılır, dolayısıyla unprivileged bir process, bir syscall yapmadan önce BHB'yi seçilmiş bir duruma sürmek için özel hazırlanmış bir branch dizisi yürütebilir. Kernel'e geçişten sonra bir kernel indirect branch, saldırganca şekillendirilmiş history ile predictor'a danışır ve target'ı bir kernel disclosure gadget'ı olan bir predictor entry'si seçer. O gadget transient olarak yürütülür, secret kernel memory'ye erişir ve saldırganın geri okuduğu bir cache izi bırakır. Target'lar meşru kernel target'ları olduğu ve yalnızca history zehirlendiği için eIBRS/CSV2 bunu engellemez.
Walkthrough¶
- BHB'yi şekillendir. User mode'dan hazırlanmış bir branch dizisi çalıştır, böylece global history, hedef indirect branch'in yaşadığı kernel bağlamıyla eşleşsin:
// Execute a precise sequence of taken/not-taken branches to push the BHB
// into the state that, in-kernel, will steer the victim indirect branch.
void shape_bhb(const branch_step_t *seq, int n) {
for (int i = 0; i < n; i++)
if (seq[i].taken) asm volatile("jmp 1f\n1:"); // history-shaping jumps
}
-
Kernel'e gir. Yolu, şekillendirilmiş history ile erişilebilen bir indirect branch içeren bir syscall yap; bu, bir disclosure gadget'ına yanlış tahmin eder.
-
Leak + decode. Gadget transient olarak kernel verisini okur ve user'a görünür bir probe array'ine dokunur; FLUSH+RELOAD byte'ı kurtarır:
flush(probe); // evict probe array
syscall_that_misspeculates(); // transient kernel gadget runs
reload_and_time(probe); // cache hit reveals the leaked byte
Beklenen sonuçlar (VUSec)
Variant: Spectre-BHB / BHI
CVEs: CVE-2022-0001 (Intel BHI), CVE-2022-23960 (Arm);
CVE-2022-0002 (intra-mode BTI) is a same-mode sibling
Bypasses: eIBRS (Intel), CSV2 (Arm) hardware Spectre-v2 mitigations
Affected: Intel since Haswell (incl. Ice Lake-SP, Alder Lake); some Arm
Demo: end-to-end userland->kernel leak ~160 B/s on eIBRS systems
Detection¶
Branch misprediction'ları üzerindeki performance counter'lar gürültülüdür; pratik tespit zayıftır. Savunmalar tespit edici olmaktan çok önleyicidir.
Mitigation¶
Kernel entry'de BHB-clearing dizisi (software clear_bhb döngüsü), Intel'in
önerdiği eIBRS+ mitigation'ları, indirect branch'ler için retpoline,
(kolay gadget'lar sağlayan) unprivileged eBPF'i devre dışı bırakma ve call-depth
tracking. Linux bir BHB-clearing rutini ve spectre_bhi kontrolleri gönderdi.