Skip to content

KVM AMD nested interrupt-shadow int_ctl desync

CVE-2026-45987: AMD nested SVM'de, bir L2 restore path'i üzerinde interrupt-shadow / int_ctl state'i vmcb02'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):

  1. L0 host KVM çalıştırır (kvm_amd nested=1); L1 bir L2 guest çalıştıran guest hypervisor'dır.
  2. L2, bir interrupt shadow'un pending olduğu bir state'te execute eder (örn. STI hemen sonrası) ve L2 state'inin bir save/restore'u gerçekleşir (normal nested_svm_vmrun field copy'sini bypass eden path).
  3. 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.
  4. 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_ctl state'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