代码之家  ›  专栏  ›  技术社区  ›  Omnifarious

如何在Linux中删除补充组?

  •  1
  • Omnifarious  · 技术社区  · 6 年前

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

    看来应该有办法失去你以前拥有的特权。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Omnifarious    6 年前

    简而言之,答案是“没有CAP\u SETGID的进程不能”。确实如此 by design that setgroups can't be used to remove groups when the process has no privileges . 前面的链接指向一篇优秀的LWN文章,详细说明了为什么不这样做。

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

    sudo setcap cap_setgid+ep wrapper_exe
    

    不过要小心,如果您编写得不太仔细,现在可能有人在您的系统上有一个shell,可以使用该可执行文件来运行某种权限提升攻击。