Skip to content

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 şekilde VALID = 1 ile programlamalıdır. IA32_SMRR_PHYSBASE.TYPE tipik 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 = 1 ile 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.

References