Skip to content

QEMU SCSI-generic INQUIRY OOB read/write (CVE-2019-6501)

Guest-controlled bir SCSI INQUIRY (Supported VPD Pages) reply'ı, scsi_handle_inquiry_reply()'in host QEMU process'inde response buffer'ının ötesine index'lemesine ve yazmasına izin verir.

Mechanism

Sınır neden kırılıyor

Bir scsi-generic passthrough device ile, guest bir INQUIRY VPD-pages reply'ının byte'larını etkileyebilir. scsi_handle_inquiry_reply()'da (hw/scsi/scsi-generic.c) QEMU, o guest-influenced length'ten page_idx = lduw_be_p(r->buf + 2) + 4'ü hesaplar ve ardından supported-page entry'sini (page 0xb0) r->buf[page_idx] içine, page_idx'i r->buflen'e karşı validate etmeden sort/write eder. Aşılan invariant: device-reply data'sından alınan bir length field'ı, host response buffer'ını index'lemeden önce range-check edilmeli. Edilmediği için, guest host process'i içinde bir heap out-of-bounds read ve write'ı yönlendirir.

Walkthrough

Public patch/advisory'den kavramsal reproduction.

  1. Guest, bir scsi-generic passthrough device'a attach edilmiştir.
  2. Guest, reply length field'ı allocate edilen r->buflen'den büyük olan Supported VPD Pages için bir INQUIRY gönderir.
  3. QEMU o length'ten page_idx'i hesaplar ve buffer'ın ötesinde r->buf[page_idx]'e erişir:
/* vulnerable shape */
int page_idx = lduw_be_p(r->buf + 2) + 4;   /* guest-influenced */
/* ... write page 0xb0 entry at r->buf[page_idx] without bounds check */
  1. Sonuç: host QEMU process'inde heap OOB read + write.

Detection

  • Host tarafı: guest SCSI INQUIRY aktivitesi ile korele QEMU crash'i; ASan ya da heap-guard page'leri scsi-generic path'indeki OOB'yi flag'ler.
  • Behavioral: Oversized length field'larıyla INQUIRY VPD reply'ları emit eden bir guest, normal SCSI operasyonu için anormaldir.

Mitigation

  • Patch: page_idx = MIN(page_idx, r->buflen) ile clamp eden ve access'leri if (page_idx < r->buflen) ile guard'layan upstream fix "scsi-generic: avoid possible out-of-bounds access to r->buf" (Paolo Bonzini)'yi uygula. RHSA-2019:2166/2425/2553 aracılığıyla dağıtıldı.
  • Configuration workaround: scsi-generic passthrough'tan kaçın; raw passthrough gerekli olmadığında virtual disk'leri (virtio-blk/emule edilmiş scsi-hd) tercih et.

References