Descriptor-table exiting (GDTR/IDTR/LDTR/TR access exit)¶
VT-x "descriptor-table exiting" control'ünü etkinleştirip guest LGDT/SGDT/LIDT/SIDT/LLDT/SLDT/LTR/STR instruction'larının bir VM-exit doğurmasını sağlamak; böylece hypervisor guest'in segment ve interrupt descriptor table'larını izleyebilir ya da koruyabilir.
Mechanism¶
Note
GDT, IDT, LDT ve TSS bir guest'in segmentation'ını, interrupt vector'lerini ve
task state'ini tanımlar — bir OS'un (ve bir introspection monitor'ünün)
integrity'sine güvendiği privileged yapılardır. İlgili register'lar
(GDTR/IDTR/LDTR/TR) LGDT/LIDT/LLDT/LTR ile load edilir ve
SGDT/SIDT/SLDT/STR ile okunur. Tarihsel olarak store formları
(SGDT/SIDT/SLDT/STR) privileged değildi ve trap etmezdi; bu, klasik
Red Pill VM-detection trick'inin temelidir. VT-x bir
descriptor-table exiting secondary VM-execution control'ü ekler ki bu
instruction'ların guest formları bir VM-exit doğursun; böylece host yeni
descriptor table load'larını (örn. IDT hooking, rootkit GDT swap'ları)
gözlemleyip emüle edebilir ya da veto edebilir.
Sınır, host'un guest descriptor state'ini gözlemleyebilmesi/koruyabilmesidir. Bunu
etkinleştirmek ayrıca stealth bir hypervisor'ın SIDT/SGDT'yi intercept edip dönen
base'i spoof etmesine, Red Pill tarzı detection'ı etkisizleştirmesine izin verir
(bkz. stealth VT-x anti-detection).
Walkthrough¶
Public reference: Intel SDM Vol. 3C, secondary processor-based control'ler, "Descriptor-table exiting". Kavramsal akış:
- Descriptor-table exiting secondary VM-execution control'ünü set et.
- Guest örneğin yeni bir interrupt descriptor table kurmak için
LIDT, ya da IDT base'ini okumak içinSIDTexecute eder. - CPU bir VM-exit yükseltir (GDTR/IDTR ya da LDTR/TR access için exit reason). Exit qualification instruction ve operand bilgisini encode eder.
- Host işlemi inceler — monitoring için yeni IDT/GDT base'i kaydeder; koruma için bir load'ı reddedebilir; stealth için bir store'da spoof'lanmış bir base döndürebilir.
- Resume.
Beklenen gözlem: guest IDT/GDT/LDT/TR değişimlerinde descriptor-table-access exit'leri; control olmadan store formları guest içinde sessizce execute olur.
Warning
Descriptor-table exiting bir secondary control'dür ve tüm part'larda implement edilmemiştir; bir monitor ona güvenmeden önce capability MSR'larını kontrol etmelidir. Tek başına, zaten load edilmiş bir table'ın in-memory tamper'lanmasını engellemez — onu table page'lerinin EPT write-trapping'i ile eşleştir.
Detection¶
- Bir guest bu monitoring'i
SIDT/SGDT'yi timing'leyerek saptayabilir: trap'lanan bir store native'inden çok daha yavaştır. Tersine, bir hypervisor bunları trap'siz bırakırsa, guest virtualization'ı saptamak için Red Pill (descriptor base relocation) kullanabilir.
Mitigation¶
- IDT/GDT integrity'sini izlemek ve korumak için descriptor-table exiting'i desteklendiği yerde etkinleştir; tamper direnci için table page'lerinin EPT koruması ile birleştir.
- Analiz sandbox'ları için, Red Pill'i yenmek üzere
SIDT/SGDTsonuçlarını intercept edip spoof et — kalan timing side channel'ını kabul ederek. - Nested virtualization'da, L0'ın control'ü sadakatle virtualize etmesini sağla ki L1'in descriptor-table policy'si L2'ye uygulansın.
References¶
- Intel 64 and IA-32 SDM, Vol. 3C, "Descriptor-Table Exiting" (secondary processor-based VM-execution control'leri; LGDT/LIDT/LLDT/LTR/SGDT/SIDT/SLDT/STR). https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-1077.html