QEMU virtio-blk SCSI handling heap overflow¶
QEMU'nun virtio-blk SCSI passthrough request path'i, map'lenmiş input descriptor'ın yeterince büyük olup olmadığını doğrulamadan guest'in sağladığı bir writable descriptor'a fixed-size bir status field'ı yazıyor (input-descriptor length-check eksikliği); guest descriptor'ı küçük boyutlandırdığında (örn. 1 byte'lık bir MMIO region ile besleyerek) bu host heap'te bir out-of-bounds write üretiyor. CVE-2026-48914 olarak raporlandı.
Mechanism¶
Note
Bir virtio-blk request, descriptor'lardan oluşan bir zincirdir: guest-readable
buffer'lar (command, data out) ardından QEMU'nun döndürülen veriyle ve sondaki bir
status'la doldurduğu guest-writable buffer'lar gelir. Legacy SCSI passthrough
(VIRTIO_BLK_T_SCSI_CMD) için QEMU, çok byte'lı bir errors/status field'ı dahil
virtio_scsi_inhdr tarzı bir sonucu, guest'in sağladığı writable input
descriptor'a yazmalıdır. İzolasyon invariant'ı şudur: host, map'lenmiş bir guest
buffer'ına yalnızca mapping'in gerçekten döndürdüğü uzunluğa kadar yazabilir. Bug
bunu kırıyor: SCSI handler, descriptor'ın / onun map'lenmiş iov'unun o kadar büyük
olduğunu kontrol etmeden input descriptor'a fixed-size bir multi-byte status/errors
field'ı (virtio_scsi_inhdr.errors, public raporlamada ~4 byte olarak tarif edilen
illüstratif bir boyut) yazıyor. Guest sondan ikinci writable descriptor'ı kasıtlı olarak yalnızca
bir byte'a map'lenen bir region'a (örn. exact-size bir bounce buffer'ı zorlayan
bir MMIO adresine) yönlendirdiğinde, QEMU o host heap allocation'ının sonunu aşarak
yazıyor — guest-kontrollü bir host heap out-of-bounds write'ı, guest→host
sınırını geçiyor.
Walkthrough¶
CVE-2026-48914 advisory'sinden public materyal (Red Hat Bugzilla 2488283, NVD CVE-2026-48914). Yalnızca kavramsal path — exploit primitive'leri yok:
- Guest
VIRTIO_BLK_T_SCSI_CMDtipinde bir virtio-blk request inşa eder. - Guest sondan ikinci writable input descriptor'ı
1uzunluğunda bir MMIO adresine işaret edecek şekilde programlar, böylece QEMU onu bir exact-size heap bounce buffer üzerinden map'ler. - QEMU'nun SCSI handler'ı çok byte'lı status /
errorsfield'ını o 1 byte'lık bounce buffer'a bir size check olmadan yazar → host heap'te multi-byte OOB write (public raporlamada ~4 byte'lık birerrorsfield'ı olarak tarif edilir). - Tekrarlanıp groom edildiğinde, kontrollü overflow komşu heap metadata'sını bozar, QEMU'yu çökertir (DoS) ve prensipte daha güçlü primitive'lere doğru yapı kurar.
Gözlemlenebilir etki
Etkilenen bir build'de ASan, virtio-blk SCSI status-write path'inde bir
heap-buffer-overflow WRITE raporlar; glibc'de hatalı bir SCSI request'in ardından
heap corruption / QEMU abort olarak yüzeye çıkar. Normal block driver'lar status
descriptor'ını doğru boyutlandırır ve onu hiçbir zaman 1 byte'lık MMIO ile
beslemez.
Warning
CVE-2026-48914 gelecek tarihli olmasına rağmen gerçek bir public advisory'ye çözümlenir
(Red Hat Bugzilla 2488283 ve NVD). Yine de açıklama kasıtlı olarak bug-class seviyesinde
tutulmuştur (virtio-blk SCSI passthrough status-write descriptor-length-check eksikliği):
belirli internal field adları/offset'leri (virtio_scsi_inhdr.errors, ~4 byte) illüstratiftir
ve hedef build'e göre teyit edilmelidir; silahlandırılmış bir chain verilmemiştir.
Detection¶
- Bir guest SCSI komutunun ardından virtio-blk SCSI request-completion / status-write
path'inde host tarafı ASan
heap-buffer-overflow WRITE(ya da glibc heap-corruption abort). - Writable descriptor'ları non-RAM / küçük boyutlu region'lara map'lenen ya da status descriptor'ında exact-size bounce buffer'ları zorlayan virtio-blk request'lerini işaretleyin.
- Küçük boyutlu input descriptor'larla yapılan block-device descriptor fuzzing'i bu class'ı yeniden üretir.
Mitigation¶
- CVE-2026-48914 için upstream QEMU fix'ini / distro backport'unu uygulayın (SCSI status field'ını yazmadan önce input descriptor / iov uzunluğunu doğrulayın).
- Gerekli olmadığı yerde virtio-blk'te SCSI passthrough'u kapatarak savunmasız
VIRTIO_BLK_T_SCSI_CMDpath'ini kaldırın. - QEMU process'indeki bir heap overflow'un sınırlanması için QEMU'yu libvirt altında SELinux/sVirt ile unprivileged çalıştırın.
References¶
- CVE-2026-48914 (virtio-blk SCSI request-handling heap overflow) — Red Hat Bugzilla 2488283, NVD CVE-2026-48914.
- Related: virtio DMA reentrancy double-free, virtio-net descriptor use-after-free, device emulation MMIO/PIO callback memory corruption