假设您是用户x
,所以运行id
给出
uid=1001(x) gid=1001(x) groups=1001(x)
还有一个y
用户
uid=1002(y) gid=1002(y) groups=1002(y)
现在,我们在用户的主目录中root
创建一个文件,如下所示:readme
x
# cd /home/x
# touch readme
# echo "hello" > readme
# chown root:y readme
# chmod 640 readme
我们复制一份less
# cd /home/x
# cp /usr/bin/less .
# chown y:x less
# chmod 6110 less
我希望用户x
能够readme
通过运行来阅读./less readme
由于 setuid 和 setgid,但我收到“权限被拒绝”错误。为什么?
这是我的逻辑,但可能有问题。
chmod 6110
给出仅有的所有者 ( y
) 和组成员 ( x
) 的执行权。由于用户x
属于组x
,因此他可以执行less
。然后setuid 使有效UID 与 相同y
,setgid 再次使有效GID 与所有者的组相同y
。而且既然readme
是 的组y
,less
应该有读取权限。
答案1
错误就出在这里:
setgid 再次使有效 GID 与所有者的组相同
y
。
setgid 位使有效 gid 成为二进制文件所有者组的 gid,即x
此处 ( chmod y:x less
)。
less
最终以与y
s 对应的有效 uid 和与x
s 对应的有效 gid 运行。由于readme
属于root:y
,因此无法读取。