Skip to content

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:

  1. Guest VIRTIO_BLK_T_SCSI_CMD tipinde bir virtio-blk request inşa eder.
  2. Guest sondan ikinci writable input descriptor1 uzunluğunda bir MMIO adresine işaret edecek şekilde programlar, böylece QEMU onu bir exact-size heap bounce buffer üzerinden map'ler.
  3. QEMU'nun SCSI handler'ı çok byte'lı status / errors field'ı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 bir errors field'ı olarak tarif edilir).
  4. 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_CMD path'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