Skip to content

QEMU tulip NIC OOB write (CVE-2020-11102)

Emüle tulip (21143) NIC, guest tarafından tanımlanan frame data'sını toplam uzunluğu zorlamadan sabit boyutlu internal buffer'lara kopyalar ve host process'inde bir out-of-bounds write'a izin verir.

Mechanism

Sınır neden bozuluyor

tulip model'i (hw/net/tulip.c), guest DMA descriptor'ları tarafından tanımlanan frame data'sını sabit boyutlu internal buffer'lara kopyalar (RX'te tulip_copy_rx_bytes()/tulip_receive() üzerinden s->rx_frame'e ve TX'te tulip_copy_tx_buffers() üzerinden s->tx_frame'e). İhlal edilen invariant şu: biriken copy uzunluğu buffer kapasitesi içinde kalmalıdır. Guest tarafından kontrol edilen descriptor uzunlukları bu kontrol olmadan toplanıp kopyalanır, böylece write static buffer'ın ötesine yürür (NVD: CWE-787 OOB write). tulip_xmit_list_update() içindeki ilişkili bir infinite loop aynı çalışmada ele alındı.

Walkthrough

Kavramsal, public advisory'den.

  1. Guest, bir tulip NIC yapılandırır ve frame/buffer uzunlukları internal frame buffer'ı aşan DMA descriptor'ları programlar.
  2. Pre-patch shape'te RX/TX copy helper'ı biriken copy uzunluğunu (rx_frame_len + len) sabit boyutlu buffer'a (sizeof(s->rx_frame)) karşı kontrol etmeden kopyalar, böylece write buffer'ın ötesine taşar. Upstream fix bu eksik kapasite kontrolünü ekler — aşağıdaki snippet vuln'un kendisi değil, copy'den önce eklenen bounds check'tir:
/* upstream fix: added capacity guard before copy (returns early on overflow) */
if (s->rx_frame_len + len > sizeof(s->rx_frame)) return;
  1. Bu guard yokken sonuç: host heap OOB write.

Detection

  • Host-side: Guest NIC etkinliği sırasında QEMU crash; ASan/heap-guard, tulip RX/TX copy path'indeki OOB'yi işaretler.
  • Behavioral: Normal bir Ethernet frame'ini aşan guest descriptor uzunlukları anormaldir.

Mitigation

  • Patch: Frame copy'lerinden önce bounds check'ler ekleyen ve descriptor iteration'ını 128'le sınırlayan upstream fix'i (Ziming Zhang ve Li Qiang tarafından raporlandı) uygula; QEMU 4.2.0 sonrasında düzeltildi.
  • Configuration workaround: Güvenilmeyen guest'ler için legacy tulip NIC'ten kaçın; virtio-net'i tercih et.

References