Skip to content

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

  1. 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.
  2. O path'te PCD protocol'ünü resolve eder — kavramsal olarak gBS->LocateProtocol(&gEfiPcdProtocolGuid, NULL, &PcdProtocol) — ve ardından PcdProtocol->SetBool(...)'u çağırır.
  3. Hem gBS->LocateProtocol pointer'ı hem de elde edilen gEfiPcdProtocol->SetBool pointer'ı SMRAM dışında yaşar; dolayısıyla bir ring-0 attacker, bunlardan birini shellcode'un adresiyle overwrite eder, ardından SMI'yi tetikler.
  4. 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.smm ve common.smm_dma; tools.smm.smm_ptr fuzzer'ı, SMI handler'larını CommBuffer pointer-handling kusurları için çalıştırır. SMRAM'in kilitli olduğunu chipsec_main -m common.smm ile 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: EfiSmmReadyToLock sonrasında gBS, gRT ya da LocateProtocol'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ı.

References