保存的用户标识的用途

时间:2017-11-20 20:42:44

标签: c linux unix

运行设置了setuid() 位的程序与将其作为该程序的所有者运行是一回事。执行程序通常退出后,为什么我们必须切换回真实的用户ID?

此外,wikipedia文章指出:

  

当使用提升权限运行的程序需要暂时执行某些非特权工作时,将使用已保存的用户ID(suid)。

为什么会这样?为什么特权进程会降低其特权,我无法解决这个问题。

3 个答案:

答案 0 :(得分:4)

扩展保存的用户ID的目的,它还允许一个以提升的权限运行的进程,然后删除它们以在需要时返回到提升的权限。

假设ID为1001的用户运行setuid-root程序。在程序启动时,各种用户ID设置如下:

  • 真正的UID:1001
  • 有效UID:0
  • 已保存UID:0

在启动时将已保存的用户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共享上的所有文件。