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.
- User networking ile bir guest başlat:
-netdev user,id=n0 -device e1000,netdev=n0. - 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. tcp_emu(), substitution'ımbufdata 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 userkullanı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_emupath'i yok). - Defense-in-depth için device/network emülasyonunu sandbox'lı çalıştır (seccomp, sVirt).
References¶
- CVE-2019-6778 (NVD) — heap buffer overflow in
tcp_emu()inslirp/tcp_subr.c: https://nvd.nist.gov/vuln/detail/CVE-2019-6778