CR3-target value matching / CR3 load exiting¶
VT-x CR3-load exiting'i CR3-target value listesiyle birlikte kullanıp hypervisor'ın yalnızca whitelist'lenmemiş guest CR3 load'larını trap etmesi — process/address-space switch'lerini guest dışından izlemenin verimli bir yolu.
Mechanism¶
Note
CR3, guest'in top-level page-directory base'ini tutar; onu load etmek bir
OS'un her context switch'te yaptığı şeydir, dolayısıyla "hangi process
çalışıyor" için neredeyse mükemmel bir proxy'dir. Process switch'leri ring -1'den
takip etmek isteyen bir hypervisor CR3-load exiting set edebilir, ama her
CR3 write'ını trap etmek pahalıdır. VT-x bir CR3-target list ekler: dört
host-programlı CR3 değeri artı bir count. CR3-load exiting etkinken, bir target
value'yla eşleşen guest MOV CR3 exit etmez; yalnızca listenin dışındaki
load'lar bir CR-access VM-exit doğurur. Bu, bir
monitor'ün bilinen/yaygın address space'leri whitelist'lemesine ve yalnızca yeni
ya da ilginç olanlarda exit etmesine izin verir.
Sınır, guest'in process model'inin guest işbirliği olmadan gözlemlenebilirliğidir — guest CR3/kpgd resolution ve process-aware introspection'ın temeli. Host-owned bir policy'dir, bir vulnerability değil.
Walkthrough¶
Public reference: Intel SDM Vol. 3C, "CR3-Target Controls". Kavramsal akış:
- CR3-load exiting primary VM-execution control'ünü etkinleştir.
- CR3-target value alanlarını (0..3) whitelist'lenmiş CR3 değerleriyle doldur ve CR3-target count'u set et.
- Guest bir context switch'te
MOV CR3, regyapar. - Değer bir target'la eşleşirse execution exit olmadan devam eder. Aksi halde CR3'ü gösteren exit qualification ile bir CR access VM-exit'i tetiklenir.
- Handler yeni CR3'ü kaydeder (örn. onu guest CR3/kpgd resolution ile bir guest process'e map eder), isteğe bağlı olarak target listesine ekler ve resume eder.
Beklenen gözlem: CR3-access exit'leri yalnızca görülmemiş address space'ler için oluşur; bir CR3 whitelist'lendikten sonra ona yapılan sonraki switch'ler sessizdir.
Warning
Target list en fazla dört entry tutar; tüm switch'leri izlemek isteyen bir monitor listeyi boş bırakmalı (her CR3 load'da exit) ya da entry'leri rotate etmeli — tamlığı exit overhead'ine karşı takas eder.
Detection¶
- Anti-introspection yapan bir guest
MOV CR3'ü timing'leyebilir: exit eden bir load, bir target'la eşleşenden çok daha yavaştır; bu, monitor'ün hangi address space'leri izlediğini sızdırır (RDTSC timing). - Host tarafı: CR3-exit frekansı ve gözlemlenen CR3 değerlerinin working set'i, process churn'ünün doğrudan telemetry'sidir.
Mitigation¶
- Target listesini hot, benign CR3 değerlerini kapsayacak şekilde seç ki monitoring overhead'i düşük kalsın ama monitor yeni process'lere kör olmasın.
- Tam address-space context için descriptor-table ve CR0/CR4 trapping ile birleştir; emüle edilen CR3 load'larını valide et.
- Nested virtualization için, L0 L1'in CR3-target control'lerini doğru merge etmeli ki bir L2 L1'in process tracking'inden kaçamasın.
References¶
- Intel 64 and IA-32 SDM, Vol. 3C, "CR3-Target Controls" ve "VM Exits, Control Register Accesses" (CR3-load exiting, CR3-target value/count). https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-1077.html