]> git.saurik.com Git - apt.git/commitdiff
DropPrivs: Also check for saved set-user-ID and set-group-ID
authorJulian Andres Klode <jak@debian.org>
Wed, 24 Sep 2014 18:57:30 +0000 (20:57 +0200)
committerJulian Andres Klode <jak@debian.org>
Wed, 24 Sep 2014 18:57:30 +0000 (20:57 +0200)
apt-pkg/contrib/fileutl.cc
buildlib/config.h.in
configure.ac

index 98544b60ce99853bdcb776cb87930629dce17742..05c2f2e00e43f3e486466a452899779dd774de67 100644 (file)
@@ -2237,6 +2237,26 @@ bool DropPrivs()
    if (geteuid() != pw->pw_uid)
       return _error->Error("Could not switch effective user");
 
+#ifdef HAVE_GETRESUID
+   uid_t ruid = 0;
+   uid_t euid = 0;
+   uid_t suid = 0;
+   if (getresuid(&ruid, &euid, &suid))
+      return _error->Errno("getresuid", "Could not get saved set-user-ID");
+   if (suid != pw->pw_uid)
+      return _error->Error("Could not switch saved set-user-ID");
+#endif
+
+#ifdef HAVE_GETRESGID
+   gid_t rgid = 0;
+   gid_t egid = 0;
+   gid_t sgid = 0;
+   if (getresgid(&rgid, &egid, &sgid))
+      return _error->Errno("getresuid", "Could not get saved set-group-ID");
+   if (sgid != pw->pw_gid)
+      return _error->Error("Could not switch saved set-group-ID");
+#endif
+
    /* TODO: Check saved uid/saved gid as well */
    return true;
 }
index 6b72fb393b2a3c2ff2c2b4af07f519a0382e3d28..c0fd2e8c666aa2ddb36d219eaea3ec88b71b4674 100644 (file)
 /* If there is no socklen_t, define this for the netdb shim */
 #undef NEED_SOCKLEN_T_DEFINE
 
+/* We need the getresuid() function */
+#undef HAVE_GETRESUID
+#undef HAVE_GETRESGID
+
 /* Define to the size of the filesize containing structures */
 #undef _FILE_OFFSET_BITS
 
index 89950fccda957a503466cbd080c89e41e29d5583..5d0e0a9dbc77892fd4fd252322e410ba514afa7b 100644 (file)
@@ -172,6 +172,12 @@ AC_EGREP_HEADER(h_errno, netdb.h, [AC_MSG_RESULT(normal)],
        [AC_MSG_ERROR("not found.")])
    ])
 
+
+dnl check for setuid checking function
+AC_CHECK_FUNCS(getresuid getresgid)
+AC_SUBST(HAVE_GETRESUID)
+AC_SUBST(HAVE_GETRESGID)
+
 dnl Check for doxygen
 AC_PATH_PROG(DOXYGEN, doxygen)