Skip to content

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:

  1. Underflow: virtio_snd_handle_rx_xfer iç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.
  2. Size mismatch: virtio_snd_pcm_in_cb, copy'sini 8-byte status header'ı çıkarmadan iov_size(in_sg, in_num) ile sınırlar — 8-byte+ bir out-of-bounds pencere.
  3. Uncontrolled write: AUD_read, MIN(available, params.period_bytes - buffer->size)'a kadar kopyalar; period_bytes guest-controlled olduğundan, audio byte'ları bir sonraki heap chunk'ına overflow eder.
  4. Grooming: yazarlar yalnızca bir 0x200 chunk'ı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-9p P9_TXATTRCREATE xattr'ları same-size chunk'lar spray eder ve overflow için delikler açar.
  5. 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.
  6. 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) bir V9fsFidState olarak reclaim et; .vq pointer'ını → VirtQueue.handle_output'u (bir QEMU code pointer'ı) leak etmek için bir VirtIOSoundPCMBuffer yerleştir; handle_output'u system() 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 qemu parent'ından gelen system()-style child process'ler; ASAN/valgrind build'leri virtio_snd_pcm_in_cb'deki OOB write'ı flag'ler.
  • Davranışsal: küçük/boş virtio-snd input iovec'lerini büyük bir period_bytes ile 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_sg size'ının ≥ sizeof(virtio_snd_pcm_status) olmasını şart koş ve allocation ile consumption'da tek tutarlı bir bound kullan (ve AUD_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