无法使用 suid 二进制文件删除特权?

Can't drop privileges with suid binary?

我想知道是否有一种方法可以使用 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 二进制文件获得特权但不能放弃特权?

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

谢谢!

这在一般情况下有效:

# 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 手册的 "INVOCATION" 部分,并强调了相关部分:

If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, no startup files are read, shell functions are not inherited from the environment, the SHELLOPTS, BASHOPTS, CDPATH, and GLOBIGNORE variables, if they appear in the environment, are ignored, and the effective user id is set to the real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.

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

就 set-uid 而言,没有特权等级——它只是将有效用户标识更改为程序所有者的用户标识。 Root 的处理方式与任何其他用户没有任何区别。

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

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