Matej Habrnal fa1950
From 0516cbbb356ca0bfd3faf7accb36c60fc5da89d7 Mon Sep 17 00:00:00 2001
Matej Habrnal fa1950
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
Date: Fri, 17 Apr 2015 14:36:45 +0200
Matej Habrnal fa1950
Subject: [PATCH] ccpp: do not override existing files by compat cores
Matej Habrnal fa1950
Matej Habrnal fa1950
Implement all checks used in kernel's do_coredump() and require
Matej Habrnal fa1950
non-relative path if suid_dumpable is 2.
Matej Habrnal fa1950
Matej Habrnal fa1950
Related: #1212818
Matej Habrnal fa1950
Matej Habrnal fa1950
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
---
Matej Habrnal fa1950
 src/hooks/abrt-hook-ccpp.c | 20 ++++++++++++++++----
Matej Habrnal fa1950
 1 file changed, 16 insertions(+), 4 deletions(-)
Matej Habrnal fa1950
Matej Habrnal fa1950
diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c
Matej Habrnal fa1950
index f77a23f..b481421 100644
Matej Habrnal fa1950
--- a/src/hooks/abrt-hook-ccpp.c
Matej Habrnal fa1950
+++ b/src/hooks/abrt-hook-ccpp.c
Matej Habrnal fa1950
@@ -26,6 +26,8 @@
Matej Habrnal fa1950
 #include <satyr/utils.h>
Matej Habrnal fa1950
 #endif /* ENABLE_DUMP_TIME_UNWIND */
Matej Habrnal fa1950
 
Matej Habrnal fa1950
+static int g_user_core_flags;
Matej Habrnal fa1950
+static int g_need_nonrelative;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 /* I want to use -Werror, but gcc-4.4 throws a curveball:
Matej Habrnal fa1950
  * "warning: ignoring return value of 'ftruncate', declared with attribute warn_unused_result"
Matej Habrnal fa1950
@@ -227,7 +229,14 @@ static int open_user_core(uid_t uid, uid_t fsuid, pid_t pid, char **percent_valu
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     full_core_basename = core_basename;
Matej Habrnal fa1950
     if (core_basename[0] != '/')
Matej Habrnal fa1950
+    {
Matej Habrnal fa1950
+        if (g_need_nonrelative)
Matej Habrnal fa1950
+        {
Matej Habrnal fa1950
+            error_msg("Current suid_dumpable policy prevents from saving core dumps according to relative core_pattern");
Matej Habrnal fa1950
+            return -1;
Matej Habrnal fa1950
+        }
Matej Habrnal fa1950
         core_basename = concat_path_file(user_pwd, core_basename);
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     /* Open (create) compat core file.
Matej Habrnal fa1950
      * man core:
Matej Habrnal fa1950
@@ -262,19 +271,19 @@ static int open_user_core(uid_t uid, uid_t fsuid, pid_t pid, char **percent_valu
Matej Habrnal fa1950
     struct stat sb;
Matej Habrnal fa1950
     errno = 0;
Matej Habrnal fa1950
     /* Do not O_TRUNC: if later checks fail, we do not want to have file already modified here */
Matej Habrnal fa1950
-    int user_core_fd = open(core_basename, O_WRONLY | O_CREAT | O_NOFOLLOW, 0600); /* kernel makes 0600 too */
Matej Habrnal fa1950
+    int user_core_fd = open(core_basename, O_WRONLY | O_CREAT | O_NOFOLLOW | g_user_core_flags, 0600); /* kernel makes 0600 too */
Matej Habrnal fa1950
     xsetegid(0);
Matej Habrnal fa1950
     xseteuid(0);
Matej Habrnal fa1950
     if (user_core_fd < 0
Matej Habrnal fa1950
      || fstat(user_core_fd, &sb) != 0
Matej Habrnal fa1950
      || !S_ISREG(sb.st_mode)
Matej Habrnal fa1950
      || sb.st_nlink != 1
Matej Habrnal fa1950
-    /* kernel internal dumper checks this too: if (inode->i_uid != current->fsuid) <fail>, need to mimic? */
Matej Habrnal fa1950
+     || sb.st_uid != fsuid
Matej Habrnal fa1950
     ) {
Matej Habrnal fa1950
         if (user_core_fd < 0)
Matej Habrnal fa1950
             perror_msg("Can't open '%s'", full_core_basename);
Matej Habrnal fa1950
         else
Matej Habrnal fa1950
-            perror_msg("'%s' is not a regular file with link count 1", full_core_basename);
Matej Habrnal fa1950
+            perror_msg("'%s' is not a regular file with link count 1 owned by UID(%d)", full_core_basename, fsuid);
Matej Habrnal fa1950
         return -1;
Matej Habrnal fa1950
     }
Matej Habrnal fa1950
     if (ftruncate(user_core_fd, 0) != 0) {
Matej Habrnal fa1950
@@ -518,8 +527,11 @@ int main(int argc, char** argv)
Matej Habrnal fa1950
         /* use root for suided apps unless it's explicitly set to UNSAFE */
Matej Habrnal fa1950
         fsuid = 0;
Matej Habrnal fa1950
         if (suid_policy == DUMP_SUID_UNSAFE)
Matej Habrnal fa1950
-        {
Matej Habrnal fa1950
             fsuid = tmp_fsuid;
Matej Habrnal fa1950
+        else
Matej Habrnal fa1950
+        {
Matej Habrnal fa1950
+            g_user_core_flags = O_EXCL;
Matej Habrnal fa1950
+            g_need_nonrelative = 1;
Matej Habrnal fa1950
         }
Matej Habrnal fa1950
     }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-- 
Matej Habrnal fa1950
2.1.0
Matej Habrnal fa1950