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.
- Driver bir combined DXE/SMM module'dür; bir global (
gPMTimerBlock) ilk SMI handler çağrısında lazy şekilde initialize edilir. - O initialization path, in-DRAM
EFI_BOOT_SERVICEStable'ını kullanarak boot-services lookup'ları yapar — kavramsal olarakgBS->LocateProtocol(...)ve daha sonra birgBS->FreePool(...). - Table SMRAM dışında durduğu için, bir ring-0 attacker
LocateProtocol()veyaFreePool()entry'sini shellcode'un adresiyle overwrite eder, ardından SWSMI handler'ı tetikler. - Handler SMRAM içinde overwrite edilmiş Boot Services pointer'ı üzerinden çağrı yapar → SMM'de arbitrary code execution.
Conceptual trigger path (illustrative, not weaponized)
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.smmvetools.smm.smm_ptr; SMRAM lock'unu (D_LCK) veSMM_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 servisleriEfiSmmReadyToLock'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ı.