Skip to content

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:

  1. Nested SVM'li bir AMD host üzerinde guest, bir L1 hypervisor gibi davranır ve kendi memory'sinde bir L2 VMCB hazırlar.
  2. Guest VMRUN çalıştırır; KVM, VMCB field'larını birden fazla kez okuyan nested_svm_vmrun'a girer.
  3. 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 VMRUN set edilmemiş olur ya da svm->nested.msrpm release edilir.
  4. 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