无法使用suid二进制文件放弃特权?

时间:2018-11-06 20:43:04

标签: linux suid

我想知道是否有一种使用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二进制文件放弃特权的解释?

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

谢谢!

2 个答案:

答案 0 :(得分:1)

这在一般情况下有效:

# 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是一种特殊情况。在bash手册的“邀请”部分中,重点是相关部分:

  

如果外壳程序以有效用户(组)标识不等于   真实用户(组)ID,并且未提供-p选项,无法启动   读取文件,不从环境继承shell函数,   SHELLOPTSBASHOPTSCDPATHGLOBIGNORE变量(如果有)   出现在环境中,将被忽略,,有效用户ID为   设置为真实用户ID 。如果在调用时提供了-p选项,   启动行为是相同的,但是有效的用户标识不是   重置。

传递-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)

答案 1 :(得分:0)

就set-uid而言,没有特权层次结构-它只是将有效用户ID更改为程序所有者的用户ID。根与其他用户没有任何区别。

您看到的是bash的故意动作。运行shell脚本setuid有很多安全隐患,并且bash默认情况下不允许这样做。 bash启动时,它将检查有效UID是否与实际UID相同。如果不是,则表示它正在运行set-uid。除非以允许的一种方式运行它,否则它将调用setuid()之类的函数将 back 更改为真实的UID。

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