Skip to content

QEMU es1370 audio OOB access (CVE-2020-13361)

QEMU'nun emüle ENSONIQ ES1370 sound card'ında guest-to-host bir out-of-bounds access; burada bir es1370 register yazması sırasında validate edilmemiş, guest-controlled bir frame count, audio-transfer loop'unu buffer'ının ötesine sürer.

Mechanism

Note

ES1370 modeli (hw/audio/es1370.c), bir channel'ın frame buffer'ını dolaşarak audio stream eder: guest-programlanan register'lardan türetilen bir frame count, es1370_transfer_audio()'ya kaç frame taşınacağını söyler. Invariant, bu count'un byte'lara ölçeklendiğinde channel'ın map'lenmiş buffer'ı içinde kalmasıdır. CVE-2020-13361'de count, buffer sınırlarına karşı düzgün validate edilmez, böylece bir guest kontrol eden register'ları yazdığında (es1370_write() path'i) transfer loop'unu hedeflenen region'ın dışında index'leten bir frame count ayarlayabilir. Sonuç, tamamen guest register değerleriyle sürülen host QEMU process'inde bir out-of-bounds read/write'tır — guest→host sınırını en azından bir host crash/DoS olarak aşar.

Bu, bir device modelinde bir input-validation (bounds-check) hatasıdır, out-of-bounds-write ve device OOB durumu qemu-arm-gic-oob-heap-access ile aynı sınıf.

Walkthrough

Public, hâlihazırda patch'lenmiş advisory'den (SUSE/Red Hat CVE sayfaları, Debian DLA-2262-1, upstream hw/audio/es1370.c fix). Yalnızca kavramsal reproduction.

  1. Guest, bir ES1370 audio channel'ını enable eder ve frame-buffer ile frame-count register'larını MMIO/PIO üzerinden programlar.
  2. Per-frame boyutla ölçeklendiğinde channel'ın map'lenmiş buffer'ını aşan bir frame count (ve/veya buffer parametreleri) seçer.
  3. Transfer, register-write path'i üzerinden tetiklenir; es1370_transfer_audio() şişirilmiş count üzerinde döngü yapar ve buffer sonunun ötesine index'ler — host process'inde bir out-of-bounds access.
  4. Vulnerable bir build'de bu tipik olarak bir QEMU crash (DoS) olarak tezahür eder.

Warning

Tarihsel, patch'lenmiş bir sorun (QEMU ≤ 5.0.0). Low severity olarak derecelendirildi. Bu giriş kavramsal kalır: tuning yapılmış bir corruption primitive'i değil, eksik bound'u adlandırır.

Missing-bound concept (shape of the fix)
/* reject / clamp a guest-supplied frame count before transferring */
if (frame_count > channel_buffer_frames(d, ch)) {
    return;  /* do not stream beyond the mapped buffer */
}
/* ... es1370_transfer_audio() over a validated count ... */

Detection

  • Host tarafı: guest audio-device register yazmalarıyla ilişkilenen, es1370_transfer_audio / es1370_write (hw/audio/es1370.c) içinde kök salan QEMU crash / AddressSanitizer heap-buffer-overflow ya da OOB-read raporları.
  • Behavioral: yapılandırılan DMA buffer'ından daha büyük transfer'leri ima eden ES1370 frame count'ları programlayan bir guest anormaldir.

Mitigation

  • Transfer'den önce frame count'u validate eden CVE-2020-13361 için upstream QEMU fix'ini uygulayın (distro backport'ları: Debian DLA-2262-1, SUSE, Red Hat).
  • Legacy es1370 (ya da diğer gereksiz legacy audio) device'ını untrusted guest'lere expose etmeyin; headless server VM'lerinden emüle sound card'ları kaldırın.
  • Defense-in-depth: QEMU'yu confine edin (seccomp, SELinux/sVirt) ki bir OOB access, host compromise yerine sınırlanmış bir crash olsun.

References

  • SUSE — CVE-2020-13361: https://www.suse.com/security/cve/CVE-2020-13361.html
  • Ubuntu — CVE-2020-13361: https://ubuntu.com/security/CVE-2020-13361
  • Debian DLA-2262-1 (qemu security update): https://lists.debian.org/debian-lts-announce/2020/06/msg00032.html