Skip to content

Xen Ouroboros hypercall vulnerabilities (Tearing Xen with the Snake)

Black Hat USA 2016 "Ouroboros" araştırması (Shangcong Luan, Alibaba Cloud), iki Xen x86 PV pagetable fast-path bug'ı üzerine — XSA-148/CVE-2015-7835 (kontrolsüz superpage'ler) ve XSA-182/CVE-2016-6258 (writable self-referential pagetable) — bir PV guest'e keyfi machine-memory R/W ve host escape verir.

Mechanism

Note

Xen PV guest'leri kendi page table'larını yönetir, ama Xen her update'i validate eder ve pagetable page'lerini MFN başına bir type+refcount sistemi aracılığıyla read-only tutar. İzolasyon invariant'ı şudur: bir guest asla canlı bir pagetable üzerinde writable bir mapping elde edemez. mod_l{1..4}_entry() update handler'ları, bir update yalnızca "güvenli" bit'leri değiştirdiğinde tam re-validation'ı atlayan bir fast-path'e sahiptir. Ouroboros konuşması bu varsayımın fazla geniş olduğu iki durumu gösterir: bir guest bir operasyonu hypercall'lar arasında böler; böylece fast-path, strict path'in reddedeceği bir bit'i flip eder ve bir pagetable üzerinde writable bir mapping üretir. Guest bir kez kendi pagetable'larını yazabildiğinde herhangi bir machine frame'i map'leyebilir — guest'ten host belleğine kaçar.

İki bug:

  • XSA-148 / CVE-2015-7835 — large-page (superpage) mapping'lerin kontrolsüz oluşturulması: L2 fast-path'i, izin verilmeyen flag'ler 0, present-ve-MFN eşleştiği zaman yeni bir entry'yi onaylar — ama PSE=1'i W=1 ile set etmek yine de geçer ve superpage validation'ı bypass eden writable bir 2 MB mapping verir. Bkz. XSA-148 PV pagetable fast-path validation.
  • XSA-182 / CVE-2016-6258 — bir self-referential ("Ouroboros") pagetable: Xen'in linear-pagetable check'i yalnızca read-only self-reference'lara izin verir, ama fast-path, present/MFN eşleştiği için mevcut bir read-only self-reference'ın read-write'a flip edilmesine olanak tanır. Bkz. XSA-182 PV pagetable / Qubes escape.

Walkthrough

Public reference: Black Hat USA 2016 whitepaper'ı "Exploit Two Xen Hypervisor Vulnerabilities" ve XSA advisory'leri. Conceptual reproduction path (örnekleyici — public materyal; weaponized bir chain yok):

  1. Normal bir hypercall aracılığıyla, izin verilen bir state'te bir pagetable entry oluştur (örneğin bir read-only self-reference ya da non-PSE bir entry).
  2. Yalnızca fast-path'in güvenli saydığı bit'i (W ya da PSE+W) değiştiren ikinci bir update yayınla; bu, permissive fast-path'i tetikler ve invariant check'ini atlar.
  3. Ortaya çıkan writable mapping, canlı bir pagetable'ı guest write'larına maruz bırakır ve keyfi machine-frame read/write verir.
  4. (Primitive sonrası, yalnızca conceptual.) Whitepaper, guest ve hypervisor'ın bir address space paylaşmasından faydalanarak bir hypercall stub'ını attacker koduna yönlendirmek için per-guest hypercall page'inin ve hypervisor hypercall table'ının — her ikisi de yarı kullanılmamış — hedef olarak bulunmasını anlatır.

Warning

Bug sınıfı için belgelenmiş tarihsel, patch'lenmiş sorunlar. Yalnızca conceptual — exploit offset'i ya da shellcode yok.

Detection

  • Mevcut high-level entry'ler üzerinde, özellikle self-referential olanlarda, yalnızca _PAGE_RW'yi toggle eden (ya da PSE+W set eden) pagetable-update hypercall'ları (mmu_update/mmuext_op) yayınlayan PV guest'leri izle.
  • Patch sonrası, strict-path reddi ("Attempt to create linear p.t. with write perms") başlı başına bir göstergedir.

Mitigation

  • XSA-148 ve XSA-182 patch'lerini uygula (validation sıkılaştırıldı; böylece fast-path'ler superpage ve writable-self-reference koşullarını yeniden check eder).
  • Untrusted guest'ler için klasik PV yerine HVM/PVH'yi tercih et — burada attack surface'inin tamamı PV pagetable validation'ıdır.

References