Speculative Dereferencing / Reviving Foreshadow¶
"prefetch" address-translation oracle'ı yanlış teşhis edilmişti: kernel/hypervisor Spectre-BTB gadget'ları attacker-controlled register'ları speculative olarak dereference eder ve user-inaccessible data'yı cache'e çeker — bu da önerilen mitigation'larla bile non-L1 data üzerinde Foreshadow'u canlandırır.
Mechanism¶
Note
Bir microarchitectural attack hattı (2016'dan beri), bir address-translation
oracle'ını ve KASLR kırmalarını, kernel address'leri fetch eden prefetch
instruction'ına atfetti. Schwarzl et al. root cause'un farklı ve daha genel
olduğunu gösterir: kernel ve hypervisor içinde, mispredict edilmiş bir
indirect branch'te, değerini user'ın kontrol ettiği bir register üzerinden
transient olarak bir load execute eden Spectre-BTB gadget'ları vardır. CPU,
o register'ı speculative olarak dereference eder — attacker'ın seçtiği
(muhtemelen user-inaccessible) bir address'e bir memory access gerçekleştirir —
ve ortaya çıkan cache state rollback'ten sağ çıkar. Kırılan invariant,
spectre-btb ile aynıdır: privileged bir context, transient
olarak attacker-supplied data üzerinde işlem yapar. Bu çalışmaya özgü sonuç:
speculative load keyfi physical/kernel address'lere dokunabilip onları cache
hierarchy'sine doğru çekebildiği için,
foreshadow-l1-terminal-fault'ın ihtiyaç
duyduğu data-getiren adımı sağlar — önerilen L1TF mitigation'ları etkinken bile
henüz L1'de olmayan data üzerinde Foreshadow'u mümkün kılar, çünkü
dereference'ın kendisi line'ı yeniden doldurur.
Walkthrough¶
Yüksek seviyeli reprodüksiyon, prefetch anlatısını değil, makalenin yeniden yorumunu izler.
-
Bir register'a bir değer yerleştir, sonra kernel/hypervisor'a trap et. Bir syscall ya da hypercall, gadget'ın sonradan pointer olarak kullanacağı bir register'da attacker'ın seçtiği bir değer bırakır.
-
Speculative dereference'ı trigger et. Mispredict edilmiş bir indirect branch (privileged koddaki bir Spectre-BTB gadget'ı), transient olarak
[reg]'den load eder:
Kavramsal parça
-
Bir address-translation oracle inşa et. Cache "hit" vs "miss",
candidate_address'in map'li / valid olup olmadığını açığa çıkarır — virtual-to-physical mapping'leri sızdırır, KASLR-class randomization'ı kırar ve register değerlerini doğrudan sızdırır. -
Foreshadow'a zincirle. Bir target line'ı cache/L1'e getirmek için dereference'ı kullan, sonra içeriğini recover etmek için L1TF read'i uygula.
Warning
Başlık niteliğindeki savunma dersi: prefetch instruction'ını (orijinal yanlış atfı) hedefleyen bir savunma burada hiçbir şey yapmaz. Gerçek fix, privileged koddaki Spectre-BTB'yi ve user-controlled register'ların speculative kullanımını ele almalıdır.
Detection¶
Architectural artifact yok. Covert channel cache timing'dir (flush-reload); EDR/host log'ları hiçbir şey göstermez. İzlenen bir core'da kernel context'indeki indirect-branch misprediction'larının perf-counter ile izlenmesi yalnızca zayıf bir sezgidir. Preventive kabul et.
Mitigation¶
- Privileged kodda Spectre-BTB savunmaları: mispredict edilmiş gadget'ın çalışmasını durdurmak için retpoline (retpoline) ve/veya eIBRS (indirect-branch-restricted-speculation), boundary'lerde indirect-branch-prediction-barrier ile birlikte.
- Privileged indirect branch'lerden önce user-controlled register'ları sanitize et / mask'le ki bir transient dereference attacker'ın seçtiği address'lere ulaşamasın.
- L1TF / Foreshadow mitigation'ları (l1d-cache-flush, PTE inversion) gerekli kalır ama, makaleye göre, non-L1 variant'a karşı tek başına yetersizdir; yukarıdaki BTB savunmalarıyla birleştir.
- KPTI (kpti), user'a görünür bazı kernel mapping'lerini azaltır ama speculative dereference'ı tek başına durdurmaz.