1

我想知道是否有办法使用 suid 二进制文件(使用 Ubuntu 18.04)来放弃特权。看:

# cp /bin/bash .
# chown www-data bash
# chmod 4700 bash
# ls -lh
-rws------ 1 www-data root 1,1M abr  4  2018 bash
# ./bash
# id
uid=0(root) gid=0(root) groups=0(root)

有没有解释为什么一个人可以获得特权但不能用 suid 二进制文件删除它们?

你可能想知道我想要完成什么,但这只是为了学习。

谢谢!

4

2 回答 2

2

这适用于一般情况:

# cp /usr/bin/id .
# chown www-data id
# chmod 4700 id
# ./id
uid=0(root) gid=0(root) euid=33(www-data) groups=0(root)

bash是一个特例。来自手册的“INVOCATION”部分,bash特别强调了相关部分:

如果 shell 以不等于实际用户(组) id 的有效用户(组) id 启动,并且-p未提供该选项,则不读取启动文件,不从环境继承 shell 函数,则SHELLOPTS, BASHOPTS, CDPATH,和GLOBIGNORE变量,如果它们出现在环境中,将被忽略,并且有效的用户 id 被设置为真实的用户 id。如果-p在调用时提供了该选项,则启动行为是相同的,但不会重置有效用户 ID。

传递-p(特权)标志确实会抑制这种行为:

# cp /bin/bash .
# chown www-data bash
# chmod 4700 bash
# ./bash -p
bash-4.4$ id
uid=0(root) gid=0(root) euid=33(www-data) groups=0(root)
于 2018-11-06T21:03:24.830 回答
0

就 set-uid 而言,没有权限层次结构——它只是将有效用户 ID 更改为程序所有者的用户 ID。Root 的处理方式与任何其他用户没有任何不同。

你看到的是一个故意的行为bash。运行 shell 脚本 setuid 有许多安全隐患,而 bash 默认情况下不允许这样做。启动时bash,它会检查有效 UID 是否与真实 UID 相同。如果不是,则意味着它正在运行 set-uid。除非它以一种允许的方式运行,否则它会调用一个函数,比如setuid()真实的 UID。

这就是这里发生的事情。root运行bash,操作系统将有效 UID 更改为www-data. bash检测到这一点并改回root.

于 2018-11-06T21:05:42.553 回答