Skip to content

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

  1. CR3-load exiting primary VM-execution control'ünü etkinleştir.
  2. CR3-target value alanlarını (0..3) whitelist'lenmiş CR3 değerleriyle doldur ve CR3-target count'u set et.
  3. Guest bir context switch'te MOV CR3, reg yapar.
  4. 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.
  5. 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