为啥 setuid 不作为所有者运行?
Posted
技术标签:
【中文标题】为啥 setuid 不作为所有者运行?【英文标题】:Why is setuid not running as the owner?为什么 setuid 不作为所有者运行? 【发布时间】:2021-12-25 17:43:47 【问题描述】:我目前正在尝试了解文件权限中的特殊位的作用,但目前正试图了解 setuid 位的作用。从它说的所有在线资源中:
通常记为 SUID,用户访问级别的特殊权限只有一个功能:具有 SUID 的文件始终以拥有该文件的用户身份执行,无论用户传递命令如何
但是在一个简单的实验中,这似乎并不正确(除非我误解了并且做错了什么?)即
mkdir /tmp/foo
mkdir /tmp/foo/bar
chmod 0700 /tmp/foo/bar # Restrict directory so only current user can access
echo content > /tmp/foo/bar/baz.txt # Create content in the restricted directory
echo "ls /tmp/foo/bar" > /tmp/foo/myscript.sh # Script to access content of restricted directoy
chmod 4777 /tmp/foo/myscript.sh # Set setuid bit so the script runs as current user
/tmp/foo/myscript.sh # Show it works when run as current user
#> baz.txt
su bob # Switch to a new user
/tmp/foo/myscript.sh # Run script again
#> ls: cannot open directory '/tmp/foo/bar': Permission denied
我的期望是,当设置了 setuid 位时,脚本应该以原始用户身份执行,因此应该拥有 ls
进入受限目录的权限。但是我得到了一个权限被拒绝的错误,表明该脚本不是以原始用户身份运行的。
任何帮助理解我做错了什么将不胜感激。 (示例在 zsh / ubuntu 20.04 / wsl2 上运行)
【问题讨论】:
我怀疑这与/tmp
中的粘性位有关。尝试重复此实验,但使用不同的文件夹来包含您的测试脚本
感谢您的评论,不幸的是,这似乎没有什么不同。那就是我创建了一个新目录 /newtmp 权限为 0777 并重复了相同的过程,但在 /newtmp 而不是 /tmp 下但得到了完全相同的结果
啊,我想我会开枪的
【参考方案1】:
suid 位仅适用于二进制可执行程序,不适用于 shell 脚本。你可以在这里找到更多信息:https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts
【讨论】:
以上是关于为啥 setuid 不作为所有者运行?的主要内容,如果未能解决你的问题,请参考以下文章
Linux 权限 - setuid、setgid、sticky bit - 用一个命令删除所有
Mac OSX 上的 XAMPP:为啥作为“守护进程”运行? [关闭]
Linux理解setuid()setgid()和sticky位