Module Name: src
Committed By: christos
Date: Sun Apr 10 15:02:17 UTC 2016
Modified Files:
src/sys/kern: kern_pax.c
Log Message:
Add a flags sysctl for ASLR to disable particular features. We seem to be
having issues with stack setup.
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 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/kern_pax.c
diff -u src/sys/kern/kern_pax.c:1.38 src/sys/kern/kern_pax.c:1.39
--- src/sys/kern/kern_pax.c:1.38 Wed Apr 6 23:31:12 2016
+++ src/sys/kern/kern_pax.c Sun Apr 10 11:02:17 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_pax.c,v 1.38 2016/04/07 03:31:12 christos Exp $ */
+/* $NetBSD: kern_pax.c,v 1.39 2016/04/10 15:02:17 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.38 2016/04/07 03:31:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.39 2016/04/10 15:02:17 christos Exp $");
#include "opt_pax.h"
@@ -131,6 +131,11 @@ int pax_mprotect_debug;
#ifdef PAX_ASLR_DEBUG
int pax_aslr_debug;
+/* flag set means disable */
+int pax_aslr_flags;
+#define PAX_ASLR_STACK 1
+#define PAX_ASLR_EXEC 2
+#define PAX_ASLR_MMAP 4
#endif
static int pax_segvguard_enabled = 1;
@@ -270,6 +275,12 @@ SYSCTL_SETUP(sysctl_security_pax_setup,
SYSCTL_DESCR("Pring ASLR selected addresses."),
NULL, 0, &pax_aslr_debug, 0,
CTL_CREATE, CTL_EOL);
+ sysctl_createv(clog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+ CTLTYPE_INT, "flags",
+ SYSCTL_DESCR("Disable/Enable select ASLR features."),
+ NULL, 0, &pax_aslr_flags, 0,
+ CTL_CREATE, CTL_EOL);
#endif
sysctl_createv(clog, 0, &rnode, NULL,
CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
@@ -438,6 +449,11 @@ pax_aslr_init_vm(struct lwp *l, struct v
if (!pax_aslr_active(l))
return;
+#ifdef PAX_ASLR_DEBUG
+ if (pax_aslr_flags & PAX_ASLR_MMAP)
+ return;
+#endif
+
uint32_t len = (ep->ep_flags & EXEC_32) ?
PAX_ASLR_DELTA_MMAP_LEN32 : PAX_ASLR_DELTA_MMAP_LEN;
@@ -454,6 +470,10 @@ pax_aslr_mmap(struct lwp *l, vaddr_t *ad
return;
#ifdef PAX_ASLR_DEBUG
char buf[256];
+
+ if (pax_aslr_flags & PAX_ASLR_MMAP)
+ return;
+
if (pax_aslr_debug)
snprintb(buf, sizeof(buf), MAP_FMT, f);
else
@@ -479,6 +499,10 @@ pax_aslr_stack(struct exec_package *epp,
{
if (!pax_aslr_epp_active(epp))
return;
+#ifdef PAX_ASLR_DEBUG
+ if (pax_aslr_flags & PAX_ASLR_STACK)
+ return;
+#endif
u_long d = PAX_ASLR_DELTA(cprng_fast32(),
PAX_ASLR_DELTA_STACK_LSB,