Skip to content

Linux KVM nested x2APIC MSR access flaw (CVE-2019-3887)

CVE-2019-3887: L2 MSR bitmap'ini kurarken, nested KVM x2APIC MSR intercept'lerini VMCS12'nin "virtualize x2APIC mode" control'üne gate etmeyi başaramaz ve bir L2 guest'in L0 host'un APIC MSR'larını read/write etmesine izin verir.

Mechanism

Bug class: nested MSR-bitmap merge'ünde eksik intercept gate'i

Risk altındaki boundary L1/L2 guest -> L0 host'tur. Intel VMX'te, KVM bir guest'in belirli APIC MSR'larına, bunların bit'lerini MSR bitmap'inde temizleyerek bir VM-exit olmadan dokunmasına izin verir. Nested guest'ler için, KVM VMCS02'nin effective bitmap'ini üretmek üzere VMCS01'in bitmap'ini VMCS12'ninkiyle nested_vmx_prepare_msr_bitmap()'te merge eder.

Kırılan invariant: x2APIC MSR pass-through yalnızca o seviye için "virtualize x2APIC mode" gerçekten aktif olduğunda enable edilmelidir. Kusurlu merge, VMCS12 "virtualize x2APIC mode" control'ünü yeniden kontrol etmeden x2APIC MSR intercept'lerini disable ediyordu. Bir L1 hypervisor bu yüzden — örneğin "virtualize x2APIC mode" kapalıyken "APIC-register virtualization"ı enable ederek — L2'nin x2APIC MSR erişimlerinin intercept ya da redirect edilmek yerine L0'ın APIC page'ine karşı servis edildiği bir state kurabiliyordu. Bkz. nested-virtualization ve l2-to-l1-escape.

Pratik etki, host APIC register değerlerinin information leak'i / bunlara müdahaledir ve potansiyel olarak bir host-kernel crash'i (DoS).

Walkthrough

Public LKML patch'inden ve Red Hat advisory'sinden çıkarılan yüksek seviyeli reprodüksiyon şekli (nested virtualization enable olmalı, kvm_intel nested=1):

  1. Bir L1 guest hypervisor, VMCS12'yi "APIC-register virtualization" enable ama "virtualize x2APIC mode" değil olacak şekilde kurar.
  2. KVM bitmap'leri merge eder; x2APIC MSR intercept'leri x2APIC-mode control'ü tarafından guard edilmediğinden, VMCS02 o MSR erişimleri un-intercepted halde kalır.
  3. L2, x2APIC MSR aralığına karşı RDMSR/WRMSR issue eder; erişimler trap edilmek yerine L0'ın virtual-APIC state'ine düşer.
  4. L1/L2 böylece host APIC register'larını gözlemler ya da pertürbe eder ve nested isolation boundary'sini geçer.

Fix, bitmap merge sırasında VMCS02'nin x2APIC MSR intercept'lerini VMCS12'nin "virtualize x2APIC mode" control'üyle açıkça guard eder.

Fix'in temsili şekli (arch/x86/kvm/vmx/nested.c)
/* Only relax x2APIC MSR intercepts in VMCS02 when VMCS12 actually
 * requests "virtualize x2APIC mode"; otherwise keep them intercepted. */
if (nested_cpu_has_virt_x2apic_mode(vmcs12)) {
        /* ... selectively disable intercepts for the x2APIC MSR range ... */
}

Örnekleyici fragment

Patch niyetinin kavramsal temsili, birebir kopya değil. Tam kod için atıf yapılan LKML thread'ine / kernel changelog'una bak.

Detection

  • Nested virtualization enable olan Intel host'larında, "virtualize x2APIC mode"u kapalı toggle'larken APIC-register virtualization'ı enable eden guest'ler için dikkatli ol — anormal VMCS12 control kombinasyonları.
  • x2APIC MSR aralığına dokunan nested guest'lerle ilintili host kernel crash'leri/oops'ları; DoS dökümante edilmiş en kötü durumdur.
  • Hangi tenant'lara nested virtualization verildiğini audit et — o olmadan flaw ulaşılamaz.
  • Vendor distro changelog'ları (4.19.35, 5.0.8) fix'e atıf yapar; bunlardan eski, 4.16+ bir kernel'deki bir host varsayımsal olarak açıktır.

Mitigation

  • nVMX x2APIC MSR-leak patch'i tarafından upstream düzeltildi (5.1 için merge edildi ve backport edildi — bkz. Linux 4.19.35 / 5.0.8 changelog'ları). Dağıtımının patch'li kernel'ini uygula (Red Hat RHSA-2019:2703/2741; Ubuntu USN-3979/3980).
  • Workaround: untrusted guest'ler için nested virtualization'ı devre dışı bırak (modprobe kvm_intel nested=0). Nested VMX tek attack surface'tir.
  • /dev/kvm ve nested-guest privilege'larını trusted workload'larla sınırla.

References