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.
- Guest, bir
scsi-genericpassthrough device'a attach edilmiştir. - Guest, reply length field'ı allocate edilen
r->buflen'den büyük olan Supported VPD Pages için bir INQUIRY gönderir. - QEMU o length'ten
page_idx'i hesaplar ve buffer'ın ötesinder->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 */
- 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'leriif (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-genericpassthrough'tan kaçın; raw passthrough gerekli olmadığında virtual disk'leri (virtio-blk/emule edilmişscsi-hd) tercih et.