我做了一些实验,发现了一些奇怪的事情:在位于 的 bash 副本上设置 setuid 位/usr/bin/bash-test
似乎没有效果。当我运行 的实例时bash-test
,我的主目录未设置为,并且当我从/root
运行命令时,我的用户名未报告为,这表明它没有以 root 身份运行。但是,如果我将 setuid 位设置为 on ,正如预期的那样,我会被报告为任何 shell 中的 root。whoami
bash-test
root
bash-test
whoami
/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 运行权力(即,它可以删除任何文件,更改任何权限等)。