Skip to content

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.

  1. 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.

  2. Speculative dereference'ı trigger et. Mispredict edilmiş bir indirect branch (privileged koddaki bir Spectre-BTB gadget'ı), transient olarak [reg]'den load eder:

Kavramsal parça
user:    set register r = candidate_address ; enter kernel (syscall)
kernel:  <Spectre-BTB gadget> -> transiently executes:  load [r]
         ; speculative access to candidate_address touches the cache
user:    Flush+Reload over the candidate -> "hit" reveals it was dereferenced
  1. 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.

  2. 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.

References