virtio-snd uncontrolled heap overflow to hypervisor escape¶
QEMU'nun virtio-snd input path'indeki bir iovec underflow'unu ve eksik bir bounds check'i uncontrolled bir glibc heap overflow'una zincirleyip, ardından RIP kontrolüne ulaşmak için host heap'i groom eden bir guest-to-host escape (CVE-2024-7730).
Mechanism¶
Note
Paravirtual bir virtio device, guest tarafından virtqueue'lar üzerinden sürülür:
guest scatter/gather descriptor'ları (bir iovec) post eder ve host device model'i
onları read/write eder. Isolation invariant'ı şudur: host kendi buffer'ını gerçek
iovec kapasitesinden boyutlandırmalı ve her copy'yi onunla sınırlamalıdır. virtio-snd
PCM input path'i bunu iki şekilde kırar: host buffer size'ını
iov_size(...) - sizeof(virtio_snd_pcm_status) olarak hesaplar (guest boş/çok küçük
bir iovec sağladığında bir integer underflow, VirtIOSoundPCMBuffer'ı
under-allocate eder) ve sonra consume path'i (virtio_snd_pcm_in_cb), write'ını
8-byte status header'ı çıkarmayan farklı bir size ile sınırlar. Host ardından
guest-controlled bir period_bytes'a kadar AUD_read yaptığı için, audio byte'ları
under-allocate edilmiş chunk'ın ötesine yazılır — guest→host sınırını aşan host (QEMU)
memory'sinin bir uncontrolled heap overflow'u.
Overflow içeriği audio stream'in kendisidir (attacker-influenced ama tam olarak keyfi değil), bu yüzden exploit "uncontrolled"dır: yalnızca allocator'ın komşu yerleştirdiğini corrupt eder ve hassas heap grooming ile birleştirilmelidir.
Walkthrough¶
Public referans: osec.io writeup'ı "From virtio-snd 0-Day to Hypervisor Escape". Kavramsal, zaten-patch'lenmiş chain:
- Underflow:
virtio_snd_handle_rx_xferiçinde, allocation size'ıiov_size(elem->in_sg, elem->in_num) - sizeof(virtio_snd_pcm_status)boş bir iovec için underflow eder ve buffer'ı under-allocate eder. - Size mismatch:
virtio_snd_pcm_in_cb, copy'sini 8-byte status header'ı çıkarmadaniov_size(in_sg, in_num)ile sınırlar — 8-byte+ bir out-of-bounds pencere. - Uncontrolled write:
AUD_read,MIN(available, params.period_bytes - buffer->size)'a kadar kopyalar;period_bytesguest-controlled olduğundan, audio byte'ları bir sonraki heap chunk'ına overflow eder. - Grooming: yazarlar yalnızca bir
0x200chunk'ının size field'ının low byte'ını corrupt eder (biased u8 silence ≈ 0x80, size'ı 0x210–0x2f0 aralığına büyütme eğilimindedir) ve onu oversized bir tcache entry'sine çevirir. virtio-9pP9_TXATTRCREATExattr'ları same-size chunk'lar spray eder ve overflow için delikler açar. - Overlap → R/W: oversized chunk'ı free edip yeniden almak (reclaim), bir sonraki allocation ile örtüşen bir chunk verir ve o object'in kontrollü read/write'ını sağlar.
- Leak'ler + RIP: bir heap base'i kurtarmak için glibc tcache
fd = next ^ (curr >> 12)'yi decode et;fs.xattr.value/len'i forge etmek için örtüşen region'ı (P9_TWALKüzerinden) birV9fsFidStateolarak reclaim et;.vqpointer'ını →VirtQueue.handle_output'u (bir QEMU code pointer'ı) leak etmek için birVirtIOSoundPCMBufferyerleştir;handle_output'usystem()ile ve.vdev'i bir command string ile overwrite et, sonra virtqueue'yu notify et.
Warning
Bug class için belgelenmiş patch'lenmiş bir sorun. Offset'ler, kesin spray sayıları ve end-to-end chain kasıtlı olarak atlanmıştır; bu kavramsal path'tir.
Detection¶
- Host tarafı: virtio-snd aktivitesiyle korele olan QEMU crash'leri / bir
qemuparent'ından gelensystem()-style child process'ler; ASAN/valgrind build'lerivirtio_snd_pcm_in_cb'deki OOB write'ı flag'ler. - Davranışsal: küçük/boş virtio-snd input iovec'lerini büyük bir
period_bytesile birlikte yapılandıran bir guest, gerçek bir audio driver için anormaldir.
Mitigation¶
- CVE-2024-7730 için QEMU fix'ini uygula: çıkarmadan önce
in_sgsize'ının ≥sizeof(virtio_snd_pcm_status)olmasını şart koş ve allocation ile consumption'da tek tutarlı bir bound kullan (veAUD_read'de gerçek allocation'a saygı göster). - virtio-snd'yi, audio'ya ihtiyacı olmayan untrusted guest'lere expose etme.
- Defense-in-depth: QEMU'yu sandbox'la (seccomp, sVirt) ki bir host-process compromise'i contained olsun.
References¶
- osec.io, "From virtio-snd 0-Day to Hypervisor Escape: Exploiting QEMU with an Uncontrolled Heap Overflow": https://osec.io/blog/2026-03-17-virtio-snd-qemu-hypervisor-escape/
- Red Hat Bugzilla — CVE-2024-7730 (virtio-snd heap buffer overflow in virtio_snd_pcm_in_cb): https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2024-7730