我想知道是否有一种使用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二进制文件放弃特权的解释?
您可能想知道我要完成什么,但这只是学习。
谢谢!
答案 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函数,SHELLOPTS
,BASHOPTS
,CDPATH
和GLOBIGNORE
变量(如果有) 出现在环境中,将被忽略,,有效用户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-data
。 bash
检测到了这一点,并更改回root
。