Skip to content

Binarly SMM callout in combined DXE/SMM, Fujitsu (BRLY-2021-019)

Fujitsu'nun bir SD-host SMI handler'ı, first-SMI initialization sırasında SMRAM içinden EFI_BOOT_SERVICES'i (LocateProtocol/FreePool) çağırıyor; bu Boot Services pointer'larını overwrite etmek ring -2'de arbitrary code execution veriyor.

Mechanism

Note

System Management Mode ring -2'de çalışır; kodu ve datası SMRAM içine mühürlenmiştir — bir kez lock'landıktan sonra ring-0 OS bunu ne okuyabilir ne de yazabilir. CPU sadece bir System Management Interrupt (SMI) geldiğinde SMM'e girer, state'i kaydeder ve kayıtlı bir handler'a dispatch eder. Bu isolation, ancak SMM kodu SMRAM dışında hiçbir şeye dokunmadığı sürece geçerlidir. Bir combined DXE/SMM driver, hem boot-time DXE phase'inde hem de bir SMI handler olarak çalışacak şekilde build edilir; dolayısıyla doğal olarak DXE-dönemi global'lerine referans verir: EFI_BOOT_SERVICES table'ı (gBS) ve onun döndürdüğü pointer'lar. Bu table'lar sıradan DRAM'de, SMRAM dışında yaşar. EfiSmmReadyToLock'tan sonra o bellek OS'a aittir, bu yüzden bir attacker Boot Services table'ı içindeki bir function pointer'ı overwrite edebilir. SMI handler daha sonra SMRAM içinden gBS->LocateProtocol() veya gBS->FreePool() çağırdığında, attacker-controlled pointer üzerinden atlar — payload'ı SMM privilege'inde çalıştırır. Bu klasik bir SMM callout'tur: privileged kodun, unprivileged bir aktörün kontrol ettiği bir hedefe doğru dışarıya çağrı yapması.

Walkthrough

Binarly advisory BRLY-2021-019'dan (CVE-2021-41840, CERT/CC VU#796611); Fujitsu LIFEBOOK E459/E449'u (Insyde-based) etkiliyor, driver SdHostDriver, vulnerable kod offset 0xB94'te, SMI handler GUID 3779ad93-b988-43bc-91f0-3b6c6e38fadb.

  1. Driver bir combined DXE/SMM module'dür; bir global (gPMTimerBlock) ilk SMI handler çağrısında lazy şekilde initialize edilir.
  2. O initialization path, in-DRAM EFI_BOOT_SERVICES table'ını kullanarak boot-services lookup'ları yapar — kavramsal olarak gBS->LocateProtocol(...) ve daha sonra bir gBS->FreePool(...).
  3. Table SMRAM dışında durduğu için, bir ring-0 attacker LocateProtocol() veya FreePool() entry'sini shellcode'un adresiyle overwrite eder, ardından SWSMI handler'ı tetikler.
  4. Handler SMRAM içinde overwrite edilmiş Boot Services pointer'ı üzerinden çağrı yapar → SMM'de arbitrary code execution.
Conceptual trigger path (illustrative, not weaponized)
// ring 0, before the SMI:
//   gBS (EFI_BOOT_SERVICES) lives in DRAM, outside SMRAM:
//   gBS->LocateProtocol = &payload;   // or gBS->FreePool = &payload
// then assert the SW SMI so SdHostDriver runs its first-SMI init path
// -> handler invokes gBS->LocateProtocol() == &payload  in SMRAM (ring -2)

Warning

CVSS v3.1 7.5 (High), vector AV:L/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:H. DXE-to-SMM escalation path'i, attacker'ın overwrite'ı SMI'dan önce hazırlamasını gerektirir; bu, authorized research için kavramsal bir repro'dur, turnkey bir exploit değil.

Detection

  • CHIPSEC: SMI handler'ları unsafe pointer kullanımı açısından fuzz etmek için chipsec_main -m common.smm ve tools.smm.smm_ptr; SMRAM lock'unu (D_LCK) ve SMM_Code_Chk_En'i doğrula.
  • Binarly FwHunt, bu advisory ID için callout pattern'ine match eden bir rule taşır; firmware image'larını / SPI dump'larını bununla tara.
  • Static review: lock'tan sonra bir SMI handler'dan gBS/gRT'yi dereference eden herhangi bir combined DXE/SMM driver bir callout şüphelisidir — özellikle lazy "first-SMI" init path'leri.

Mitigation

  • CVE-2021-41840'ı remediate eden Insyde/Fujitsu BIOS update'ini (2021-11-09 tarihli Insyde PSIRT fix) uygula.
  • Combined DXE/SMM driver'ları, SMM yarısının gBS/gRT'ye asla referans vermeyeceği şekilde refactor et: ihtiyaç duyulan servisleri EfiSmmReadyToLock'tan önce SMRAM-resident kopyalara yakala ve initialization'ı first SMI yerine registration time'da yap.
  • Hardware backstop'ları zorunlu kıl: SMM_Code_Chk_En (SMRAM dışında SMM execution'ı engelle), locked SMRAM (SMRR/SMRAMC D_LCK) ve mevcut olduğu yerde bir SMM supervisor / deprivileging katmanı.

References