Xen unsafe AMD IOMMU pagetable updates (CVE-2020-27670)¶
XSA-347: AMD/Hygon IOMMU page-table ve Device Table entry'leri canlıyken field-by-field değiştirilir; bu da IOMMU'nun yırtık (torn), kısmen güncellenmiş entry'leri gözlemlemesine olanak verir.
Mechanism¶
Bug sınıfı: kullanımdaki hardware yapılarının non-atomic güncellenmesi
Bir IOMMU page-table entry'si (ve bir device'ın translation'ını köklendiren Device Table entry'si), passthrough yapılmış bir PCI device'ı sahibi olan guest'in erişmesine izin verilen belleğe hapseden güvenlik sınırıdır. Bir savunmacının önemsediği invariant şudur: IOMMU asla yarı yazılmış bir entry üzerinde işlem yapmamalıdır. AMD/Hygon hardware'inde bir entry birden çok 64-bit word'e yayılabilir (örn. present bit, next-level pointer, permission/level alanları). Xen bu word'leri "adım adım, IOMMU tarafından potansiyel olarak kullanımda olabileceklerini gözetmeden" güncelliyordu. IOMMU table'ları CPU ile eşzamanlı walk ettiği için, bir device DMA'sı ne eski ne de amaçlanan yeni entry olan bir state'e karşı translate edilebilir — örneğin stale bir next-level pointer'ın yeni yazılmış permission bit'leriyle birleşmesi. Bu torn read, guest'in dokunamaması gereken bir physical frame'e resolve olabilir ve DMA confinement'ını kırar.
Maruziyet, gerçekten bir guest adına IOMMU'yu programlayan configuration'larla sınırlıdır: physical device pass-through verilen guest'ler. VT-d (Intel) ve Arm SMMU code path'leri bu özel advisory'den etkilenmez.
Walkthrough¶
Yalnızca kavramsal
Tamamen public, patch'lenmiş XSA-347 advisory'sine dayanır. Burada hiçbir offset, gadget chain veya weaponized kod yeniden üretilmemiştir.
Advisory'nin tarif ettiği yüksek seviye mantıksal adımlar:
- Bir guest, IOMMU mapping'leri runtime'da değişen bir pass-through device'a sahiptir (balloon, grant map/unmap ya da guest physical page'lerin remapping'i).
- Xen, ilgili AMD IOMMU PTE / Device Table entry'sini yeni entry'yi atomik olarak yayımlamak (tek bir 128-bit write veya write-then-flush sıralaması) yerine her seferinde bir word olacak şekilde yeniden yazar.
- Device'ın kendi DMA engine'i, table'ları paralel walk ederek eski ve yeni word'leri karıştıran bir entry latch eder.
- Translation amaçlanmayan bir frame'e resolve olur ve mismapped frame'in içeriğine bağlı olarak cross-domain data corruption, data leak, DoS veya privilege escalation üretir.
Fix, update'leri atomik olarak / güvenli bir sırada yayımlar ve entry canlı kabul edilmeden önce flush eder, böylece hardware asla torn bir entry gözlemlemez.
Detection¶
- Hangi guest'lerin PCI/GPU/NVMe pass-through'a sahip olduğunu envantere al; yalnızca onlar maruz kalır. Aktif pass-through'lu patch'lenmemiş her host'u kapsamda say.
- Hypervisor log'larında AMD IOMMU I/O page fault'larına (IO_PAGE_FAULT) ve map/unmap aktivitesiyle ilişkili event-log entry'lerine dikkat et — torn entry'ler, guest'in "sahibi olması gereken" adresler için fault olarak yüzeye çıkma eğilimindedir.
- Passthrough workload çalıştıran AMD/Hygon host'larında açıklanamayan guest ya da host instabilitesini (crash'ler, memory corruption) izle.
- VM/host integrity baseline'ları kullan: sessiz data corruption en zor sinyaldir, dolayısıyla uzun ömürlü guest bellek bölgelerini checksum ile doğrulamak anomalileri yüzeye çıkarabilir.
Mitigation¶
- Patch'le. Xen branch'in için XSA-347 update'ini (xsa347 serisi) uygula; tek eksiksiz fix budur. Patch, IOMMU PTE / Device Table update'lerini eşzamanlı in-flight kullanıma karşı güvenli hale getirir.
- Saldırı yüzeyini azalt: gerekmediği yerde ham PCI pass-through'tan kaçın; guest tarafından kontrol edilen bir IOMMU mapping yaşam döngüsü açığa çıkarmayan paravirtual veya mediated device'ları tercih et.
- Defense in depth: IOMMU/ACS isolation'ı etkin tut ve patch'lenmemiş host'larda pass-through'u yalnızca trusted guest'lere kısıtla.