Module Name: src Committed By: maxv Date: Mon Feb 25 06:49:44 UTC 2019
Modified Files: src/sys/netcan: can_pcb.c src/sys/netinet: sctp_usrreq.c src/sys/netinet6: raw_ip6.c sctp6_usrreq.c Log Message: RIP6, CAN, SCTP and SCTP6 lack a length check in their _send() functions. Fix RIP6 and CAN, add a big XXX in the SCTP ones. Found by KASAN, triggered by SyzKaller. Reported-by: syzbot+0b9692ae0f49f93b7...@syzkaller.appspotmail.com To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/netcan/can_pcb.c cvs rdiff -u -r1.17 -r1.18 src/sys/netinet/sctp_usrreq.c cvs rdiff -u -r1.174 -r1.175 src/sys/netinet6/raw_ip6.c cvs rdiff -u -r1.18 -r1.19 src/sys/netinet6/sctp6_usrreq.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netcan/can_pcb.c diff -u src/sys/netcan/can_pcb.c:1.6 src/sys/netcan/can_pcb.c:1.7 --- src/sys/netcan/can_pcb.c:1.6 Fri Jun 9 08:21:41 2017 +++ src/sys/netcan/can_pcb.c Mon Feb 25 06:49:44 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: can_pcb.c,v 1.6 2017/06/09 08:21:41 bouyer Exp $ */ +/* $NetBSD: can_pcb.c,v 1.7 2019/02/25 06:49:44 maxv Exp $ */ /*- * Copyright (c) 2003, 2017 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: can_pcb.c,v 1.6 2017/06/09 08:21:41 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: can_pcb.c,v 1.7 2019/02/25 06:49:44 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -124,6 +124,8 @@ can_pcbbind(void *v, struct sockaddr_can if (scan->can_family != AF_CAN) return (EAFNOSUPPORT); + if (scan->can_len != sizeof(*scan)) + return EINVAL; mutex_enter(&canp->canp_mtx); if (scan->can_ifindex != 0) { canp->canp_ifp = if_byindex(scan->can_ifindex); @@ -157,6 +159,8 @@ can_pcbconnect(void *v, struct sockaddr_ if (scan->can_family != AF_CAN) return (EAFNOSUPPORT); + if (scan->can_len != sizeof(*scan)) + return EINVAL; #if 0 mutex_enter(&canp->canp_mtx); memcpy(&canp->canp_dst, scan, sizeof(struct sockaddr_can)); Index: src/sys/netinet/sctp_usrreq.c diff -u src/sys/netinet/sctp_usrreq.c:1.17 src/sys/netinet/sctp_usrreq.c:1.18 --- src/sys/netinet/sctp_usrreq.c:1.17 Sun Feb 24 07:20:33 2019 +++ src/sys/netinet/sctp_usrreq.c Mon Feb 25 06:49:44 2019 @@ -1,5 +1,5 @@ /* $KAME: sctp_usrreq.c,v 1.50 2005/06/16 20:45:29 jinmei Exp $ */ -/* $NetBSD: sctp_usrreq.c,v 1.17 2019/02/24 07:20:33 maxv Exp $ */ +/* $NetBSD: sctp_usrreq.c,v 1.18 2019/02/25 06:49:44 maxv Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc. @@ -33,7 +33,7 @@ * SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sctp_usrreq.c,v 1.17 2019/02/24 07:20:33 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sctp_usrreq.c,v 1.18 2019/02/25 06:49:44 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -638,6 +638,11 @@ sctp_send(struct socket *so, struct mbuf return EINVAL; } #endif /* INET6 */ + + /* + * XXX XXX XXX Check addr->sa_len? + */ + connected_type: /* now what about control */ if (control) { Index: src/sys/netinet6/raw_ip6.c diff -u src/sys/netinet6/raw_ip6.c:1.174 src/sys/netinet6/raw_ip6.c:1.175 --- src/sys/netinet6/raw_ip6.c:1.174 Sun Feb 24 07:20:33 2019 +++ src/sys/netinet6/raw_ip6.c Mon Feb 25 06:49:44 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip6.c,v 1.174 2019/02/24 07:20:33 maxv Exp $ */ +/* $NetBSD: raw_ip6.c,v 1.175 2019/02/25 06:49:44 maxv Exp $ */ /* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.174 2019/02/24 07:20:33 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.175 2019/02/25 06:49:44 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_ipsec.h" @@ -891,6 +891,10 @@ rip6_send(struct socket *so, struct mbuf error = EAFNOSUPPORT; goto release; } + if (dst->sin6_len != sizeof(*dst)) { + error = EINVAL; + goto release; + } } error = rip6_output(m, so, dst, control); m = NULL; Index: src/sys/netinet6/sctp6_usrreq.c diff -u src/sys/netinet6/sctp6_usrreq.c:1.18 src/sys/netinet6/sctp6_usrreq.c:1.19 --- src/sys/netinet6/sctp6_usrreq.c:1.18 Sun Feb 24 07:20:33 2019 +++ src/sys/netinet6/sctp6_usrreq.c Mon Feb 25 06:49:44 2019 @@ -1,5 +1,5 @@ /* $KAME: sctp6_usrreq.c,v 1.38 2005/08/24 08:08:56 suz Exp $ */ -/* $NetBSD: sctp6_usrreq.c,v 1.18 2019/02/24 07:20:33 maxv Exp $ */ +/* $NetBSD: sctp6_usrreq.c,v 1.19 2019/02/25 06:49:44 maxv Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc. @@ -33,7 +33,7 @@ * SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sctp6_usrreq.c,v 1.18 2019/02/24 07:20:33 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sctp6_usrreq.c,v 1.19 2019/02/25 06:49:44 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -833,6 +833,9 @@ sctp6_send(struct socket *so, struct mbu #ifdef INET sin6 = (struct sockaddr_in6 *)nam; + /* + * XXX XXX XXX Check sin6->sin6_len? + */ if (inp6->in6p_flags & IN6P_IPV6_V6ONLY) { /* * if IPV6_V6ONLY flag, we discard datagrams