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):
- Validation'dan sonra external CommBuffer'ı yeniden okuyan (bir double-fetch) zayıf bir SMI handler belirle.
- 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. - 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.
- 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.