QEMU e1000 large-packet buffer overflow (SBP/LPE disabled)¶
QEMU'nun emüle Intel e1000 NIC'inde guest-reachable bir buffer overflow (CVE-2012-6075); burada
e1000_receive(), SBP ve LPE flag'leri disabled olduğunda, guest driver'ın varsaydığı 1522-byte sınırını zorlamadan oversized bir frame'i guest-allocated bir RX buffer'a kopyalıyordu.
Mechanism¶
Note
QEMU, Intel e1000 NIC'ini host process içinde emüle eder. Gerçek e1000 donanımı
çok büyük bir frame'i guest'e yalnızca RCTL register'ında LPE (Large Packet
Enable) ya da SBP (Store Bad Packet) set ise iletir; aksi halde oversized
frame'ler düşürülür. Guest driver'lar bu sözleşmeye güvenir ve receive (RX)
descriptor buffer'larını normal maksimum Ethernet/VLAN frame'i (1522 byte) için
boyutlandırır. Isolation invariant, e1000_receive()'in bir frame'i guest
buffer'ına DMA'lamadan önce donanımın size filtering'ini taklit etmesi gerektiğidir.
CVE-2012-6075 eksik bir size check'tir: LPE ve SBP disabled iken,
e1000_receive() yine de guest'in beklediğinden daha büyük bir frame'i guest'in RX
buffer'ına yazıp onu overflow ederek guest memory'sini bozuyordu — attacker-controlled
(örn. external/remote) bir paketle sürülen bir crash ya da olası bir
guest-code-execution primitive'i.
Frame kaynağı emüle network backend'idir, dolayısıyla guest'in vNIC'ine büyük bir frame iletebilen bir remote attacker (ya da loopback ile işbirliği yapan bir guest) overflow'u sürer. Burada aşılan sınır, emüle donanım ile guest driver'ın buffer-sizing varsayımı arasındaki trust boundary'sidir; overflow guest RAM'e düşer.
Walkthrough¶
Public, hâlihazırda patch'lenmiş materyal: QEMU fix commit'i ve NVD kaydı. Yalnızca kavramsal path.
- Guest driver, standart max frame için boyutlandırılmış RX descriptor'ları
programlar ve RCTL'de
E1000_RCTL_LPEileE1000_RCTL_SBP'yi clear bırakır. - 1522 byte'tan büyük bir frame emüle NIC'e ulaşır. Patch öncesi
e1000_receive()onu reddetmedi ve tüm frame'i guest buffer'ına kopyalayarak sonunun ötesine yazdı. - Fix,
e1000_receive()'in başına açık bir size gate ekler:
Warning
Bug sınıfı için belgelenmiş tarihsel, patch'lenmiş bir sorun. Hiçbir exploit offset'i ya da guest heap layout'u verilmemiştir.
Patched bound (from the CVE-2012-6075 fix)
Vulnerable bir build'de beklenen gözlemlenebilir: LPE/SBP clear iken oversized bir frame iletildikten sonra guest OS crash / memory corruption.
Detection¶
- Guest tarafı: LPE/SBP disabled iken yapılandırılan MTU'dan büyük frame'lerin varışıyla ilişkilenen e1000 RX corruption / panic'leri.
- Host/backend tarafı: patch'lenmemiş bir build'de emüle NIC'i
MAXIMUM_ETHERNET_VLAN_SIZE'ı aşıpe1000_receive()'e ulaşan frame'ler için izlemek; bir guest vNIC'ine doğru olağandışı büyük inbound frame'ler.
Mitigation¶
- CVE-2012-6075 için QEMU fix'ini uygulayın (
e1000_receive()içinde LPE/SBP flag'lerine uyarakMAXIMUM_ETHERNET_VLAN_SIZE'a karşı size check). - Mümkün olan yerde untrusted ağlar için legacy emüle e1000 yerine paravirtualized bir NIC (virtio-net) ya da bakımı yapılan bir device modelini tercih edin.
- Defense-in-depth: device-emulation process'ini deprivilege edin/sandbox'layın (seccomp, SELinux/sVirt) ki memory corruption sınırlansın.
References¶
- NVD — CVE-2012-6075: https://nvd.nist.gov/vuln/detail/CVE-2012-6075
- QEMU fix commit (hw/e1000.c,
MAXIMUM_ETHERNET_VLAN_SIZE): https://gitlab.com/qemu-project/qemu/-/commit/b0d9ffcd0251161c7c92f94804dcf599dfa3edeb