svn commit: r293898 - in stable/9: etc sys/amd64/linux32 sys/compat/linux sys/i386/linux sys/kern sys/netinet sys/netinet6 sys/sys

Gleb Smirnoff glebius at FreeBSD.org
Thu Jan 14 09:11:51 UTC 2016


Author: glebius
Date: Thu Jan 14 09:11:48 2016
New Revision: 293898
URL: https://svnweb.freebsd.org/changeset/base/293898

Log:
  o Fix SCTP ICMPv6 error message vulnerability. [SA-16:01.sctp]
  o Fix ntp panic threshold bypass vulnerability. [SA-16:02.ntp]
  o Fix Linux compatibility layer incorrect futex handling. [SA-16:03.linux]
  o Fix Linux compatibility layer setgroups(2) system call. [SA-16:04.linux]
  o Fix TCP MD5 signature denial of service. [SA-16:05.tcp]
  o Fix insecure default bsnmpd.conf permissions. [SA-16:06.bsnmpd]
  
  Security:	FreeBSD-SA-16:01.sctp, CVE-2016-1879
  Security:	FreeBSD-SA-16:03.linux, CVE-2016-1880
  Security:	FreeBSD-SA-16:04.linux, CVE-2016-1881
  Security:	FreeBSD-SA-16:05.tcp, CVE-2016-1882
  Security:	FreeBSD-SA-16:06.bsnmpd, CVE-2015-5677

Modified:
  stable/9/etc/Makefile
  stable/9/sys/amd64/linux32/linux32_proto.h
  stable/9/sys/amd64/linux32/linux32_systrace_args.c
  stable/9/sys/amd64/linux32/syscalls.master
  stable/9/sys/compat/linux/linux_futex.c
  stable/9/sys/compat/linux/linux_misc.c
  stable/9/sys/i386/linux/syscalls.master
  stable/9/sys/kern/kern_prot.c
  stable/9/sys/netinet/tcp_output.c
  stable/9/sys/netinet6/sctp6_usrreq.c
  stable/9/sys/sys/ucred.h

Modified: stable/9/etc/Makefile
==============================================================================
--- stable/9/etc/Makefile	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/etc/Makefile	Thu Jan 14 09:11:48 2016	(r293898)
@@ -82,10 +82,6 @@ BIN1+= amd.map
 BIN1+= apmd.conf
 .endif
 
-.if ${MK_BSNMP} != "no"
-BIN1+= snmpd.config
-.endif
-
 .if ${MK_FREEBSD_UPDATE} != "no"
 BIN1+= freebsd-update.conf
 .endif
@@ -217,6 +213,11 @@ distribution:
 		${BIN2} ${DESTDIR}/etc; \
 	    ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
 		master.passwd nsmb.conf opieaccess ${DESTDIR}/etc;
+.if ${MK_BSNMP} != "no"
+	cd ${.CURDIR}; \
+	    ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
+		snmpd.config ${DESTDIR}/etc;
+.endif
 .if ${MK_AT} == "no"
 	sed -i "" -e 's;.*/usr/libexec/atrun;#&;' ${DESTDIR}/etc/crontab
 .endif

