setuid 位似乎对 bash 没有影响

setuid 位似乎对 bash 没有影响

我做了一些实验,发现了一些奇怪的事情:在位于 的 bash 副本上设置 setuid 位/usr/bin/bash-test似乎没有效果。当我运行 的实例时bash-test,我的主目录未设置为,并且当我从/root运行命令时,我的用户名未报告为,这表明它没有以 root 身份运行。但是,如果我将 setuid 位设置为 on ,正如预期的那样,我会被报告为任何 shell 中的 root。whoamibash-testrootbash-testwhoami

/usr/bin/bash我也尝试设置 setuid 位并观察到相同的行为。

当我设置 setuid 位时,为什么 bash 不能以 root 身份运行? selinux 可能与此有关吗?

答案1

这个解释有点烦人:bash 本身就是原因。strace是我们的朋友(必须是 SUID root 才能正常工作):

getuid()                                = 1000
getgid()                                = 1001
geteuid()                               = 0
getegid()                               = 1001
setuid(1000)                            = 0
setgid(1001)                            = 0

bash 检测到它已启动 SUID root (UID!=EUID) 并使用其 root 权限来丢弃此权限,将 EUID 重置为 UID。后来甚至还有 FSUID,只是为了确定......:

getuid()                                = 1000
setfsuid(1000)                          = 1000
getgid()                                = 1001
setfsgid(1001)                          = 1001

最后:没有机会。您必须使用 UID root(即 sudo)启动 bash。

编辑1

手册页是这样说的:

如果 shell 启动时有效用户(组)id 不等于真实用户(组)id,并且未提供 -p 选项,则不会读取启动文件,shell 函数不会从环境继承,SHELLOPTS 、BASHOPTS、CDPATH 和 GLOBIGNORE 变量,如果它们出现在环境中,将被忽略,并将有效用户 ID 设置为真实用户 ID。如果在调用时提供 -p 选项,则启动行为是相同的,但不会重置有效用户 ID。

但这对我不起作用。-p启动选项中甚至没有提到。我也尝试过--posix;也没用。

答案2

无论如何,SUID root 程序才不是以 root 的环境运行($HOME,shell 的配置,等等),它以 root 运行权力(即,它可以删除任何文件,更改任何权限等)。

相关内容