c - 保存用户 ID 的目的

标签 c linux unix

使用 setuid() 运行程序位设置与以该程序的所有者身份运行它是一回事。执行完程序一般都会退出,为什么还要切换回真实用户ID呢?

另外,wikipedia文章指出:

The saved user ID (suid) is used when a program running with elevated privileges needs to do some unprivileged work temporarily.

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

最佳答案

扩展保存的用户 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

关于c - 保存用户 ID 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47400704/

相关文章:

bash - 排序变量

regex - 如何在使用 sed 替换文本时保留新行和格式?

c - C中从文件中读取数据(精确到小数点后15位)

objective-c - memcpy 导致 EXC_BAD_ACCESS

linux - 小写到大写的转换

linux - 为什么在 AWS EC2 实例的主目录中自动创建 '~' 波形符目录

unix - 记录到系统日志 vs 文件系统 : pros and cons

C 函数头文件位置 : . h 或 .c?

C++ 预期类型说明符错误

java - 在 linux 上用 java 读取远程文件