Skip to content

MSR bitmap interception

VMCS MSR-bitmap address'ini 4 KB'lık bir bitmap'e işaret ettirerek guest RDMSR/WRMSR'lerini seçici biçimde trap'leme; böylece yalnızca işaretli MSR'ler VM-exit'e yol açarken geri kalanı native hızda çalışır — bir hypervisor'ın model-specific register'ları aracılamak için kullandığı per-MSR access-control primitive'i.

Mechanism

Note

Prensipte her RDMSR/WRMSR VM-exit edebilir, ama hepsini trap'lemek fazla yavaştır. VMX, "use MSR bitmaps" VM-execution control'ünü sağlar: set edildiğinde, VMCS field'ı MSR_BITMAP dört adet 1 KB quadrant'a bölünmüş 4 KB'lık, 4 KB hizalı bir bölgeyi işaret eder:

  • read bitmap, low MSRs 0x00000000–0x00001FFF
  • read bitmap, high MSRs 0xC0000000–0xC0001FFF
  • write bitmap, low MSRs
  • write bitmap, high MSRs

Aralık içindeki bir MSR için, karşılık gelen bit exit'e karar verir: bit = 1 -> VM-exit, bit = 0 -> native çalıştır. Her iki aralığın da dışındaki herhangi bir MSR'ye erişim daima VM-exit eder (bitmap'ten bağımsız olarak). Invariant: hypervisor, per-MSR ve per-direction olarak, hangi register erişimlerini aracılaması gerektiğine karar verir; bir exit'te erişimi emulate/virtualize eder (örn. bir değeri sahteleyerek, bir feature'ı gizleyerek ya da bir policy uygulayarak). Bu bitmap'i yanlış yapmak bir güvenlik açığıdır — örn. hassas bir host MSR'sini un-trapped bırakmak (karşılaştır: nested_svm_vmrun host MSR control, burada free edilmiş bir nested MSR bitmap host MSR'lerini açığa çıkarır).

Walkthrough

Public reference: Intel SDM Vol. 3C (MSR bitmaps; RDMSR/WRMSR exit conditions). Minimal bir hypervisor'da kavramsal kurulum:

  1. 4 KB hizalı bir page allocate et, sıfırla (varsayılan: aralık içindeki MSR'ler için exit yok).
  2. Processor-based VM-exec control'lerinde "use MSR bitmaps"i etkinleştir ve page'in physical address'ini MSR_BITMAP VMCS field'ına yaz.
  3. Örneğin IA32_LSTAR'a (0xC0000082) yazmaları trap'lemek için, onun bit'ini write/high quadrant'ında set et:
    index = LSTAR - 0xC0000000 = 0x82
    set bit 0x82 in write-high bitmap quadrant
    
  4. Bir guest WRMSR LSTAR'ında, CPU "WRMSR" sebebiyle VM-exit eder; handler ECX/EDX:EAX'i okur, policy uygular (bkz. IA32 LSTAR MSR write interception) ve sonra resume eder.
Exit-reason check sketch
if exit_reason == EXIT_RDMSR or exit_reason == EXIT_WRMSR:
    msr = guest_ecx
    emulate(msr, direction)   # return faked value / enforce policy
    advance_guest_rip()

Warning

Bitmap'te temiz (clear) bir bit native erişim demektir — guest gerçek MSR'ye dokunur. Host-sensitive MSR'leri yalnızca gerçekten güvenliyse un-trapped bırak; nested kurulumlar L1'in ve L0'ın bitmap'lerini merge etmeli ki L0 kendi gerekli trap'lerini asla düşürmesin.

Detection

  • Bir guest RDMSR/WRMSR'yi zamanlayabilir: trap'lenmiş MSR'ler native olanlardan belirgin biçimde yavaştır (VM-exit latency'si), bu da hypervisor'ın hangi MSR'leri intercept ettiğini fingerprint'ler (bkz. VM-exit latency fingerprinting).

Mitigation

  • Bitmap'leri tutucu (conservative) kur: hassas MSR'ler için varsayılan olarak trap'le; hangi MSR'lerin native bırakıldığını audit et.
  • Nested virtualization'da guest ve host MSR bitmap'lerini doğru biçimde merge et ve bir run onu tüketirken bitmap'i asla free etme/desenkronize etme.

References

  • Intel 64 and IA-32 Architectures Software Developer's Manual, Vol. 3C (MSR bitmaps; RDMSR/WRMSR VM-exit conditions). https://cdrdv2-public.intel.com/671506/326019-sdm-vol-3c.pdf