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.