Skip to content

Xen grant v2-to-v1 BUG() host crash (CVE-2018-7541)

Bir domain'in grant table'ını v2'den v1'e geçirmek v2 status page'lerini serbest bırakır ama outstanding mapping kontrolünü bir error döndürmek yerine BUG() ile yapar — guest tarafından tetiklenebilen bir hypervisor crash (ve eski sürümlerde bir UAF).

Mechanism

Bug class / invariant

Grant table'ların v1 ve v2 ABI'leri vardır; v2 ayrı status page'leri ekler. Bir guest v2→v1 geçişi yaptığında Xen status page'lerini serbest bırakmalıdır — ama yalnızca hâlâ map'li değillerse. Kod bu önkoşulu guest'e graceful bir error return yerine internal bir BUG() assertion olarak ifade ediyordu. İhlal edilen invariant şudur: guest tarafından ulaşılabilen error koşulları error olarak döndürülmeli, asla assert edilmemelidir. Bir guest, host'u crash etmek için assertion'ı deterministik olarak tetikleyebilir. Çok eski Xen'de (4.0–4.2), page'ler hâlâ map'liyken yeniden kullanılabiliyordu bile — info disclosure / privilege escalation'a olanak tanıyan bir use-after-free.

Walkthrough

Conceptual only

XSA-255'ten high-level yeniden kurgu.

  1. Bir guest grant v2 status page'lerini kurar ve bir reference/mapping tutar.
  2. Grant v1'e geri geçiş ister.
  3. Teardown'un mapping kontrolü BUG()'ı tetikler ve hypervisor'ı crash eder (DoS); Xen 4.0–4.2'de page map'liyken serbest bırakılabilir (UAF).

Detection

  • Grant-table sürümünü (v2↔v1) anormal şekilde değiştiren guest'ler.
  • Grant-table teardown / BUG()'a atıfta bulunan hypervisor panic log'ları.

Mitigation

  • XSA-255 patch'lerini uygula (Xen 4.0+; 4.6–4.10 ve unstable için branch bazlı patch setleri); bunlar assert etmek yerine bir error döndürür.
  • Workaround: hypervisor command line'da v2 grant table'ları devre dışı bırak (v2'ye bağımlı guest'leri bozar).

References