Linux Can';t使用suid二进制文件放弃特权?

Linux Can';t使用suid二进制文件放弃特权?,linux,suid,Linux,Suid,我想知道是否有办法使用suid二进制文件(使用ubuntu18.04)放弃特权。看: 有没有一个解释,为什么一个人可以获得特权,但不能用suid二进制文件放弃它们 你可能想知道我想完成什么,但这只是为了学习 谢谢 这在一般情况下有效: # 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是一个特例。从b

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

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

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


谢谢

这在一般情况下有效:

# 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不等于 未提供真实用户(组)id和
-p
选项,不启动 读取文件,外壳函数不从环境继承,
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)

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

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

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

# 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)