CR access VM-exit (control register exiting)¶
VT-x/SVM'i, guest'in control register'lara (CR0/CR3/CR4) write (ya da read) işlemleri bir VM-exit doğuracak şekilde yapılandırmak; böylece hypervisor guest'in en privileged machine state'indeki değişiklikleri inceleyebilir ya da veto edebilir.
Mechanism¶
Note
Control register'lar guest'in protection ve paging state'ini tanımlar (CR0
PE/PG, CR4 feature'ları, CR3 page-directory base). Bir hypervisor'ın izolasyon
invariant'ı bunların izin verdiği sınırlar içinde kalmasına bağlıdır — bir
guest örneğin host'un güvendiği bit'leri temizleyememelidir. VT-x, CR0/CR4
guest/host mask'leri ve read shadow'ları, artı bir CR3-load exiting
control'ü sunar; böylece host hangi CR bit değişiminin sahibi olduğuna, hangisini
guest'in serbestçe değiştirmesine bırakacağına karar verir. Host-owned bir
bit'e guest write'ı bir CR_ACCESS VM-exit'i doğurur; host exit
qualification'ı (hangi CR, MOV yönü, GPR) okur ve değişikliği emüle eder,
ayarlar ya da reddeder.
Bu bir monitoring/policy primitive'idir, bir bug değil. Introspection'ın (process switch'leri takip etmek için CR3'ü izlemek — bkz. CR3-load exiting), shadow paging'in ve CR4.SMEP/SMAP ya da CR0.WP gibi feature'ların host'tan zorlanmasının temelidir.
Walkthrough¶
Public reference: Intel SDM Vol. 3C, "Control-Register Accesses". Kavramsal host yapılandırması:
- CR0/CR4 guest/host mask'ini programla: mask'te set olan bit'ler host-owned'dır; guest'in bunlara write'ı exit eder.
- İlgili read shadow'u programla ki guest'in masked bit'leri okuması gerçek CR'ı değil, host'un göstermek istediği değeri görsün.
- İsteğe bağlı olarak CR3-load exiting (ve/veya CR3-target listesi) ve CR8-load exiting'i set et.
- Bir guest
MOV CRn'inde CPU bir CR-access VM-exit'i yükseltir. Handler exit qualification'ı decode eder: CR numarası, access tipi (MOV to/from CR, CLTS, LMSW), source/dest register. - Host yeni değeri valide eder, izin verilirse gerçek guest CR state'ini günceller, sonra resume eder.
Beklenen gözlem: guest paging-mode geçişleri, context switch'ler (CR3) ve feature
toggle'ları (CR4) etrafında kümelenen CR_ACCESS exit'leri.
Warning
Her process switch'te CR3'ü over-trap etmek pahalıdır; hypervisor'lar yalnızca whitelist'lenmemiş CR3 load'larında exit etmek için CR3-target value listesini kullanır. Guest/host mask'ini yanlış boyutlandırmak ya da yanlış emüle etmek klasik bir nested-virt bug kaynağıdır.
Detection¶
- Anti-introspection yapan bir guest'ten: ağır CR3-load trapping context-switch latency'sini şişirir, RDTSC timing ile ölçülebilir.
- Host tarafı: control-register access'leri için exit-reason sayacı doğrudan telemetry'dir; spike'lar paging değişimlerine ya da introspection yüküne işaret eder.
Mitigation¶
- Yalnızca host'un gerçekten sahip olduğu CR bit'lerini trap et; CR0/CR4 okuyan guest yazılımını bozmamak için read shadow kullan.
- Her emüle edilen CR write'ını guest state'e commit etmeden önce mimari kısıtlamalara karşı valide et.
- Nested kurulumlarda, L2'nin CR mask/shadow'larının L0 tarafından doğru merge edilmesini sağla ki bir L2 host-owned bit policy'sinden kaçamasın — bkz. VMCS manipulation.
References¶
- Intel 64 and IA-32 SDM, Vol. 3C — "VM Exits, Control-Register Accesses" ve CR0/CR4 için guest/host mask ve read shadow'lar (VM-execution control fields). https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-1077.html
- AMD64 APM Vol. 2, SVM control register intercept'leri.