Skip to content

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).

References