如何在Linux中删除补充组?

时间:2018-02-20 23:02:30

标签: c linux posix privileges

我有一个可执行文件ug+s给非root用户和组。我希望它能留下它最初所拥有的所有补充团体。有没有办法让这种情况发生?如果您不是root,setgroups调用允许您执行此操作看起来不像。当我尝试时,我得到EPERM

似乎应该有办法失去你以前拥有的特权。

1 个答案:

答案 0 :(得分:1)

简短的回答是“没有CAP_SETGID的过程不能。”。它是by design that setgroups can't be used to remove groups when the process has no privileges。之前的链接是一篇优秀的LWN文章,详细说明了原因。

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

sudo setcap cap_setgid+ep wrapper_exe

但要小心,现在,如果您没有非常仔细地编写,那么系统上有shell的人可以使用该可执行文件来运行某种特权升级攻击。