QEMU ide_atapi_cmd_reply_end out-of-bounds read¶
QEMU'nun ATAPI emülasyonunda guest-triggerable bir out-of-bounds read (CVE-2020-29443); burada
hw/ide/atapi.ciçindekiide_atapi_cmd_reply_end(), validate edilmemiş bir buffer index'i kullanarakio_buffer'ın ötesini okur ve komşu host process memory'sini guest'e sızdırır.
Mechanism¶
Note
QEMU'nun ATAPI PIO path'inde, ide_atapi_cmd_reply_end(), IDE channel'ının
io_buffer'ından guest'e reply data döndürür ve kısmen guest-visible state
tarafından sürülen (örn. byte-count limit ve transfer pozisyonu) bir index/byte
count kullanarak içinde ilerler. Isolation invariant, bu index'in guest'e herhangi
bir byte geri verilmeden önce allocate edilmiş io_buffer'ın sınırları içinde
kalmasıdır. CVE-2020-29443 eksik bir validation'dır: bir buffer index validate
edilmez, böylece ide_atapi_cmd_reply_end(), io_buffer'ın sonunun ötesini
okur. Out-of-bounds byte'lar guest'e döndürülür, dolayısıyla buffer'a komşu
host-process memory'si guest→host sınırı boyunca sızar — emüle bir ATAPI/CD-ROM
device'ına sahip herhangi bir guest tarafından erişilebilen bir
information-disclosure primitive'i (ve host ASLR'ını yenmeye olası bir yardım).
CVE-2015-5154 ATAPI write/overflow bug'ının aksine, bu buffer'ın ötesine saf bir read: daha düşük etki (info leak / minor DoS) ama aynı kök pattern — ATAPI reply path'inde guest-influenced bir index'e bir bounds check olmadan güvenmek.
Walkthrough¶
Public, hâlihazırda açıklanmış/patch'lenmiş materyal: CVE-2020-29443 için NVD kaydı ve
hw/ide/atapi.c fix'i. Yalnızca kavramsal path.
- Guest, emüle bir ATAPI/CD-ROM'a sahiptir. ATAPI komutları çıkarır ve reply data'yı
ide_atapi_cmd_reply_end()tarafından servis edilen PIO data register'ı üzerinden okur. io_buffer'ı dolaşmak için kullanılan reply index'i guest-controllable state'ten türetilir ve patch öncesi buffer'ın boyutuna karşı bounds-check edilmez.- O index'i
s->data_end/io_buffer'ın sonunun ötesine işaret edecek şekilde ayarlayarak, guestide_atapi_cmd_reply_end()'in out-of-bounds host byte'larını okumasına ve bunları ATAPI reply data olarak döndürmesine neden olur — komşu QEMU heap içeriğini guest'e sızdırarak.
Warning
Bug sınıfı için belgelenmiş tarihsel, patch'lenmiş bir sorun. Bu giriş kavramsal kalır; hiçbir offset ya da host layout verilmez.
Root cause (per NVD CVE-2020-29443)
Vulnerable bir build'de beklenen gözlemlenebilir: guest'in media içeriğine karşılık gelmeyen ATAPI reply byte'ları alması (sızdırılan host memory'si) ya da ASan altında bir OOB-read abort'u.
Detection¶
- Host tarafı:
ide_atapi_cmd_reply_end/hw/ide/atapi.ciçinde AddressSanitizer out-of-bounds-read raporları; ATAPI read'leriyle ilişkilenen enstrümante build'lerde QEMU abort'ları. - Behavioral: byte-count limit'leri / index'leri normal bir optical-media driver'ın asla talep etmeyeceği değerlere ayarlanmış ATAPI reply read'leri.
Mitigation¶
- CVE-2020-29443 için QEMU fix'ini uygulayın (
ide_atapi_cmd_reply_end()içinde reply buffer index'ini validate edin / reply length'iio_bufferboyutuna karşı clamp'leyin). - Emüle CD-ROM/ATAPI drive'ını ihtiyacı olmayan guest'lerden kaldırın.
- Defense-in-depth: device modelini deprivilege edin/sandbox'layın (seccomp, SELinux/sVirt) ve leaked-pointer mitigation'larını (host ASLR) tek katman olarak değil, bir katman olarak ele alın.
References¶
- NVD — CVE-2020-29443: https://nvd.nist.gov/vuln/detail/CVE-2020-29443