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.
- Guest, emüle edilen SDHCI controller'a erişir.
- 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.
- 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_blocksiç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")timeoutguard'ı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.