QEMU USB UAS stream-number OOB write (CVE-2021-3713)¶
Emüle USB Attached SCSI (UAS) device, guest tarafından sağlanan bir stream number'ı bounds check olmadan per-stream array'leri indekslemek için kullanır ve host process'inde bir out-of-bounds write'a izin verir.
Mechanism¶
Sınır neden bozuluyor
UAS device'ı (hw/usb/dev-uas.c, usb_uas_handle_data()), per-stream state
array'lerini (data3/status3) guest tarafından sağlanan bir stream number
ile indeksler. İhlal edilen invariant şu: bir stream index'i, ayrılan stream
sayısından (UAS_MAX_STREAMS) küçük olacak şekilde validate edilmelidir.
Index denetlenmeden kullanıldığı için, aralık dışı bir stream number bir
out-of-bounds write'a yol açar (NVD: CWE-787). Bu bug, device'ın QEMU 1.5.0'da
tanıtılmasından beri var.
Walkthrough¶
Kavramsal, public patch'ten.
- Guest, stream'lerle yapılandırılmış bir
usb-uasdevice'ı kullanır. - Guest,
UAS_MAX_STREAMS'ten büyük bir stream number ile bir DATA_IN/DATA_OUT veya STATUS pipe request'i verir. -
Handler, stream number'ı validate eden bir bounds check'e sahip olmadığı için per-stream array'i aralık dışı indeksler (missing-check / vulnerable path).
-
Sonuç: host OOB write.
Detection¶
- Host-side: Guest UAS etkinliği sırasında QEMU crash; ASan/heap-guard,
usb_uas_handle_dataiçindeki OOB'yi işaretler. - Behavioral: Aralık dışı stream number'ları taşıyan UAS request'leri anormaldir.
Mitigation¶
- Patch: STATUS ve DATA pipe'ları için stream index'ini validate eden upstream fix'i ("uas: add stream number sanity checks") uygula; QEMU 6.2.0-rc0'da düzeltildi. Patch, her iki pipe handler'ında aralık dışı stream'leri reject eden şu sanity check'i ekler:
usb-uas'ı güvenilmeyen
guest'lere açmaktan kaçın.