Skip to content

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.c içindeki ide_atapi_cmd_reply_end(), validate edilmemiş bir buffer index'i kullanarak io_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.

  1. 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.
  2. 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.
  3. O index'i s->data_end / io_buffer'ın sonunun ötesine işaret edecek şekilde ayarlayarak, guest ide_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)
ide_atapi_cmd_reply_end in hw/ide/atapi.c in QEMU 5.1.0 allows out-of-bounds
read access because a buffer index is not validated.

Fix: validate the buffer index / clamp the reply length to the io_buffer bounds
before returning bytes to the guest.

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.c iç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'i io_buffer boyutuna 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