Skip to content

Xen IOMMU coalesced TLB flush use-after-free (CVE-2020-27671)

Xen, IOMMU TLB flush'larını page removal'ları için de coalesce ediyordu ve deferred flush tamamlanmadan önce page'in son reference'ını düşürüyordu — in-flight DMA'nın freed/reassigned bir page'i read/write ettiği bir pencere bırakarak.

Mechanism

Bug class / invariant

Xen, performans için page başına IOMMU TLB flush'larını tek bir operasyona batch'ler. Bu, addition'lar için güvenlidir ama page removal'larına yanlış uygulandı: page'in son reference'ı, deferred IOMMU flush gerçekten çalışmadan önce serbest bırakılıyordu. İhlal edilen invariant şudur: bir page'in IOMMU mapping'i, page free edilebilir ya da reassign edilebilir olmadan önce flush edilmelidir. Bu boşluk sırasında, bir device'ın stale IOMMU translation'ı hâlâ page'i gösterir; bu yüzden orijinal sahipten gelen in-flight DMA, free edilmiş ve muhtemelen başka bir domain'e verilmiş belleği read/write edebilir — cross-guest erişimi olan bir use-after-free.

Walkthrough

Conceptual only

XSA-346'dan high-level yeniden kurgu.

  1. Device passthrough'lu (ve non-shared IOMMU/CPU pagetable'lı) bir HVM/PVH guest, page refcount'unu sıfıra düşürecek şekilde IOMMU mapping'lerini kaldırır.
  2. Page zaten free edilmişken IOMMU flush'ı defer edilir (coalesce edilir).
  3. Stale translation kullanan DMA, freed/reassigned belleğe çarpar — data corruption, leak'ler ve potansiyel olarak privilege escalation.

Detection

  • AMD host'larda ya da non-shared pagetable / shadow mode'lu Intel VT-d'de yoğun IOMMU map/unmap döngüsü olan passthrough guest'ler.
  • DMA aktivitesine bağlı memory corruption ya da cross-domain anomalileri. İlgili: IOMMU bypass via device hotplug.

Mitigation

  • XSA-346 patch setini uygula (Xen 4.10–4.14+; iki patch); bu, removal'larda reference'ı serbest bırakmadan önce flush eder.
  • Mitigation: untrusted guest'lere passthrough'dan kaçın; desteklenen yerlerde IOMMU/CPU pagetable'larını paylaş. Xen ≤4.1 etkilenmez; ARM etkilenmez.

References