Linux KVM nested SVM virt_ext intercept bypass (CVE-2021-3656)¶
KVM'in nested-SVM kodu, L1-supplied
virt_extVMCB 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:
- Nested SVM'li bir AMD host'unda, guest L1 olarak davranır ve bir L2
VMCBhazırlar. - L1, VMLOAD/VMSAVE interception'ını kapatan ve L2 için VLS'i enable eden
virt_extbit'lerini set eder. - L1
VMRUNissue eder; fix öncesi KVMvirt_ext'e uyar, yani L2 o intercept'ler olmadan çalışır. - 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_extbit'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