Linux KVM nested SVM int_ctl AVIC bypass (CVE-2021-3653)¶
KVM'in nested-SVM kodu, L1-supplied
int_ctlVMCB field'ını sanitize etmekte başarısız olur ve malicious bir L1'in L2 için AVIC'i enable etmesine ve host-physical write erişimi elde etmesine izin verir.
Mechanism¶
Note
AMD SVM'de, bir guest hypervisor (L1), bir L2 VMCB'ye karşı VMRUN ile L2'yi
başlatır. KVM (L0), L1'in control state'ini çalıştırdığı gerçek VMCB'ye merge eder.
AVIC (Advanced Virtual Interrupt Controller), hardware'in doğrudan yazdığı
guest-supplied fiziksel adresleri (örneğin bir backing/APIC page) kullanır.
Kırılan invariant: L2 control area'sını kopyalarken, KVM L1'in sağladığı int_ctl
field'ından AVIC ile ilgili bit'leri körlemesine inherit etmemelidir, çünkü AVIC
nesting ile birlikte desteklenmez ve o adres field'ları nested context için
validate/translate edilmez. Fix şöyle özetlenir: "int_ctl'de L2'den desteklenmeyen
bit'leri almaktan kaçın."
int_ctl'deki AVIC-enable bit'ini set ederek, malicious bir L1, kendi
(guest-controlled) backing adreslerini sağlarken L2 için AVIC'i açar. Hardware o
zaman guest tarafından seçilmiş host fiziksel memory'sine yazma işlemleri yapar
— host RAM'in büyük bir alt kümesi — host memory corruption'ı, data leak, host crash
ya da bir guest-to-host escape'i sağlar. Geçilen privilege boundary L2/L1 guest →
L0 host'tur.
Walkthrough¶
Public, patch'li materyal: Maxim Levitsky (Red Hat) tarafından oss-security disclosure'ı,
Red Hat Bugzilla 1983686, upstream fix commit
0f923e07124df069ba68d8bb12324398f4b6b709 (5.14-rc7'den önce düzeltildi; ilgili davranış
AVIC'in tanıtımına kadar gider). Kavramsal reprodüksiyon yolu:
- Nested SVM ve AVIC desteği mevcut bir AMD host'unda, guest L1 olarak davranır.
- L1 bir L2
VMCBhazırlar ve AVIC backing/address field'ları attacker-seçimli page'leri gösterirkenint_ctl'deki AVIC-enable bit'ini set eder. - L1
VMRUNissue eder; fix öncesi KVM, desteklenmeyenint_ctlbit'lerini L2 için çalıştırdığı VMCB'ye kopyalar. - Nesting altında AVIC aktifken, hardware guest'in kontrol ettiği host-physical page'lere yazma işlemleri yapar.
Warning
Yalnızca kavramsal. Struct offset'leri, adres layout'ları ya da silahlandırılmış sequence verilmiyor.
Detection¶
- Nested-SVM VMCB merge kodunu, L1'in sağladığı control area'dan
int_ctlAVIC bit'lerinin filtrelenmemiş propagation'ı için audit et. - AMD host'larında, nested guest'ler için AVIC'in beklenmedik enable edilmesi, ya da AVIC backing page'lerinin host-physical region'lara çözülmesi anormaldir.
- Kernel sürümünü CVE-2021-3653 fix'ine karşı doğrula; nested AMD guest'leriyle ilintili host memory corruption'ı / crash'leri için dikkatli ol.
Mitigation¶
- Upstream fix'i uygula (nested VMCB'yi kurarken desteklenmeyen
int_ctlbit'lerini mask'le), patch'li 5.x kernel'lerinde ve vendor backport'larında mevcut. - Gerekmediği yerde nested virtualization'ı devre dışı bırak:
modprobe kvm_amd nested=0. - Tüm L1-supplied VMCB control field'larını untrusted olarak ele al; nesting altında desteklenmeyen feature'ları kullanmadan önce validate/clear et.
References¶
- oss-security — "[CVE-2021-3653, CVE-2021-3656] SVM nested virtualization issues in KVM" (Maxim Levitsky). https://www.openwall.com/lists/oss-security/2021/08/16/1
- Red Hat Bugzilla 1983686 — CVE-2021-3653 (AVIC support). https://bugzilla.redhat.com/show_bug.cgi?id=1983686
- Ubuntu Security — CVE-2021-3653. https://ubuntu.com/security/CVE-2021-3653