Skip to content

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ış:

  1. Descriptor-table exiting secondary VM-execution control'ünü set et.
  2. Guest örneğin yeni bir interrupt descriptor table kurmak için LIDT, ya da IDT base'ini okumak için SIDT execute eder.
  3. 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.
  4. 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.
  5. 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/SGDT sonuç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