Skip to content

VMCB clean bits (state caching control)

CPU'ya hangi VMCB bölgelerinin son VMRUN'dan bu yana değişmediğini söyleyerek cached state'i yeniden kullanabilmesini sağlayan AMD-V VMCB "clean bits" (VMCB State Caching) alanı — yanlış ele alınması çalışan guest'i stale control state üzerinde bırakabilen, bir correctness/isolation footgun'ı olan bir performans özelliği.

Mechanism

Note

VMCB State Caching, processor'ın VMCB'nin parçalarını (interception vector'ları, TSC offset/pause-filter, IOMSRPM bitmap pointer'ları, nested-paging state, segment register'ları vb.) VMRUN'lar boyunca cache'lemesini sağlar. VMCB Clean Field bir bitmask'tir: her bit bir VMCB field grubuna karşılık gelir. Host bir clean bit'i set bırakırsa, "bu grubu değiştirmedim, cached kopyayı kullanabilirsin" der; bit'i clear etmek CPU'yu bir sonraki VMRUN'da o grubu VMCB'den yeniden yüklemeye zorlar. Invariant: host bir VMCB grubunu düzenlediğinde, ilgili clean bit'i clear etmek zorundadır. Unutursa, CPU guest'i stale interception/paging/TSC state ile çalıştırmaya devam eder — guest örneğin, host'un intercept'i yeniden etkinleştirdiğini sandığı bir instruction'ı çalıştırabilir veya stale bir nested-paging root üzerinde koşabilir. Bug class: bir hypervisor'da clean-bit desynchrony'si (özellikle L0'ın L1'in VMCB12'sinden merged bir VMCB02 inşa ettiği nested SVM'de) intended trap-and-emulate semantiğini bozabilen, tekrar eden bir state-confusion bug kaynağıdır.

VMCB manipulation'a eşlik eder; kavramsal olarak Intel'in nested Hyper-V için enlightened VMCS clean-field optimizasyonuna benzer.

Walkthrough

Örnekleyici clean-bit ele alımı (kavramsal, AMD SVM manual'ı ve Xen'in vmcb.c'si gibi SVM implementasyonlarından):

/* host modifies the interception vectors, so it MUST clear that clean bit */
vmcb->control.intercept |= (1ULL << INTERCEPT_CPUID);
vmcb->control.clean &= ~CLEAN_INTERCEPTS;   /* force reload of intercepts */

/* host did NOT touch the I/O & MSR permission maps this time */
/* leaving CLEAN_IOPM set lets the CPU reuse the cached bitmap pointers   */

asm volatile("vmrun" :: "a"(vmcb_phys));

Beklenen (doğru): CPU intercept grubunu yeniden yükler, böylece yeni CPUID intercept yürürlüğe girer. Beklenen (buglı): CLEAN_INTERCEPTS set bırakılsaydı, guest CPUID'yi trap olmadan çalıştırabilirdi çünkü CPU cached intercept'leri kullanırdı.

Warning

Kavramsal; clean-bit programlaması host SVM (ring-0) kodudur. Exploit chain sağlanmamıştır.

Detection

  • Hypervisor testing: son VMRUN'dan bu yana yazılmış herhangi bir VMCB grubunun clean bit'inin clear edildiğini doğrula (VMCB write path'lerini enstrümante et).
  • Differential testing / nested-SVM fuzzing, clean-bit state confusion'ı açığa çıkarır.

Mitigation

  • VMCB düzenlemelerini, ilgili clean bit'i otomatik clear eden helper'ların arkasında merkezileştir (olgun VMM'lerin yaptığı gibi).
  • Şüphe varsa tüm clean bit'leri muhafazakârca clear et (caching hızlanması yerine correctness) — field tamamen bir optimizasyondur.
  • Nested SVM'de, VMCB12'ye güvenmek yerine VMCB02 için clean bit'leri yeniden hesapla.

References