Linux SUID 权限位行为 - 我错过了啥?

Posted

技术标签:

【中文标题】Linux SUID 权限位行为 - 我错过了啥?【英文标题】:Linux SUID permission bit behavior - what am I missing?Linux SUID 权限位行为 - 我错过了什么? 【发布时间】:2021-12-10 08:58:06 【问题描述】:

假设如下目录结构:

-rwxr-xr-x 1 root   root       script
-rw-r--r-- 1 root   root       owned_by_root

还假设script 是一个简单的shell 脚本,内容如下:

#!/usr/bin/bash

echo "Appending $2 to $1..."
echo -n "$2" >> $1

owned_by_root 是一个空文件。


由于owned_by_root 显然归root 用户所有,并且写入标志仅为拥有用户设置,因此在非root 帐户下执行以下操作显然会失败:

user@machine 
$ ./script ./owned_by_root "Hi"

现在,如果我设置 script 文件的 SUID 位,如下所示:

sudo chmod u+s ./script

(导致script 的权限位为-rwsr-xr-x),令我惊讶的是,

user@machine 
$ ./script ./owned_by_root "Hi"

仍然失败,./script: line 4: owned_by_root: Permission denied

我的印象是,在脚本可执行文件上设置 SUID 位会导致任何第 3 方用户帐户能够附加到 ./owned_by_root

SUID 通常由/etc/passwd//usr/bin/passwd 动态解释,其权限位分别与owned_by_rootscript 的权限位匹配。一定有我遗漏/误解的东西。

【问题讨论】:

【参考方案1】:

Linux 似乎忽略了 shebang (#!) 脚本上的 SETUID 位。这可以通过在脚本中添加sleep 命令并同时检查进程表来确认:

$ ps aux | grep -i script

user   1271826  0.0  0.0  10084  2796 pts/4    S+   18:20   0:00 /usr/bin/bash ./script owned_by_root Hello

通过观察第一列,很明显bash 进程在最初执行脚本的同一用户下运行。

编译后的程序并非如此,/usr/bin/passwd 是。

【讨论】:

以上是关于Linux SUID 权限位行为 - 我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 用户与组的基本操作及文件权限位的设置方法

解读SUID权限位

Linux浅谈SUID,SGID,Sticky粘滞位对目录以及文件的相关作用

linux文件系统上的特殊权限

Linux学习014特殊权限

linux 文件都有哪些特殊权限