QEMU SDHCI multi-block SDMA heap overflow (CVE-2020-17380)¶
QEMU'nun SDHCI emülasyonu üzerinden özenle hazırlanmış multi-block bir SDMA transfer'i, data'yı host process'indeki device'a ait heap FIFO buffer'ının ötesine taşır.
Mechanism¶
Sınır neden bozuluyor
sdhci_sdma_transfer_multi_blocks() (hw/sd/sdhci.c) içinde transfer
mantığı, ilerleyen data/block boyutunu heap üzerinde ayrılan
s->buf_maxsz boyutundaki s->fifo_buffer içinde tutmayı başaramaz. İhlal edilen
invariant, DMA-backed her device model'inin tutması gereken aynı invariant:
guest'in programladığı block-size ve block-count, transfer allocation'ı
aşamayacak şekilde validate edilmelidir. Özenle hazırlanmış transfer
parametreleriyle SDMA path buffer'ın ötesine yazar (NVD: CWE-787 OOB write)
ve komşu host heap'ini bozar. Bu, CVE-2020-25085 (BLKSIZE) ile yakından
ilişkilidir ve nihai fix'i onunla paylaşır.
Walkthrough¶
Kavramsal, public advisory'den.
- Guest, emüle edilen SDHCI controller'a erişir.
- Guest, özenle hazırlanmış block-size / block-count parametreleriyle multi-block bir SDMA transfer'i kurar.
- Transfer döngüsü
s->fifo_buffer'ı aşar → host heap overflow.
Detection¶
- Host-side: Guest SD/MMC SDMA etkinliği sırasında QEMU crash; ASan/heap-guard, SDHCI multi-block path'indeki OOB write'ı işaretler.
- Behavioral: Boyutu controller buffer'ını aşan anormal SDHCI transfer descriptor'ları.
Mitigation¶
- Patch: QEMU <= 5.0.0'ı etkiler; CVE-2020-25085 / CVE-2021-3409 ile aynı upstream SDHCI serisiyle çözülmüştür. (Red Hat'in dağıttığı qemu-kvm'de SDHCI desteği yoktu, bu yüzden RHEL etkilenmedi.)
- Configuration workaround: Emüle edilen SDHCI'yı güvenilmeyen guest'lere açmaktan kaçının.