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.
- 64-bit bir PV guest, Xen'in TLB-flush mantığının guest-controlled, non-canonical
bir address için
INVPCIDyayınlamasına yol açan operasyonlar gerçekleştirir. INVPCID, hypervisor context'inde#GP(0)yükseltir.- Beklenmedik fault host'u crash eder (DoS).
Detection¶
- Intel Haswell+ üzerinde hypervisor
#GPfault'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=0ya dainvpcid=0ile boot et. - Surface bazlı mitigation: yalnızca 64-bit PV guest'ler etkilenir; HVM/PVH/32-bit PV etkilenmez.