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; guests->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 penceresis->io_buffer'ın sonunu aşacak şekilde ilerledikçeio_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.
- 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. - Completion atlandığı için DRQ set kalır ve
s->end_transfer_funcclear edilmez — device hâlâ "daha fazla PIO data mevcut" reklamı yapar. - Guest, ATAPI data register'ını okumaya devam eder. Her read
s->data_end'in, ardındans->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. - 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.ciç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_bufferbounds 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