我正在删除root权限setregid(real_gid, effective_gid).两者都设置为1000,但是当我运行id命令时,组列表中有根!我该如何删除?
如果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...
}
Run Code Online (Sandbox Code Playgroud)
请注意,该root组在Linux上为0,但组0的名称并不总是root(例如,它system在AIX和wheelMacOS 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));
Run Code Online (Sandbox Code Playgroud)