Avoid simple memory dumps via ptrace
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Wed, 12 Aug 2015 00:28:26 +0000 (20:28 -0400)
committerDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Thu, 22 Aug 2019 19:11:59 +0000 (20:11 +0100)
This avoids needing to setgid gpg-agent.  It probably doesn't defend
against all possible attacks, but it defends against one specific (and
easy) one.  If there are other protections we should do them too.

This will make it slightly harder to debug the agent because the
normal user won't be able to attach gdb to it directly while it runs.

The remaining options for debugging are:

 * launch the agent from gdb directly
 * connect gdb to a running agent as the superuser

Upstream bug: https://dev.gnupg.org/T1211

Gbp-Pq: Topic block-ptrace-on-secret-daemons
Gbp-Pq: Name Avoid-simple-memory-dumps-via-ptrace.patch

agent/gpg-agent.c
configure.ac
scd/scdaemon.c

index ffd85d196c19719e5c05a50d77f4d430036dbc17..591f4fd8fa7aa523da1c081e804ea6b9d856a3fc 100644 (file)
@@ -48,6 +48,9 @@
 # include <signal.h>
 #endif
 #include <npth.h>
+#ifdef HAVE_PRCTL
+# include <sys/prctl.h>
+#endif
 
 #define GNUPG_COMMON_NEED_AFLOCAL
 #include "agent.h"
@@ -1013,6 +1016,11 @@ main (int argc, char **argv )
 
   early_system_init ();
 
+#if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE)
+  /* Disable ptrace on Linux without sgid bit */
+  prctl(PR_SET_DUMPABLE, 0);
+#endif
+
   /* Before we do anything else we save the list of currently open
      file descriptors and the signal mask.  This info is required to
      do the exec call properly.  We don't need it on Windows.  */
index 919ab3197121773435efd56a04e33d43fc88a353..b5a72e66ce206ec03bfe6086ef2d335e20d09c0f 100644 (file)
@@ -1395,7 +1395,7 @@ AC_CHECK_FUNCS([atexit canonicalize_file_name clock_gettime ctermid  \
                 ftruncate funlockfile getaddrinfo getenv getpagesize \
                 getpwnam getpwuid getrlimit getrusage gettimeofday   \
                 gmtime_r inet_ntop inet_pton isascii lstat memicmp   \
-                memmove memrchr mmap nl_langinfo pipe raise rand     \
+                memmove memrchr mmap nl_langinfo pipe prctl raise rand \
                 setenv setlocale setrlimit sigaction sigprocmask     \
                 stat stpcpy strcasecmp strerror strftime stricmp     \
                 strlwr strncasecmp strpbrk strsep strtol strtoul     \
index 8f8a026195d786009de03b7d3f96d045cc365f9c..e427b9e5755ae0b30011704ec60b8bed0ce94a8a 100644 (file)
@@ -36,6 +36,9 @@
 #include <unistd.h>
 #include <signal.h>
 #include <npth.h>
+#ifdef HAVE_PRCTL
+# include <sys/prctl.h>
+#endif
 
 #define GNUPG_COMMON_NEED_AFLOCAL
 #include "scdaemon.h"
@@ -438,6 +441,12 @@ main (int argc, char **argv )
   npth_t pipecon_handler;
 
   early_system_init ();
+
+#if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE)
+  /* Disable ptrace on Linux without sgid bit */
+  prctl(PR_SET_DUMPABLE, 0);
+#endif
+
   set_strusage (my_strusage);
   gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
   /* Please note that we may running SUID(ROOT), so be very CAREFUL