CPUID hypervisor-present bit detection¶
CPUID leaf 1, ECX bit 31'i ("hypervisor present") okuyarak kodun bir virtual machine içinde çalıştığını öğrenmek.
Mechanism¶
Note
Bare metal'de CPUID leaf 1 ECX bit 31 mimari olarak reserved'dır ve 0 okunur.
Konvansiyon gereği her mainstream hypervisor, bir guest CPUID execute
ettiğinde bu bit'i 1 yapar. Buradaki ilgili sınır transparency'dir: CPUID'i
virtualize eden bir hypervisor (Intel/AMD'de her zaman bir VM-exit doğurur, yani
host sonucu synthesize edebilir) varlığını kasıtlı olarak ilan eder. Dolayısıyla
detection bir escape değildir — malware ve CTF guest'lerinin farklı davranıp
davranmayacağına karar vermek için (anti-analysis) kullandığı, defender'ların ise
nested-virt postürünü doğrulamak için kullandığı bir recon'dur.
Bit cooperative bir sinyaldir: bir hypervisor stealth için onu temizlemeyi seçebilir (bkz. stealth VT-x anti-detection); bu yüzden present bit yalnızca first-pass bir heuristic'tir ve genellikle vendor-ID leaf probing ve timing kontrolleriyle birleştirilir.
Walkthrough¶
Public reference: KVM, Hyper-V, Xen HVM, VMware vb. tarafından kullanılan konvansiyonel hypervisor CPUID interface'i. Temsili guest probe:
unsigned int eax = 1, ecx = 0;
__asm__ volatile("cpuid"
: "+a"(eax), "=c"(ecx) : : "ebx", "edx");
if (ecx & (1u << 31))
/* hypervisor present */;
Beklenen gözlem: bir VM'de bit set'tir; bare metal'de clear'dır. CPUID
koşulsuz olarak host'a exit ettiği için, host dönen değeri tamamen kontrol eder.
Warning
Clear bir bit bare metal'i kanıtlamaz — stealth bir hypervisor onu bastırabilir. Set bir bit, virtualization'ın güvenilir kanıtıdır; çünkü onu temizlemek kasıtlı, daha az yaygın bir tercihtir.
Detection¶
- Bu bir detection tekniğidir (guest'in host'u saptaması). Host perspektifinden
gözlem, EAX=1 ile bir
CPUIDVM-exit'idir; process başlangıcından hemen sonra sık leaf-1 probing yaygın bir anti-analysis fingerprint'idir. - Bir monitor,
CPUID'den hemen sonra ECX bit 31 üzerinde branch yapan guest kodunu flag'leyebilir.
Mitigation¶
- Gizli kalmak isteyen analiz sandbox'ları için: synthesize edilen CPUID sonucunda ECX bit 31'i temizle (bit'e dayanan paravirtual enlightenment'ların o zaman devre dışı kalacağını kabul ederek).
- Bit'in dürüst olmasını isteyen defender'lar için (çoğu cloud): set bırak; doğru sinyal guest tooling'e ve nested-virt detection'a yardımcı olur.
- Policy'yi vendor-ID leaf kararıyla eşleştir ki iki CPUID-based sinyal tutarlı olsun.
References¶
- The Linux Kernel, "KVM CPUID bits" — hypervisor CPUID interface, leaf 0x40000000 ve hypervisor-present konvansiyonu. https://www.kernel.org/doc/html/latest/virt/kvm/x86/cpuid.html
- "Reaching the far corners of MATRIX: generic VMM fingerprinting" (Source Seattle 2015) — CPUID-tabanlı VM detection. http://www.c7zero.info/stuff/source-seattle-2015-generic_vmm_fingerprinting.pdf