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:
- Politikayı seç.
RDTSC exiting = 0veuse TSC offsetting = 1ile VMCS TSC-offset'ini guest'inhost_TSC + offsetgörmesini sağlayacak şekilde programla. - 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 + offsetokur. - 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ızcaCPUIDexit'inin hemen ardından gelen tekRDTSC'yi intercept edip native timing ile tutarlı bir değer dönebilir. - VM-entry'de hardware offset/scale'i otomatik uygular; guest
RDTSCasla 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