VP_INDEX enlightenment (HV_X64_MSR_VP_INDEX)¶
Hyper-V synthetic MSR
HV_X64_MSR_VP_INDEX(0x40000002): bir guest, kendisini veya diğer VP'leri hypercall'larda adlandırabilmek için virtual-processor index'ini okur — aynı zamanda güvenilir bir hypervisor-presence detection sinyalidir.
Mechanism¶
Note
Hyper-V altında bir virtual processor, partition ID + processor index
tuple'ı ile tanımlanır. VP index (typedef UINT32 HV_VP_INDEX), VP
oluşturulurken atanır ve VP'nin lifetime'ı boyunca sabittir. Bir guest'in
hypervisor interface'lerinde kendisine atıfta bulunmak veya başka VP'leri
hedeflemek için kullandığı kanonik kimliktir — ve local APIC ID'den
farklıdır. x64'te bir guest bunu synthetic MSR
HV_X64_MSR_VP_INDEX = 0x40000002'in RDMSR'ı ile okur; ARM64'te eşdeğeri,
HvCallGetVpRegisters üzerinden okunan read-only HvRegisterVpIndex
synthetic register'ıdır. Hyper-V interface signature'ının ("Microsoft Hv"
döndüren CPUID leaf 0x40000000) duyurulması, HV_X64_MSR_GUEST_OS_ID,
HV_X64_MSR_HYPERCALL ve HV_X64_MSR_VP_INDEX'in implement edildiğini ima
eder.
VP index, belirli bir VP'yi adlandırması gereken enlightenment'lar için
gereklidir: SynIC, synthetic timer'lar ve TLB-flush/IPI hypercall'ları (örn.
HvCallFlushVirtualAddressSpace, HvCallNotifyLongSpinWait). İki sentinel değer
tanımlıdır: HV_ANY_VP = (HV_VP_INDEX)-1 (0xFFFFFFFF) ve HV_VP_INDEX_SELF =
(HV_VP_INDEX)-2 (0xFFFFFFFE).
VP index'i tüketen interface'ler için Hyper-V enlightenments ve synthetic cluster IPI hypercall'a bak.
Walkthrough¶
TLFS'ten (Virtual Processor properties). Geçerli VP'nin index'ini okuma:
; Read HV_X64_MSR_VP_INDEX
mov ecx, 0x40000002
rdmsr ; EDX:EAX <- HV_VP_INDEX (high dword zero)
; EAX now holds the 32-bit VP index of the executing VP
Guest daha sonra bu değeri — ya da HV_VP_INDEX_SELF (0xFFFFFFFE) / HV_ANY_VP
(0xFFFFFFFF) — sonraki hypercall'ların VP-set / target alanlarını doldururken
kullanır.
Hypervisor-presence probe (anti-VM ilgisi)
0x40000000–0x4FFFFFFF MSR aralığı hypervisor'a ayrılmıştır. Başarılı bir
RDMSR 0x40000002 (CPUID 0x40000000'deki "Microsoft Hv" vendor string'i ile
birlikte) Hyper-V enlightenment maruziyetine işaret eder — yaygın bir
VM/hypervisor detection sinyali. Karşılaştır:
CPUID hypervisor present-bit detection
ve CPUID hypervisor vendor-ID leaf probing.
Detection¶
- MSR read'in kendisi bir detection aracıdır (anti-VM): bir hypervisor emüle
eden defender'lar,
0x40000000–0x4FFFFFFFsynthetic aralığını expose edip etmemeye karar vermelidir, çünkü varlığı bir fingerprint'tir. - Hypervisor/emulator tarafında VP-index doğrulaması bir attack surface'tir:
KVM'in Hyper-V emülasyonu
vp_index < KVM_MAX_VCPUSkuralını uygular ve bu da hypercall'lardaki guest tarafından verilen VP index'lerinin range-check'ten geçirilmesi gerektiğinin altını çizer.
Mitigation¶
- Kendi başına bir vulnerability değildir; ilgili sertleştirme, bir VP index kabul eden herhangi bir hypercall için hypervisor/emulator'da input validation'dır (range dışı index'leri reddet) ve virtualization'ı gizlemek isteyen araçlar için kasıtlı bir fingerprinting duruşudur.
References¶
- Microsoft, "Virtual Processor" (Hyper-V TLFS), https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/vp-properties