Skip to content

QEMU IDE/ATAPI heap overflow on ATAPI command processing

QEMU'nun IDE/ATAPI emülasyonunda guest-to-host bir heap buffer overflow (CVE-2015-5154, XSA-138; XSA/NVD'nin kanonik adlandırması "heap-based buffer overflow"). Primitive iki aşamalıdır: bir ATAPI komutunun end_transfer_func'u komutu düzgün tamamlamadığında DRQ bit'i ve transfer function set kalır; guest s->data_end'in ötesinden okumaya devam ederek önce bir out-of-bounds READ (info-leak / heap grooming primitive'i) elde eder, sonra PIO erişim penceresi s->io_buffer'ın sonunu aşacak şekilde ilerledikçe io_buffer'a yapılan transfer host heap'inde gerçek bir out-of-bounds WRITE'a (overflow) dönüşür. CVE adındaki "overflow", bu ikinci aşamadaki write'ı kasteder — OOB read tek başına bir info-leak'tir, asıl guest→host escape'i io_buffer overflow'u sağlar.

Mechanism

Note

QEMU'nun IDE core'u, PIO data transfer'lerini s->data_ptr/s->data_end ile sınırlanmış sabit boyutlu channel başına bir io_buffer üzerinden sürer ve bir PIO parçası tükendiğinde çağrılan bir end_transfer_func callback'i vardır. Isolation invariant, yeterli data transfer edildiğinde end_transfer_func'un command completion path'ini çağırması gerektiğidir, böylece DRQ (data-request) clear edilir ve guest daha fazla byte isteyemez. CVE-2015-5154, ATAPI command handling'de bu invariant'ın bir ihlalidir: belirli komutlar için (açıklanan durum START STOP UNIT), completion fonksiyonları doğru çağrılmaz, böylece DRQ bit'i ve s->end_transfer_func set kalır. Guest ardından ATAPI data port'undan daha fazla byte okur; kod s->io_buffer'dan s->data_end'in ötesinde servis vermeye devam eder ve sonunda host heap'inde io_buffer'ı overflow eder — guest→host sınırını aşan guest-controlled bir out-of-VM overflow (QEMU process'i olarak host code execution).

Device, guest'in emüle bir CD-ROM/ATAPI drive'ına sahip olduğu her durumda (yaygın bir varsayılan) unprivileged bir guest kullanıcısından erişilebilir; bug'ın pratik bir guest-to-host escape olmasının ve QEMU/Xen (Xen 4.5.x ve öncesi) device modeliyle gönderilmesinin nedeni budur.

Walkthrough

Public, hâlihazırda patch'lenmiş materyal: Xen Security Advisory 138 / oss-sec gönderisi (Kevin Wolf, Red Hat) ve QEMU hw/ide/atapi.c fix'i. Yalnızca kavramsal path.

  1. Guest, bir ATAPI CD-ROM'a sahiptir. Handler'ı command completion'ı doğru çağırmadan end_transfer_func'a ulaşan bir ATAPI komutu (örn. START STOP UNIT) çıkarır.
  2. Completion atlandığı için DRQ set kalır ve s->end_transfer_func clear edilmez — device hâlâ "daha fazla PIO data mevcut" reklamı yapar.
  3. Guest, ATAPI data register'ını okumaya devam eder. Her read s->data_end'in, ardından s->io_buffer'ın sonunun ötesine ilerler, komşu host heap byte'larını döndürür/işler ve host heap state'ini bozar.
  4. Host-heap grooming ile overflow, QEMU process'indeki allocator metadata'sına ya da function pointer'larına yönlendirilebilir → host control-flow hijack.

Warning

Bug sınıfı için belgelenmiş tarihsel, patch'lenmiş bir sorun. Hiçbir exploit offset'i ya da host heap layout'u verilmez — yalnızca örnekleyici.

Root cause and the fix (per XSA-138 / oss-sec)
Cause: if end_transfer_func is called because enough data has been read/written
for the current PIO transfer but fails to correctly call the command-completion
functions, the DRQ bit and s->end_transfer_func remain set; the guest can then
access bytes in s->io_buffer beyond s->data_end and eventually overflow io_buffer
(observed with ATAPI START STOP UNIT).

Fix: add explicit array-bounds checks before accessing the buffer instead of
relying on end_transfer_func to behave correctly.

Vulnerable bir build'de beklenen gözlemlenebilir: bir guest emüle bir CD-ROM'a karşı sorunlu ATAPI dizisini çıkardıktan sonra QEMU heap corruption / crash.

Detection

  • Host tarafı: bir CD-ROM'a sahip bir guest'ten gelen ATAPI aktivitesiyle ilişkilenen QEMU crash'leri / heap-corruption abort'ları (ya da hw/ide/atapi.c içinde ASan raporları).
  • Behavioral: ATAPI komutlarını (örn. tekrarlanan START STOP UNIT artı oversized PIO read'leri) normal hiçbir optical-media driver'ın üretmediği bir pattern'de süren bir guest.

Mitigation

  • CVE-2015-5154 / XSA-138 için QEMU/Xen fix'ini uygulayın (ATAPI PIO path'inde açık io_buffer bounds check'leri).
  • Attack surface'i tamamen düşürmek için 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) ki heap corruption, tam host kontrolü yerine sınırlansın.

References

  • Xen Security Advisory 138 (CVE-2015-5154) — oss-sec: https://seclists.org/oss-sec/2015/q3/212
  • NVD — CVE-2015-5154: https://nvd.nist.gov/vuln/detail/CVE-2015-5154