Skip to content

KVM AMD SVM LBR save/restore info leak (L2->L0)

KVM'in AMD Last Branch Record (LBR) MSR'larının save/restore'unu bir L2->L0 transition boyunca yanlış yönettiği nested-SVM state-management bug'ı (CVE-2026-46014); böylece stale L2 branch-record state'i sınırı aşıp hayatta kalır ve virtualization context'leri arasında control-flow bilgisi sızdırır.

Mechanism

Note

AMD'nin LBR özelliği, en son alınan branch'leri (jump, call, return) küçük bir MSR bankasına (örn. DEBUGCTL/DbgCtl, LBR FROM/TO record'ları) kaydeder. Bu MSR'lar per-logical-CPU global state'tir — CPU bunları bir VMRUN/#VMEXIT boyunca otomatik olarak context-switch etmez. Dolayısıyla her world switch'te giden context'in LBR state'ini kaydetmek ve gelen context'in state'ini yüklemek hypervisor'ın sorumluluğundadır.

Nested SVM'de bir L2 guest'in exit'i doğrudan L0'a yönlendirilebilir (L1'den geçmeden L0'ın handle ettiği bir #VMEXIT). O anda L0, L2 LBR MSR'larını persist etmeli ve kendi (L0/L1) değerlerini restore etmelidir. CVE-2026-46014 bu yoldaki bir logic error'dur: L2->L0 transition'ında LBR MSR'ları stale L2 değerleri tutar halde bırakılır (veya yanlış VMCB context'inden restore edilir — vmcb01'e karşı vmcb02). Kırılan isolation invariant'ı CPU-state confinement'tır: bir VM çalışırken üretilen branch-record state'i, başka bir context'e world switch sonrasında gözlemlenebilir. Branch adresleri control-flow bilgisidir, dolayısıyla bu, nested-virt sınırı boyunca bir information-disclosure primitive'idir (örn. KASLR'ı yenmek, secret'a-bağımlı control flow sızdırmak) ve bozulmuş DbgCtl/LBR-enable state'i host'u daha da kararsızlaştırabilir.

Walkthrough

Bu, public ve patch'lenmiş CVE-2026-46014 açıklamasına dayanır; fix, KVM'in nested SVM kodunda (arch/x86/kvm/svm/) yer alır. Kavramsal reproduction yolu:

  1. Nested SVM'nin enable olduğu (kvm_amd.nested=1) bir AMD host üzerinde, kendisi bir L2 guest çalıştıran bir L1 hypervisor (KVM-in-KVM) çalıştır.
  2. L2'de LBR'ı enable et (DEBUGCTL içindeki LBR-enable bit'ini set et). L2, FROM/TO record'ları LBR MSR'larına düşen bir branch akışı üretir.
  3. KVM'in doğrudan servis ettiği bir L2->L0 exit'i zorla. Save/restore logic error'u nedeniyle KVM, gelen context için L2 LBR MSR'larını doğru şekilde persist/clear etmez.
  4. LBR MSR'larını okuyan bir sonraki context, artık kalan L2 branch record'larını — isolation sınırını aşmış control-flow state'ini — gözlemler.

Warning

LBR/DbgCtl'i CPU tarafından otomatik olarak izole edilmiş varsayma. Bunlar sticky per-pCPU MSR'lardır; bir world switch'te kaçırılan herhangi bir save/restore, cross-VM bir leak'tir. Bunu açıklayıcı kabul et — gerçek bir chain, tam kernel version'a ve LBR virtualization (LBR_CTL) ayarlarına bağlıdır; spesifikleri kavramsal tut.

Detection

  • Host telemetry: hiç üretmediği non-zero LBR record'larını okuyabilen bir L2 ya da çalışan context ile tutarsız LBR/DbgCtl değerleri, bir leak'e işaret eder.
  • Bir kernel'i denetleyen defender'lar için: nested-SVM world-switch yolunun, LBR MSR'larını hem vmcb01 hem vmcb02 context'leri için simetrik şekilde save/restore edip etmediğini kontrol et.
  • Patch'lenmiş kernel'ler fix'i içerir; çalışan kernel version'ı CVE-2026-46014 için vendor advisory'sine karşı doğrula.

Mitigation

  • CVE-2026-46014'ü düzelten kernel güncellemesini uygula (her L2<->L0 transition'ında doğru LBR save/restore).
  • Patch henüz mümkün değilse, AMD'de nested virtualization'ı disable et (kvm_amd.nested=0) ve/veya LBR'ı güvenilmeyen nested guest'lere expose etmekten kaçın.
  • Nested virtualization'ı güvenilen tenant'larla sınırla.

References

  • "NVD - CVE-2026-46014." https://nvd.nist.gov/vuln/detail/CVE-2026-46014
  • "CVE-2026-46014: KVM AMD SVM LBR Save/Restore Bug Threatens Nested Virtualization Security." https://windowsnews.ai/article/cve-2026-46014-kvm-amd-svm-lbr-saverestore-bug-threatens-nested-virtualization-security.420368