gpt4 book ai didi

C/Linux : setgid leaves root in list of groups

转载 作者:可可西里 更新时间:2023-11-01 11:47:43 26 4
gpt4 key购买 nike

我正在使用 setregid(real_gid, effective_gid) 放弃 root 权限。两者都设置为 1000,但是当我运行 id 命令时,组列表中有 root!我该如何删除它?

最佳答案

如果 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 组在 Linux 上为 0,但组 0 的名称并不总是 root(例如,它是 system AIX 和 MacOS X 上的 wheel),而且并非所有系统都有一个组 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));

关于C/Linux : setgid leaves root in list of groups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com