总是在 setuid 之前设置组?

信息安全 Unix
2021-09-09 21:27:38

在使用 RPM 包构建的 GNU/Linux 系统上,该rpmlint实用程序会抱怨setgroups之前不调用setuid.

这个想法是,在删除特权之前,进程还应该删除补充组 ID 的列表setgroups(0, NULL)

但是,这是应该一直做的事情吗?

假设我们正在运行 setuid root,并携带来自我们原始安全上下文的补充组 ID 列表:与真实用户 ID 关联的组。

当我们回到那个真实的用户 ID 时,我们不一定想要丢失这些组:作为原始用户执行的代码可能取决于那些补充成员资格,对吧?

setgroups(0, NULL)在将 privs 删除给原始用户之前,我们是否应该在 setuid 代码中省略

(顺便说一句,我们当然不会setuid在 Linux 上放弃权限,因为这对于运行 setuid 非 root 的代码不起作用。)

1个回答

这几乎完全取决于您是暂时还是永久放弃特权。

在暂时放弃特权的情况下,实际上不建议setgroups使用单个组进行调用,因为您将擦除辅助组列表,可能无法(没有外部干预)将进程恢复到其原始特权级别.

在永久删除特权的情况下,清除辅助组列表非常重要,以使漏洞在删除后更难恢复特权。当您尝试以错误的方式执行此操作时会出现问题:如果您setuid首先设置一个非零值(意味着您不再是 root),然后调用setgroups,则进程的有效 uid 现在不再是 root,这意味着内部setgid调用失败。反过来做就没有这个问题,因为setgid先调用不会改变进程的有效uid,允许setuid被调用。

更多信息可以在这里找到: