7f173b2
From c4ea553123a5ab1bf5fab38f12a540020c08293d Mon Sep 17 00:00:00 2001
7f173b2
From: David Lamparter <equinox@opensourcerouting.org>
7f173b2
Date: Wed, 31 Aug 2016 13:31:16 +0200
7f173b2
Subject: [PATCH 4/4] zebra: stack overrun in IPv6 RA receive code
7f173b2
 (CVE-2016-1245)
7f173b2
7f173b2
The IPv6 RA code also receives ICMPv6 RS and RA messages.
7f173b2
Unfortunately, by bad coding practice, the buffer size specified on
7f173b2
receiving such messages mixed up 2 constants that in fact have
7f173b2
different values.
7f173b2
7f173b2
The code itself has:
7f173b2
 #define RTADV_MSG_SIZE 4096
7f173b2
While BUFSIZ is system-dependent, in my case (x86_64 glibc):
7f173b2
 /usr/include/_G_config.h:#define _G_BUFSIZ 8192
7f173b2
 /usr/include/libio.h:#define _IO_BUFSIZ _G_BUFSIZ
7f173b2
 /usr/include/stdio.h:# define BUFSIZ _IO_BUFSIZ
7f173b2
7f173b2
FreeBSD, OpenBSD, NetBSD and Illumos are not affected, since all of them
7f173b2
have BUFSIZ == 1024.
7f173b2
7f173b2
As the latter is passed to the kernel on recvmsg(), it's possible to
7f173b2
overwrite 4kB of stack -- with ICMPv6 packets that can be globally sent
7f173b2
to any of the system's addresses (using fragmentation to get to 8k).
7f173b2
7f173b2
(The socket has filters installed limiting this to RS and RA packets,
7f173b2
but does not have a filter for source address or TTL.)
7f173b2
7f173b2
Issue discovered by trying to test other stuff, which randomly caused
7f173b2
the stack to be smaller than 8kB in that code location, which then
7f173b2
causes the kernel to report EFAULT (Bad address).
7f173b2
7f173b2
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
7f173b2
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
7f173b2
7f173b2
Cherry-picked from: cfb1fae25f8c092e0d17073eaf7bd428ce1cd546
7f173b2
Resolves: #1386110
7f173b2
---
7f173b2
 zebra/rtadv.c | 2 +-
7f173b2
 1 file changed, 1 insertion(+), 1 deletion(-)
7f173b2
7f173b2
diff --git a/zebra/rtadv.c b/zebra/rtadv.c
7f173b2
index 21ca6da..973ae08 100644
7f173b2
--- a/zebra/rtadv.c
7f173b2
+++ b/zebra/rtadv.c
7f173b2
@@ -515,7 +515,7 @@ rtadv_read (struct thread *thread)
7f173b2
   /* Register myself. */
7f173b2
   rtadv_event (RTADV_READ, sock);
7f173b2
 
7f173b2
-  len = rtadv_recv_packet (sock, buf, BUFSIZ, &from, &ifindex, &hoplimit);
7f173b2
+  len = rtadv_recv_packet (sock, buf, sizeof (buf), &from, &ifindex, &hoplimit);
7f173b2
 
7f173b2
   if (len < 0) 
7f173b2
     {
7f173b2
-- 
7f173b2
2.7.4
7f173b2