Skip to content

Xen CMPXCHG8B operand-size emulator infoleak (CVE-2016-9932)

x86 instruction emulator'ı CMPXCHG8B/CMPXCHG16B için aşırı genel bir operand boyutu kullandı ve guest'e fazladan uninitialized hypervisor stack byte'ları döndürdü.

Mechanism

Bug sınıfı / invariant

CMPXCHG8B 8-byte'lık bir operand üzerinde, CMPXCHG16B ise 16-byte'lık bir operand üzerinde çalışır — operand boyutu her zaman 8 ya da 16'dır. Xen'in emulator'ı bunun yerine bazı path'lerde "yanlış, tamamen genel" bir operand boyutu değeri kullandı, dolayısıyla bir emülasyon sonucunu guest'e doğru geri kopyalarken instruction'ın gerçekte tanımladığından daha fazla byte aktardı. Bu fazladan byte'lar uninitialized hypervisor stack'ten geldi. İhlal edilen invariant şudur: guest'e yalnızca mimari olarak tanımlanan operand byte'ları döndürülebilir. XSA-200'e göre leak miktarı 64-bit mode'daki guest'ler için 96 bit, diğer guest'ler için 32 bit uninitialized hypervisor stack verisidir.

Walkthrough

Yalnızca kavramsal

XSA-200'den üst düzey yeniden kurulum.

  1. Bir guest, Xen'in emüle etmesi gereken memory üzerinde CMPXCHG8B/CMPXCHG16B çalıştırır.
  2. Emulator sonuç buffer'ını sabit 8/16-byte genişlik yerine yanlış, genelleştirilmiş bir operand boyutu kullanarak hesaplar.
  3. Aşırı boyutlu kopyalama bayat hypervisor stack byte'larını guest'e geri verir ve hypervisor ASLR'sini aşmak ya da ileri saldırılar hazırlamak için kullanılabilir bilgiyi leak eder.

Detection

  • Doğrudan gözlemlenmesi zor (saf read leak). MMIO/emüle edilmiş bölgelere karşı sık emüle edilmiş lock/CMPXCHG operasyonu tetikleyen guest'lere dikkat et.
  • Sonraki exploitation göstergeleriyle (örn. KASLR aşan davranış) korele et.

Mitigation

  • Emulator kopyalamasını mimari operand genişliğiyle sınırlayan XSA-200 patch'ini uygula (etkilenen Xen 3.3–4.7; 4.8+ zaten doğru).
  • Defense in depth: emulator scratch buffer'larını zero-initialize et; hypervisor'ı güncel tut.

References