Skip to content

TSC offset / TSC scaling emulation (timing spoofing)

Guest'in time-stamp counter'ını virtualize etmek: VMCS/VMCB, CPU'nun exit olmadan RDTSC/RDTSCP'ye uyguladığı 64-bit bir TSC-offset (ve opsiyonel TSC-multiplier) taşır; bu da bir hypervisor'ın tutarlı — ya da kasıtlı olarak spoof edilmiş — bir guest clock sunmasına izin verir.

Mechanism

Note

RDTSC, CPU time-stamp counter'ını okur. Virtualization altında guest, migration boyunca ve VM-exit'ler boyunca tutarlı (coherent) bir TSC görmelidir ve stealth bir hypervisor bu exit'lerin maliyetini gizlemek isteyebilir. Invariant: "RDTSC exiting" control'ü kapalı ve "use TSC offsetting" açıkken, CPU guest RDTSC/RDTSCP için VM-exit olmadan host_TSC + TSC_OFFSET (64-bit bir VMCS field'ı) döner; TSC scaling destekleniyorsa, değer önce 64-bit TSC-multiplier ile çarpılır sonra offset'lenir (host_TSC * mult + offset). Ayarlama hardware'de olduğu için guest offset'in kendisini ölçemez. Detection-evasion açısı: gerçek bir VM-exit ~1,200–2,000+ cycle'a mal olur; TSC_OFFSET'i dürterek bir hypervisor, CPUID-tetikli bir exit'i guest'in bir sonraki RDTSC'sine near-native ~200–400 cycle'lık bir event gibi gösterebilir — ama kümülatif kurcalama monotonicity'yi bozar (watchdog timeout'ları), ki bu spoofing'in temel sınırıdır.

Walkthrough

Public referanslar: Intel SDM Vol. 3C (TSC-offset / TSC-multiplier execution control'leri) ve KVM x86 timekeeping dokümantasyonu. Kavramsal kullanım:

  1. Politikayı seç. RDTSC exiting = 0 ve use TSC offsetting = 1 ile VMCS TSC-offset'ini guest'in host_TSC + offset görmesini sağlayacak şekilde programla.
  2. Scaling (opsiyonel). Part TSC scaling destekliyorsa, guest TSC frekansının bir hedefe uymasını sağlamak için TSC-multiplier'ı ayarla (migration için farklı frekanstaki host'lar arasında kullanılır). Guest host_TSC * mult + offset okur.
  3. Stealth varyant ("trap next RDTSC"). Bazı exit'leri (ör. CPUID) intercept eden bir hypervisor, TSC_OFFSET'i kalıcı olarak kaydırmak (ki bu clock'u desenkronize ederdi) yerine yalnızca CPUID exit'inin hemen ardından gelen tek RDTSC'yi intercept edip native timing ile tutarlı bir değer dönebilir.
  4. VM-entry'de hardware offset/scale'i otomatik uygular; guest RDTSC asla exit etmez.

Beklenen gözlem: RDTSC ile CPUID latency'sini ölçen bir guest, iyi ayarlanmış bir offset altında near-native cycle'lar görür; bu olmadan ise ham, multi-thousand-cycle exit maliyetini görür.

Warning

Dual-use: meşru (migration/time coherence) ve evasive (bir hypervisor'ı timing detection'dan gizleme). Mekanizma için belgelenmiştir.

Detection

  • Cross-clock karşılaştırması: CPUID/RDTSC'yi bağımsız bir referansa (HPET, ACPI PM timer, wall-clock ya da başka bir core) karşı ölç — offset spoofing TSC'yi bunlara göre kaydırır ve harici bir clock'a karşı zorlanmış TSC monotonicity tampering'i açığa çıkarır. Bu, VM-exit latency fingerprinting ve RDTSC timing detection'ın temelidir.
  • İstatistiksel: spoof edilmiş timing'ler inandırıcı olmayacak kadar düşük variance / clamping gösterir.

Mitigation

  • Timing'e güvenen defender'lar yalnızca TSC'ye güvenmemeli; birden çok bağımsız timer'ı cross-check etmeli ve guest timing yerine VMM'den exit-count telemetry'sini kullanmalıdır.
  • Operatörler: TSC frekansını pin'le ve migration için hardware TSC scaling kullan ki meşru offsetting stabil ve auditable olsun.

References

  • Intel 64 and IA-32 Architectures SDM, Vol. 3C — TSC-offset / TSC-multiplier VM-execution controls: https://cdrdv2-public.intel.com/825750/326019-sdm-vol-3c.pdf
  • The Linux Kernel — Timekeeping Virtualization for x86 (KVM): https://docs.kernel.org/virt/kvm/x86/timekeeping.html