假设你是 user 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
由于 setuid 和 setgid,我希望用户x
能够readme
通过运行./less readme
来阅读,但我收到“权限被拒绝”错误。为什么?
这是我的逻辑,但可能有问题。
chmod 6110
仅授予所有者 ( y
) 和组成员( )执行权x
。由于用户x
属于组x
,他可以执行less
。然后 setuid 使有效 UID 与 相同y
,而 setgid 使有效 GID 与所有者的组相同,再次y
。并且由于readme
's group is y
,less
应该具有读取权限。
错误就在这里:
setgid 位使有效 gid 成为二进制文件所有者组的有效 gid,即
x
此处 (chmod y:x less
)。less
最终以对应于 's 的有效 uid 和对应于y
's 的有效 gid运行x
。由于readme
归 拥有root:y
,因此无法读取。