linux - Linux SUID 权限位行为 - 我错过了什么?
问题描述
假设以下目录结构:
-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"
现在,如果我设置文件的 SUID 位script
,如下所示:
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
dynamic 解释,其权限位分别与owned_by_root
和的权限位匹配script
。一定有我遗漏/误解的东西。
解决方案
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
。
推荐阅读
- android - 如何仅为我的圆圈图标设置不同的大小?(安卓)
- python - 删除默认帮助命令不起作用 discord.py
- typescript - 确保接口与联合类型相同?
- spring-boot - 我是否需要在 Spring Boot JWT 令牌验证中设置安全上下文身份验证?
- javascript - React js 渲染大量嵌套元素
- arrays - 需要帮助使用 .join() 将数组转换为字符串列表
- regex - 确认/匹配帐号。这是我验证帐号的正则表达式 ^[0-9]{7,12}$ 但我不知道如何确认
- ios - 如何在带有应用剪辑 url 前缀的主应用中触发 SceneDelegate 方法场景:继续:
- amazon-web-services - 从 elb 访问私有子网中的 ASG 时出现问题
- javascript - 你能把这个逻辑转换成其他形式吗?如果-那么