Xen CMPXCHG8B operand-size emulator infoleak (CVE-2016-9932)¶
x86 instruction emulator'ı
CMPXCHG8B/CMPXCHG16Biç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.
- Bir guest, Xen'in emüle etmesi gereken memory üzerinde
CMPXCHG8B/CMPXCHG16Bçalıştırır. - Emulator sonuç buffer'ını sabit 8/16-byte genişlik yerine yanlış, genelleştirilmiş bir operand boyutu kullanarak hesaplar.
- 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/
CMPXCHGoperasyonu 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.