3

我需要以 root 身份生成一个进程,然后将其权限授予非 root 用户,因此为了实现这一点,我使用 setbit 作为二进制文件并将所有者更改为 root。然后我以非 root 用户身份生成该进程,最初它以 root 身份启动,在完成必要的任务后,我使用 setuid(getuid()) 调用将其权限授予非 root 用户。发生这种情况的是所有者:位置 /proc/(pid)/ 处所有文件的组仍然是 root:root。由于我的进程产生的线程(在放弃特权后)。在 /proc/(pid)/exe 中拒绝访问。有人知道为什么 setuid 没有在文件位置 /proc/(pid) 处设置所有者:组吗?

4

1 回答 1

3

在 Linux 下,如果一个进程在启动时设置了 ID,或者如果用户有权执行二进制文件但不能读取它,并且可能在其他情况下,内核内部的“可转储”标志会被清除。出于安全原因,此标志可以防止一些事情:它不允许核心转储(核心转储可能会泄漏特权信息),阻止普通用户附加调试器,并限制/proc/<pid>对该进程中大多数文件的访问。

清除后,即使进程放弃特权,该标志也无法再次设置。

(实际上,有一个系统调用prctl(PR_SET_DUMPABLE)可以改变标志的值,但我相信这个系统调用并不适合一般用途。)

更重要的是,我想知道你在你的程序中做什么依赖于/proc/<pid>/exe或其他文件/proc/<pid>是可读/可打开的。

于 2012-01-06T14:26:55.667 回答