QEMU SDHCI BLKSIZE heap overflow (CVE-2020-25085)¶
Guest'in SDHCI
BLKSIZEregister'ı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.
- Guest, emüle edilen SDHCI controller'a erişebiliyor.
- Guest,
SDHC_BLKSIZE'a aşırı büyük bir değer yazar. - Guest, multi-block bir SDMA transfer'i başlatır; per-block boyutu
buf_maxsz'yi aştığı için transfers->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
BLKSIZEprogramlaması 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.