Skip to content

Stealth VT-x hypervisor anti-detection (CPUID/RDTSC spoofing)

Thin bir Intel VT-x hypervisor, CPUID exit'lerini intercept ederek hypervisor-present bit'ini ve vendor leaf'lerini gizleyerek ve TSC'yi yöneterek VM-exit'lerin cycle maliyetini guest timing kontrollerinden maskeleyerek gözlemlenebilir footprint'ini minimize eder.

Mechanism

Note

Bir guest bir hypervisor'ı yalnızca CPU'nun açtığı mimari kanallardan "görebilir". İkisi baskındır. CPUID: leaf 1 bir hypervisor-present bit'i (CPUID.1:ECX[31]) raporlar ve leaf aralığı 0x40000000–0x400000FF hypervisor vendor signature'ını taşır. VT-x'te CPUID her zaman bir VM-exit doğurur, dolayısıyla hypervisor her probe'u görür ve dönen register'ları yeniden yazabilir — ECX[31]'i temizleyip vendor leaf'leri sıfırlayarak/sahteleyerek guest'in bare metal'de olduğuna inanmasını sağlar. Timing (RDTSC/RDTSCP): virtualization, VM-exit eden işlemlere (CPUID, belirli MSR/CR access'leri) latency ekler. Bir guest rdtsc; cpuid; rdtsc timing'ler ve anormal büyük bir delta'yı flag'ler. Stealth bir hypervisor buna VT-x TSC-offset ve TSC-scaling control'leri (ve RDTSC'yi trap'leyerek) ile karşı koyar; guest'e exit maliyetini gizleyen bir timeline verir.

İzolasyon açısı burada terstir: host'u guest'ten korumak yerine, hypervisor guest'in virtualization sınırı görüşünü manipüle eder ki in-guest detection (tipik olarak anti-analysis malware) VM'i donanımdan güvenilir biçimde ayırt edemesin.

Walkthrough

Klasik guest-side probe'lar ve hypervisor'ın karşı-handling'i:

  1. Hypervisor-bit probe — guest çalıştırır:
    mov eax, 1
    cpuid
    bt  ecx, 31      ; CF = hypervisor-present bit
    
    CPUID VM-exit handler'ı guest'e dönen değerde bit 31'i temizler, böylece CF=0.
  2. Vendor-leaf probe — guest, "KVMKVMKVM", "Microsoft Hv", "VMwareVMware" gibi bir signature bekleyerek EAX=0x40000000 ile CPUID çalıştırır. Handler sıfır (ya da sahte bare-metal-benzeri yanıt) döndürür, VMM kimliğini gizler.
  3. Timing probe — guest rdtsc; cpuid; rdtsc delta'sını bir threshold'a karşı ölçer (bkz. rdtsc-timing-detection.md). Hypervisor bir TSC offset uygular ki ikinci rdtsc native execution'la tutarlı görünen bir maliyet yansıtsın.
Spoof'lanmış CPUID handler mantığı (kavramsal)
on VMEXIT(CPUID):
    leaf = guest_RAX
    native_cpuid(leaf, &regs)
    if leaf == 1:          regs.ECX &= ~(1u<<31)   # hypervisor bit'i gizle
    if leaf in 0x40000000..0x400000FF: regs = {0,0,0,0}  # vendor leaf'leri gizle
    set guest registers = regs
    advance guest RIP past CPUID

Warning

Anti-evasion / VM-introspection research ve thin-hypervisor projelerinde belgelenmiştir. CPUID/RDTSC spoofing kolay belirtileri handle eder; tek başına her detection vector'ünü yenmez (bkz. Mitigation).

Detection

CPUID/RDTSC spoofing ile bile, residual sinyaller bir VMM'i ele verir:

  • CPU errata probing: gerçek bir CPU'nun sahip olduğu ama emulator/hypervisor'ın ince bir şekilde yanlış yaptığı microarchitectural quirk/errata sorgulamak (bkz. cpu-errata-probing-for-vm-detection.md).
  • Diğer forced-exit timing: yalnızca CPUID timing'i tune edilmişse, exit eden descriptor-table ya da MSR access'leri hâlâ şişmiş latency gösterebilir.
  • Descriptor-table relocation (SIDT/SGDT Red Pill kontrolü, bkz. red-pill.md) ve interrupt-latency varyansı.

Mitigation (hypervisor'ın stealth'i ve sınırları için)

  • Stealth'i güçlendirmek için: TSC'yi tüm exit yollarında tutarlı virtualize et, descriptor-table instruction'larını trap'le ve errata yanıtlarını normalize et — büyük, kırılgan bir surface.
  • Böyle bir hypervisor'ı saptamaya çalışan defender/analist'ler için: birden çok bağımsız kanalı birleştir (errata + birkaç exit tipinin timing'i + descriptor-table kontrolleri); tek bir spoof hepsini kapsamaz.

References