Skip to content

Linux KVM nested SVM int_ctl AVIC bypass (CVE-2021-3653)

KVM'in nested-SVM kodu, L1-supplied int_ctl VMCB 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:

  1. Nested SVM ve AVIC desteği mevcut bir AMD host'unda, guest L1 olarak davranır.
  2. L1 bir L2 VMCB hazırlar ve AVIC backing/address field'ları attacker-seçimli page'leri gösterirken int_ctl'deki AVIC-enable bit'ini set eder.
  3. L1 VMRUN issue eder; fix öncesi KVM, desteklenmeyen int_ctl bit'lerini L2 için çalıştırdığı VMCB'ye kopyalar.
  4. 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_ctl AVIC 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_ctl bit'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