Skip to content

Xen INVPCID non-canonical address host crash (CVE-2018-19965)

Guest tarafından ulaşılabilen bir TLB-flush path'i INVPCID'ye non-canonical bir address geçiriyordu; bu da #GP(0) yükseltir ve host'u crash eder — PCID tabanlı Meltdown mitigation'larının getirdiği bir regression.

Mechanism

Bug class / invariant

INVPCID instruction'ı, non-canonical bir linear address'i invalidate etmesi istendiğinde #GP(0) ile fault verir. Xen, Meltdown (KPTI tarzı) mitigation'larının performans maliyetini azaltmak için PCID'yi benimsediğinde, bir TLB-flush kod path'i guest-etkili address'leri canonical formu sağlamadan INVPCID'ye geçirmeye başladı. İhlal edilen invariant şudur: hypervisor context'inde INVPCID'ye verilen address'ler canonical olmalıdır. 64-bit bir PV guest, o path'e non-canonical bir address sürüp handle edilmeyen bir #GP tetikleyebilir ve host'u crash edebilir.

Walkthrough

Conceptual only

XSA-279'dan high-level yeniden kurgu.

  1. 64-bit bir PV guest, Xen'in TLB-flush mantığının guest-controlled, non-canonical bir address için INVPCID yayınlamasına yol açan operasyonlar gerçekleştirir.
  2. INVPCID, hypervisor context'inde #GP(0) yükseltir.
  3. Beklenmedik fault host'u crash eder (DoS).

Detection

  • Intel Haswell+ üzerinde hypervisor #GP fault'larını tetikleyen 64-bit PV guest'ler.
  • TLB-flush / INVPCID çevresindeki host panic log'ları.

Mitigation

  • XSA-279 patch'ini uygula (Xen 4.6–4.11.x); bu, INVPCID'den önce address'i canonicalize eder/korur.
  • Workaround: pcid=0 ya da invpcid=0 ile boot et.
  • Surface bazlı mitigation: yalnızca 64-bit PV guest'ler etkilenir; HVM/PVH/32-bit PV etkilenmez.

References