Skip to content

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.

  1. Guest, stream'lerle yapılandırılmış bir usb-uas device'ı kullanır.
  2. Guest, UAS_MAX_STREAMS'ten büyük bir stream number ile bir DATA_IN/DATA_OUT veya STATUS pipe request'i verir.
  3. 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).

  4. Sonuç: host OOB write.

Detection

  • Host-side: Guest UAS etkinliği sırasında QEMU crash; ASan/heap-guard, usb_uas_handle_data iç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:

/* upstream patched reject condition */
if (p->stream > UAS_MAX_STREAMS) {
    goto err_stream;
}
- Configuration workaround: Gerekli değilken usb-uas'ı güvenilmeyen guest'lere açmaktan kaçın.

References