Skip to content

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:

  1. 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.
  2. 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.
  3. 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/--fuzz net 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 e1000 modeli yerine virtio-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.

References