Xen hypercall_create_continuation BUG() crash (CVE-2019-18420)¶
Variadic
hypercall_create_continuation()'a (VCPUOP_initialiseüzerinden ulaşılabilir) geçirilen malformed bir format specifierBUG()'ı tetikler ve hypervisor'ı crash eder.
Mechanism¶
Bug class / invariant
hypercall_create_continuation(), bir hypercall yeniden başlatılması (preempt
edilmesi) gerektiğinde argümanlarını marshal etmek için printf tarzı bir format
string kullanan variadic bir helper'dır. Guest tarafından ulaşılabilen bir path
(x86 PV'de VCPUOP_initialise) bir beklenmedik/desteklenmeyen format
karakterinin işlenmesine yol açabiliyordu ve error handling graceful bir
failure yerine BUG() çağırıyordu. İhlal edilen invariant XSA-255 ile aynı
savunmacı ilkedir: guest tarafından ulaşılabilen error state'leri assert
edilmemelidir. Guest, host'u deterministik olarak crash eder.
Walkthrough¶
Conceptual only
XSA-296'dan high-level yeniden kurgu.
- Bir x86 PV guest, etkilenen hypercall continuation path'ini (
VCPUOP_initialiseüzerinden) kötü bir format karakteri üreten koşullar altında çağırır. hypercall_create_continuation()desteklenmeyen-specifier branch'ine düşer.BUG()tetiklenir ve hypervisor'ı panic'e sokar — sistem genelinde bir DoS.
Detection¶
- Olağandışı
VCPUOP_initialisedesenleri yayınlayan PV guest'ler. hypercall_create_continuation/BUG()'a atıfta bulunan hypervisor panic'leri.
Mitigation¶
- XSA-296 patch'ini uygula (Xen 4.6+; 4.9+ için
xsa296.patch, 4.7–4.8 içinxsa296-4.8.patch). Workaround yoktur. - Surface azaltarak mitigation: yalnızca HVM/PVH guest'ler çalıştır (bu path'e yalnızca x86 PV ulaşabilir).