Skip to content

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 CPUID VM-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