Skip to content

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:

  1. 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ı).
  2. 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.
  3. Gadget'ın covert channel'ının kullandığı probe array'ini flush et.
  4. Syscall'ı trigger et; kernel branch'i gadget'a mispredict eder, gadget probe[secret*stride]'i speculatively load eder.
  5. 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/ret trampoline 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 / exec sı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).

References