Xen failsafe callback stack overlap (CVE-2017-8905)¶
64-bit bir PV guest'e failsafe callback iletirken, Xen'in stack-range kontrolü fazladan dört saved-segment slot'unu hesaba katmadı; bu da bir guest'in hedeflenen page'in ötesine yazıp sahibi olmadığı memory'yi bozmasına olanak tanıdı.
Mechanism¶
Bug sınıfı / invariant
64-bit bir PV guest'in failsafe callback'ine dönmek için Xen, saved segment register'larını (DS, ES, FS, GS) push eder — normal exception frame'in ötesinde fazladan dört stack slot'u. Hedef guest stack bölgesinin kabul edilebilir olmasını sağlayan address-range doğrulaması, bounds hesabından bu dört slot'u atladı. İhlal edilen invariant şudur: Xen'in bir guest stack frame'ine yazdığı tüm byte'lar doğrulanmış, guest'e ait range içinde kalmalıdır. Fiziksel memory'si belirli sınırlara (≈3.5 TB / 5 TB) uzanan host'larda yazma, guest'e ait olmayan bir fiziksel page'e taşabilir ve corruption, crash, info disclosure veya privilege escalation'a olanak tanır.
Walkthrough¶
Yalnızca kavramsal
XSA-215'ten üst düzey yeniden kurulum.
- 64-bit bir PV guest, doğrulanmış bir sınıra yakın, dikkatle seçilmiş bir stack pointer ile Xen'i failsafe-callback dönüş path'ine sürükleyen koşulları ayarlar.
- Xen, frame boyutunu fazladan dört segment slot'u olmadan doğrular.
- DS/ES/FS/GS'in gerçek push'u doğrulanmış range'in ötesine, guest'in dışındaki bir page'e yazar ve host ile ilgili memory'yi bozar.
Detection¶
- Bir PV guest'ten gelen sık failsafe-callback / segment-reload fault'ları.
- Tek bir PV domain'e bağlı, büyük-memory'li host'larda host memory corruption'ı veya crash'leri.
Mitigation¶
- Fazladan dört slot'u range kontrolüne dahil eden XSA-215 patch'ini uygula (Xen 4.5.x/4.6.x; 4.7+ zaten doğru).
- Mitigation: yalnızca HVM veya 32-bit PV guest çalıştır (yalnızca 64-bit PV etkilenir).