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
CPUIDVM-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¶
- The Linux Kernel, "KVM CPUID bits" — leaf 0x40000000 vendor signature ("KVMKVMKVM"), hypervisor CPUID interface'i. https://www.kernel.org/doc/html/latest/virt/kvm/x86/cpuid.html
- Microsoft Hypervisor TLFS, "Nested Virtualization" — hypervisor CPUID leaf'leri (0x40000000+). https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/nested-virtualization