SMRR misconfiguration (SMM Range Register not locked)¶
BIOS, SMM Range Register'larını enable etmeyi/yapılandırmayı başaramazsa, ring-0 software SMRAM'i cacheable yapabilir ve System Management Mode'a karşı bir cache-poisoning saldırısı kurabilir.
Mechanism¶
Invariant
SMRAM, ring -2'de çalışan SMI handler kodunu tutar. Chipset, SMM-dışı kodun
DRAM-destekli SMRAM aralığını okumasını ya da yazmasını engeller, ama CPU
cache'leri ayrı bir meseledir: bir SMRAM physical address ile tag'lenmiş bir
cache line, SMRAM cacheable (WB) bırakılırsa ring-0 kod tarafından
doldurulabilir. SMM Range Registers (SMRR) mimari çözümdür.
IA32_SMRR_PHYSBASE ve IA32_SMRR_PHYSMASK, CPU'nun SMM'de yürütülmediği her
durumda non-cacheable ve erişilemez olmaya zorladığı bir aralık tanımlar.
Hardware invariant'ı şudur: SMM dışında, SMRR aralığını hedefleyen herhangi
bir erişim — bir cache fill dahil — bloke edilir / abort olur. BIOS hiç
PHYSMASK.VALID = 1'i programlamazsa (ya da SMBASE'i gerçekten kapsamayan bir
base/mask programlarsa), o invariant kaybolur ve SMRAM'e karşı klasik
Wojtczuk–Rutkowska CPU cache poisoning saldırısı mümkün hâle gelir.
Walkthrough¶
CHIPSEC'in common.smrr modülü SMRR MSR'larını okur ve doğrular.
IA32_SMRR_PHYSBASE.PHYSBASE, IA32_SMRR_PHYSBASE.TYPE,
IA32_SMRR_PHYSMASK.PHYSMASK ve IA32_SMRR_PHYSMASK.VALID'i kontrol eder.
# chipsec_main -m common.smrr
[x][ =======================================================================
[x][ Module: CPU SMM Cache Poisoning / System Management Range Registers
[x][ =======================================================================
[*] SMRR range protection is supported
[*] IA32_SMRR_PHYSBASE = 0x000000007B000006 < SMRR PHYSBASE = 0x7B000000 TYPE = 6
[*] IA32_SMRR_PHYSMASK = 0x00000000FF800800 < SMRR PHYSMASK = 0xFF800000 VALID = 1
[+] PASSED: SMRR protection against cache attack is properly configured
Çıktıdaki TYPE = 6, standart MTRR/SMRR memory-type encoding'inde Write-Back
(WB) demektir; bu, CPU SMM içindeyken SMRAM'e erişmek için kullanılan cache
tipidir. SMRR TYPE alanı, aralığın SMM-dışı davranışını belirlemez: donanım,
SMM dışındayken bu aralığa yönelen her erişimi TYPE'tan bağımsız olarak
uncacheable/abort'a zorlar. Yani "korumalı davranış", TYPE değerinden değil,
VALID = 1 ile SMRR mekanizmasının etkinleştirilmesinden gelir.
Bir FAIL, VALID = 0 ya da TSEG/SMBASE bölgesini kuşatmayan bir base/mask gibi
görünür. Modül ayrıca canlı doğrulama için -a modify ile çalıştırılabilir: bu,
SMRR aralığındaki belleğe ring 0'dan yazma denemesini yapar ve bloke edilişini
doğrular.
Warning
Doğru kilitlenmiş bir SMRR gereklidir ama yeterli değildir. SMRAM ayrıca
kilitlenmeli (D_LCK, bkz. smram-not-locked.md) ve DMA'dan korunmalıdır
(smm_dma, bkz. toctou-smm-via-dma.md). SMRR özellikle
smram-cache-poisoning.md'de tanımlanan cache-poisoning vektörünü kapatır.
Detection¶
- Platform değerlendirmesi sırasında ayrıcalıklı bir OS bağlamından CHIPSEC
common.smrr'yi çalıştırın; FAIL, cache-poisoning vektörünün açık olduğu anlamına gelir. IA32_SMRR_PHYSBASE/PHYSMASK'i memory controller'ın raporladığı TSEG aralığıyla karşılaştırın; bir uyuşmazlık, register'ların SMBASE'i korumadığını gösterir.
Mitigation¶
- BIOS, SMRAM'i kilitlemeden önce her logical processor'da,
IA32_SMRR_PHYSBASE/PHYSMASK'i tam SMRAM/TSEG aralığını kapsayacak şekildeVALID = 1ile programlamalıdır.IA32_SMRR_PHYSBASE.TYPEtipik olarak Write-Back (WB,0x6) olarak ayarlanır (SMM içi erişim tipi); SMM-dışı erişimlere karşı non-cacheable/abort koruması TYPE alanından değil,VALID = 1ile etkinleştirilen SMRR donanımından gelir. D_LCK, SMM_BWP ve TSEG-tabanlı DMA protection ile birleştirin, böylece tek bir misconfiguration SMRAM'i yeniden açmasın.