运行设置了setuid() 位的程序与将其作为该程序的所有者运行是一回事。执行程序通常退出后,为什么我们必须切换回真实的用户ID?
此外,wikipedia文章指出:
当使用提升权限运行的程序需要暂时执行某些非特权工作时,将使用已保存的用户ID(suid)。
为什么会这样?为什么特权进程会降低其特权,我无法解决这个问题。
答案 0 :(得分:4)
扩展保存的用户ID的目的,它还允许一个以提升的权限运行的进程,然后删除它们以在需要时返回到提升的权限。
假设ID为1001的用户运行setuid-root程序。在程序启动时,各种用户ID设置如下:
在启动时将已保存的用户ID设置为有效用户ID,允许用户在需要时返回此用户ID。
此时程序具有root权限。然后该程序可以执行以下操作:
// perform privileged commands
seteuid(1001); // drop privileges, euid is now 1001
// perform unprivileged commands
seteuid(0); // raise privileges, euid is now 0, allowed because saved UID is 0
// perform more privileged commands
seteuid(1001); // drop privileges, euid is now 1001
// perform more unprivileged commands
答案 1 :(得分:3)
最好以较低的权限尽可能地做。通过这种方式,操作系统可以防止您做出愚蠢的事情。
以root身份做尽可能少的事情。许多人以root身份登录并且确实搞砸了。
答案 2 :(得分:3)
为什么特权进程会降低其特权,我无法解决这个问题。
有几个原因:
首先:这个过程知道用户启动了什么!否则,它无法知道 - 没有系统调用来显式获取另一个进程的UID。 (有procfs,但那是非标准和不可靠的。)
正如其他人提到的那样,为了安全起见。删除权限可以限制故障setuid-root程序可能造成的损害。 (例如,当以root用户身份运行时,Web服务器通常bind
到端口80上的套接字,然后在提供任何内容之前将其UID / GID设置为服务用户。)
因此,setuid-root进程创建的文件将由创建进程的用户创建,而不是由root用户创建。
在某些情况下,root可以具有 less 功能而非非root用户ID。一个例子是在NFS上 - UID 0通常映射到" nobody"在NFS服务器上,因此以root身份运行的进程无法读取或修改NFS共享上的所有文件。