如何在 Linux 中删除补充组?

How do I drop supplementary groups in Linux?

我有一个 ug+s 给非 root 用户和组的可执行文件。我希望它能把它原来拥有的所有补充组都留在后面。有没有办法做到这一点?如果您不是 root,看起来 setgroups 调用不允许您执行此操作。当我尝试时,我得到 EPERM.

似乎应该有一种方法可以失去您以前拥有的特权。

简短的回答是 "A process without CAP_SETGID can't."。而且是by design that setgroups can't be used to remove groups when the process has no privileges。之前的 link 是一篇优秀的 LWN 文章,详细说明了为什么不这样做。

在我的特殊情况下,由于我立即创建了一个用户命名空间,所以这些补充组无论如何都会映射到 'nobody'。所以这不是很重要。如果它很重要,您可以使用 setcap(8) 在包装器可执行文件上设置功能,该包装器可执行文件检查它是否被具有预期组权限的预期用户 运行 然后删除组并删除 CAP_SETGID 和 运行 是您真正想要 运行 的可执行文件。您将用来执行此操作的命令是:

sudo setcap cap_setgid+ep wrapper_exe

不过要小心,现在您的系统上有 shell 的人可能会使用该可执行文件来 运行 某种特权升级攻击,如果您没有仔细编写的话。