Author: kib
Date: Sat Sep 28 07:33:08 2019
New Revision: 352833
URL: https://svnweb.freebsd.org/changeset/base/352833

Log:
  MFC r352582, r352585:
  Make non-ASLR pie base tunable.

Modified:
  stable/12/sys/kern/imgact_elf.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/kern/imgact_elf.c
==============================================================================
--- stable/12/sys/kern/imgact_elf.c     Sat Sep 28 03:33:07 2019        
(r352832)
+++ stable/12/sys/kern/imgact_elf.c     Sat Sep 28 07:33:08 2019        
(r352833)
@@ -136,6 +136,27 @@ SYSCTL_INT(_kern_elf32, OID_AUTO, read_exec, CTLFLAG_R
 #endif
 #endif
 
+static u_long __elfN(pie_base) = ET_DYN_LOAD_ADDR;
+static int
+sysctl_pie_base(SYSCTL_HANDLER_ARGS)
+{
+       u_long val;
+       int error;
+
+       val = __elfN(pie_base);
+       error = sysctl_handle_long(oidp, &val, 0, req);
+       if (error != 0 || req->newptr == NULL)
+               return (error);
+       if ((val & PAGE_MASK) != 0)
+               return (EINVAL);
+       __elfN(pie_base) = val;
+       return (0);
+}
+SYSCTL_PROC(__CONCAT(_kern_elf, __ELF_WORD_SIZE), OID_AUTO, pie_base,
+    CTLTYPE_ULONG | CTLFLAG_MPSAFE | CTLFLAG_RW, NULL, 0,
+    sysctl_pie_base, "LU",
+    "PIE load base without randomization");
+
 SYSCTL_NODE(__CONCAT(_kern_elf, __ELF_WORD_SIZE), OID_AUTO, aslr, CTLFLAG_RW, 
0,
     "");
 #define        ASLR_NODE_OID   __CONCAT(__CONCAT(_kern_elf, __ELF_WORD_SIZE), 
_aslr)
@@ -1148,13 +1169,13 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *i
                if (baddr == 0) {
                        if ((sv->sv_flags & SV_ASLR) == 0 ||
                            (fctl0 & NT_FREEBSD_FCTL_ASLR_DISABLE) != 0)
-                               et_dyn_addr = ET_DYN_LOAD_ADDR;
+                               et_dyn_addr = __elfN(pie_base);
                        else if ((__elfN(pie_aslr_enabled) &&
                            (imgp->proc->p_flag2 & P2_ASLR_DISABLE) == 0) ||
                            (imgp->proc->p_flag2 & P2_ASLR_ENABLE) != 0)
                                et_dyn_addr = ET_DYN_ADDR_RAND;
                        else
-                               et_dyn_addr = ET_DYN_LOAD_ADDR;
+                               et_dyn_addr = __elfN(pie_base);
                }
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to