为啥 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位

-RPATH 首选项在设置了 SETUID 的可执行文件运行时不起作用

跟踪设有setuid的程序

JNI + setuid 问题