Skip to content

Xen x86 IOMMU timeout mishandling (CVE-2021-28692)

XSA-373: Xen, x86 IOMMU command completion için spin-wait yapar, ama bir bekleme timeout olduğunda alınan aksiyon yanlıştır — AMD'de failure caller'lardan gizlenir, Intel'de ilgisiz bir guest crashed olarak işaretlenebilir.

Mechanism

Bug sınıfı: bir hardware timeout'unda hatalı failure handling

Bir IOMMU'yu programlamak (TLB'leri flush etmek, command-buffer entry'lerini tamamlamak) hardware'in acknowledge etmesini beklemeyi gerektirir. Xen bunu sınırlı spin-wait loop'larıyla yapar. Güvenlik invariant'ı: hardware zamanında tamamlanmazsa, caller operasyonun failed olduğunu öğrenmeli ve stale/partial IOMMU state'ini otoriter olarak ele almayı reddetmelidir. XSA-373, bir timeout tespit edildikten sonra olanlardaki bir bug'dır:

  • AMD path'i: üst-katman caller'lar failure hakkında bilgilendirilmez, dolayısıyla IOMMU operasyonu (örn. bir flush) başarılı olmuş gibi devam ederler. Bir device sonra stale mapping'lere karşı translate etmeyi sürdürebilir — privilege escalation ya da info leak'e yükselebilen bir confidentiality/integrity sınır ihlali.
  • Intel path'i: timeout ile ilgisiz bir guest yanlışlıkla crashed olarak işaretlenebilir — masum bir domain'e karşı denial-of-service.

Yalnızca aktif bir IOMMU'ya sahip ve device pass-through yapan guest'lerin bulunduğu configuration'lar maruz kalır.

Walkthrough

Yalnızca kavramsal

Public, patch'lenmiş XSA-373 advisory'sine dayanır; exploit ayrıntısı yok.

Mantıksal akış:

  1. Pass-through'lu bir guest IOMMU command/flush aktivitesi tetikler (map/unmap churn).
  2. IOMMU, Xen'in spin-wait loop'u timeout'una ulaşacak kadar yavaş ya da sıkışmış olur.
  3. AMD: timeout tespit edilir ama caller'a hiçbir şey söylenmez; sistem flush tamamlanmış gibi devam eder — stale translation'lar device tarafından kullanılabilir kalır.
  4. Intel: durmadan sorumlu olmayan bir domain crashed olarak işaretlenir.
  5. Net etki (advisory'ye göre): malicious bir guest host ayrıcalığına yükselebilir, host/guest DoS'una neden olabilir ya da information leak'lere yol açabilir.

Fix, timeout handling'in failure'ı caller'lara doğru biçimde propagate etmesini ve crash'leri yanlış atfetmeyi durdurmasını sağlar.

Detection

  • IOMMU timeout / flush-wait timeout'larını raporlayan hypervisor log'ları, özellikle aksi halde sessizce yutulabilecekleri AMD'de.
  • Intel host'larında kendi kusuru olmayan guest'ler için beklenmedik "domain crashed" event'leri — crash zamanlamasını başka bir guest'in passthrough I/O'su ile ilişkilendir.
  • Bir flush'ın tamamlandığı sanıldıktan sonra ortaya çıkan IOMMU IO_PAGE_FAULT ya da VT-d fault-recording event'leri (stale mapping'lerin canlı kaldığının bir işareti).
  • Aktif bir IOMMU'ya ve en az bir passthrough guest'e sahip x86 host'larıyla sınırla; passthrough'suz host'lar maruz kalmaz.

Mitigation

  • Patch'le. Xen branch'in için XSA-373 serisini uygula (stable 4.11–4.15 ve unstable genelinde fix'ler). 3.2 ve sonrasındaki tüm Xen etkilenir; patch tek eksiksiz çözümdür.
  • Yüzeyi azalt: patch'lenmemiş host'larda untrusted guest'lere ham device pass-through'tan kaçın; mediated/paravirtual device'ları tercih et.
  • IOMMU/ACS isolation'ı etkin tut ve yukarıdaki gibi IOMMU fault log'larını izle.

References