Insyde InsydeH2O SMM/DXE memory corruption (CVE-2020-27339, AMI UsbRt-class defect)¶
Birleşik bir DXE/SMM driver'ı SMM communication buffer'ını (CommBuffer / CommBufferSize) validate etmeyi atlar; bu da privileged bir OS caller'ının ring-0 -> SMM (ring -2) sınırını aşarak firmware veya OS memory'sini corrupt etmesine izin verir.
Mechanism¶
Note
System Management Mode (SMM), x86'daki en privileged execution context'tir
("ring -2"): locked SMRAM içinden çalışır, bir System
Management Interrupt (SMI) ile girilir ve OS ile hypervisor'a görünmezdir.
Firmware, OS'un privileged servisler talep edebilmesi için SMI handler'lar expose eder;
OS argümanları, tasarım gereği SMRAM dışındaki normal
(OS-controlled) memory'de yaşayan, CommBufferSize uzunluğundaki paylaşılan bir
SMM communication buffer (CommBuffer) üzerinden geçirir.
Bir SMI handler'ın korumak ZORUNDA olduğu security invariant şudur: CommBuffer'dan
gelen pointer'lara, size'lara veya embedded struct'lara asla güvenme.
Spesifik olarak, CommBuffer/CommBufferSize'ın (ve içlerine nested edilmiş herhangi bir
pointer'ın) onlar üzerinden read ya da write yapmadan önce SMRAM ile overlap etmediğini
confirm etmesi gerekir. Bir handler attacker-supplied bir
pointer'ı dereference ederse ya da bu check olmadan attacker-chosen bir length'i copy ederse, bir ring-0
attacker SMM kodunu arbitrary memory'yi — SMRAM'in kendisi dahil — read veya write yaptırabilir.
Bu klasik bir SMM confused-deputy / memory-corruption
primitive'idir ve arbitrary SMM code execution'a, SPI-flash write'larına
ve OS'un altında firmware persistence'a giden yoldur.
CVE-2020-27339 tam olarak bu bug class'ıdır. Attribution notu: bu note uzun süredir devam eden "AMI UsbRt" SMM attack-surface soyağacı altında dosyalanmış olsa da (Binarly ve diğerlerinin defalarca defective bulduğu Aptio USB runtime SMM driver ailesi), CVE-2020-27339 için otoriter NVD/CVE kaydı spesifik olarak Insyde InsydeH2O 5.x SMM driver'larını anlatır; bu driver'lar "CommBuffer ve CommBufferSize parametrelerini doğru validate etmiyor, caller'ların ya firmware'i ya da OS memory'sini corrupt etmesine izin veriyordu." Mekanizma — unvalidated bir CommBuffer'a güvenen bir SMM handler'ı — vendor ne olursa olsun aynı defect class'ıdır.
Walkthrough¶
Bu zafiyete OS kernel privilege'inden (ring 0) erişilir. Kavramsal olarak:
[ring-0 attacker (OS kernel)]
prepare CommBuffer: embed pointer / size pointing into SMRAM or arbitrary memory
trigger SMI (software SMI, e.g. write to APMC port 0xB2)
|
v
[vulnerable SMM driver's SMI handler]
reads CommBuffer/CommBufferSize WITHOUT checking SMRAM overlap
read/write through attacker-controlled pointer
|
v
[SMRAM / firmware / OS memory corruption -> arbitrary SMM code execution]
NVD kaydına göre, CVE-2020-27339 için adı geçen InsydeH2O 5.x driver'ları
storage-stack SMM/DXE driver'larıdır: AhciBusDxe, IdeBusDxe, NvmExpressDxe,
SdHostDriverDxe ve SdMmcDeviceDxe. Atanan weakness CWE-20
(Improper Input Validation); NVD CVSS v3.1 base 6.7
(AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H) kaydeder.
'Medium' severity'de bile neden önemli
CVSS'in local/high-privilege gereksinimi impact'i olduğundan az gösterir: zaten ring-0 (kernel) code execution'ı olan bir attacker bunu SMM'e girmek için kullanabilir, ki SMM OS trust boundary'sinin altında durur. SMM'den bir attacker SPI-flash write protection'larını disable edebilir ve OS reinstall'larını atlatan, OS-level savunmalardan kaçan persistent firmware implant'ları kurabilir — SMM CommBuffer-validation bug'larının firmware security'de ciddiye alınmasının temel nedeni budur.
Warning
Daha geniş "AMI UsbRt" soyağacı (INTEL-SA-00057 / "Aptiocalypsis", ilk olarak 2016'da raporlandı) bu class'ın ne kadar kalıcı olduğunu gösterir: eşdeğer SMM pointer/CommBuffer-validation defect'leri vendor'lar ve product generation'ları boyunca tekrar tekrar ortaya çıkıyor. Tek bir patch'in tüm yüzeyi kapattığını varsayma.
Detection¶
Firmware analiz araçları (örn. CHIPSEC'in SMM/CommBuffer check'leri, Binarly'nin scanner'ları) CommBuffer pointer'larını SMRAM-overlap validation'ı olmadan dereference eden SMI handler'larını flag edebilir. Runtime'da, crafted port-0xB2 write'larıyla korele beklenmeyen SMI aktivitesi olası bir indicator'dur, gerçi SMM büyük ölçüde OS'a opak'tır.
Mitigation¶
Vendor firmware/BIOS update'ini uygula (CVE-2020-27339 için Insyde'ın
SA-2021001'i; AMI Aptio-lineage sorunları için ilgili AMI/CERT-CC
advisory'leri). Yapısal düzeltme, her SMI handler'ın herhangi bir access'ten önce
CommBuffer/CommBufferSize'ın ve tüm nested pointer'ların tamamen SMRAM dışında
(ve beklenen OS memory'si içinde) olduğunu validate etmesidir — tam olarak
vulnerable handler'ların atladığı check.