Module Name:    src
Committed By:   christos
Date:           Fri May 13 17:33:43 UTC 2016

Modified Files:
        src/sys/kern: exec_subr.c kern_pax.c

Log Message:
- make pax aslr stack eat up to 1/8 of the max stack space insted of 1/4
  and reduce the length of the randomization bits since this is unused.
- call the pax aslr stack function sooner so we don't need to re-adjust the
  stack size.
- adjust the stack max resource limit to account for the maximum space that
  can be lost by aslr
- tidy up debugging printfs


To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 src/sys/kern/exec_subr.c
cvs rdiff -u -r1.43 -r1.44 src/sys/kern/kern_pax.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/kern/exec_subr.c
diff -u src/sys/kern/exec_subr.c:1.74 src/sys/kern/exec_subr.c:1.75
--- src/sys/kern/exec_subr.c:1.74	Thu Apr  7 08:06:50 2016
+++ src/sys/kern/exec_subr.c	Fri May 13 13:33:43 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_subr.c,v 1.74 2016/04/07 12:06:50 christos Exp $	*/
+/*	$NetBSD: exec_subr.c,v 1.75 2016/05/13 17:33:43 christos Exp $	*/
 
 /*
  * Copyright (c) 1993, 1994, 1996 Christopher G. Demetriou
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.74 2016/04/07 12:06:50 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.75 2016/05/13 17:33:43 christos Exp $");
 
 #include "opt_pax.h"
 
@@ -391,25 +391,27 @@ exec_setup_stack(struct lwp *l, struct e
 		max_stack_size = MAXSSIZ;
 	}
 
-	DPRINTF(("ep_minsaddr=%llx max_stack_size=%llx\n",
-	    (unsigned long long)epp->ep_minsaddr,
-	    (unsigned long long)max_stack_size));
-
-	epp->ep_ssize = MIN(l->l_proc->p_rlimit[RLIMIT_STACK].rlim_cur,
-	    max_stack_size);
+	DPRINTF(("ep_minsaddr=%#jx max_stack_size=%#jx\n",
+	    (uintmax_t)epp->ep_minsaddr, (uintmax_t)max_stack_size));
 
 #ifdef PAX_ASLR
 	pax_aslr_stack(epp, &max_stack_size);
 #endif /* PAX_ASLR */
 
+	DPRINTF(("[RLIMIT_STACK].lim_cur=%#jx max_stack_size=%#jx\n",
+	    (uintmax_t)l->l_proc->p_rlimit[RLIMIT_STACK].rlim_cur,
+	    (uintmax_t)max_stack_size));
+	epp->ep_ssize = MIN(l->l_proc->p_rlimit[RLIMIT_STACK].rlim_cur,
+	    max_stack_size);
+
 	l->l_proc->p_stackbase = epp->ep_minsaddr;
 	
 	epp->ep_maxsaddr = (vaddr_t)STACK_GROW(epp->ep_minsaddr,
-		max_stack_size);
+	    max_stack_size);
 
