Skip to content

Xen IRET-in-multicall PV mode confusion (CVE-2017-8903)

IRET hypercall'ını bir multicall'ın ortasına yerleştirmek, sonraki batch entry'lerinin sanki guest kernel mode'undaymış gibi çalışmasına yol açar; bu da yanlış pagetable seçimine ve accounting hatalarına neden olur ve 64-bit bir PV guest'e kendi pagetable'larına — dolayısıyla tüm belleğe — writable erişim verir.

Mechanism

Bug class / invariant

Bir Xen multicall'ı birkaç hypercall'ı batch'ler. IRET hypercall'ı guest'in mevcut mode'unu değiştirir (user↔kernel). IRET bir multicall batch'inin ortasında göründüğünde, aynı batch'teki sonraki entry'ler yanlış şekilde guest kernel-mode context'i varsayar; bu yüzden Xen yanlış pagetable'ları kullanır ve page type/reference accounting'ini yanlış izler. İhlal edilen invariant şudur: pagetable seçimini ve type-refcount'unu yöneten guest-mode context'i her hypercall için tutarlı olmalıdır. Bu karışıklık, 64-bit bir PV guest'in bazı pagetable'larına writable erişim elde etmesini sağlar; bu da tüm sistem belleğini read/write etmeye genellenir — tam host compromise.

Walkthrough

Conceptual only

XSA-213'ten high-level yeniden kurgu.

  1. 64-bit bir PV guest, bir IRET'in ardından pagetable ile ilgili hypercall'lar gelen bir multicall kurar.
  2. IRET'ten sonra batch'in mode bookkeeping'i yanlıştır; sonraki entry'ler kernel-mode varsayımlarıyla ve yanlış pagetable base'iyle çalışır.
  3. Guest bir pagetable'a writable erişim kazanır, ardından keyfi memory read/write ve host privilege'ına yükselir.

Detection

  • Diğer hypercall'lar arasına IRET gömen multicall'lar yayınlayan 64-bit PV guest'ler.
  • Tek bir PV domain'e bağlı hypervisor pagetable type/refcount validation hataları. İlgili primitive: page-table manipulation.

Mitigation

  • XSA-213 patch'ini uygula (x86'daki tüm 64-bit Xen; branch bazlı 4.5–4.8 ve unstable).
  • Mitigation: yalnızca HVM ya da 32-bit PV guest'ler çalıştır (yalnızca 64-bit PV etkilenir) ya da 64-bit PV'yi trusted administrator'larla sınırla.

References