diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2014-07-27 16:16:22 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2014-10-07 19:51:12 +0200 |
commit | eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae (patch) | |
tree | 365ba40b3e5b6fc3bcc8cb8c47a968a3318009cf /src/util/become_user.c | |
parent | 4a2259de5f7366e911a42bebfe8e8582cadf2de9 (diff) | |
download | sssd-eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae.tar.gz sssd-eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae.tar.xz sssd-eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae.zip |
UTIL: Prefer libcap-ng for privilege drop operations
Diffstat (limited to 'src/util/become_user.c')
-rw-r--r-- | src/util/become_user.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/util/become_user.c b/src/util/become_user.c index b5f94f993..c8a0c77ee 100644 --- a/src/util/become_user.c +++ b/src/util/become_user.c @@ -25,7 +25,11 @@ #include "util/util.h" #include <grp.h> -errno_t become_user(uid_t uid, gid_t gid) +#ifdef HAVE_LIBCAPNG +#include <cap-ng.h> +#endif + +static errno_t become_user_int(uid_t uid, gid_t gid) { uid_t cuid; int ret; @@ -40,7 +44,7 @@ errno_t become_user(uid_t uid, gid_t gid) return EOK; } - /* drop supplmentary groups first */ + /* drop supplementary groups first */ ret = setgroups(0, NULL); if (ret == -1) { ret = errno; @@ -71,6 +75,30 @@ errno_t become_user(uid_t uid, gid_t gid) return EOK; } +#ifdef HAVE_LIBCAPNG +static errno_t become_user_libcap(uid_t uid, gid_t gid) +{ + int ret; + + capng_clear(0); + ret = capng_change_id(uid, gid, CAPNG_DROP_SUPP_GRP); + if (ret != 0) { + DEBUG(SSSDBG_FATAL_FAILURE, "Cannot change UID: %d errno: %d\n", ret, errno); + } + + return ret; +} +#endif + +errno_t become_user(uid_t uid, gid_t gid) +{ +#ifdef HAVE_LIBCAPNG + return become_user_libcap(uid, gid); +#endif + + return become_user_int(uid, gid); +} + struct sss_creds { uid_t uid; gid_t gid; |