KVM nested SVM nested_svm_vmrun host MSR control (guest-to-host breakout)¶
KVM'in nested-SVM
nested_svm_vmrun'ındaki bir double-fetch / TOCTOU bug'ı (CVE-2021-29657); bir AMD guest'in kullanımdaki nested MSR-permission bitmap'ini free etmesine ve host MSR'larına unrestricted erişim kazanmasına izin veriyor — guest-to-host privilege boundary kırılması.
Mechanism¶
Note
AMD SVM'de bir guest hypervisor (L1), bir L2 VMCB'sine karşı VMRUN çalıştırarak
L2'yi başlatır. KVM (L0) bunu nested_svm_vmrun
(arch/x86/kvm/svm/nested.c) içinde intercept/emulate eder. L2'nin hangi MSR'lara
dokunabileceğini kontrol etmek için KVM bir
nested MSR-permission bitmap (svm->nested.msrpm) kurar — bu,
MSR bitmap'in SVM karşılığıdır — ve gerçek VMCB'yi ona yönlendirir.
Bug şu: nested_svm_vmrun, bir consistency garantisi olmadan guest tarafından sağlanan
VMCB'yi iki kez fetch eder (bir double-fetch TOCTOU). Nested state'in on-demand
allocation'ıyla birleşince, kötü niyetli bir guest race yaparak KVM'in host MSR'larını
koruyan intercept olmadan bir L2 başlatmasını sağlayabilir, ya da msrpm
bitmap'ini hâlâ kullanımdayken free edebilir. Bozulan invariant şu: hardware tarafından
tüketilen MSR permission bitmap'i, run boyunca geçerli ve kısıtlayıcı kalmalıdır.
Bitmap free edildikten / desync olduktan sonra guest, host MSR'ları üzerinde unrestricted
RDMSR/WRMSR kazanır — host CPU state'ini bozmaya ve tam host compromise'a pivot etmeye
yetecek kadar. Bu bir guest-to-host (escape-class) bug'ıdır.
Walkthrough¶
Kamuya açık, yamalı materyal (Red Hat Bugzilla, upstream fix
a58d9166a756a0f4a6618e4f593232593d6df134). NVD'ye göre etkilenen aralık
5.10 (5.10-rc1'de tanıtıldı) ile 5.11.12 öncesidir; stable'da 5.10.28 / 5.11.12,
mainline'da 5.12 ile düzeltildi.
Kavramsal reproduction yolu:
- Nested SVM'li bir AMD host üzerinde guest, bir L1 hypervisor gibi davranır ve
kendi memory'sinde bir L2
VMCBhazırlar. - Guest
VMRUNçalıştırır; KVM, VMCB field'larını birden fazla kez okuyannested_svm_vmrun'a girer. - Guest eşzamanlı olarak VMCB'yi mutate eder / on-demand nested-state allocation
yolunu tetikler; böylece validate edilen view ile kullanılan view ayrışır — örn.
Intercept VMRUNset edilmemiş olur ya dasvm->nested.msrpmrelease edilir. - MSR permission bitmap'i artık kısıtlamaları enforce etmediğinden, guest host MSR'larını doğrudan okur ve yazar.
Warning
Bu bir race'tir; güvenilirlik double-fetch penceresini kazanmaya bağlıdır. Buradaki materyal bug class'ını örnekler niteliktedir — onu turnkey bir escape gibi görmeyin.
Detection¶
- Nested-SVM VMRUN yolunu, guest-kontrollü VMCB field'larının tekrar tekrar okunması ve
svm->nested.msrpm'in lifetime/refcount işlenişi açısından audit edin. - Guest'in host MSR'larına beklenmedik erişimi (trap etmesi gereken MSR'lar üzerinde RDMSR/WRMSR) davranışsal imzadır.
- Kernel sürümünü CVE-2021-29657 fix'ine karşı doğrulayın.
Mitigation¶
- Kernel 5.12+'te bulunan upstream fix'i uygulayın (VMCB state'in tek, consistent fetch'i; nested MSR bitmap'inin doğru allocation/lifetime'ı).
- Guest tarafından sağlanan virtualization control yapılarını bir kez kopyalayıp validate edilmiş halde tutun; validation'dan sonra asla guest memory'den yeniden okumayın.
- İhtiyaç duymayan host'larda nested SVM'i (
kvm_amd.nested=0) devre dışı bırakın.
References¶
- Red Hat Bugzilla — CVE-2021-29657: "KVM: double fetch in nested_svm_vmrun can lead to unrestricted MSR access." https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2021-29657