RingHopper SMM arbitrary code execution (CVE-2021-33625)¶
EFI_SMM_COMMUNICATION_PROTOCOL.Communicate()üzerinden bir communication buffer alan SMI handler'ları, bunu yeniden validate etmezse (veya bir kez validate edip sonra DMA ile race ederse), admin seviyesindeki bir attacker'ın SMRAM'e yazmasına ve SMM (ring -2) içinde code execute etmesine izin verir.
Mechanism¶
SMM trust boundary'sinde validate-once, use-later
SMM, x86'nın en privileged mode'udur (ring -2); kodu/verisi SMRAM içinde
yaşar ve OS bunu okuyup yazamaz. SMI handler'ları parametrelerini, tamamen
SMRAM dışında bulunması gereken paylaşılan bir communication buffer
üzerinden alır — kanonik check SmmIsBufferOutsideSmmValid()'dir.
RingHopper sınıfı bug'lar, Communicate() üzerinden ulaşılan bir handler
şu durumlarda ortaya çıkar:
- buffer'ın (ya da içindeki bir nested pointer'ın) SMRAM dışında olup olmadığını hiç check etmez, böylece OS bir SMRAM/MMIO/kernel adresi verebilir ve handler'a oraya sabit/öngörülebilir veri yazdırabilir; ya da
- buffer'ı bir kez check eder, sonra attacker check ile use arasında içeriğini DMA ile flip'ler (bir TOCTOU race), validation'ı bypass eder.
Her iki durumda da "SMI handler'ları yalnızca SMRAM dışındaki, attacker-readable bellek üzerinde çalışır" invariant'ı kırılır; bu da bir SMRAM write primitive'i ve oradan SMM içinde — OS'in ve Secure Boot'un altında — code execution sağlar.
Insyde firmware'inde bulundu (ör. HddPassword SMM driver'ı) ve birden çok
vendor'da (Intel, AMI, Dell, Fujitsu, HPE) doğrulandı. CVE-2021-33625.
Walkthrough¶
Public CERT/CC ve Insyde advisory'lerinden defensive olarak belgelenmiştir; weaponized bir chain verilmemektedir.
Conceptual path (per the public advisory):
1. Attacker has OS admin / ring 0 (the assumed SMM threat model).
2. Build a comm buffer and call EFI_SMM_COMMUNICATION_PROTOCOL.Communicate()
targeting the vulnerable SMI handler.
3a. Missing-check variant: supply a nested pointer that overlaps SMRAM; the
handler writes attacker-influenced data into SMRAM.
3b. TOCTOU variant: pass validation, then use a DMA-capable device to overwrite
the buffer after SmmIsBufferOutsideSmmValid() but before the handler reads
it, smuggling an SMRAM-overlapping pointer past the check.
4. The resulting SMRAM write is leveraged to execute code in SMM.
Vulnerable bir platformda beklenen sonuç: SMRAM'e controlled write ve SMM code execution; patch'lenmiş bir platformda handler buffer'ı reject eder.
Detection¶
- Korunmasız SMI handler'ları için firmware-attestation / CHIPSEC scan'leri; SMRAM integrity measurement.
- IOMMU (VT-d) DMA-remapping log'ları / fault'ları, SMI sırasında comm buffer bölgesine yönlendirilmiş DMA'yı açığa çıkarabilir.
Mitigation¶
- Vendor firmware update'lerini uygulayın; handler'lar buffer ve her nested
pointer için
SmmIsBufferOutsideSmmValid()çağırmalı ve input'ları kullanmadan önce SMRAM'e kopyalamalı (DMA TOCTOU'yu bypass ederek). - DMA'yı communication buffer'a karşı kısıtlamak için IOMMU/VT-d'yi etkinleştirin (bkz. TOCTOU SMM via DMA).
- SMRAM ve SMRR'yi lock'layın (bkz. SMRAM not locked, SMRR misconfiguration).