restrict-access.c revision 8f061b0f360e0e94a2753b26360b07b38de70be9
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher#define _GNU_SOURCE /* setresgid() */
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#include <stdio.h> /* for AIX */
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher#include <sys/types.h>
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#include <unistd.h>
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt#include "lib.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "restrict-access.h"
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include "env-util.h"
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include <stdlib.h>
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include <time.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <pwd.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <grp.h>
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#ifdef HAVE_PR_SET_DUMPABLE
5ebdc2391e96cfcc86ebdb8f223e159c00a0d82bLukas Slebodnik# include <sys/prctl.h>
5ebdc2391e96cfcc86ebdb8f223e159c00a0d82bLukas Slebodnik#endif
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnikstatic gid_t process_primary_gid = (gid_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic gid_t process_privileged_gid = (gid_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic bool process_using_priv_gid = FALSE;
700d45751e997c634504a4f22facd2edf82edea7Lukas Slebodnik
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozekvoid restrict_access_init(struct restrict_access_settings *set)
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek{
deeadf40db3a1eec64cf030e54afc4cb8612a8d5Lukas Slebodnik memset(set, 0, sizeof(*set));
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher set->uid = (uid_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher set->gid = (gid_t)-1;
f0ea3ed816182fadf77f3e7f7ddb298b287007adLukas Slebodnik set->privileged_gid = (gid_t)-1;
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher}
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagherstatic const char *get_uid_str(uid_t uid)
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher{
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina const struct passwd *pw;
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina const char *ret;
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina int old_errno = errno;
c481179da5d5b53ce16d8784c0bd2857ffc2f061Lukas Slebodnik
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher pw = getpwuid(uid);
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik if (pw == NULL)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = dec2str(uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = t_strdup_printf("%s(%s)", dec2str(uid), pw->pw_name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno = old_errno;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const char *get_gid_str(gid_t gid)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct group *group;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *ret;
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce int old_errno = errno;
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik group = getgrgid(gid);
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik if (group == NULL)
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik ret = dec2str(gid);
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek else
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek ret = t_strdup_printf("%s(%s)", dec2str(gid), group->gr_name);
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek errno = old_errno;
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce return ret;
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce}
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozekstatic void restrict_init_groups(gid_t primary_gid, gid_t privileged_gid)
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek{
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek if (privileged_gid == (gid_t)-1) {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek if (primary_gid == getgid() && primary_gid == getegid()) {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek /* everything is already set */
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek return;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek }
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek if (setgid(primary_gid) != 0) {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek i_fatal("setgid(%s) failed with euid=%s, "
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek "gid=%s, egid=%s: %m",
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek get_gid_str(primary_gid), get_uid_str(geteuid()),
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek get_gid_str(getgid()), get_gid_str(getegid()));
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek }
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik return;
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik }
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik
faa16fc9f0c9a02b26497e7cf148a92586144c08David Disseldorp if (getegid() != 0 && primary_gid == getgid() &&
faa16fc9f0c9a02b26497e7cf148a92586144c08David Disseldorp primary_gid == getegid()) {
faa16fc9f0c9a02b26497e7cf148a92586144c08David Disseldorp /* privileged_gid is hopefully in saved ID. if not,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher there's nothing we can do about it. */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#ifdef HAVE_SETRESGID
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (setresgid(primary_gid, primary_gid, privileged_gid) != 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("setresgid(%s,%s,%s) failed with euid=%s: %m",
d921c1eba437662437847279f251a0a5d8f70127Maxim get_gid_str(primary_gid), get_gid_str(primary_gid),
d921c1eba437662437847279f251a0a5d8f70127Maxim get_gid_str(privileged_gid), get_uid_str(geteuid()));
d921c1eba437662437847279f251a0a5d8f70127Maxim }
d921c1eba437662437847279f251a0a5d8f70127Maxim#else
d921c1eba437662437847279f251a0a5d8f70127Maxim if (geteuid() == 0) {
d921c1eba437662437847279f251a0a5d8f70127Maxim /* real, effective, saved -> privileged_gid */
d921c1eba437662437847279f251a0a5d8f70127Maxim if (setgid(privileged_gid) < 0) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer i_fatal("setgid(%s) failed: %m",
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer get_gid_str(privileged_gid));
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer }
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer }
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer /* real, effective -> primary_gid
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer saved -> keep */
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (setregid(primary_gid, primary_gid) != 0) {
327127bb7fcc07f882209f029e14026de1b23c94Maxim i_fatal("setregid(%s,%s) failed with euid=%s: %m",
327127bb7fcc07f882209f029e14026de1b23c94Maxim get_gid_str(primary_gid), get_gid_str(privileged_gid),
327127bb7fcc07f882209f029e14026de1b23c94Maxim get_uid_str(geteuid()));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#endif
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic gid_t *get_groups_list(unsigned int *gid_count_r)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_t *gid_list;
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce int ret, gid_count;
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek if ((gid_count = getgroups(0, NULL)) < 0)
07d82f79d2970a08628ebf71343441ec55faa6faPavel Březina i_fatal("getgroups() failed: %m");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* @UNSAFE */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_list = t_new(gid_t, gid_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((ret = getgroups(gid_count, gid_list)) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("getgroups() failed: %m");
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose *gid_count_r = ret;
03713859dffacc7142393e53c73d8d4cf7dee8d5Pavel Březina return gid_list;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik}
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzkestatic void drop_restricted_groups(const struct restrict_access_settings *set,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_t *gid_list, unsigned int *gid_count,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool *have_root_group)
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozek{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* @UNSAFE */
772464c842968d6e544118ae1aa7c49a7cda2ad6Stephen Gallagher unsigned int i, used;
32381402a4a9afc003782c9e2301fc59c9bda2a9Yassir Elley
068dbee9ca7bf5b37330eff91c94ae10f288d09fJakub Hrozek for (i = 0, used = 0; i < *gid_count; i++) {
98ce3c3e85a4bb2e1822bf8ab2a1c2ab9e3dd61dJakub Hrozek if (gid_list[i] >= set->first_valid_gid &&
be65f065fef1d387281096ef095a2acef39ecc12Jakub Hrozek (set->last_valid_gid == 0 ||
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek gid_list[i] <= set->last_valid_gid)) {
f36078af138f052cd9a30360867b0ebd0805af5eJakub Hrozek if (gid_list[i] == 0)
34c78b745eb349eef2b0f13ef2b722632aebe619Jan Cholasta *have_root_group = TRUE;
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek gid_list[used++] = gid_list[i];
e07a94a66985b674c5df11ca466792902164c4e2George McCollister }
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik *gid_count = used;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer}
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bosestatic gid_t get_group_id(const char *name)
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct group *group;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (is_numeric(name, '\0'))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return (gid_t)strtoul(name, NULL, 10);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher group = getgrnam(name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (group == NULL)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("unknown group name in extra_groups: %s", name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return group->gr_gid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void fix_groups_list(const struct restrict_access_settings *set,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool preserve_existing, bool *have_root_group)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_t gid, *gid_list, *gid_list2;
a5077712fc8c24e8cad08207b7b5a6603bde6a7cJakub Hrozek const char *const *tmp, *empty = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i, gid_count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool add_primary_gid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* if we're using a privileged GID, we can temporarily drop our
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher effective GID. we still want to be able to use its privileges,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher so add it to supplementary groups. */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher add_primary_gid = process_privileged_gid != (gid_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp = set->extra_groups == NULL ? &empty :
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek t_strsplit_spaces(set->extra_groups, ", ");
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (preserve_existing) {
6b0a7c72bb841d6885a620c68bd51d55109b66c7Jakub Hrozek gid_list = get_groups_list(&gid_count);
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik drop_restricted_groups(set, gid_list, &gid_count,
0e1dcef53d9d8465ce97d31ad11be4445a6e7eb8Lukas Slebodnik have_root_group);
c3889e5a101a075defe533d81f5296d5e680f639Lukas Slebodnik /* see if the list already contains the primary GID */
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina for (i = 0; i < gid_count; i++) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (gid_list[i] == process_primary_gid) {
40b2be4f4312470044cdef460b02b66003f5c85fJakub Hrozek add_primary_gid = FALSE;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek break;
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov }
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina }
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina } else {
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina gid_list = NULL;
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina gid_count = 0;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher }
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (gid_count == 0) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher /* Some OSes don't like an empty groups list,
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik so use the primary GID as the only one. */
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik gid_list = t_new(gid_t, 2);
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik gid_list[0] = process_primary_gid;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher gid_count = 1;
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik add_primary_gid = FALSE;
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik }
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (*tmp != NULL || add_primary_gid) {
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik /* @UNSAFE: add extra groups and/or primary GID to gids list */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_list2 = t_new(gid_t, gid_count + str_array_length(tmp) + 1);
539b1be3507abdf8ac235b06eeed5011b0b5cde2Ondrej Kos memcpy(gid_list2, gid_list, gid_count * sizeof(gid_t));
539b1be3507abdf8ac235b06eeed5011b0b5cde2Ondrej Kos for (; *tmp != NULL; tmp++) {
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos gid = get_group_id(*tmp);
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos if (gid != process_primary_gid)
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos gid_list2[gid_count++] = gid;
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos }
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (add_primary_gid)
e6e26182d58c05d896f72f2925426658a6dc70b5Jakub Hrozek gid_list2[gid_count++] = process_primary_gid;
e6e26182d58c05d896f72f2925426658a6dc70b5Jakub Hrozek gid_list = gid_list2;
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher }
e6e26182d58c05d896f72f2925426658a6dc70b5Jakub Hrozek
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (setgroups(gid_count, gid_list) < 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (errno == EINVAL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("setgroups(%s) failed: Too many extra groups",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher set->extra_groups == NULL ? "" :
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher set->extra_groups);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("setgroups() failed: %m");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozekvoid restrict_access(const struct restrict_access_settings *set,
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek const char *home, bool disallow_root)
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool is_root, have_root_group, preserve_groups = FALSE;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool allow_root_gid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek is_root = geteuid() == 0;
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek /* set the primary/privileged group */
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek process_primary_gid = set->gid;
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek process_privileged_gid = set->privileged_gid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
6b01dae732eedee808f32a9cdd4b5656a9f839c4Jakub Hrozek have_root_group = process_primary_gid == 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (process_primary_gid != (gid_t)-1 ||
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher process_privileged_gid != (gid_t)-1) {
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka if (process_primary_gid == (gid_t)-1)
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka process_primary_gid = getegid();
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka restrict_init_groups(process_primary_gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher process_privileged_gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek if (process_primary_gid == (gid_t)-1)
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek process_primary_gid = getegid();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek /* set system user's groups */
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek if (set->system_groups_user != NULL && is_root) {
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek if (initgroups(set->system_groups_user,
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek process_primary_gid) < 0) {
d9378e64499642e86989158f274372187314d5b2Lukas Slebodnik i_fatal("initgroups(%s, %s) failed: %m",
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek set->system_groups_user,
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek get_gid_str(process_primary_gid));
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek }
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek preserve_groups = TRUE;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek }
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek /* add extra groups. if we set system user's groups, drop the
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek restricted groups at the same time. */
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek if (is_root) T_BEGIN {
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek fix_groups_list(set, preserve_groups,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &have_root_group);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek } T_END;
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher
f5b6f977d4144c28e9c66f3f1c9d634d595d1117Marko Myllynen /* chrooting */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (set->chroot_dir != NULL) {
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik /* kludge: localtime() must be called before chroot(),
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik or the timezone isn't known */
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik time_t t = 0;
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik (void)localtime(&t);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik if (chroot(set->chroot_dir) != 0)
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik i_fatal("chroot(%s) failed: %m", set->chroot_dir);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (home != NULL) {
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik if (chdir(home) < 0) {
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik i_error("chdir(%s) failed: %m", home);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik home = NULL;
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik }
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik }
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik if (home == NULL) {
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik if (chdir("/") != 0)
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik i_fatal("chdir(/) failed: %m");
dc4c30bae512c0b45ff925d9e998337f8fe97e94Lukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik /* uid last */
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek if (set->uid != (uid_t)-1) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (setuid(set->uid) != 0) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik i_fatal("setuid(%s) failed with euid=%s: %m",
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik get_uid_str(set->uid), get_uid_str(geteuid()));
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik /* verify that we actually dropped the privileges */
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if ((set->uid != (uid_t)-1 && set->uid != 0) || disallow_root) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (setuid(0) == 0) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (disallow_root &&
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik (set->uid == 0 || set->uid == (uid_t)-1))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("This process must not be run as root");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik i_fatal("We couldn't drop root privileges");
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik }
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik }
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik if (set->first_valid_gid != 0)
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik allow_root_gid = FALSE;
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik else if (process_primary_gid == 0 || process_privileged_gid == 0)
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik allow_root_gid = TRUE;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik else
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik allow_root_gid = FALSE;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (!allow_root_gid && set->uid != 0) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (getgid() == 0 || getegid() == 0 || setgid(0) == 0) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (process_primary_gid == 0)
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik i_fatal("GID 0 isn't permitted");
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik i_fatal("We couldn't drop root group privileges "
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik "(wanted=%s, gid=%s, egid=%s)",
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik get_gid_str(process_primary_gid),
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik get_gid_str(getgid()), get_gid_str(getegid()));
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik}
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikvoid restrict_access_set_env(const struct restrict_access_settings *set)
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik{
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (set->system_groups_user != NULL &&
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik *set->system_groups_user != '\0') {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik env_put(t_strconcat("RESTRICT_USER=",
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik set->system_groups_user, NULL));
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (set->chroot_dir != NULL && *set->chroot_dir != '\0')
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov env_put(t_strconcat("RESTRICT_CHROOT=", set->chroot_dir, NULL));
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (set->uid != (uid_t)-1) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher env_put(t_strdup_printf("RESTRICT_SETUID=%s",
3d038d2e0dc7af04ec2f7c85ae325accb39f6237Jakub Hrozek dec2str(set->uid)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (set->gid != (gid_t)-1) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher env_put(t_strdup_printf("RESTRICT_SETGID=%s",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dec2str(set->gid)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (set->privileged_gid != (gid_t)-1) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek env_put(t_strdup_printf("RESTRICT_SETGID_PRIV=%s",
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek dec2str(set->privileged_gid)));
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek }
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (set->extra_groups != NULL && *set->extra_groups != '\0') {
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek env_put(t_strconcat("RESTRICT_SETEXTRAGROUPS=",
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek set->extra_groups, NULL));
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek }
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek if (set->first_valid_gid != 0) {
e07a94a66985b674c5df11ca466792902164c4e2George McCollister env_put(t_strdup_printf("RESTRICT_GID_FIRST=%s",
e07a94a66985b674c5df11ca466792902164c4e2George McCollister dec2str(set->first_valid_gid)));
e07a94a66985b674c5df11ca466792902164c4e2George McCollister }
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (set->last_valid_gid != 0) {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose env_put(t_strdup_printf("RESTRICT_GID_LAST=%s",
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose dec2str(set->last_valid_gid)));
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
172c07013d1ea99447a780fd36f49d5c3a76981bJakub Hrozek}
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const char *null_if_empty(const char *str)
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce{
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce return str == NULL || *str == '\0' ? NULL : str;
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce}
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
336879aabae137f9a81304f147fb0d43001654b0Simo Sorcevoid restrict_access_by_env(const char *home, bool disallow_root)
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce{
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce struct restrict_access_settings set;
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce const char *value;
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce restrict_access_init(&set);
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce if ((value = getenv("RESTRICT_SETUID")) != NULL)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.uid = (uid_t)strtol(value, NULL, 10);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik if ((value = getenv("RESTRICT_SETGID")) != NULL)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.gid = (gid_t)strtol(value, NULL, 10);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik if ((value = getenv("RESTRICT_SETGID_PRIV")) != NULL)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.privileged_gid = (gid_t)strtol(value, NULL, 10);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik if ((value = getenv("RESTRICT_GID_FIRST")) != NULL)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.first_valid_gid = (gid_t)strtol(value, NULL, 10);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik if ((value = getenv("RESTRICT_GID_LAST")) != NULL)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.last_valid_gid = (gid_t)strtol(value, NULL, 10);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.extra_groups = null_if_empty(getenv("RESTRICT_SETEXTRAGROUPS"));
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.system_groups_user = null_if_empty(getenv("RESTRICT_USER"));
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik set.chroot_dir = null_if_empty(getenv("RESTRICT_CHROOT"));
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik restrict_access(&set, home, disallow_root);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik /* clear the environment, so we don't fail if we get back here */
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik env_remove("RESTRICT_SETUID");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik if (process_privileged_gid == (gid_t)-1) {
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik /* if we're dropping privileges before executing and
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik a privileged group is set, the groups must be fixed
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik after exec */
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_SETGID");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_SETGID_PRIV");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik }
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_GID_FIRST");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_GID_LAST");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_SETEXTRAGROUPS");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_USER");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik env_remove("RESTRICT_CHROOT");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik}
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnikvoid restrict_access_allow_coredumps(bool allow ATTR_UNUSED)
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik{
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik#ifdef HAVE_PR_SET_DUMPABLE
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (void)prctl(PR_SET_DUMPABLE, allow, 0, 0, 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#endif
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint restrict_access_use_priv_gid(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_assert(!process_using_priv_gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (process_privileged_gid == (gid_t)-1)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (setegid(process_privileged_gid) < 0) {
1c7f25390572025baa6783ede14523e22fc73043Lukas Slebodnik i_error("setegid(privileged) failed: %m");
40b2be4f4312470044cdef460b02b66003f5c85fJakub Hrozek return -1;
40b2be4f4312470044cdef460b02b66003f5c85fJakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher process_using_priv_gid = TRUE;
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov return 0;
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov}
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallaghervoid restrict_access_drop_priv_gid(void)
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek{
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek if (!process_using_priv_gid)
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek return;
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (setegid(process_primary_gid) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("setegid(primary) failed: %m");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher process_using_priv_gid = FALSE;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bosebool restrict_access_have_priv_gid(void)
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose{
96c73559adfbdac96720008fc022cb1d540b53c3Jakub Hrozek return process_privileged_gid != (gid_t)-1;
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose}
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher