Skip to content

QEMU SDHCI BLKSIZE heap overflow (CVE-2020-25085)

Guest'in SDHCI BLKSIZE register'ına yaptığı bir write, multi-block bir SDMA transfer'ini host QEMU process'indeki device'a ait heap FIFO buffer'ının ötesine taşır.

Mechanism

Sınır neden bozuluyor

QEMU'nun SD Host Controller'ı (hw/sd/sdhci.c) transfer'leri, s->buf_maxsz boyutunda heap üzerinde ayrılan bir FIFO olan s->fifo_buffer içinde tamponlar. Multi-block bir SDMA transfer'i sırasında (sdhci_sdma_transfer_multi_blocks()) per-block boyutu, guest'in programladığı SDHC_BLKSIZE register'ından alınır. İhlal edilen invariant şu: per-block transfer boyutu s->fifo_buffer[s->buf_maxsz] içinde kalmalıdır. buf_maxsz'yi aşan bir BLKSIZE programlayan bir guest, DMA engine'in heap buffer'ının ötesine read/write yapmasına yol açar (NVD: CWE-787, OOB write; OOB flatview_read_continue içinde yüzeye çıkar).

Walkthrough

Kavramsal, public advisory'den.

  1. Guest, emüle edilen SDHCI controller'a erişebiliyor.
  2. Guest, SDHC_BLKSIZE'a aşırı büyük bir değer yazar.
  3. Guest, multi-block bir SDMA transfer'i başlatır; per-block boyutu buf_maxsz'yi aştığı için transfer s->fifo_buffer'ın ötesini indeksler → host heap overflow.

Detection

  • Host-side: Guest SD/MMC etkinliği sırasında QEMU crash; ASan/heap-guard, SDHCI SDMA path'indeki OOB'yi işaretler.
  • Behavioral: Guest'in controller'ın buffer maksimumundan daha büyük bir BLKSIZE programlaması anormaldir.

Mitigation

  • Patch: QEMU <= 5.0.0'ı etkiler; block/dword sayılarını sınırlayan Bin Meng'in 2021 SDHCI serisiyle çözülmüştür (CVE-2020-17380 ve CVE-2021-3409'u düzelten aynı seri).
  • Configuration workaround: Gerekli değilse emüle edilen bir SDHCI device'ı güvenilmeyen guest'lere açmayın.

References