Skip to content

Linux KVM nested SVM virt_ext intercept bypass (CVE-2021-3656)

KVM'in nested-SVM kodu, L1-supplied virt_ext VMCB field'ını sanitize etmekte başarısız olur ve malicious bir L1'in L2 için VMLOAD/VMSAVE intercept'lerini (ve VLS'i) devre dışı bırakmasına ve host-physical memory'ye ulaşmasına izin verir.

Mechanism

Note

AMD SVM'de, L0 (KVM), bir L2 run'ı için effective control area'yı L1-supplied VMCB'den kurar. VMLOAD/VMSAVE instruction'ları bir CPU state bloğunu (segment base'leri, MSR benzeri field'lar) VMCB'nin gösterdiği bir fiziksel adrese/adresten taşır. KVM normalde bunları nested guest'ler için intercept eder ki adresi vet'leyip translate edebilsin; VLS (Virtual VMLOAD/VMSAVE) ise hardware'in bunları exit olmadan çalıştırmasına izin verebilir.

Kırılan invariant: KVM, L2 için VMLOAD/VMSAVE'i daima control altında tutmalı ve L1'in sağladığı virt_ext field'ını filtrelenmemiş inherit etmemelidir. Fix öncesi, malicious bir L1 virt_ext'te bit'ler set ederek L2 için hem VMLOAD/VMSAVE intercept'lerini disable hem de VLS'i enable edebiliyordu. Fix şöyle özetlenir: "nested olduğunda VMLOAD/VMSAVE'i daima intercept et."

Interception kapalı ve VLS açıkken, L2, KVM'in hiç validate etmediği guest-seçimli bir fiziksel adrese karşı VMLOAD/VMSAVE çalıştırır ve bu host fiziksel memory'sinin read ve write'ına izin verir — host corruption, data leak, crash ya da bir guest-to-host escape. Geçilen boundary L2/L1 guest → L0 host'tur.

Walkthrough

Public, patch'li materyal: Maxim Levitsky ve Paolo Bonzini (Red Hat) tarafından oss-security disclosure'ı, Red Hat Bugzilla 1983988, upstream fix commit c7dfa4009965a9b2d7b329ee970eb8da0d32f0bc (ilgili davranış ~4.13'te eklenen VLS desteğine kadar gider). Kavramsal reprodüksiyon yolu:

  1. Nested SVM'li bir AMD host'unda, guest L1 olarak davranır ve bir L2 VMCB hazırlar.
  2. L1, VMLOAD/VMSAVE interception'ını kapatan ve L2 için VLS'i enable eden virt_ext bit'lerini set eder.
  3. L1 VMRUN issue eder; fix öncesi KVM virt_ext'e uyar, yani L2 o intercept'ler olmadan çalışır.
  4. L2, attacker-controlled bir fiziksel adrese karşı VMLOAD/VMSAVE çalıştırır ve host-physical memory'ye dokunur.

Warning

Yalnızca kavramsal — offset yok, validate edilmiş adres layout'ları yok, turnkey chain yok.

Detection

  • Nested-SVM control-area construction'ını, L1'in virt_ext'inin filtrelenmemiş kullanımı ve nesting altında VMLOAD/VMSAVE interception'ını düşüren path'ler için audit et.
  • AMD host'larında, VMLOAD/VMSAVE intercept'leri beklenmedik şekilde temizlenmiş ya da L2 için VLS enable edilmiş nested guest'ler anormaldir.
  • Kernel sürümünü CVE-2021-3656 fix'ine karşı doğrula; host memory corruption'ı / crash'leri nested AMD guest'leriyle ilintilendir.

Mitigation

  • Upstream fix'i uygula (nested guest'ler için VMLOAD/VMSAVE'i daima intercept et; desteklenmeyen virt_ext bit'lerini inherit etme), 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.
  • L1-supplied VMCB control field'larını untrusted olarak ele al; guest-provided feature bit'lerine dayanarak host intercept'lerini asla gevşetme.

References

  • oss-security — "[CVE-2021-3653, CVE-2021-3656] SVM nested virtualization issues in KVM" (Maxim Levitsky / Paolo Bonzini). https://www.openwall.com/lists/oss-security/2021/08/16/1
  • Red Hat Bugzilla 1983988 — CVE-2021-3656 (VMLOAD/VMSAVE). https://bugzilla.redhat.com/show_bug.cgi?id=1983988
  • Ubuntu Security — CVE-2021-3656. https://ubuntu.com/security/CVE-2021-3656