Skip to content

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.

  1. Guest, emüle edilen SDHCI controller'a erişir.
  2. Guest, özenle hazırlanmış block-size / block-count parametreleriyle multi-block bir SDMA transfer'i kurar.
  3. 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.

References