SMRAM cache-poisoning (MTRR write-back attack)¶
MTRR'leri yeniden programlayarak SMRAM aralığını write-back cacheable olarak işaretleyen bir saldırgan, CPU cache'ini SMBASE adreslerinde seçilen byte'larla doldurur; sonraki SMI gerçek SMRAM yerine cache'lenen (zehirlenmiş) line'ları çalıştırır — SMM'de kod yürütme.
Mechanism¶
Cache, chipset'in SMRAM korumasına uymaz
SMRAM normalde uncacheable olarak işaretlenir ve chipset o physical
adreslere SMM-dışı erişimi engeller. Ancak bir physical aralığın caching
davranışı, SMRR öncesinde ring 0 tarafından serbestçe yazılabilen (Linux'ta
/proc/mtrr üzerinden kolayca) CPU'nun Memory Type Range Register'ları (MTRR)
tarafından yönetilir. Wojtczuk & Rutkowska (2009), cache'in SMRAM erişim
kısıtlamasını uygulamadığını gözlemledi:
- Bir MTRR'yi yeniden programlayarak SMRAM/SMBASE physical aralığını uncacheable yerine write-back (cacheable) yap.
- O adreslere saldırgan byte'ları (örn. SMI-handler shellcode) yaz. Chipset gerçek SMRAM DRAM'e yapılan yazmaları atar, ama cache line'lar saldırgan verisiyle doldurulur ("zehirlenir").
- Bir SMI tetikle. CPU SMM'e girer ve handler'ı SMBASE'den fetch eder — ve zehirlenmiş line'lar üzerinde bir cache hit alır, gerçek handler yerine SMM'de saldırgan kodunu çalıştırır.
Bozulan invariant: "CPU'nun SMM'de çalıştırdığı byte'ları yalnızca SMM sağlayabilir." Ring 0'dan MTRR'ler aracılığıyla kontrol edilen cache state, SMM komutlarının gerçek kaynağı hâline gelir. İki PoC gösterildi: SMRAM dump'ı ve SMM'de kod yürütme.
Bu not, yukarıda anlatılan MTRR write-back reprogramlama varyantını belgeler. Aynı araştırma hattındaki CR0.CD (cache-disable / no-fill mode) varyantı kardeş bir tekniktir; ikisi de SMRAM caching invariant'ını ihlal eder ama farklı mekanizmalar kullanır.
Walkthrough¶
Kavramsal, savunma amaçlı (orijinal PoC'lar board'a özgüdür):
1. From ring 0, set an MTRR covering the SMRAM range to write-back (WB).
(Historically: write /proc/mtrr on Linux as root.)
2. Write the desired SMM payload bytes to SMBASE-relative addresses; this
fills/poisons the cache lines (actual SMRAM DRAM writes are dropped).
3. Generate an SMI (e.g. I/O port 0xB2) before the lines are evicted.
4. SMM entry hits the poisoned cache -> attacker code runs in SMM (ring -2).
Savunmasız (SMRR öncesi) bir platformda beklenen sonuç: SMRAM dump'ı ya da SMM kod yürütme. SMRR-korumalı CPU'larda saldırı başarısız olur (aşağıda).
Detection¶
- O dönem OS'tan büyük ölçüde tespit edilemezdi; modern göstergeler SMRAM'i kapsayan beklenmedik MTRR değişiklikleri ve SMRAM integrity-measurement uyuşmazlıklarıdır.
Mitigation¶
- SMRR (System Management Range Registers): doğrudan çözüm olarak tanıtıldı —
SMM aralığının cacheability/type'ını sabitler, böylece SMM dışında cacheable
yapılamaz, ve erişimi SMM'e kısıtlar. CHIPSEC'in
common.smrr'siyle doğrulayın (bkz. SMRR misconfiguration). - Tamamlayıcı bir kontrol olarak SMRAM'i kilitleyin (D_LCK) (bkz. SMRAM not locked).