Spectre-PHT cross-address-space out-of-place¶
Bir victim'in conditional branch'ini ayrı bir attacker process'ten, congruent bir branch — Pattern History Table index'inde victim branch'e alias'lanan farklı bir virtual address — kullanarak mistrain et ve onu transient bir bounds-check bypass'a yönlendir.
Mechanism¶
Note
Spectre-PHT (Spectre v1), bir conditional branch'in taken olup olmadığını tahmin eden directional predictor olan Pattern History Table (PHT)'ı sömürür. Canella et al. her history-based Spectre attack'ini iki bağımsız eksen boyunca sınıflandırır (makalenin Figure 3'ü):
- Poisoning branch'in nerede çalıştığı — same address space'te (victim process'in kendisi) ya da cross-address-space attacker-controlled bir process'te.
- Poisoning'i hangi branch'in yaptığı — vulnerable branch'in kendisi (in-place), ya da congruent bir virtual address'teki bir branch (out-of-place).
"Cross-address-space out-of-place", ikisini birleştiren köşedir: attacker, victim'in tam branch address'i yerine congruent bir virtual address'te bulunan farklı bir process'te bir shadow branch çalıştırır. Bunu işler kılan invariant şudur: branch-prediction buffer'ları yalnızca branch'in virtual address'inin bir subset'iyle index'lenir, dolayısıyla low-order address bit'leri çakışan iki branch aynı PHT entry'sine map'lenir. Attacker congruent branch'ini seçilen bir yönde tekrar tekrar execute ederek paylaşılan 2-bit saturating counter'ı eğer; victim sonradan kendi branch'ine ilk kez ulaştığında, predictor attacker'ın seçtiği yönü önerir ve out-of-bounds okuyup bir cache covert channel üzerinden sızdıran bir transient window açar.
Walkthrough¶
Attacker'ın victim'in tam branch address'ine asla ihtiyacı yoktur — yalnızca congruent (PHT'nin hash'lediği index bit'lerini paylaşan) bir branch'e.
-
Congruent bir address bul. Attacker process'inde, virtual address'i PHT index'inde victim branch'e alias'lanan bir conditional branch yerleştir. Address'in yalnızca bir kısmı kullanıldığı için birçok address congruent'tir.
-
Paylaşılan counter'ı poison'la. Congruent branch'i sabit bir yönde birçok kez execute et, böylece 2-bit counter "taken"e doğru sature olur:
// Attacker process: congruent shadow branch, run in a tight loop.
// Its address is chosen so the PHT index collides with the victim branch.
for (int i = 0; i < N_TRAIN; i++) {
if (always_true) // bias the shared PHT counter "taken"
asm volatile("nop");
}
// then yield / let the scheduler hand the core to the victim
-
Victim mispredict eder. Victim process kendi bounds check'ini
if (x < array_len)çalıştırır. Poison'lanmış counter,xaralık dışındayken bile CPU'nun in-bounds speculate etmesini sağlar; transient olarakarray[x]'i ve secret-dependent bir ikinci array'i okur. -
İkinci array üzerinde Flush+Reload ile secret'ı recover et (bkz. flush-reload).
Beklenen davranış
Root cause: Pattern History Table (PHT) directional predictor
Poison from: a different process (cross-address-space)
Poison with: a congruent branch (out-of-place)
Why congruent: PHT is indexed by a SUBSET of the branch virtual address,
so aliasing addresses share one counter
Effect: victim bounds check mispredicted "in-bounds"
Leak channel: cache (Flush+Reload / Prime+Probe)
Warning
Process-isolation'ı tek başına yetersiz kılan şey out-of-place mistraining'dir: attacker'ın victim'in branch address'ini kontrol etmesi, hatta bilmesi bile gerekmez. Ayrıca spesifik bir "kötü" branch'i eşleştirmeye çalışan savunmaları da zayıflatır, çünkü asıl mispredict eden branch farklı bir process'te farklı bir address'te yaşar.
Detection¶
PHT collision'ları doğrudan gözlemlenebilir değildir. Anormal branch-misprediction oranları ya da bir sibling/komşu context'te olağandışı yapılandırılmış Flush+Reload aktivitesi training loop'larına işaret edebilir, ama detection düşük doğruluktadır; savunmalar preventive'dir.
Mitigation¶
Spectre-PHT, vulnerable branch'te speculation serialize edilmeden ortadan
kaldırılamaz. Standart yaklaşımlar: data-dependent index masking (index'i
clamp et ki out-of-bounds bir değer secret'ları address'leyemesin), bounds check
ile dependent load arasında bir lfence/serializing barrier ve compiler hardening
(örn. speculative load hardening). SMT'yi devre dışı bırakmak ve context switch'te
predictor state'i flush'lamak cross-address-space training'i azaltır;
kpti ise bir userspace attacker'ın hedefleyebileceği
kernel address'lerini sınırlar.