Skip to content

TOCTOU SMM via DMA (DMA against the communication buffer)

SMM CommBuffer TOCTOU'sunun DMA-driven varyantı: DMA-capable bir cihaz, communication buffer'ı SMI handler doğruladıktan sonra ama kullanmadan önce DRAM'de yeniden yazar ve yarışı ikinci bir CPU thread'i olmadan kazanır.

Mechanism

Invariant

SMI handler'ın güvenliği, CommBuffer'ın time-of-check ile time-of-use arasında stabil olmasına bağlıdır. İkinci bir CPU thread'i bunu ihlal edebilir (toctou-race-against-smm-commbuffer.md), ama DMA da edebilir: CommBuffer sıradan DRAM'de yaşar ve bir bus-mastering cihaz DRAM'i asenkron olarak, SMI handler'ı çalıştıran CPU'dan bağımsız olarak yazar. "Doğrulanan byte'lar kullanılan byte'lara eşittir" invariant'ı, pencereye düşen bir cihaz DMA yazması tarafından kırılır. Kritik olarak, DMA boş bir logical core'a ihtiyaç duymaz ve handler'ın kendi serileştirmesine tabi değildir — SMI handler buffer'ı DMA-erişilebilir bellekte bırakıp validation'dan sonra yeniden okursa yarışı keyfi olarak kazanılabilir kılar. SMRR, SMRAM'i DMA'dan korur ama CommBuffer tasarım gereği SMRAM dışında oturur, bu yüzden DMA ile erişilebilir kalır.

Walkthrough

VU#434994, DMA timing varyantını açıkça belirtir: bir saldırgan "[buffer'ın] içeriğini keyfi veriyle üzerine yazmak için iyi zamanlanmış probing kullanabilir" ve yarış, early-boot/sleep/recovery aşamaları dahil "zayıf SMI handler'ları kullanarak OS'tan tetiklenebilir." Kavramsal yol (public, patch'li):

  1. Validation'dan sonra external CommBuffer'ı yeniden okuyan (bir double-fetch) zayıf bir SMI handler belirle.
  2. CommBuffer field'larını sürekli üzerine yazmak için DMA-capable bir cihazı (ya da Cr4sh'in software DMA çalışması tarzında chipset'in kendi DMA'sını, uefi-software-dma-attack-against-firmware-security.md) programla.
  3. SMI'ı tekrar tekrar tetikle; bazı iterasyonlarda DMA yazması check ile use arasına düşer, böylece SMM saldırganın seçtiği pointer/length'ler üzerinde işlem yapar.
  4. Sonuç: out-of-range SMM erişimi → SMRAM corruption / ring -2 execution.
# Conceptual: arm device DMA to spam the CommBuffer, then raise SW SMI in a loop
arm_dma_write(commbuffer_phys, malicious_fields);   // asynchronous, continuous
while (1) out(0xB2, subfn);                          // race the validated copy

Warning

Savunma/eğitsel amaçlı; tek güvenli yeniden üretim, public CERT notundan kavramsaldır. Savunma, CPU-thread durumunu genelleştirir.

Detection

  • CPU-thread TOCTOU ile aynı handler denetimi: external CommBuffer pointer'ının validation sonrası herhangi bir kullanımı DMA tarafından da sömürülebilir.
  • IOMMU/VT-d event log'larında firmware buffer'larına beklenmeyen cihaz yazmaları.

Mitigation

  • CommBuffer'ı SMRAM'e kopyalayın ve yalnızca local kopyayı kullanın (SMRR/TSEG konfigüre edilmişse DMA SMRAM'e ulaşamaz — bkz. smrr-misconfiguration.md).
  • İlgili DRAM aralıkları üzerinde IOMMU/VT-d DMA korumasını etkinleştirin ve kilitleyin.

References