Skip to content

InsydeH2O SMM memory corruption cluster (CVE-2021-45969/45970/45971)

Binarly'nin InsydeH2O UEFI'deki "23 vulnerabilities" açıklaması (CERT VU#796611): CommBuffer pointer'larını/length'lerini doğrulamayan — SdHostDriver, IdeBusDxe, AhciBusDxe dahil — bir SMM SWSMI handler cluster'ı; SMRAM'in içine out-of-bounds write'lar ve ring -2 compromise üretiyor.

Mechanism

Note

Bu cluster genelinde paylaşılan invariant, her SMM communication path'ini koruyan invariant'ın aynısıdır: SMRAM içinde çalışan bir SMI handler'ı, CommBuffer'dan gelen caller'ın sağladığı her pointer ve length'i, onlar üzerinden read ya da write yapmadan önce doğrulamalıdır. Bir handler, ham bir pointer ya da size field'ına (CommBufferData) target'ın SMRAM dışında ve bounds içinde olduğunu doğrulamadan güvendiğinde, CommBuffer'ı kontrol eden bir attacker güvenilen handler'ı bir confused deputy'ye çevirir: handler, SMRAM'in içine düşebilen bir out-of-bounds write gerçekleştirir ve SMM code'unu ya da data'sını corrupt eder. Handler ring -2'de çalıştığı için, başarılı bir corruption ring 0'dan tam platform kontrolüne yükselir ve OS reinstall'dan sağ çıkar. Binarly 23 sorunu ~10 SMM privilege escalation, ~12 SMM memory corruption ve 1 DXE memory corruption olarak grupladı; bu sayfa, CVSS ile işaretlenmiş üç SMM/storage-driver corruption'ını sınıfın temsilcileri olarak ele alır.

Walkthrough

CERT/CC VU#796611'e ve Insyde'ın advisory'lerine göre öne çıkan üç CVE, storage ile ilgili driver'lardaki SMM SWSMI handler'larıdır:

  • CVE-2021-45971SdHostDriver (Binarly BRLY-2021-012). NVD: "a SWSMI handler that does not sufficiently check or validate the allocated buffer pointer (CommBufferData)." CVSS 8.2, CWE-787 Out-of-bounds Write.
  • CVE-2021-45970IdeBusDxe (BRLY-2021-015).
  • CVE-2021-45969AhciBusDxe (BRLY-2021-016).

Temsili kavramsal yol (cluster tarafından paylaşılır):

  1. Bir storage SMM driver'ı, OS'ten SMM communication protocol üzerinden ulaşılabilen bir SWSMI handler'ı register eder.
  2. Handler, CommBuffer'dan (CommBufferData) bir pointer/length field okur ve onu range/bounds'u doğrulamadan bir write destination olarak kullanır.
  3. Ring-0'daki bir attacker, SMRAM range'ine çözümlenen bir pointer/size yerleştirir.
  4. SW SMI'yı tetiklemek, handler'ı SMRAM içinde bir out-of-bounds write'a sürükler → SMRAM corruption → potansiyel ring -2 code execution.
Kontrol edilmemiş CommBufferData pattern'i (örnekleme amaçlı, silahlandırılmamış)
// conceptual shape shared across the cluster:
UINT64 ptr = *(UINT64 *)(CommBuffer + OFF);   // CommBufferData, attacker-set
CopyMem((VOID *)ptr, src, len);                // OOB write, no SMRAM range check
// required: SmmIsBufferOutsideSmmValid(ptr, len) before the copy

Warning

VU#796611'e göre etkilenen vendor'lar arasında Insyde ve downstream OEM'ler (Fujitsu, Atos/Bull, Aruba; açıklama anında birçoğu için status "unknown") bulunuyor. Bu üçü için CVSS 9.8 aktaran basın haberleri tek bir scoring kaynağına atıfta bulunuyor; NVD ise SMM olanları daha düşük puanlıyor (örn. CVE-2021-45971 = 8.2). Diğer iki cluster üyesi ayrı olarak belgelenmiştir: insyde-int15servicesmm-smm-callout.md (CVE-2021-42060) ve insyde-swsmi-commbuffer-pointer-not-validated.md (CVE-2021-33626).

Detection

  • CHIPSEC: chipsec_main -m common.smm ve tools.smm.smm_ptr SMI fuzzer'ıyla CommBuffer pointer/length field'larını fuzz edip attacker'ın sağladığı adreslere write yapan handler'ları yakala; SMRAM lock'unu ve SMM_Code_Chk_En'i doğrula.
  • Binarly FwHunt: SPI flash dump'larını BRLY-2021-012/-015/-016 rule set'iyle tara (SdHostDriver / IdeBusDxe / AhciBusDxe).
  • Static review: register edilmiş tüm SWSMI handler'larını listele ve her birinin dereference'tan önce CommBuffer pointer'larını ve length'lerini doğruladığını teyit et.

Mitigation

  • InsydeH2O update'lerini uygula: Kernel 5.1 → 05.16.25, 5.2 → 05.26.25, 5.3 → 05.35.25, 5.4 → 05.43.25, 5.5 → 05.51.25 (üç CVE için, Insyde'a göre), platform/OEM vendor üzerinden; mümkün olan yerlerde LVFS/fwupd kullan.
  • CommBuffer'dan türetilen her pointer ve length'i, herhangi bir read/write'tan önce SmmIsBufferOutsideSmmValid() (veya eşdeğeri) ile doğrula.
  • Hardware backstop'lar: locked SMRAM (SMRR / D_LCK), SMM_Code_Chk_En ve desteklenen yerlerde SMM supervisor / deprivileging.

References