有效与真实用户 ID :为什么在我的示例中它不返回 root 作为有效 ID?

Che*_*tar 3 root setuid

我读了一些关于真实用户 ID 和有效用户 ID 之间的区别的文章。我以为我明白了,但我有一个疑问:根据我的理解,在下面的示例中,命令$ id -un应该返回root为有效用户,而不是jack

\n
$ sudo cp /usr/bin/bash /usr/bin/bashroot\n$ sudo chmod u+s /usr/bin/bashroot\n$ ls -l /usr/bin/bashroot \n-rwsr-xr-x 1 root root 1234376 oct.  25 15:42 /usr/bin/bashroot\n\n$ bashroot\n\n$ id -un\njack\n\n$ id -unr\njack\n
Run Code Online (Sandbox Code Playgroud)\n

bashroot已经 setuid 并属于root,所以根据我的理解我预计$ id -un会返回root,而不是jack

\n

我想念什么?

\n

[编辑]\n更具体地说,既然两者都有 setuid ,为什么/usr/bin/bashroot行为不像?/usr/bin/passwd

\n
$ ls -l /usr/bin/passwd \n-rwsr-xr-x 1 root root 63960 f\xc3\xa9vr.  7  2020 /usr/bin/passwd\n\n$ ls -l /usr/bin/bashroot \n-rwsr-xr-x 1 root root 1234376 oct.  25 15:42 /usr/bin/bashroot\n\n$ passwd\nChanging password for jack.\nCurrent password: \n
Run Code Online (Sandbox Code Playgroud)\n

然后,在另一个终端中:

\n
$ bashroot\n\n$ ps -a | grep passwd\n1682362 pts/3    00:00:00 passwd\n$ ps -eo pid,ruid,euid | grep 1682362\n1682362  1000     0\n\n$ ps -a | grep bashroot\n1682405 pts/4    00:00:00 bashroot\n$ ps -eo pid,ruid,euid | grep 1682405\n1682405  1000  1000\n
Run Code Online (Sandbox Code Playgroud)\n

的有效 UID 为passwd( root0),这是预期的。为什么有效 UID 是bashroot1000( jack) 而不是root

\n

[编辑2:操作系统]

\n
$ cat /etc/debian_version \n11.6\n$ uname -a\nLinux d11work 5.10.0-20-amd64 #1 SMP Debian 5.10.158-2 (2022-12-13) x86_64 GNU/Linux\n$ bash --version\nGNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)\n
Run Code Online (Sandbox Code Playgroud)\n

[EDIT3]\n请参阅斯蒂芬·基特的回答

\n
$ bashroot -p\n\n# id -un\nroot\n\n# id -unr\njack \n
Run Code Online (Sandbox Code Playgroud)\n

Ste*_*itt 8

Bash 强制执行此操作:如果它是 setuid,但不是\xe2\x80\x99 运行在特权模式下(查找-p),它将有效用户 id 设置为真实用户 id:

\n
\n

如果 shell 启动时有效用户(组)id 不等于真实用户(组)id,并且-p未提供该选项,则执行这些操作并将有效用户 id 设置为真实用户 id。如果-p在启动时提供该选项,则不会重置有效用户 ID。关闭此选项会导致有效用户和组 ID 设置为真实用户和组 ID。

\n
\n

要获得您\xe2\x80\x99 正在寻找的效果,您需要运行bashroot -p. 您\xe2\x80\x99 会立即注意到差异:shell 提示符#$.

\n