Skip to content

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ı:

  1. CR0/CR4 guest/host mask'ini programla: mask'te set olan bit'ler host-owned'dır; guest'in bunlara write'ı exit eder.
  2. İ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.
  3. İsteğe bağlı olarak CR3-load exiting (ve/veya CR3-target listesi) ve CR8-load exiting'i set et.
  4. 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.
  5. 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