SMM callout (calling outside SMRAM)¶
SMRAM'in dışında bulunan bir fonksiyonu çağıran ya da bir pointer'ı dereference eden bir SMI handler, ring-0 software'in o adrese önceden saldırgan kodu yerleştirmesine imkân verir; bu, ayrıcalıklı SMM çağrısını ele geçirir ve ring -2'ye yükseltir.
Mechanism¶
SMM'in OS'un yeniden yazabileceği belleğe güvenmesi
SMM kodu ve onun protocol/service'leri SMRAM'de yaşar; OS buraya dokunamaz.
Bir callout, en temel SMM bug sınıfıdır: bir SMI handler, işinin bir kısmını
yapmak için SMRAM'in dışında bulunan bir pointer ya da service'e uzanır —
klasik olarak UEFI runtime/boot services table'ı (gRT/gBS) ya da bir
GetVariable/SmmGetVariable çağrısı.
O target OS'un erişebildiği bellekte yaşadığı için, ring 0'a sahip bir saldırgan, SMI'yi tetiklemeden önce çağrılan fonksiyonu destekleyen physical page'leri overwrite eder. SMM (artık saldırgan kontrolündeki) pointer'ı dereference ettiğinde, saldırgan kodunu SMM ayrıcalığıyla çalıştırır. Bozulan invariant: "bir SMI handler'ın kullandığı her fonksiyon/pointer güvenilir SMRAM'de yaşar." Sonuç, OS'un ve Secure Boot'un altında bir ring 0 -> ring -2 yükselmesidir.
Kanonik bir örnek: GetVariable'ı çağırmak için gRT'yi dereference eden bir
SWSMI handler; bu çağrı SMRAM'in dışında bulunur (Binarly, Eclypsium ve Cr4sh
araştırmalarında belgelenmiştir). Çözüm, runtime-services kopyası yerine
SMM-resident EfiSmmVariableProtocol'ü (SmmGetVariable/SmmSetVariable)
kullanmaktır.
Walkthrough¶
Savunma amaçlı gösterim (kavramsal; silah hâline getirmeyin):
1. Reverse the SMM driver; find an SMI handler that calls through gRT/gBS or a
pointer table located outside SMRAM (e.g. gRT->GetVariable).
2. From ring 0, remap/overwrite the physical page holding that function or
table entry with a stub.
3. Trigger the SMI (e.g. write the handler's SW SMI value to I/O port 0xB2).
4. SMM dereferences the outside-SMRAM pointer and runs the attacker stub in SMM.
Savunmasız bir handler'da beklenen sonuç: SMM'de kod yürütme; düzeltilmiş bir handler'da tüm çağrılar SMRAM-resident SMM protocol'lerine çözülür.
Detection¶
gRT/gBS'yi ya da SMRAM-dışı adresleri referans alan SMI handler'ları işaretleyen statik analiz (CHIPSEC, efiXplorer).- SMRAM integrity measurement / firmware attestation.
Mitigation¶
- SMI handler'ları içindeki runtime/boot-service çağrılarını SMM-resident
protocol'lerle (
EfiSmmVariableProtocol) değiştirin; satıcı firmware güncellemelerini uygulayın. - SMRAM ve SMRR'yi kilitleyin, böylece bir ele geçirme bile kolayca kalıcı olamasın (bkz. SMRAM not locked, SMRR misconfiguration).
- İlgili: SMM callout class (Binarly), RingHopper SMM arbitrary code execution.