Spectre v2 branch-target injection¶
Branch-target buffer / indirect-branch predictor'ı poison'la (CVE-2017-5715), böylece bir kernel indirect branch'i, attacker'ın seçtiği bir gadget'ı speculatively execute etsin ve kernel belleğini bir cache side channel üzerinden sızdırsın.
Mechanism¶
Indirect branch'ler (jmp/call *reg), branch-target buffer (BTB) ve indirect-branch predictor üzerinden predict edilir; bunlar branch source address'iyle index'lenen paylaşımlı yapılardır — ve tarihsel olarak privilege level'ları veya SMT sibling'ları arasında isolate edilmemiştir.
Note
Attacker, user mode'dan (ya da bir sibling thread'den), bir kernel indirect branch'iyle alias olan adreslerde indirect branch'leri tekrar tekrar execute eder, predictor'ı seçilen bir target'a — kernel text'inde attacker'ın seçtiği bir disclosure gadget'ına — train eder. Kernel daha sonra gerçek indirect branch'e ulaştığında, poison'lanmış target'a speculatively atlar; o gadget hassas kernel belleğini speculatively okur ve cache'e encode eder. Architectural state squash edilir, ama cache footprint kalıcıdır ve secret timing ile (Flush+Reload) kurtarılır. v1'in aksine, leak bir array index'ine bağlı değildir — erişilebilen herhangi bir gadget'a yönlendirilebilir.
Walkthrough¶
Kavramsal cross-privilege leak:
- Bir syscall üzerinden erişilebilen bir kernel indirect branch'ini ve kernel text'inde uygun bir disclosure gadget'ını bul (adresleri bilmek için önce KASLR kırılmalı).
- Poison: user mode'da, source address'leri (predictor'ın index'lemesinde) kernel branch'iyle çakışan indirect branch'leri execute et, tekrar tekrar gadget adresine yönlendir.
- Gadget'ın covert channel'ının kullandığı probe array'ini flush et.
- Syscall'ı trigger et; kernel branch'i gadget'a mispredict eder, gadget
probe[secret*stride]'i speculatively load eder. - Probe array'ini timing'leyerek secret'ı recover et.
Beklenen sonuç: BTB-yönlendirmeli transient gadget üzerinden round başına secret kernel byte'ları sızdırılır.
Mitigation¶
- Retpoline — indirect branch'leri, speculation'ı predictor'ın target'ı yerine zararsız bir loop'a hapseden bir
call/rettrampoline yapısıyla değiştir. - IBRS / enhanced IBRS (eIBRS) — hardware, daha yüksek privilege'de indirect-branch prediction'ı kısıtlar.
- IBPB — context'ler arasında (örn. context switch /
execsırasında) predictor'ı flush eden barrier. - STIBP — bir SMT thread'inin branch prediction'larının sibling'ini yönlendirmesini engeller.
Bunlar, mevcut CPU özelliklerine göre per-CPU seçilir (bkz. kernel'in spectre_v2 boot-parameter handling'i).