Skip to content

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.

  1. Guest driver, standart max frame için boyutlandırılmış RX descriptor'ları programlar ve RCTL'de E1000_RCTL_LPE ile E1000_RCTL_SBP'yi clear bırakır.
  2. 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ı.
  3. 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)
#define MAXIMUM_ETHERNET_VLAN_SIZE 1522
...
/* discard oversized frames when neither long-packet nor
   store-bad-packet is enabled, matching real hardware */
if (size > MAXIMUM_ETHERNET_VLAN_SIZE
    && !(s->mac_reg[RCTL] & E1000_RCTL_LPE)
    && !(s->mac_reg[RCTL] & E1000_RCTL_SBP)) {
    return size;
}

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şıp e1000_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 uyarak MAXIMUM_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