Modified: stable/9/sys/amd64/linux32/linux32_proto.h
==============================================================================
--- stable/9/sys/amd64/linux32/linux32_proto.h	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/amd64/linux32/linux32_proto.h	Thu Jan 14 09:11:48 2016	(r293898)
@@ -993,7 +993,7 @@ struct linux_set_robust_list_args {
 };
 struct linux_get_robust_list_args {
 	char pid_l_[PADL_(l_int)]; l_int pid; char pid_r_[PADR_(l_int)];
-	char head_l_[PADL_(struct linux_robust_list_head *)]; struct linux_robust_list_head * head; char head_r_[PADR_(struct linux_robust_list_head *)];
+	char head_l_[PADL_(struct linux_robust_list_head **)]; struct linux_robust_list_head ** head; char head_r_[PADR_(struct linux_robust_list_head **)];
 	char len_l_[PADL_(l_size_t *)]; l_size_t * len; char len_r_[PADR_(l_size_t *)];
 };
 struct linux_splice_args {

Modified: stable/9/sys/amd64/linux32/linux32_systrace_args.c
==============================================================================
--- stable/9/sys/amd64/linux32/linux32_systrace_args.c	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/amd64/linux32/linux32_systrace_args.c	Thu Jan 14 09:11:48 2016	(r293898)
@@ -2090,7 +2090,7 @@ systrace_args(int sysnum, void *params, 
 	case 312: {
 		struct linux_get_robust_list_args *p = params;
 		iarg[0] = p->pid; /* l_int */
-		uarg[1] = (intptr_t) p->head; /* struct linux_robust_list_head * */
+		uarg[1] = (intptr_t) p->head; /* struct linux_robust_list_head ** */
 		uarg[2] = (intptr_t) p->len; /* l_size_t * */
 		*n_args = 3;
 		break;
@@ -5371,7 +5371,7 @@ systrace_setargdesc(int sysnum, int ndx,
 			p = "l_int";
 			break;
 		case 1:
-			p = "struct linux_robust_list_head *";
+			p = "struct linux_robust_list_head **";
 			break;
 		case 2:
 			p = "l_size_t *";

Modified: stable/9/sys/amd64/linux32/syscalls.master
==============================================================================
--- stable/9/sys/amd64/linux32/syscalls.master	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/amd64/linux32/syscalls.master	Thu Jan 14 09:11:48 2016	(r293898)
@@ -512,8 +512,8 @@
 ; linux 2.6.17:
 311	AUE_NULL	STD	{ int linux_set_robust_list(struct linux_robust_list_head *head, \
 					l_size_t len); }
-312	AUE_NULL	STD	{ int linux_get_robust_list(l_int pid, struct linux_robust_list_head *head, \
-					l_size_t *len); }
+312	AUE_NULL	STD	{ int linux_get_robust_list(l_int pid, \
+				    struct linux_robust_list_head **head, l_size_t *len); }
 313	AUE_NULL	STD	{ int linux_splice(void); }
 314	AUE_NULL	STD	{ int linux_sync_file_range(void); }
 315	AUE_NULL	STD	{ int linux_tee(void); }

Modified: stable/9/sys/compat/linux/linux_futex.c
==============================================================================
--- stable/9/sys/compat/linux/linux_futex.c	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/compat/linux/linux_futex.c	Thu Jan 14 09:11:48 2016	(r293898)
@@ -1090,7 +1090,7 @@ linux_get_robust_list(struct thread *td,
 		return (EFAULT);
 	}
 
-	error = copyout(head, args->head, sizeof(struct linux_robust_list_head));
+	error = copyout(&head, args->head, sizeof(head));
 	if (error) {
 		LIN_SDT_PROBE1(futex, linux_get_robust_list, copyout_error,
 		    error);

Modified: stable/9/sys/compat/linux/linux_misc.c
==============================================================================
--- stable/9/sys/compat/linux/linux_misc.c	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/compat/linux/linux_misc.c	Thu Jan 14 09:11:48 2016	(r293898)
@@ -1111,9 +1111,11 @@ linux_setgroups(struct thread *td, struc
 	if (error)
 		goto out;
 	newcred = crget();
+	crextend(newcred, ngrp + 1);
 	p = td->td_proc;
 	PROC_LOCK(p);
-	oldcred = crcopysafe(p, newcred);
+	oldcred = p->p_ucred;
+	crcopy(newcred, oldcred);
 
 	/*
 	 * cr_groups[0] holds egid. Setting the whole set from

Modified: stable/9/sys/i386/linux/syscalls.master
==============================================================================
--- stable/9/sys/i386/linux/syscalls.master	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/i386/linux/syscalls.master	Thu Jan 14 09:11:48 2016	(r293898)
@@ -520,8 +520,8 @@
 ; linux 2.6.17:
 311	AUE_NULL	STD	{ int linux_set_robust_list(struct linux_robust_list_head *head, \
 					l_size_t len); }
-312	AUE_NULL	STD	{ int linux_get_robust_list(l_int pid, struct linux_robust_list_head **head, \
-					l_size_t *len); }
+312	AUE_NULL	STD	{ int linux_get_robust_list(l_int pid, \
+				    struct linux_robust_list_head **head, l_size_t *len); }
 313	AUE_NULL	STD	{ int linux_splice(void); }
 314	AUE_NULL	STD	{ int linux_sync_file_range(void); }
 315	AUE_NULL	STD	{ int linux_tee(void); }

Modified: stable/9/sys/kern/kern_prot.c
==============================================================================
--- stable/9/sys/kern/kern_prot.c	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/kern/kern_prot.c	Thu Jan 14 09:11:48 2016	(r293898)
@@ -88,7 +88,6 @@ static MALLOC_DEFINE(M_CRED, "cred", "cr
 
 SYSCTL_NODE(_security, OID_AUTO, bsd, CTLFLAG_RW, 0, "BSD security policy");
 
-static void crextend(struct ucred *cr, int n);
 static void crsetgroups_locked(struct ucred *cr, int ngrp,
     gid_t *groups);
 
@@ -1974,7 +1973,7 @@ crcopysafe(struct proc *p, struct ucred 
 /*
  * Extend the passed in credential to hold n items.
  */
-static void
+void
 crextend(struct ucred *cr, int n)
 {
 	int cnt;

Modified: stable/9/sys/netinet/tcp_output.c
==============================================================================
--- stable/9/sys/netinet/tcp_output.c	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/netinet/tcp_output.c	Thu Jan 14 09:11:48 2016	(r293898)
@@ -702,8 +702,8 @@ send:
 	 * segments.  Options for SYN-ACK segments are handled in TCP
 	 * syncache.
 	 */
+	to.to_flags = 0;
 	if ((tp->t_flags & TF_NOOPT) == 0) {
-		to.to_flags = 0;
 		/* Maximum segment size. */
 		if (flags & TH_SYN) {
 			tp->snd_nxt = tp->iss;
@@ -1168,7 +1168,7 @@ send:
 		tp->snd_up = tp->snd_una;		/* drag it along */
 
 #ifdef TCP_SIGNATURE
-	if (tp->t_flags & TF_SIGNATURE) {
+	if (to.to_flags & TOF_SIGNATURE) {
 		int sigoff = to.to_signature - opt;
 		tcp_signature_compute(m, 0, len, optlen,
 		    (u_char *)(th + 1) + sigoff, IPSEC_DIR_OUTBOUND);
@@ -1587,6 +1587,7 @@ tcp_addoptions(struct tcpopt *to, u_char
 			bcopy((u_char *)&to->to_tsecr, optp, sizeof(to->to_tsecr));
 			optp += sizeof(to->to_tsecr);
 			break;
+#ifdef TCP_SIGNATURE
 		case TOF_SIGNATURE:
 			{
 			int siglen = TCPOLEN_SIGNATURE - 2;
@@ -1605,6 +1606,7 @@ tcp_addoptions(struct tcpopt *to, u_char
 				 *optp++ = 0;
 			break;
 			}
+#endif
 		case TOF_SACK:
 			{
 			int sackblks = 0;

Modified: stable/9/sys/netinet6/sctp6_usrreq.c
==============================================================================
--- stable/9/sys/netinet6/sctp6_usrreq.c	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/netinet6/sctp6_usrreq.c	Thu Jan 14 09:11:48 2016	(r293898)
@@ -393,7 +393,6 @@ sctp6_ctlinput(int cmd, struct sockaddr 
 		 * XXX: We assume that when IPV6 is non NULL, M and OFF are
 		 * valid.
 		 */
-		/* check if we can safely examine src and dst ports */
 		struct sctp_inpcb *inp = NULL;
 		struct sctp_tcb *stcb = NULL;
 		struct sctp_nets *net = NULL;
@@ -402,6 +401,10 @@ sctp6_ctlinput(int cmd, struct sockaddr 
 		if (ip6cp->ip6c_m == NULL)
 			return;
 
+		/* Check if we can safely examine the SCTP header. */
+		if (ip6cp->ip6c_m->m_pkthdr.len < ip6cp->ip6c_off + sizeof(sh))
+			return;
+
 		bzero(&sh, sizeof(sh));
 		bzero(&final, sizeof(final));
 		inp = NULL;

Modified: stable/9/sys/sys/ucred.h
==============================================================================
--- stable/9/sys/sys/ucred.h	Thu Jan 14 09:11:42 2016	(r293897)
+++ stable/9/sys/sys/ucred.h	Thu Jan 14 09:11:48 2016	(r293898)
@@ -104,6 +104,7 @@ void	change_svuid(struct ucred *newcred,
 void	crcopy(struct ucred *dest, struct ucred *src);
 struct ucred	*crcopysafe(struct proc *p, struct ucred *cr);
 struct ucred	*crdup(struct ucred *cr);
+void	crextend(struct ucred *cr, int n);
 void	cred_update_thread(struct thread *td);
 void	crfree(struct ucred *cr);
 struct ucred	*crget(void);


More information about the svn-src-all mailing list