QEMU e1000 e1000_receive_iov stack buffer overflow (loopback)¶
CVE-2025-12464: short-frame padding QEMU'nun net core'unda merkezileştirildikten sonra, e1000 device'ının
e1000_receive_iov()içindeki loopback receive path'i hâlâ under-length bir frame'i işleyebiliyor, on-stack minimum-frame buffer'ı taşırıp QEMU host process'ini crash'letiyordu.
Mechanism¶
Note
Bir QEMU NIC modeli, device-to-host DMA receive path'ini tamamen host QEMU
process'i içinde emüle eder. Guest driver e1000'i loopback mode'a aldığında
(device'ın MAC/RCTL register'ları üzerinden yapılandırılan normal, belgelenmiş bir
diagnostic özellik), transmit edilen frame'ler host network backend'inden
geçmeden doğrudan e1000_receive_iov() receive routine'ine geri beslenir.
QEMU'nun dayandığı Ethernet isolation invariant şudur: device receive path'ine
verilen her frame en az minimum Ethernet frame uzunluğundadır (60 byte), çünkü
short frame'ler device'a ulaşmadan önce padding yapılır. Tarihsel olarak her NIC
modeli kendi padding'ini yapardı; bir refactor o padding'i paylaşılan net core
koduna taşıdı. e1000 loopback path'i o core padding'i bypass eder, dolayısıyla bir
short (sub-minimum) frame ile erişilebilir. e1000_receive_iov(), frame'i
minimum-length bir frame için boyutlandırılmış sabit bir on-stack buffer'a
kopyalar; uzunluk hesabı o buffer'ı underflow eden/aşan bir frame onun ötesine
yazar. Overrun QEMU host stack'ine düştüğü için, guest-controlled bir koşul
host memory'sini bozar — guest→host isolation sınırını aşar (advisory'ye göre
burada bir denial of service / process crash olarak gerçekleşir).
Walkthrough¶
Public, hâlihazırda patch'lenmiş materyal (CVE-2025-12464, upstream'de Peter Maydell tarafından Oct 2025'te düzeltildi). Yalnızca kavramsal reproduction path — weaponize edilmiş bir chain yok:
- Guest, e1000 driver'ını yükler ve device'ı register'ları üzerinden (RCTL loopback bit'leri) loopback'e programlar; sıradan bir guest'ten erişilebilir bir yapılandırma.
- Guest, 60-byte Ethernet minimumundan kısa bir frame transmit eder. Loopback'te
frame doğrudan
e1000_receive_iov()'a yönlendirilir ve refactor'ün artık dayandığı net-core padding'inden asla geçmez. - Receive routine, frame'i padding yapılmış bir minimum frame için tasarlanmış sabit boyutlu bir stack buffer'a birleştirir; uyumsuz uzunluk, kopyalamanın buffer'ın sonunun ötesine yazmasına izin verir — QEMU host stack'inde bir CWE-121 stack-based buffer overflow.
guest (loopback short frame) --> e1000_receive_iov() --> on-stack min-frame buffer
(no net-core padding applied) ^ overrun
Upstream fix, e1000 loopback path'inde short frame'lerin doğru işlenmesini geri getirir, böylece device artık under-length bir frame'i sabit buffer'a kopyalamaz.
Observable effect on an unpatched build
Fix olmayan bir build'de, kötü niyetli short loopback frame bir QEMU process crash
üretir (SIGSEGV / stack-smashing abort, örn. -fstack-protector ile derlendiğinde
*** stack smashing detected ***). Normal bir guest asla sub-minimum loopback
frame yaymaz, dolayısıyla bu path benign çalışmada tetiklenmez.
Warning
Tarihsel, düzeltilmiş bug (CVE-2025-12464, CVSS ~6.2, local/guest attacker, availability etkisi). Açıklanan etki host-side bir DoS'tur. Burada hiçbir offset, grooming reçetesi ya da end-to-end host code-execution chain verilmez — yalnızca açıklanmış yapı.
Detection¶
e1000_receive_iov()'tan kaynaklanan host-side crash imzaları: stack-protector abort'ları (stack smashing detected) ya da e1000 receive path'inde ASan stack-buffer-overflow raporları.- e1000 loopback mode'unu enable edip sub-minimum frame'ler yayan guest'ler için denetleyin/izleyin — production workload'ları için anormal.
- e1000 receive path'ini short/loopback frame'lerle fuzz'lamak (QEMU'nun
qtest/--fuzznet harness'i) bu sınıfı deployment öncesinde tekrar üretir.
Mitigation¶
- CVE-2025-12464 fix'ini taşıyan bir QEMU build'ine (upstream Oct 2025) ya da distro backport'una (Red Hat, SUSE, Debian, Fedora advisory'leri) güncelleyin.
- Guest uyumluluğunun izin verdiği yerlerde legacy
e1000modeli yerinevirtio-net'i tercih ederek legacy NIC emülasyon bug'larına maruziyeti azaltın. - QEMU'yu libvirt altında sVirt/SELinux ve seccomp ile unprivileged çalıştırın ki QEMU process'indeki bir crash, host kontrolü vermek yerine sınırlansın.