QEMU USB EHCI MMIO-overlap UAF (CVE-2021-3750)¶
Emüle EHCI USB controller, bir transfer buffer'ının kendi MMIO register region'ıyla örtüşüp örtüşmediğini doğrulamaz ve host process'inde bir DMA-reentrancy use-after-free'ye izin verir.
Mechanism¶
Sınır neden bozuluyor
EHCI controller model'i (hw/usb/hcd-ehci.c), uçuştaki USB transfer'leri için
guest'in seçtiği adreslere DMA gerçekleştirir. İhlal edilen invariant şu: bir
device'ın DMA hedef memory'si, kendi MMIO control register'larından farklı
olmalıdır. Bir transfer buffer'ını EHCI MMIO aralığına yöneltmek, uçuştaki bir
DMA write'ın controller'ın kendi register'larına çarpmasına yol açar (örn.
device state'ini free eden bir reset/teardown), bu state ise transfer
ortasında hâlâ dereference edilir → use-after-free. Bu, daha geniş QEMU
DMA-reentrancy bug ailesinin parçasıdır.
Sibling'lerden farkı
Bu note, generic DMA-reentrancy class note'undan ve e1000e/NVMe/virtio
variant'larından subsystem ve free site ile ayrılır. Aynı sınıf (guest'in
yönlendirdiği bir DMA write'ın aynı device'ın MMIO register'larına re-entrant
olarak çarpması), farklı bileşen: burada EHCI USB controller (hw/usb/hcd-ehci.c)
ve free, transfer'in ortasında reach edilen bir reset/teardown path'inde gerçekleşir.
e1000e/NVMe/virtio kardeşlerinde ise free site network/storage descriptor
işleme yollarındadır; generic class note ise per-device mem_reentrancy_guard
invariant'ını subsystem'den bağımsız olarak tanımlar.
Walkthrough¶
Kavramsal, public advisory'den.
- Guest, data buffer EHCI MMIO aralığıyla alias olacak şekilde EHCI transfer descriptor'larını özenle hazırlar.
- Guest, bir transfer başlatır; DMA write, controller state'ini free eden reset benzeri bir register etkisi tetikler.
- Transfer kodu, free edilmiş state'i dereference etmeye devam eder → UAF (host DoS, potansiyel RCE).
Detection¶
- Host-side: Guest USB etkinliği sırasında QEMU crash; ASan, EHCI transfer path'indeki UAF'yi işaretler.
- Behavioral: Device MMIO aralıklarına işaret eden guest USB transfer buffer'ları anormaldir.
Mitigation¶
- Patch: CVE-2021-3750 QEMU 7.0.0'da düzeltildi (Red Hat / GitHub Advisory:
"affects QEMU versions before 7.0.0"). Bu, EHCI path'ine özgü bir
overlap/reentrancy fix'iydi; genel per-device DMA-reentrancy guard'ı
(reentrant erişimde reddeden device başına
mem_reentrancy_guard.engaged_in_ioflag'i, Bulekov serisi) ayrı ve daha sonra, QEMU 8.1'de merge edildi (bkz. sibling note). 7.0.0 fix'inin sonradan eksik olduğu bulundu ve CVE-2023-2680 (Red Hat Bugzilla 2203387: "incomplete fix for CVE-2021-3750", qemu-kvm 8.0.0'da düzeltildi) olarak izlendi — QEMU'yu güncel tut. - Configuration workaround: Gerekli değilken EHCI USB'yi güvenilmeyen guest'lere açmaktan kaçın.