Skip to content

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ı, perf counter'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