Binarly SMM callout class (BRLY-2021-046 / CVE-2022-31640, BRLY-2021-047 / CVE-2022-31641)¶
Bir HP EliteBook SMI handler'ı, attacker'ın kontrol ettiği CommBuffer input'unu validate eder, ardından SMRAM dışında yer alan EFI_PCD_PROTOCOL->SetBool()'u çağırır; o pointer'ı (ya da gBS->LocateProtocol'u) overwrite etmek, ring -2'de arbitrary code execution sağlar.
Mechanism¶
Note
System Management Mode (SMM), en ayrıcalıklı x86 execution context'idir
("ring -2"). Kodu ve verisi, OS'ten kilitlenerek ayrılmış bir bölge olan
SMRAM'de yaşar; öyle ki ring-0 kernel kodu bile onu okuyamaz veya
değiştiremez. Giriş yalnızca bir System Management Interrupt (SMI) ile olur;
CPU state'i kaydeder, SMRAM'e geçer ve SMM dispatcher, SMI'yi kayıtlı bir
handler'a yönlendirir. İzolasyon garantisi tek bir kurala dayanır: SMM kodu,
yalnızca kilitli SMRAM içinde yaşayan veriye ve call target'larına güvenmelidir.
Bir SMM callout bu kuralı bozar. Pek çok handler, birleşik DXE/SMM driver'lar
olarak yazılmıştır ve boot-time pointer'ları tekrar kullanır — global gBS
(EFI Boot Services table) ya da gBS->LocateProtocol() ile elde edilen bir
protocol interface'i — ki bunlar SMRAM dışındaki sıradan DXE/runtime
memory'sinde bulunur. EfiSmmReadyToLock sonrasında, bu structure'lar artık
güvenilir değildir: bir ring-0 attacker, Boot Services table'daki ya da elde
edilen protocol'ün interface'indeki bir function pointer'ı overwrite edebilir,
ardından SMI'yi ateşleyebilir. Handler, artık attacker'ın kontrol ettiği
pointer üzerinden SMRAM içinde çalışırken itaatkârca call yapar; böylece
attacker'ın payload'u tam SMM ayrıcalığıyla çalışır.
Walkthrough¶
Binarly advisory'leri BRLY-2021-046 (CVE-2022-31640) ve BRLY-2021-047
(CVE-2022-31641)'den; HP cihazlarını (örn. HP EliteBook x360 1040 G8) etkiler.
BRLY-2021-047, farklı bir modülde bulunan aynı SMM callout kusurudur — bu
yüzden ikisi tek bir "class" olarak ele alınır. Advisory'den temsili handler
mantığı (offset 0x19C4; handler GUID b62bcc9c-6bcb-4707-b365-b8cd40cf0652):
- SWSMI handler'ı, OS'in sağladığı CommBuffer'ı alır ve bir selector kontrol
eder, örn.
CommBuffer'da non-null bir pointer ile*(CommBuffer + 16) == 0x01. - O path'te PCD protocol'ünü resolve eder — kavramsal olarak
gBS->LocateProtocol(&gEfiPcdProtocolGuid, NULL, &PcdProtocol)— ve ardındanPcdProtocol->SetBool(...)'u çağırır. - Hem
gBS->LocateProtocolpointer'ı hem de elde edilengEfiPcdProtocol->SetBoolpointer'ı SMRAM dışında yaşar; dolayısıyla bir ring-0 attacker, bunlardan birini shellcode'un adresiyle overwrite eder, ardından SMI'yi tetikler. - Handler, SMRAM içinde overwrite edilmiş pointer üzerinden call yapar → SMM'de arbitrary code execution.
Kavramsal trigger path'i (açıklayıcı, weaponize değil)
// ring 0, before issuing the SMI:
// 1. locate the in-DRAM EFI_PCD_PROTOCOL interface (outside SMRAM)
// 2. overwrite its SetBool field with &payload (payload also in DRAM)
// 3. prepare CommBuffer so the handler takes the SetBool() branch
// CommBuffer[16] = 0x01; *(void**)CommBuffer = non_null;
// 4. write the SW SMI command port to invoke the handler
// -> handler runs PcdProtocol->SetBool == &payload in SMRAM (ring -2)
Warning
Kök neden CWE-20 (improper input validation)'dur: handler, bir attacker'ın post-lock yer değiştirebileceği pointer'lara güvenir. Bu yalnızca yetkili research için kavramsal bir repro'dur — eksiksiz bir weaponize edilmiş chain değil.
Detection¶
- CHIPSEC:
chipsec_main -m common.smmvecommon.smm_dma;tools.smm.smm_ptrfuzzer'ı, SMI handler'larını CommBuffer pointer-handling kusurları için çalıştırır. SMRAM'in kilitli olduğunuchipsec_main -m common.smmile doğrulayın (SMRAMC D_LCK / SMM_BWP kontrolleri). - Binarly FwHunt, bu advisory ID'lerine bağlı YARA-style kurallar sunar; bunlar firmware image'lerindeki vulnerable callout pattern'iyle eşleşir.
- Statik inceleme:
EfiSmmReadyToLocksonrasındagBS,gRTya daLocateProtocol'den türetilmiş bir interface'i dereference eden herhangi bir SMI handler'ını işaretleyin.
Mitigation¶
- CVE-2022-31640 ve CVE-2022-31641'i remediate eden HP BIOS update'lerini uygulayın.
- Callout'ları ortadan kaldırın: SMI handler'ları gereken tüm services/protocol'leri lock'tan önce resolve etmeli ve onları SMRAM'e kopyalamalı, ve runtime'da asla non-SMRAM memory'deki pointer'lar üzerinden call yapmamalıdır.
- CommBuffer'daki her pointer'ın (ve onun eriştiği herhangi bir pointer'ın) input'lar için SMRAM dışındaki memory'yi hedeflediğini ve bounds-check edildiğini, EDK II SMM communication rehberine göre validate edin.
- Hardware backstop'ları etkinleştirin:
SMM_Code_Chk_En(Intel SMM code-execution kısıtlaması, böylece SMM, SMRAM dışında execute edemez) ve mevcutsa bir SMM supervisor / SMI deprivileging katmanı.