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_root
和script
的权限位匹配。一定有我遗漏/误解的东西。
【问题讨论】:
【参考方案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 权限位行为 - 我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章