Skip to content

Linux KVM nested VMX L2-to-L1 emulation leak (CVE-2020-2732)

KVM'in nested-VMX instruction emulation'ı, L1'in interception bitmap'lerine tam uymaz, dolayısıyla bir L2 guest L0'ı, L1'in policy'sinin gizli tutmayı amaçladığı L1 kaynaklarına erişmesi için kandırabilir.

Mechanism

Note

Nested VMX'te (Intel), L0 (KVM) bazen L2 çalışırken L1 adına bir instruction emulate eder. Bunu yapmadan önce, erişimin izinli olup olmadığına ve bunun yerine L1'e exit edip etmemesi gerektiğine karar vermek için L1'in konfigüre ettiği interception policy'sine — L1'in VMCS'indeki I/O-port ve MSR bitmap'lerine — danışmalıdır.

Kırılan invariant: L1 adına emulation, ilgili her L1 intercept'ine saygı göstermelidir. KVM'in vmx_check_intercept'i eksik implemente edilmişti (bir "TODO: check more intercepts" notu taşıyordu), yani belirli emulated instruction'lar için I/O / MSR interception bitmap'leri kontrol edilmiyordu. Sonuç olarak malicious ya da buggy bir L2, L0'ı L1'in asla izin vermek istemediği bir instruction'ı emulate etmeye yönlendirebilir ve L0'ın, L1 policy'sinin L2'ye erişilemez tutmayı amaçladığı hassas L1 kaynaklarına (I/O port'ları, MSR'lar) erişmesine neden olur.

Geçilen boundary, L2'nin L1'in konfigüre ettiği isolation'ın ötesine ulaşmasıdır — nested virtualization içinde bir information-leak / policy-bypass (yalnızca Intel).

Walkthrough

Public, patch'li materyal: oss-security "CVE-2020-2732: Nested VMX vulnerability" (Oracle üzerinden raporlandı; fix serisi Paolo Bonzini, Red Hat tarafından mail'lendi), Linux 5.6 cycle'ında düzeltildi. Kavramsal reprodüksiyon yolu:

  1. Nested VMX'li bir Intel host'unda, guest L1 olarak davranır ve L2'yi, L2'yi kısıtlamayı amaçlayan I/O-port / MSR intercept bitmap'leriyle konfigüre eder.
  2. L2, L0'ın L1 adına emulate etmeyi seçtiği bir path boyunca bir instruction issue eder (örneğin bir I/O ya da MSR erişimi).
  3. Fix öncesi vmx_check_intercept ilgili bitmap kontrolünü atlar, yani L0, L1'in intercept'ini enforce etmek yerine emulation'ı tamamlar.
  4. Emulate edilen erişim, L1'in policy'sinin erişilemez tutmayı amaçladığı bir L1 kaynağına dokunur.
// Conceptual: emulation proceeding without consulting L1's I/O / MSR bitmaps.
// (pre-fix vmx_check_intercept carried a "TODO: check more intercepts")

Warning

Yalnızca kavramsal. Instruction sequence ya da kaynak haritası verilmiyor.

Detection

  • Nested-VMX emulation entry point'lerini, L1'in I/O / MSR interception bitmap'lerine danışmadan L1 adına emulate edilen instruction'lar için audit et.
  • L1'in bitmap'lerinin trap'lemek üzere konfigüre edildiği I/O port'larına ya da MSR'lara anormal L2 erişimi davranışsal imzadır.
  • Kernel sürümünü CVE-2020-2732 fix'ine karşı doğrula (Linux 5.6+ / backport'lar).

Mitigation

  • Upstream fix'i uygula: intercept'lerin tam validate edilemediği guest mode'da L1 adına instruction emulate etmeyi yasakla ve eksik I/O-port / MSR intercept kontrollerini ekle. Linux 5.6+ ve vendor backport'larında mevcut.
  • Gerekmediği yerde nested virtualization'ı devre dışı bırak: modprobe kvm_intel nested=0.
  • L1'in konfigüre ettiği interception bitmap'lerini otorite olarak ele al; bunları bypass eden bir emulation'ı asla tamamlama.

References

  • oss-security — "CVE-2020-2732: Nested VMX vulnerability". https://www.openwall.com/lists/oss-security/2020/02/25/3
  • Phoronix — "Intel KVM CVE-2020-2732" (vmx_check_intercept / 5.6 fix). https://www.phoronix.com/news/Intel-KVM-CVE-2020-2732
  • Ubuntu kernel patch — "KVM: nVMX: Don't emulate instructions in guest mode". https://patchwork.ozlabs.org/project/ubuntu-kernel/patch/20200227185125.650784-7-cascardo@canonical.com/