Skip to content

Xen hypercall_create_continuation BUG() crash (CVE-2019-18420)

Variadic hypercall_create_continuation()'a (VCPUOP_initialise üzerinden ulaşılabilir) geçirilen malformed bir format specifier BUG()'ı 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.

  1. 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.
  2. hypercall_create_continuation() desteklenmeyen-specifier branch'ine düşer.
  3. BUG() tetiklenir ve hypervisor'ı panic'e sokar — sistem genelinde bir DoS.

Detection

  • Olağandışı VCPUOP_initialise desenleri 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çin xsa296-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).

References