From 8b000a20cc367c727b9f2c0d8e68372d0c9df995 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Sun, 16 Jul 2017 16:52:08 +0000 Subject: More secure setgroups functions. (thanks muh) --- src/libstddjb/prot_grps.c | 14 ++++++++++++-- src/libstddjb/setgroups.c | 8 ++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) (limited to 'src/libstddjb') diff --git a/src/libstddjb/prot_grps.c b/src/libstddjb/prot_grps.c index cc4ba0d..c5ea35b 100644 --- a/src/libstddjb/prot_grps.c +++ b/src/libstddjb/prot_grps.c @@ -2,16 +2,26 @@ /* MT-unsafe */ -#include #include +#include #include #include +#include #include #include int prot_grps (char const *name) { gid_t tab[NGROUPS_MAX] ; + struct passwd *pw ; int n = prot_readgroups(name, tab, NGROUPS_MAX) ; - return n < 0 ? -1 : setgroups(n, tab) ; + if (n < 0) return n ; + errno = 0 ; + pw = getpwnam(name) ; + if (!pw) + { + if (!errno) errno = ENOENT ; + return -1 ; + } + return setgroups_and_gid(pw->pw_gid, n, tab) ; } diff --git a/src/libstddjb/setgroups.c b/src/libstddjb/setgroups.c index c7610ab..d064ed2 100644 --- a/src/libstddjb/setgroups.c +++ b/src/libstddjb/setgroups.c @@ -10,10 +10,9 @@ #include #include -int setgroups_with_egid (size_t n, gid_t const *tab) +int setgroups_and_gid (gid_t g, size_t n, gid_t const *tab) { size_t i = 1 ; - gid_t g = getegid() ; if (!n) return setgroups(1, &g) ; if (tab[0] == g) return setgroups(n, tab) ; for (; i < n ; i++) if (tab[i] == g) break ; @@ -34,6 +33,11 @@ int setgroups_with_egid (size_t n, gid_t const *tab) } } +int setgroups_with_egid (size_t n, gid_t const *tab) +{ + return setgroups_and_gid(getegid(), n, tab) ; +} + int skalibs_setgroups (size_t n, gid_t const *tab) { #ifdef SKALIBS_BSD_SUCKS -- cgit v1.2.3