From 09db4332c6017ab57cd136788c48e5a81e3b9399 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 14 Jun 2021 14:28:26 -0700 Subject: [PATCH] fbsd nat: Disable address space randomization when requested. Use procctl(2) with PROC_ASLR_CTL to disable address space randomization in the current gdb process before forking a child process for a new inferior when address space randomization is disabled. gdb/ChangeLog: * configure.ac: Check for . * config.in, configure: Regenerate. * fbsd-nat.c: Include if present. [PROC_ASLR_CTL] (maybe_disable_address_space_randomization): New. (fbsd_nat_target::create_inferior) (fbsd_nat_target::supports_disable_randomization): New. * fbsd-nat.h (fbsd_nat_target::create_inferior) (fbsd_nat_target::supports_disable_randomization): New. --- gdb/ChangeLog | 11 +++++++ gdb/config.in | 3 ++ gdb/configure | 2 +- gdb/configure.ac | 2 +- gdb/fbsd-nat.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ gdb/fbsd-nat.h | 5 ++++ 6 files changed, 96 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2db5abcb65e..7f46c4a6482 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2021-06-14 John Baldwin + + * configure.ac: Check for . + * config.in, configure: Regenerate. + * fbsd-nat.c: Include if present. + [PROC_ASLR_CTL] (maybe_disable_address_space_randomization): New. + (fbsd_nat_target::create_inferior) + (fbsd_nat_target::supports_disable_randomization): New. + * fbsd-nat.h (fbsd_nat_target::create_inferior) + (fbsd_nat_target::supports_disable_randomization): New. + 2021-06-14 Bernd Edlinger * compile/compile.c: Include missing header signal.h. diff --git a/gdb/config.in b/gdb/config.in index 99c924f9ba0..9342604ac4c 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -486,6 +486,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_POLL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PROCCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PROCFS_H diff --git a/gdb/configure b/gdb/configure index 3d3977b26a8..c6b5906d9e4 100755 --- a/gdb/configure +++ b/gdb/configure @@ -12260,7 +12260,7 @@ fi for ac_header in nlist.h machine/reg.h \ thread_db.h \ sys/file.h sys/filio.h sys/ioctl.h sys/param.h \ - sys/resource.h sys/ptrace.h ptrace.h \ + sys/procctl.h sys/resource.h sys/ptrace.h ptrace.h \ sys/reg.h sys/debugreg.h \ termios.h elf_hp.h do : diff --git a/gdb/configure.ac b/gdb/configure.ac index df340ffa826..68cf84d6ca3 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1298,7 +1298,7 @@ AC_HEADER_STDC AC_CHECK_HEADERS([nlist.h machine/reg.h \ thread_db.h \ sys/file.h sys/filio.h sys/ioctl.h sys/param.h \ - sys/resource.h sys/ptrace.h ptrace.h \ + sys/procctl.h sys/resource.h sys/ptrace.h ptrace.h \ sys/reg.h sys/debugreg.h \ termios.h elf_hp.h]) AC_CHECK_HEADERS(sys/user.h, [], [], diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 581c04d5f83..234e74fcfd4 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -29,6 +29,9 @@ #include "gdbsupport/gdb_wait.h" #include "inf-ptrace.h" #include +#ifdef HAVE_SYS_PROCCTL_H +#include +#endif #include #include #include @@ -1401,6 +1404,68 @@ fbsd_nat_target::supports_stopped_by_sw_breakpoint () } #endif +#ifdef PROC_ASLR_CTL +class maybe_disable_address_space_randomization +{ +public: + explicit maybe_disable_address_space_randomization (bool disable_randomization) + { + if (disable_randomization) + { + if (procctl (P_PID, getpid (), PROC_ASLR_STATUS, &m_aslr_ctl) == -1) + { + warning (_("Failed to fetch current address space randomization " + "status: %s"), safe_strerror (errno)); + return; + } + + m_aslr_ctl &= ~PROC_ASLR_ACTIVE; + if (m_aslr_ctl == PROC_ASLR_FORCE_DISABLE) + return; + + int ctl = PROC_ASLR_FORCE_DISABLE; + if (procctl (P_PID, getpid (), PROC_ASLR_CTL, &ctl) == -1) + { + warning (_("Error disabling address space randomization: %s"), + safe_strerror (errno)); + return; + } + + m_aslr_ctl_set = true; + } + } + + ~maybe_disable_address_space_randomization () + { + if (m_aslr_ctl_set) + { + if (procctl (P_PID, getpid (), PROC_ASLR_CTL, &m_aslr_ctl) == -1) + warning (_("Error restoring address space randomization: %s"), + safe_strerror (errno)); + } + } + + DISABLE_COPY_AND_ASSIGN (maybe_disable_address_space_randomization); + +private: + bool m_aslr_ctl_set = false; + int m_aslr_ctl = 0; +}; +#endif + +void +fbsd_nat_target::create_inferior (const char *exec_file, + const std::string &allargs, + char **env, int from_tty) +{ +#ifdef PROC_ASLR_CTL + maybe_disable_address_space_randomization restore_aslr_ctl + (disable_randomization); +#endif + + inf_ptrace_target::create_inferior (exec_file, allargs, env, from_tty); +} + #ifdef TDP_RFPPWAIT /* Target hook for follow_fork. On entry and at return inferior_ptid is the ptid of the followed inferior. */ @@ -1526,6 +1591,16 @@ fbsd_nat_target::supports_multi_process () return true; } +bool +fbsd_nat_target::supports_disable_randomization () +{ +#ifdef PROC_ASLR_CTL + return true; +#else + return false; +#endif +} + void _initialize_fbsd_nat (); void _initialize_fbsd_nat () diff --git a/gdb/fbsd-nat.h b/gdb/fbsd-nat.h index 772655d320e..1fdb939935c 100644 --- a/gdb/fbsd-nat.h +++ b/gdb/fbsd-nat.h @@ -67,6 +67,9 @@ public: thread_control_capabilities get_thread_control_capabilities () override { return tc_schedlock; } + void create_inferior (const char *, const std::string &, + char **, int) override; + void resume (ptid_t, int, enum gdb_signal) override; ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override; @@ -98,6 +101,8 @@ public: #endif bool supports_multi_process () override; + + bool supports_disable_randomization () override; }; #endif /* fbsd-nat.h */ -- 2.30.2