Skip to content

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)

0x400000000x4FFFFFFF 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, 0x400000000x4FFFFFFF synthetic 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_VCPUS kuralı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