Skip to content

VM-exit latency fingerprinting

Bir VM-exit'i zorlayan instruction'ları (ör. CPUID) timing yaparak bir hypervisor'ı tespit etmek: exit + handler + entry round-trip'i native execution'dan çok daha fazla cycle'a mal olur ve bu açığı hypervisor'ın tamamen gizlemesi zordur.

Mechanism

Note

Bazı instruction'lar koşulsuz (ya da konfigürasyonla) intercept edilir, dolayısıyla virtualization altında bir VM-exit'e yol açar. CPUID kanonik örnektir. Detector'ın dayandığı invariant: bir VM-exit, guest state'i kaydetmeli, hypervisor'a geçmeli, handler'ı çalıştırmalı ve yeniden girmelidir — tamamen silinemeyen architectural bir maliyet. Native olarak CPUID ~80–200 cycle'dır; bir hypervisor altında exit+handler+entry ~500–2.000+ cycle ekler. CPUID'yi RDTSC ile çevreleyip bir threshold'a karşı kıyaslayarak, bir guest virtualize olduğunu çıkarsayabilir — bir "red pill" timing oracle'ı. Hypervisor bunu TSC offsetting ile köreltebilir, ama kümülatif TSC oynaması monotonluğu bozar, dolayısıyla evasion kusurludur.

Walkthrough

Public referans: Rossow vd., "Detecting Hardware-Assisted Virtualization" (DIMVA 2016). Kavramsal ölçüm:

  1. Trap eden bir instruction seç. CPUID bir VM-exit'i zorlar ve ring-3'ten kullanılabilir, bu da onu standart probe yapar.
  2. Onu çok kez timing yap cycle counter ile:
    uint64_t t0 = __rdtsc();
    __cpuid(regs, 0);             /* forces a VM-exit under a hypervisor */
    uint64_t dt = __rdtsc() - t0;
    
    Noise'u bastırmak için çok sayıda iterasyon üzerinden minimum/median al.
  3. Threshold. Native CPUID düşük cycle'larda kümelenir; virtualize edilmiş, yüzlerce–binlerce cycle daha yüksekte kümelenir. Threshold'un üzerinde ölçülen bir median, bir hypervisor'ı işaret eder.
  4. Sağlamlık. Bağımsız bir timer'a (HPET/PM-timer) karşı kıyasla ki TSC offsetting sonucu sessizce normalize edemesin; bir "trap next RDTSC" savunmasına direnmek için probe'u (diğer intercepted op'lar) çeşitlendir.

Beklenen gözlemlenebilir: aynı silikonda aynı instruction için bimodal bir latency dağılımı — bare metal'e karşı virtualize.

Warning

Hem malware/anti-cheat tarafından sandbox'lardan kaçmak için, hem de savunmacılar tarafından bir stealth hypervisor'ı tespit etmek için kullanılır; teknik için dokümante edilmiştir.

Detection

  • VMM tarafından: RDTSC; CPUID; RDTSC'yi sıkı şekilde loop'layan bir guest, bir timing probe'unun imzasıdır ve CPUID exit oranı üzerinden gözlemlenebilir.

Mitigation

  • Stealth VMM'ler, görünür maliyeti normalize etmek için intercept'leri azaltır ve TSC offsetting / "trap next RDTSC" uygular (bkz. TSC offset / TSC scaling emulation ve stealth VT-x anti-detection) — ama cross-timer kontrolleri bunu sınırlar.
  • Kötü amaçlı bir hypervisor'ı tespit etmek isteyen savunmacılar, tek bir TSC-bazlı threshold yerine çapraz-referanslı bağımsız clock'ları tercih etmelidir.

References

  • C. Rossow et al., "Detecting Hardware-Assisted Virtualization" (DIMVA 2016): https://www.christian-rossow.de/publications/detectvt-dimva2016.pdf