KVM AMD nested interrupt-shadow int_ctl desync¶
CVE-2026-45987: AMD nested SVM'de, bir L2 restore path'i üzerinde interrupt-shadow /
int_ctlstate'ivmcb02'ye doğru şekilde senkronize edilmiyor; bu da L2 vCPU'yu interrupt'ları yanlışça masked halde bırakarak hang etmesine yol açabiliyor.
Mechanism¶
Bug class: nested control-field desynchronization (vmcb01 -> vmcb02)
Bu, KVM'in AMD SVM nested virtualization'ında bir state-synchronization açığı. Etkilenen sınır, KVM'in L2'ye sunduğu state için L1 <-> L0 tutarlılığı. Raporlanan etki bir liveness/DoS durumu (L2 hang eder), privilege-crossing bir escape değil.
AMD SVM'de host, nested guest'i (L2) konvansiyonel olarak vmcb02
denilen, host tarafından inşa edilen bir control block'tan çalıştırır; KVM
bunu L1 hypervisor'ın guest control block'undan (vmcb12) ve host'un kendi
block'undan (vmcb01) doldurur. int_ctl field'ı virtual-interrupt control
state'ini taşır — pending bir interrupt shadow'u temsil eden bit dahil
(STI/MOV SS sonrasında interrupt'ların bloklandığı tek-instruction'lık
pencere).
Raporlanan bug şu: belirli bir restore path'inde (L1'in control
field'larını kopyalayan normal nested VM-entry'den geçmeden L2'ye yeniden
girilirken), int_ctl'in interrupt-shadow kısmı vmcb02'ye yeniden
inject edilmiyor. Dolayısıyla L2 vCPU, interrupt-shadow / virtual-IRQ
state'i L1'in amaçladığıyla tutarsız şekilde resume olur — efektif olarak
interrupt'lar masked — ve forward progress yapmayı durdurup hang edebilir.
Detail confidence
High-level sınıf (L2 restore'da interrupt-shadow / int_ctl
re-synchronization'ının eksik olması) atıf yapılan public writeup'tan
geliyor. Değişen field semantiği, function isimleri ve upstream commit
hash'inin tam hali, yazım anında birincil bir kernel.org/lore
kaynağına karşı doğrulanmadı — aşağıdaki field-level ve diff-level
ayrıntıları conceptual/illustrative kabul et.
Sync-direction unverified
Sync'in tam yönü/hedef block'u doğrulanmamıştır. Bu not gövdesi
interrupt-shadow'un vmcb02'ye sync edilmesinden bahsediyor, ancak
atıf yapılan MSRC kaynağının başlığı "Sync interrupt shadow to
cached vmcb12 after VMRUN of L2" diyor. Hangi block'un (vmcb02
vs vmcb12) ve hangi yönün doğru olduğu, birincil kernel kaynağına
karşı teyit edilmeden kesin kabul edilmemeli — pending
confirmation.
Walkthrough¶
Conceptual reproduction path (AMD host, nested SVM enabled):
- L0 host KVM çalıştırır (
kvm_amd nested=1); L1 bir L2 guest çalıştıran guest hypervisor'dır. - L2, bir interrupt shadow'un pending olduğu bir state'te execute eder (örn.
STIhemen sonrası) ve L2 state'inin bir save/restore'u gerçekleşir (normalnested_svm_vmrunfield copy'sini bypass eden path). - Restore sırasında,
vmcb02.control.int_ctl'e yansıması gereken interrupt-shadow bit'i düşürülür; böylece L2, virtual interrupt'lar yanlışça masked halde resume olur. - L2, masked state'in delivery'sine engel olduğu bir interrupt'ı süresiz bekler — guest hang etmiş görünür.
Conceptual shape of the fix (illustrative — NOT verbatim)
/* On the L2 restore path, re-synchronize the pending interrupt-shadow
* state into vmcb02's int_ctl so the guest does not resume with
* interrupts incorrectly masked. */
if (nested_interrupt_shadow_pending(svm))
svm->nested.vmcb02.ptr->control.int_ctl |= /* V_* shadow bit */;
Beklenen etki: fix sonrası, pending bir interrupt-shadow penceresine
restore edilen bir L2, doğru int_ctl state'iyle resume olur ve
interrupt'lar normal şekilde deliver edilir; böylece guest artık hang
etmez.
Do not treat as a verified diff
Yukarıdaki fragment, bug sınıfının conceptual bir yeniden inşası; birincil bir kaynaktan onaylanmış bir patch değil. Field isimleri ve bit identifier'ları upstream commit'i bekleyen placeholder'lardır.
Detection¶
- Nested virtualization'lı AMD host'lar (
kvm_amd nested=1): bir save-restore veya migration tarzı operasyondan sonra hang olan / yanıt vermeyi bırakan L2 guest'ler, L1 vCPU ise sağlıklı. - Host crash beklenmez ve privilege escalation beklenmez — semptom guest liveness kaybı, ki bunu guest OS'a yanlış atfetmek kolaydır.
- Hang'leri nested-SVM workload'larındaki KVM/QEMU save-restore veya snapshot operasyonlarıyla korele et.
Mitigation¶
- L2 restore path'inde interrupt-shadow /
int_ctlstate'ini yeniden senkronize eden patch'li Linux kernel'i uygula. Atıf yapılan writeup'a göre sorun Linux 5.12 civarında introduce edilmiş ve 2026'da yayınlanan stable/mainline güncellemelerinde fix edilmiş; tam backport için distribution'ının advisory'sini takip et. (Tam fixed version string'leri ve upstream commit hash'i burada doğrulanmamıştır — alıntılamadan önce kernel.org/stable changelog'una karşı teyit et.) - Workaround: etkilenen guest'ler için nested virtualization'ı disable et
(
modprobe kvm_amd nested=0); bu, surface'i tamamen kaldırır.
References¶
- MSRC Security Update Guide — CVE-2026-45987: "KVM: nSVM: Sync interrupt shadow to cached vmcb12 after VMRUN of L2"
- lore/openwall linux-kernel: KVM: nSVM nested_vmcb02_recalc_intercepts() (vmcb01/vmcb12/vmcb02, int_ctl, V_INTR_MASKING)
- windowsnews.ai: CVE-2026-45987 — KVM flaw in AMD nested virtualization can hang L2 guests after restore