Skip to content

CPUID hypervisor vendor-ID leaf probing (0x40000000)

Leaf 0x40000000'dan başlayan synthetic CPUID aralığını okuyarak bir hypervisor'ın 12-byte vendor signature'ını (örn. "KVMKVMKVM", "Microsoft Hv", "VMwareVMware", "XenVMMXenVMM") geri elde etmek ve böylece guest'i hangi hypervisor'ın host'ladığını belirlemek.

Mechanism

Note

Intel ve AMD, CPUID leaf aralığı 0x40000000-0x400000FF'i hypervisor kullanımına rezerve eder; bare metal'de bu leaf'ler tipik olarak sıfır okunur ya da en yüksek standart leaf'i alias'lar. Konvansiyon gereği bir hypervisor, leaf 0x40000000'da EAX'ta maksimum hypervisor leaf'ini ve EBX:ECX:EDX'e paketlenmiş 12-byte ASCII vendor signature'ını döndürür. CPUID her zaman host'a trap ettiği için, bu değerleri host doldurur. Devredeki sınır yine izolasyon değil transparency'dir: leaf kasıtlı bir paravirtual interface'dir (enlightened guest'lere hangi hypercall ABI'sini ve synthetic MSR'ları kullanacaklarını söyler — bkz. Hyper-V enlightenments). Aynı interface, anti-analysis ve nesting denetleyen defender'lar için yüksek-fidelity bir fingerprint'tir.

Walkthrough

Public reference: Microsoft (TLFS), KVM, Xen ve VMware tarafından belgelenen fiili hypervisor CPUID interface'i. Temsili guest probe:

unsigned int eax, ebx, ecx, edx;
char sig[13] = {0};
__asm__ volatile("cpuid"
    : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
    : "a"(0x40000000));
*(unsigned int*)(sig+0) = ebx;
*(unsigned int*)(sig+4) = ecx;
*(unsigned int*)(sig+8) = edx;
/* sig artık örn. "KVMKVMKVM\0\0\0" ya da "Microsoft Hv" tutar */

Beklenen gözlem: hypervisor'ı tanımlayan tanınabilir bir 12-byte string; EAX en yüksek implement edilmiş hypervisor leaf'ini verir, böylece prober daha ileri leaf'leri yürüyebilir (timing/feature'lar, örn. TSC/APIC frekansı için 0x40000010).

Detection

  • Bu, bir guest'in kullandığı bir detection tekniğidir. Host tarafında gözlem, EAX'ı 0x40000000 aralığında olan bir CPUID VM-exit'idir; bu tür access'ler benign workload'larda nadirdir ve evasive malware'de başlangıçta yoğunlaşır.
  • Bir monitor, leaf 1 (present bit) ardından 0x40000000 (vendor) art arda probing'ini bir virtualization-detection sekansı olarak flag'leyebilir.

Mitigation

  • Stealth arayan analiz sandbox'ları, 0x40000000 vendor string'ini boşaltabilir ya da randomize edebilir — buna dayanan enlightened guest'leri bozma pahasına.
  • Production hypervisor'lar signature'ı dürüst tutar çünkü paravirtual driver'lar, clock source'lar ve hypercall ABI'ları ona göre çalışır.
  • Present-bit policy'si ve TSC offset işlemesiyle eşleştir ki tüm VM-detection surface'leri tutarlı olsun.

References