Xen 2-level event channel 32-bit limit corruption (CVE-2020-25600)¶
32-bit bir PV/HVM domain, desteklenen 1023 limitinin ötesinde event channel allocate edebilir ve 2-level event-channel bitmap'lerinin ötesine, shared-info yapısının diğer alanlarına yazabilir.
Mechanism¶
Bug sınıfı / invariant
Xen'in 2-level event-channel ABI'si pending/masked bitmap'leri guest ile
paylaşılan shared_info page'inde saklar. Kullanılabilir channel sayısı word
boyutuna bağlıdır: 32-bit x86 domain'ler için 1023'e karşılık 64-bit/ARM
için 4095. Bug: domain-başına channel limiti domain initialization sırasında,
domain'in hâlâ 64-bit olarak ele alındığı bir anda, domain özellikleri
(32-bit'lik) dikkate alınmadan önce kaydedilmişti. İhlal edilen invariant
şudur: event-channel index'leri domain'in gerçek word genişliğine göre
boyutlandırılmış bitmap bölgesinin içinde kalmalıdır. 32-bit bir domain'de
1024–4095 aralığında channel allocate etmek, bit operasyonlarının komşu
shared_info alanlarına düşmesine neden olur — paylaşımlı yapı içinde
kontrollü bir out-of-bounds write.
Walkthrough¶
Yalnızca kavramsal
XSA-342'den üst düzey yeniden kurulum.
- 32-bit bir domain (veya başkalarına hizmet veren 32-bit bir domain) index 1023'ün ötesinde event channel allocation'ı talep eder.
- Kaydedilen limit 64-bit varsayılanını yansıttığı için request reddedilmez.
- Bu yüksek channel'lar için yapılan pending/mask bit güncellemeleri 32-bit bitmap'in ötesini indekler ve shared-info yapısının komşu kısımlarını bozar; bu da sistem geneli bir DoS'a yol açar.
Detection¶
- Anormal derecede yüksek sayıda event channel allocate eden domain'ler, özellikle 1023 sınırına yakın/üzerinde olan 32-bit guest'ler.
- Tek bir 32-bit domain ile korele hypervisor instabilitesi veya Dom0 arızası.
- Domain-başına
EVTCHNOP_*hypercall hacmi üzerine telemetri.
Mitigation¶
- Limiti domain word boyutu belirlendikten sonra kaydeden XSA-342 patch'ini uygula (Xen 4.4'ten 4.14/unstable'a kadar).
- Konfigürasyon mitigation'ı: 32-bit bir guest'in event channel'larını 1023 ile sınırla.
- FIFO event channel'ları tercih etmek burada bir düzeltme değildir; sorun spesifik olarak 2-level limit bookkeeping'idir.