bash 可以使用 uid 0 和不同的 euid 运行吗?

Eri*_*ett 3 linux bash setuid uid

我正在编写一些bash代码,我想检查脚本是否具有 root 权限。我从其他人那里看到的所有代码都只检查$EUID == 0. 完全有可能让其他程序以 UID = 0 和 EUID > 0 运行。我的代码不应该检查这两者吗?或者 bash 有什么东西可以防止这种(奇怪的)情况发生吗?

对于那些想要看到这种情况的人,这里有一个概念证明:

[root@new-host bennett]# cp /bin/sleep .
[root@new-host bennett]# chown bennett sleep
[root@new-host bennett]# chmod 4755 sleep
[root@new-host bennett]# ll sleep 
-rwsr-xr-x. 1 bennett root 32188 Sep  9 02:38 sleep
[root@new-host bennett]# ./sleep 1000 &
[root@new-host bennett]# ps -e -o user= -o ruser= -o comm= | awk '$1 != $2'
bennett  root     sleep
Run Code Online (Sandbox Code Playgroud)

回顾一下这个问题:在任何情况下bash都可能遇到这样的情况吗?(( $UID == 0 && $EUID > 0 ))其他程序可以。

Kus*_*nda 6

是的:

$ env UID=0 EUID=90 bash -c 'echo $UID $EUID'
0 90
Run Code Online (Sandbox Code Playgroud)

请注意,上面只是更改了变量的值。实际的UID和EUID不受影响。

你应该改用id。例如,请参阅问题How to stop a script from running if it's not root(并回显“Not running as root! Exiting...”)

如果脚本设置了 set-uid 位(并且运行此类脚本 set-uid 是 Unix 上的事情),则有效用户 ID 也将与真实 ID 不同。在这种情况下,UID 将是调用脚本的用户的 UID,而 EUID 将是脚本所有者的 UID。

相关:在 shell 脚本上允许 setuid

  • 是的,我知道这是不好的形式,并且一些 Unicies 不允许 setuid 脚本。我的问题更多是关于 $EUID 和 $UID 的可靠性。@Kusalananda 指出它们几乎毫无用处。 (2认同)