C / Linux:setgid将根留在组列表中
收藏

我要用setregid(real_gid, effective_gid)删除根权限。两者都设置为1000,但当我运行id命令时,组列表中有根!我该如何移除它?


最佳答案:

如果root是辅助组之一,则需要使用getgroups()调整辅助组列表-删除“CC>(0)”。注意,posix指定了setgroups(),但没有指定root
您可能会使用类似的代码:

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...
}

注意,Linux上的getgroups()组是0,但组0的名称并不总是setgroups()(例如,在aix上是root,在macos x上是root),并且并非所有系统都有一个组system(aix和macos x都没有)。还请注意,由于内核是组0,因此它没有向组0授予任何特殊权限(但它确实向用户0授予了特殊权限)。
您可以通过查找要忽略的组来泛化代码。posix也提供了一个ngroups_max;您可以使用它来代替max_aux_group。标准页面还建议:
long ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
gid_t *group = (gid_t *)malloc(ngroups_max *sizeof(gid_t));

公众号