我进行了一些试验并注意到一些奇怪的事情:在位于 bash 的副本上设置 setuid 位/usr/bin/bash-test
似乎没有效果。当我运行一个实例时bash-test
,我的主目录没有设置为/root
,当我whoami
从运行命令时bash-test
,我的用户名没有被报告为是root
,这表明它bash-test
没有以 root 身份运行。但是,如果我将 setuid 位设置为 on whoami
,则正如预期的那样,我被报告为任何 shell 中的 root 用户。
我也尝试设置 setuid 位/usr/bin/bash
并观察到相同的行为。
当我在其上设置 setuid 位时,为什么 bash 没有以 root 身份运行?selinux 可能与此有关吗?
Hau*_*ing 21
解释有点烦人:bash 本身就是原因。strace
是我们的朋友(必须是 SUID 根本身才能工作):
getuid() = 1000
getgid() = 1001
geteuid() = 0
getegid() = 1001
setuid(1000) = 0
setgid(1001) = 0
Run Code Online (Sandbox Code Playgroud)
bash 检测到它已经启动了 SUID root (UID!=EUID) 并使用它的 root power 来丢弃这个 power,将 EUID 重置为 UID。后来甚至 FSUID,只是为了确定......:
getuid() = 1000
setfsuid(1000) = 1000
getgid() = 1001
setfsgid(1001) = 1001
Run Code Online (Sandbox Code Playgroud)
最后:没有机会。您必须使用 UID 根(即 sudo)启动 bash。
编辑 1
手册页是这样说的:
如果 shell 以不等于实际用户(组)id 的有效用户(组)id 启动,并且未提供 -p 选项,则不读取启动文件,不从环境继承 shell 函数,SHELLOPTS 、BASHOPTS、CDPATH 和 GLOBIGNORE 变量,如果它们出现在环境中,将被忽略,并将有效用户 id 设置为真实用户 id。如果在调用时提供 -p 选项,则启动行为相同,但不会重置有效用户 ID。
但这对我不起作用。-p
在启动选项中甚至没有提到。我也试过--posix
;也没有用。