Insyde Int15ServiceSmm SMM callout (CVE-2021-42060)¶
InsydeH2O'daki bir Int15ServiceSmm SW SMI handler'ı, attacker'ın etkileyebildiği bir pointer üzerinden SMRAM dışına çağrı yapıyor; bu da ring-0'daki bir aktörün execution flow'u ele geçirip ring 0'dan ring -2'ye (SMM) yükselmesine imkân veriyor.
Mechanism¶
Note
SMM, x86'nın "ring -2"sidir: code'u ve data'sı, ring-0 OS'ten kilitlenmiş bir
bölge olan SMRAM'de yaşar ve buraya yalnızca bir System Management Interrupt
(SMI) CPU'yu o protected mode'a geçirip dispatcher kayıtlı bir handler'a route
ettiğinde girilir. Isolation invariant'ı basittir: SMRAM içindeki code sadece
SMRAM içindeki target'ları çağırmalıdır. Bir "callout" bu invariant'ı kırar —
tam SMM privilege'iyle çalışan bir SMI handler'ı, normal DRAM'de SMRAM
dışında yaşayan bir pointer üzerinden bir fonksiyon çağırır (örn. bir
EFI_BOOT_SERVICES/gBS entry'si, locate edilmiş bir protocol interface'i ya
da bir real-mode INT 15h legacy service vector'ü). EfiSmmReadyToLock'tan sonra
o DRAM OS'e aittir, dolayısıyla ring-0 veya DXE-phase'deki bir attacker target'ı
overwrite edebilir. Bir sonraki SMI, güvenilen handler'ın zehirlenmiş pointer
üzerinden SMRAM içinde çağrı yapmasını sağlar ve attacker code'u ring -2'de
çalışır. Int15ServiceSmm driver'ı tam da bu tür bir dışa çağrı yapan bir
software SMI handler'ı register eder; dolayısıyla call target'ın kontrolü SMM
code execution'a dönüşür.
Walkthrough¶
Insyde advisory'sine (SA-2022007) ve CVE-2021-42060 için NVD'ye göre etkilenen bileşen, InsydeH2O'daki Int15ServiceSmm driver'ıdır ve Binarly efiXplorer ekibine atfedilmiştir. NVD metni bunu "an Int15ServiceSmm SMM callout vulnerability [that] allows an attacker to hijack execution flow of code running in System Management Mode." diye tanımlar.
Int15ServiceSmm, ilgili SW SMI tetiklendiğinde SMRAM içinde çalışan bir software SMI handler'ı (INT 15h tarzı bir legacy service path) register eder.- Handler içinde execution, DRAM'de SMRAM dışında bulunan bir pointer/service üzerinden dışarı akar — klasik callout pattern'i (bkz. smm-callout.md).
- Ring 0'da (ya da DXE phase sırasında) çalışan bir attacker, o dışa çağrı target'ını DRAM'deki shellcode'un adresiyle overwrite eder.
- SW SMI'yı tetiklemek, handler'ın zehirlenmiş target üzerinden SMRAM içinde dispatch etmesini sağlar ve ring 0 → ring -2 yükselmesi olur.
Kavramsal tetikleme yolu (örnekleme amaçlı, silahlandırılmamış)
# representative, from public advisory class — NOT a working chain
# 1. stage payload + overwrite the outward call target (DRAM, outside SMRAM)
# 2. raise the Int15ServiceSmm software SMI (write the trigger value to the SW SMI port)
# 3. handler calls through the attacker-controlled target -> code runs in SMM
Warning
Skorlar kaynaklar arasında farklılaşıyor: Insyde advisory'si CVSS 3.1 7.5
(AV:L/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:H) listeliyor; NVD ise 8.2
(AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) veriyor. Kesin SW SMI numarası ve code
offset'i birincil advisory'de yayımlanmamış; bu sayfa onları kavramsal
tutuyor. Bu, Insyde'ın "23 vulnerabilities" açıklamasının bir parçası
(bkz. insydeh2o-smm-memory-corruption-cluster.md).
Detection¶
- CHIPSEC:
chipsec_main -m common.smmvetools.smm.smm_ptrSMI fuzzer'ını çalıştırıp güvensiz/relocatable pointer'ları dereference eden SMI handler'larını ortaya çıkar; SMRAM'in locked olduğunu veSMM_Code_Chk_En'in set edildiğini doğrula. - Binarly FwHunt: SPI flash dump'larını efiXplorer/Binarly rule set'iyle
tarayıp
Int15ServiceSmmcallout pattern'ini ara. - Static review: lock'tan sonra SMRAM'de bulunduğu kanıtlanmamış bir pointer veya service üzerinden çağrı yapan SMI handler'larını (özellikle legacy INT 15h / dispatch handler'larını) işaretle.
Mitigation¶
- InsydeH2O firmware update'lerini uygula: Kernel 5.0 → 05.08.49, 5.1 → 05.16.49, 5.2 → 05.23.22, 5.3 → 05.32.22 (SA-2022007'ye göre 5.4/5.5 etkilenmemiş). Build'i platform/OEM vendor'ından temin et.
- Callout'u kaldır: gereken her service/protocol'ü
EfiSmmReadyToLock'tan önce SMRAM-resident bir storage'a kopyala; bir SMI handler'ından asla bir DRAM pointer'ı üzerinden dispatch etme. - Hardware backstop'lar:
SMM_Code_Chk_En(SMRAM dışında SMM execution'ı reddet), locked SMRAM (SMRR / D_LCK) ve desteklenen yerlerde bir SMM supervisor / deprivileging katmanı.