Skip to content

QEMU slirp tcp_emu() heap buffer overflow

slirp'in application-layer protocol emülasyonunda (tcp_emu(), CVE-2019-6778), QEMU user-mode networking kullanan bir guest'ten erişilebilen bir heap buffer overflow.

Mechanism

Note

QEMU'nun -netdev user'ı (namıdiğer slirp), bir guest'in host ayrıcalıkları olmadan ağa ulaşmasını sağlayan bir user-space TCP/IP stack'idir. Legacy protocol'leri kendi NAT'ı üzerinden çalıştırmak için slirp, tcp_emu() (slirp/tcp_subr.c) içinde application-layer payload'larını inline olarak yeniden yazar — örn. IRC DCC, FTP PORT ve identd —, gömülü IP:port string'lerini yamalar. İzolasyon invariant'ı şu: herhangi bir rewrite, segment'i tutan socket buffer (sbuf/mbuf) içinde hesaba katılan alana sığmalıdır. CVE-2019-6778 bunu bozar: tcp_emu(), yeniden yazılmış substitution'ı buffer'a kalan alanı yeniden kontrol etmeden (m->m_len / sodata) ekler, böylece özenle hazırlanmış bir application-layer mesajı, emülatörün heap allocation'ının ötesine yazmasına yol açar. Bu out-of-bounds write, QEMU host process heap'ine düşer — guest→host sınırını aşan guest-controlled bir corruption.

Walkthrough

Warning

Tarihî, patch'li bir issue (QEMU ≤ 3.0 / fix öncesi libslirp). Yalnızca kavramsal; public CVE ve patch'e dayanır — weaponize edilmiş host layout'u yok.

  1. User networking ile bir guest başlat: -netdev user,id=n0 -device e1000,netdev=n0.
  2. Guest'ten, tcp_emu()'nun yeniden yazdığı bir protocol sür (örn. DCC mesajı aşırı uzun bir adres alanı taşıyan bir IRC session'ı), böylece slirp'in yazdığı substitution orijinal token'dan büyük olur ve segment buffer'ının boş alanını aşar.
  3. tcp_emu(), substitution'ı mbuf data region'ının sonunun ötesine kopyalar.
/* shape of the unchecked rewrite (illustrative) */
// tcp_emu(): builds "DCC ... <ip> <port> ..." replacement
// then: memcpy(m->m_data + m->m_len, buf, n);   // n not bounded vs free space

Beklenen gözlem: vulnerable bir build'de over-write komşu heap'i bozar ve genellikle QEMU'yu crash ettirir (veya control data'ya doğru yönlendirilir); patch'li bir build'de substitution sığmayacağında emülasyon erken çıkar.

Detection

  • Host: ASAN/instrumented QEMU, tcp_emu() içindeki OOB write'ı işaretler; bir guest -netdev user kullanırken QEMU heap corruption ile crash eder.
  • Behavioural: yalnızca tcp_emu() substitution'larını büyütmek için bozuk IRC/FTP control mesajları yayan guest'ler anormaldir.

Mitigation

  • CVE-2019-6778 için libslirp/QEMU fix'ini uygula (substitution uzunluğunu bounds-check et).
  • Güvenilmeyen guest'ler için -netdev user'dan kaçın; tap/vhost-net'i tercih et (tcp_emu path'i yok).
  • Defense-in-depth için device/network emülasyonunu sandbox'lı çalıştır (seccomp, sVirt).

References