-	DPRINTF(("ep_ssize=%llx ep_maxsaddr=%llx\n",
-	    (unsigned long long)epp->ep_ssize,
-	    (unsigned long long)epp->ep_maxsaddr));
+	DPRINTF(("ep_ssize=%#jx ep_minsaddr=%#jx ep_maxsaddr=%#jx\n",
+	    (uintmax_t)epp->ep_ssize, (uintmax_t)epp->ep_minsaddr,
+	    (uintmax_t)epp->ep_maxsaddr));
 
 	/*
 	 * set up commands for stack.  note that this takes *two*, one to
@@ -425,12 +427,10 @@ exec_setup_stack(struct lwp *l, struct e
 	noaccess_linear_min = (vaddr_t)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
 	    access_size), noaccess_size);
 
-	DPRINTF(("access_size=%llx, access_linear_min=%llx, "
-	    "noaccess_size=%llx, noaccess_linear_min=%llx\n",
-	    (unsigned long long)access_size,
-	    (unsigned long long)access_linear_min,
-	    (unsigned long long)noaccess_size,
-	    (unsigned long long)noaccess_linear_min));
+	DPRINTF(("access_size=%#jx, access_linear_min=%#jx, "
+	    "noaccess_size=%#jx, noaccess_linear_min=%#jx\n",
+	    (uintmax_t)access_size, (uintmax_t)access_linear_min,
+	    (uintmax_t)noaccess_size, (uintmax_t)noaccess_linear_min));
 
 	if (noaccess_size > 0 && noaccess_size <= MAXSSIZ) {
 		NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,

Index: src/sys/kern/kern_pax.c
diff -u src/sys/kern/kern_pax.c:1.43 src/sys/kern/kern_pax.c:1.44
--- src/sys/kern/kern_pax.c:1.43	Sun May  8 16:01:56 2016
+++ src/sys/kern/kern_pax.c	Fri May 13 13:33:43 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_pax.c,v 1.43 2016/05/08 20:01:56 christos Exp $	*/
+/*	$NetBSD: kern_pax.c,v 1.44 2016/05/13 17:33:43 christos Exp $	*/
 
 /*
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.43 2016/05/08 20:01:56 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.44 2016/05/13 17:33:43 christos Exp $");
 
 #include "opt_pax.h"
 
@@ -104,11 +104,12 @@ int pax_aslr_global = PAX_ASLR;
 #define PAX_ASLR_DELTA_STACK_LSB	PGSHIFT
 #endif
 #ifndef PAX_ASLR_DELTA_STACK_LEN
-#define PAX_ASLR_DELTA_STACK_LEN 	PAX_ASLR_DELTA_MMAP_LEN
+#define PAX_ASLR_DELTA_STACK_LEN 	((sizeof(void *) * NBBY) / 4)
 #endif
 #ifndef PAX_ASLR_DELTA_STACK_LEN32
-#define PAX_ASLR_DELTA_STACK_LEN32 	PAX_ASLR_DELTA_MMAP_LEN32
+#define PAX_ASLR_DELTA_STACK_LEN32 	((sizeof(uint32_t) * NBBY) / 4)
 #endif
+#define PAX_ASLR_MAX_STACK_WASTE	8
 
 static bool pax_aslr_elf_flags_active(uint32_t);
 #endif /* PAX_ASLR */
@@ -335,6 +336,12 @@ pax_init(void)
 		panic("pax_init: segvguard_id: error=%d\n", error);
 	}
 #endif /* PAX_SEGVGUARD */
+#ifdef PAX_ASLR
+	/* Adjust maximum stack by the size we can consume for ASLR */
+	extern rlim_t maxsmap;
+	maxsmap = MAXSSIZ - (MAXSSIZ / PAX_ASLR_MAX_STACK_WASTE);
+	// XXX: compat32 is not handled.
+#endif
 }
 
 void
@@ -564,14 +571,12 @@ pax_aslr_stack(struct exec_package *epp,
 		rand = pax_aslr_rand;
 #endif
 	u_long d = PAX_ASLR_DELTA(rand, PAX_ASLR_DELTA_STACK_LSB, len);
-	d &= (*max_stack_size / 4) - 1;
+	d &= (*max_stack_size / PAX_ASLR_MAX_STACK_WASTE) - 1;
  	u_long newminsaddr = (u_long)STACK_GROW(epp->ep_minsaddr, d);
 	PAX_DPRINTF("old minsaddr=%#jx delta=%#lx new minsaddr=%#lx",
 	    (uintmax_t)epp->ep_minsaddr, d, newminsaddr);
 	epp->ep_minsaddr = (vaddr_t)newminsaddr;
 	*max_stack_size -= d;
-	if (epp->ep_ssize > *max_stack_size)
-		epp->ep_ssize = *max_stack_size;
 }
 
 uint32_t

Reply via email to