|
@@ -0,0 +1,64 @@
|
|
|
+From 0b03959b72036afce151783720d9e54988cf76ef Mon Sep 17 00:00:00 2001
|
|
|
+From: Changqing Li <changqing.li@windriver.com>
|
|
|
+Date: Thu, 27 Feb 2020 12:15:04 +0800
|
|
|
+Subject: [PATCH] slirp: use correct size while emulating IRC commands
|
|
|
+
|
|
|
+While emulating IRC DCC commands, tcp_emu() uses 'mbuf' size
|
|
|
+'m->m_size' to write DCC commands via snprintf(3). This may
|
|
|
+lead to OOB write access, because 'bptr' points somewhere in
|
|
|
+the middle of 'mbuf' buffer, not at the start. Use M_FREEROOM(m)
|
|
|
+size to avoid OOB access.
|
|
|
+Reported-by: default avatarVishnu Dev TJ <vishnudevtj@gmail.com>
|
|
|
+Signed-off-by: default avatarPrasad J Pandit <pjp@fedoraproject.org>
|
|
|
+Reviewed-by: Samuel Thibault's avatarSamuel Thibault
|
|
|
+<samuel.thibault@ens-lyon.org>
|
|
|
+Message-Id: <20200109094228.79764-2-ppandit@redhat.com>
|
|
|
+
|
|
|
+CVE: CVE-2020-7039
|
|
|
+Upstream-Status: Backport
|
|
|
+[https://gitlab.freedesktop.org/slirp/libslirp/commit/ce131029d6d4a405cb7d3ac6716d03e58fb4a5d9]
|
|
|
+
|
|
|
+Signed-off-by: Changqing Li <changqing.li@windriver.com>
|
|
|
+---
|
|
|
+ slirp/src/tcp_subr.c | 11 ++++++-----
|
|
|
+ 1 file changed, 6 insertions(+), 5 deletions(-)
|
|
|
+
|
|
|
+diff --git a/slirp/src/tcp_subr.c b/slirp/src/tcp_subr.c
|
|
|
+index e8ed4ef..3a4a8ee 100644
|
|
|
+--- a/slirp/src/tcp_subr.c
|
|
|
++++ b/slirp/src/tcp_subr.c
|
|
|
+@@ -777,7 +777,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ m->m_len = bptr - m->m_data; /* Adjust length */
|
|
|
+- m->m_len += snprintf(bptr, m->m_size, "DCC CHAT chat %lu %u%c\n",
|
|
|
++ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
|
|
++ "DCC CHAT chat %lu %u%c\n",
|
|
|
+ (unsigned long)ntohl(so->so_faddr.s_addr),
|
|
|
+ ntohs(so->so_fport), 1);
|
|
|
+ } else if (sscanf(bptr, "DCC SEND %256s %u %u %u", buff, &laddr, &lport,
|
|
|
+@@ -787,8 +788,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ m->m_len = bptr - m->m_data; /* Adjust length */
|
|
|
+- m->m_len +=
|
|
|
+- snprintf(bptr, m->m_size, "DCC SEND %s %lu %u %u%c\n", buff,
|
|
|
++ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
|
|
++ "DCC SEND %s %lu %u %u%c\n", buff,
|
|
|
+ (unsigned long)ntohl(so->so_faddr.s_addr),
|
|
|
+ ntohs(so->so_fport), n1, 1);
|
|
|
+ } else if (sscanf(bptr, "DCC MOVE %256s %u %u %u", buff, &laddr, &lport,
|
|
|
+@@ -798,8 +799,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ m->m_len = bptr - m->m_data; /* Adjust length */
|
|
|
+- m->m_len +=
|
|
|
+- snprintf(bptr, m->m_size, "DCC MOVE %s %lu %u %u%c\n", buff,
|
|
|
++ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
|
|
++ "DCC MOVE %s %lu %u %u%c\n", buff,
|
|
|
+ (unsigned long)ntohl(so->so_faddr.s_addr),
|
|
|
+ ntohs(so->so_fport), n1, 1);
|
|
|
+ }
|
|
|
+--
|
|
|
+2.7.4
|
|
|
+
|