Skip to content

QEMU SDHCI ineffective-patch OOB r/w (CVE-2021-3409)

SDHCI SDMA/ADMA overflow'ları (CVE-2020-17380/25085) için yazılan orijinal fix eksikti; özenle hazırlanmış input hâlâ sahte bir transfer başlatıp host process'inde out-of-bounds read/write'lar sürebiliyordu.

Mechanism

Sınır neden bozuluyor

Daha önceki patch (commit dfba99f17feb…), sdhci_do_adma() ve sdhci_sdma_transfer_multi_blocks() (hw/sd/sdhci.c) içindeki SDHCI transfer parametrelerini yeterince kısıtlamadan bıraktı. Kritik olarak, bir data transfer'i SD command başarısız olduğunda veya timeout'a uğradığında bile başlatılabiliyordu ve ADMA/SDMA descriptor sayıları korumasız kalıyordu. İhlal edilen invariant şu: bir command başarıyla tamamlanmadıkça ve descriptor'ın belirlediği uzunluk buffer içinde kalmadıkça hiçbir data transfer'i çalışmamalıdır. Her iki koşul da denetlenmediği için yetkili bir guest, bir OOB read/write'a ulaşır (NVD: CWE-119).

Walkthrough

Kavramsal, public patch'ten.

  1. Guest, emüle edilen SDHCI controller'a erişir.
  2. Guest, timeout'a uğrayan bir command verir, ardından yine de bir data transfer'i tetikler ve/veya sınırsız sayıda ADMA descriptor sağlar.
  3. SDMA/ADMA engine, out-of-bounds bir host erişimi gerçekleştirir.

Merge edilen fix, data-present koşulunu korur:

/* fixed shape: don't transfer data on command timeout */
if (!timeout && s->blksize && (s->cmdreg & SDHC_CMD_DATA_PRESENT)) {
    /* ... start transfer ... */
}

Detection

  • Host-side: Data transfer'lerinden hemen önce gelen SD command timeout'ları sonrasında QEMU crash; ASan/heap-guard, OOB'yi sdhci_do_adma / sdhci_sdma_transfer_multi_blocks içinde işaretler.
  • Behavioral: Guest'in başarısız/timeout'a uğramış SD command'lerinden sonra data transfer'leri başlatması anormaldir.

Mitigation

  • Patch: QEMU <= 5.2.0'ı etkiler. Bin Meng serisini uygulayın (Şub–Mar 2021); doğrulanmış fix commit'i b263d8f928001b5cfa2a993ea43b7a5b3a1811e8 ("Don't transfer any data when command time out") timeout guard'ını ekler ve CVE-2020-17380, CVE-2020-25085 ve CVE-2021-3409'u düzelttiğini belirtir.
  • Configuration workaround: Emüle edilen SDHCI'yı güvenilmeyen guest'lere açmayın.

References