C / Linux: setgid оставляет root в списке групп - PullRequest
3 голосов
/ 05 июля 2011

Я сбрасываю права root с setregid(real_gid, effective_gid) Оба установлены на 1000, но когда я запускаю команду id, в списке групп есть root! Как мне это убрать?

1 Ответ

6 голосов
/ 05 июля 2011

Если root является одной из вспомогательных групп, вам нужно будет использовать getgroups() и setgroups() для настройки списка вспомогательных групп - удалив root (0) из этого списка , Обратите внимание, что POSIX указывает getgroups(), но не указывает setgroups().

Возможно, вы могли бы использовать код, подобный следующему:

enum { MAX_AUX_GROUPS = 16 };  // Reasonable number
enum { ROOT_GROUP     = 0  };  // Platform specific

gid_t aux_groups[MAX_AUX_GROUPS];
int ngroups = getgroups(MAX_AUX_GROUPS, aux_groups);
if (ngroups > 0)
{
    int dst = 0;
    for (int i = 0; i < ngroups; i++)
    {
        if (aux_groups[i] != ROOT_GROUP)
            aux_groups[dst++] = aux_groups[i];
    }
    ngroups = dst;
}
if (ngroups > 0)
{
    if (setgroups(ngroups, aux_groups) != 0)
        ...report error...
}

Обратите внимание, что группа root равна 0 в Linux, но имя группы 0 не всегда root (например, это system в AIX и wheel в MacOS X), и не все системы имеют группа root (ни AIX, ни MacOS X, опять же). Также обратите внимание, что ядро ​​не предоставляет никаких специальных привилегий группе 0, поскольку оно является группой 0 (тогда как оно предоставляет специальные привилегии пользователю 0).

Вы можете обобщить код, найдя группы, которые вы хотите опустить. POSIX также предоставляет NGROUPS_MAX; Вы можете использовать это вместо MAX_AUX_GROUPS. Стандартная страница также предлагает:

long ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
gid_t *group = (gid_t *)malloc(ngroups_max *sizeof(gid_t));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...