System Management Mode speculative execution / Spectre-SMM (Spectre v1 / CVE-2017-5753)¶
Bir SMI handler içindeki Spectre tarzı bir bounds-check-bypass gadget'ı, SMRR'a rağmen SMRAM'i transient olarak okuyabilir ve ring -2 sırlarını bir cache covert channel üzerinden sızdırabilir.
Mechanism¶
Invariant
SMRR, SMRAM'i SMM dışında architectural olarak erişilemez kılar. Ancak
Spectre, SMRR'ın yönetmediği transient (speculative) domain'i hedefler. Klasik
bir bounds check içeren bir SMI handler düşünün:
if (x < array1_size) y = array2[array1[x] * 512];. SMI handler SMM içinde
çalıştığında, SMRAM'e meşru erişimi vardır. Eğer x daha az ayrıcalıklı caller
tarafından sağlanırsa ve branch mispredict ederse, CPU array1[x]'i bir
out-of-bounds (saldırganın seçtiği) adresten — SMRAM dahil — speculative olarak
load eder ve ardından secret byte'ı array2'yi index'lemek için kullanır,
cache'te secret-dependent bir iz bırakır. SMRR'ın invariant'ı ("SMRAM'e non-SMM
erişimi yok") architectural olarak geçerlidir, ama speculative okuma handler SMM
içindeyken gerçekleşir ve cache state rollback'ten sağ çıkar. Sır ardından ring 0'dan
FLUSH+RELOAD ile geri kazanılır. Bu primary mekanizma Spectre v1 (bounds-check-bypass /
PHT, CVE-2017-5753) sınıfındandır — aşağıdaki Walkthrough bu varyantı anlatır.
Variant: Spectre v2 / BTI in SMM¶
Ayrı ve tamamlayıcı bir varyant olarak, Spectre v2 / Branch Target Injection
(CVE-2017-5715) SMM speculation'ını saldırganın seçtiği bir indirect-branch gadget'ına
yönlendirebilir. Bu, aynı secret domain'i (SMRR arkasındaki SMRAM) hedefler ama mistrain
vektörü olarak BTB/RSB kullanır; aşağıdaki Walkthrough'da anlatılan v1 PHT varyantından
farklıdır ve microcode/IBRS sınıfı mitigation gerektirir.
Walkthrough¶
Eclypsium'un public gösteriminden (zaten açıklanmış, mitigate edilmiş) — Spectre v1 / bounds-check-bypass varyantı:
- Caller-controlled bir index kullanarak bir array okuyan, ardından load edilen değeri ikinci bir array'i index'lemek için kullanan bir SMI handler'da bir bounds-check gadget'ı bul/tetikle.
- Ring 0'dan ilgili branch predictor'ı mistrain et, covert-channel array'ini
(
array2) flush et ve SMI'ı out-of-bounds bir index ile raise et. - Handler SMRAM'i speculative olarak okur ve
array2[secret * 512]'a dokunup bir line'ı cache'ler. - Ring 0'a dönüldüğünde,
array2üzerinde FLUSH+RELOAD hangi line'ın cache'lendiğini açığa çıkarır → SMRAM'in bir secret byte'ı. SMRAM'i dump etmek için tekrarla.
# Conceptual covert-channel line (inside the speculative window):
temp &= arrays_ptr->array2[arrays_ptr->array1[x] * 512];
# ring 0 then times reloads of array2[i*512] (FLUSH+RELOAD) to read 'secret'
Bu, spectre-v1-bounds-check-bypass-kernel-gadget.md ile aynı mekanizmayı kullanır
ve flush-reload üzerinden exfiltrate eder, sadece secret region olarak SMRAM ile.
Warning
Eğitsel/savunma amaçlı; public Eclypsium writeup'ından ve Intel rehberinden kavramsal olarak yeniden üretin. Klasik Spectre'a kıyasla yeni olan tek unsur secret domain'dir (SMRR arkasındaki SMRAM).
Detection¶
- SMI handler'ları caller-controlled index'ler üzerinde çalışan Spectre-v1 bounds-check gadget'ları için denetleyin; eksik speculation barrier'larını arayın.
- SMI'larla korele alışılmadık cache-miss/FLUSH+RELOAD desenleri için performance counter'ları (gürültülü; çoğunlukla bir araştırma sinyali).
Mitigation¶
- SMI handler'larda bounds check'lerden sonra
LFENCEspeculation barrier'ları ekleyin (Intel'in firmware Spectre-v1 rehberi). - Spectre-v2 (CVE-2017-5715) yolu için microcode/IBRS sınıfı mitigation'ları uygulayın; UEFI memory-protection rehberine göre SMM'in physical memory mapping'lerini kısıtlayın.