Skip to content

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:

  1. Bir MTRR'yi yeniden programlayarak SMRAM/SMBASE physical aralığını uncacheable yerine write-back (cacheable) yap.
  2. 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").
  3. 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).

References