VMCB (Virtual Machine Control Block) manipulation¶
AMD-V (SVM) VMCB'nin field'larını — VMRUN'a verilen, bir guest'in control area'sını ve state-save area'sını tutan 4 KB'lık page'i — düzenleyerek intercept'leri ve guest state'i yapılandırmak, ya da VMX-root-eşdeğeri (host SVM) yürütme varsa guest/host sınırını zayıflatmak.
Mechanism¶
Note
AMD SVM'de VMCB iki parçalı, page-aligned bir structure'dır: control area
(intercept vector'ları, TSC offset, exit code / EXITINFO1/2, guest ASID,
nested-paging control) ve state-save area (guest segment, control ve general
register'ları). VMRUN, VMCB physical address'ini alır, önce host state'i
VM_HSAVE_PA MSR'ının adlandırdığı bölgeye kaydeder, guest state'i VMCB'den yükler
ve guest'i bir #VMEXIT'e kadar çalıştırır; bu noktada processor exit code ve info
field'larını doldurur. Intel'in VMREAD/VMWRITE'ının aksine, VMCB host'un doğrudan
düzenlediği düz bir memory structure'dır. Isolation invariant'ı şudur: yalnızca
güvenilir host SVM kodu VMCB'yi yazar ve set ettiği intercept vector'ları hassas
guest işlemlerini host'a trap ettirmeye devam eder. Bug class: host SVM
yürütmesine (bir hypervisor bug'ı aracılığıyla) ulaşan bir saldırgan intercept
bit'lerini clear edebilir, nested-paging (NPT) CR3'ünü değiştirebilir veya guest/host
state field'larını bozabilir — bir host memory bug'ını sınırın kontrolüne çevirir.
Nested SVM'de, L0'ın guest tarafından sağlanan VMCB12 field'larını yanlış ele alması
aynı tehlikedir.
Bu primitive'in Intel karşılığı VMCS manipulation'dır; VMCB field'larının VMRUN boyunca cache'lenmesi VMCB clean bits tarafından yönetilir.
Walkthrough¶
Örnekleyici host-side VMCB kurulumu (kavramsal, AMD SVM/Pacifica manual'ından):
/* host SVM code preparing a guest before VMRUN */
vmcb->control.intercept |= (1ULL << INTERCEPT_VMMCALL); /* trap guest VMMCALL */
vmcb->control.nested_cr3 = npt_pml4_phys; /* nested paging root */
vmcb->save.rip = guest_entry;
vmcb->save.cs.selector = 0x08;
wrmsrl(MSR_VM_HSAVE_PA, host_save_area_phys);
asm volatile("vmrun" :: "a"(vmcb_phys)); /* runs until #VMEXIT */
/* on return: vmcb->control.exit_code, exit_info_1/2 describe the exit */
Beklenen: guest çalışır; bir VMMCALL veya başka bir intercepted olay, host'un emüle
edebilmesi için exit_code set edilmiş halde kontrolü geri döndürür. Burada bir
intercept bit'ini clear etmek, guest'in o işlemi trap olmadan yapmasına izin verirdi.
Warning
VMCB düzenlemeleri host SVM (ring-0) ayrıcalığı gerektirir. Kavramsal kayıt — host SVM yürütmesine ulaşacak bir chain sağlanmamıştır.
Detection¶
- Host self-integrity: her VMCB'de intercept vector'larını ve NPT CR3'ü VMRUN'dan önce doğrula; set olması gereken clear edilmiş intercept'leri tespit et.
- Nested SVM: bir guest VMCB'den gerçek VMCB'ye kopyalanan field'ları denetle.
Mitigation¶
- Host SVM kodunu minimal ve memory-safe tut.
- Nested-SVM emülasyonunda guest-controlled VMCB12 field'larını kullanmadan önce yeniden doğrula (bir KVM nSVM bug sınıfı onlara güvenmekten kaynaklanır).
- VMCB clean bits'i doğru kullan ki stale cached state VMCB'den sessizce sapamasın.