我读了一些关于真实用户 ID 和有效用户 ID 之间的区别的文章。我以为我明白了,但我有一个疑问:根据我的理解,在下面的示例中,命令$ id -un
应该返回root
为有效用户,而不是jack
:
$ 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)\nbashroot
已经 setuid 并属于root
,所以根据我的理解我预计$ id -un
会返回root
,而不是jack
。
我想念什么?
\n[编辑]\n更具体地说,既然两者都有 setuid ,为什么/usr/bin/bashroot
行为不像?/usr/bin/passwd
$ 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
( root
0),这是预期的。为什么有效 UID 是bashroot
1000( jack
) 而不是root
?
[编辑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
Bash 强制执行此操作:如果它是 setuid,但不是\xe2\x80\x99 运行在特权模式下(查找-p
),它将有效用户 id 设置为真实用户 id:
\n\n如果 shell 启动时有效用户(组)id 不等于真实用户(组)id,并且
\n-p
未提供该选项,则执行这些操作并将有效用户 id 设置为真实用户 id。如果-p
在启动时提供该选项,则不会重置有效用户 ID。关闭此选项会导致有效用户和组 ID 设置为真实用户和组 ID。
要获得您\xe2\x80\x99 正在寻找的效果,您需要运行bashroot -p
. 您\xe2\x80\x99 会立即注意到差异:shell 提示符#
是$
.
归档时间: |
|
查看次数: |
434 次 |
最近记录: |