【问题标题】:How do I drop supplementary groups in Linux?如何在 Linux 中删除补充组?
【发布时间】:2018-02-20 23:02:29
【问题描述】:

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

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

【问题讨论】:

  • 那么,downvoter,这个问题有什么问题?我该如何改进它?求知者想知道。还是您只是喜欢无缘无故地随机投票否决问题?
  • 是什么让你觉得setgroups不能用来做这件事?
  • @zwol - 因为我试过了,但它以EPERM 失败。基本上,如果您有 CAP_SETGID,您只能进行该调用,并且由于启动 set{u,g}id 进程的程序是非特权的,并且正在设置 {u,g}id 的用户/组也是非特权,不去。
  • 哦,嗯。那......实际上可能意味着没有办法做到这一点。 (我不知道有任何其他系统调用会更改补充组列表。)您是否有能力在不同的内核上尝试该程序,例如 BSD 之一? “我可以在 FooBSD 上做到这一点”比“从来没有办法做到这一点,但我想要一个”更容易卖给内核开发人员。
  • @zwol - 事实证明它是有原因的,如果 FooBSD 不是这样,它应该是:lwn.net/Articles/626665

标签: c linux posix privileges


【解决方案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 的人可以使用该可执行文件来运行某种特权提升攻击。

【讨论】:

  • 虽然,我不确定第二段是否正确。链接文章中内核修复的要点是,对于非特权(非 CAP_SETGID)用户“基本上不可能(1)通过映射到丢弃组来玩技巧”。所以我不相信补充组正在重新映射为“nobody”。
  • @sourcejedi - 请注意那里的“在我的特定情况下”限定词。
  • 如果您的内核遵循与链接源中的规则不同的规则,如果您指定它会更清楚。如果您的内核遵循相同的规则,那么这些规则中“那些补充组无论如何都映射到'nobody'”的特殊条件是什么?
  • @sourcejedi - 这些不是特殊规则。当您不是 root 时创建用户命名空间时会发生这种情况。所有 uid,除了你的一个被映射到 nobody,所有 gid 都相同,但你的一个。
  • 当您从命名空间内部查看时,额外的组显示为nobody。但是当你从命名空间之外看时,进程并没有失去它的补充组。因此,如果进程仍然可以看到实际上属于这些组之一的对象(外部命名空间),则该组的权限仍将应用于进程采取的操作。这可能会授予对对象的更多权限 - 或者可能授予 less 权限。后者是需要这种方法的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2014-11-24
  • 2020-10-28
  • 2016-01-19
  • 2011-10-19
  • 2011-11-07
相关资源
最近更新 更多