Branch Target Buffer Poisoning¶
Bir CPU'nun indirect-branch predictor'ını saldırgan kontrolündeki koddan train et ki victim'in indirect branch'i speculative olarak saldırganın seçtiği bir gadget'a atlasın — Spectre v2 / Branch Target Injection'ın çekirdek primitive'i (CVE-2017-5715).
Mechanism¶
Neden çalışır
Indirect branch'lerde (jmp *%rax, call *(%rbx)) takılıp kalmamak için CPU,
target'ı Branch Target Buffer (BTB) ve indirect predictor'da saklanan
history'den predict eder, sonra orada speculative olarak çalıştırır. Prediction
yalnızca branch'in düşük virtual-address bitleri ve (indirect branch'ler için)
Branch History Buffer (BHB) ile index'lenir — tam adres değil, physical adres
değil ve tarihsel olarak privilege seviyesi ya da PID değil.
Indexing kısmi ve paylaşımlı olduğu için, congruent bir virtual address'te bir branch çalıştıran saldırgan aynı predictor entry'sine kötü niyetli bir target yerleştirebilir. Victim daha sonra kendi indirect branch'ine ulaştığında CPU, gerçek olanı çözmeden önce zehirlenmiş target'a ("disclosure gadget") speculative olarak atlar. Gadget'ın transient load'ları, Flush+Reload gibi bir covert channel ile geri kurtarılan bir mikromimari iz bırakır.
Orijinal disclosure'da Kocher ve arkadaşları, predictor'ı mistrain etmek için "yalnızca virtual address'lerin taklit edilmesi gerektiğini; physical address'lerin, timing'in ve process ID'nin önemli görünmediğini" buldu. Bunun dayandığı collision zemini BTB collision'dır; in-/out-of-place training varyantları Spectre-BTB altında kataloglanmıştır.
Walkthrough¶
Saldırgan ve victim bir predictor entry üzerinde anlaşmalıdır; saldırgan o entry'ye tekrar tekrar bir gadget'ı göstermeyi "öğretir", sonra victim'i tetikler.
1. Bir victim indirect branch'i ve bir disclosure gadget'ı bul. Bir kernel
hedefinde bu, bir syscall'dan erişilebilen bir indirect call/jmp'tir; saldırganın
etkilediği bir bağımlı load yapan bir gadget ile birlikte:
; victim: indirect branch the CPU will mispredict
jmp *function_ptr ; architecturally -> legit handler
; gadget (lives elsewhere in victim address space):
mov rax, [rdi] ; rdi attacker-influenced
mov rax, [rbx + rax*64] ; secret-dependent cache line -> covert channel
2. Predictor'ı mistrain et. Victim branch ile aynı düşük-bitli virtual address'te bir branch çalıştır, onu birçok kez gadget adresine yönlendir ki BTB/IBP entry'si gadget target'ını cache'lesin:
for i in 0..N:
set up BHB to match victim's branch history
execute branch@<congruent VA> -> gadget_addr # poison the entry
3. Victim'i çağır ve geri kurtar. Victim'e gir (örn. syscall); gadget'a
mispredict eder ve gadget speculative olarak secret'a bağlı bir line'a dokunur.
Sonra channel'ı probe'la:
$ ./recover
flush probe array (256 lines)
syscall -> victim indirect branch (mispredicts to gadget)
reload probe array, time each line:
line 0x41 = 78 cycles (HIT) <- leaked secret byte = 0x41
all others > 200 cycles (MISS)
Indirect branch'ler için BHB eşleşmeli
Modern indirect predictor'lar global branch history (BHB) katlar. Training path'inin history'si victim'inkinden farklıysa entry'ler alias yapmaz ve poisoning sessizce başarısız olur. Aynı BHB state'ini üreten bir branch dizisini replay etmelisin — bkz. Branch History Buffer Fingerprinting ve Indirect Branch Predictor Mistraining.
Detection¶
- Temiz bir mimari imza yok; exfiltration aşaması,
perfcounter'ları aracılığıyla gözlemlenebilen anormal LLC-miss / Flush+Reload timing pattern'leri olarak görünür. /sys/devices/system/cpu/vulnerabilities/spectre_v2, çalışan kernel'in kendini mitigate edilmiş sanıp sanmadığını raporlar.
Mitigation¶
- Retpoline — indirect branch'leri, speculation'ı zararsız bir döngüye yönlendiren bir return trampoline ile değiştir; böylece BTB hiç danışılmaz.
- IBPB (Indirect Branch Prediction Barrier) — context switch / privilege geçişinde predictor'ı flush'la ki saldırganın training'i sağ kalmasın.
- IBRS / enhanced IBRS (eIBRS) — donanım, prediction'ların cross-privilege kullanımını kısıtlar; eIBRS korumayı boot'ta bir kez etkinleştirir.
- STIBP — kardeş bir SMT thread'inin diğer thread'in predictor'ını zehirlemesini önler.
Kernel yazısına bakın: Spectre v2 / Branch Target Injection.
References¶
- Paul Kocher et al. Spectre Attacks: Exploiting Speculative Execution. IEEE S&P 2019 — https://www.cs.sfu.ca/~ashriram/Courses/CS7ARCH/papers/Kocher-security-2019.pdf
- Spectre Side Channels — The Linux Kernel documentation — https://docs.kernel.org/admin-guide/hw-vuln/spectre.html
- CVE-2017-5715 (Spectre, Variant 2) — WikiChip — https://en.wikichip.org/wiki/cve/cve-2017-5715