【问题标题】:What can a process with UID 0 do that a process with EUID 0 can't?UID 0 的进程可以做什么而 EUID 0 的进程不能?
【发布时间】:2019-12-19 13:16:56
【问题描述】:

我意识到我错过了用户 ID (UID) 和有效用户 ID (EUID) 的一个微妙之处,需要澄清一下。注:我正在开发 macOS,尽管我怀疑在 Linux 世界中一切都有意义。

我创建了一个二进制文件并在上面设置了 setuid 位(使用chmod +s)。如果我运行这个二进制文件并记录来自getuid()geteuid() 的值,那么我会看到 UID=501(我的普通用户)和 EUID=0(root)。我可以进一步调用setuid(0) 设置UID=0。

我的问题是,我什么时候需要这样做?即我的进程可以用 (UID, EUID)=(0,0) 做什么,而它不能用 (UID, EUID)=(501,0) 做什么?

【问题讨论】:

  • 前者可以运行以nosuid挂载的文件系统...

标签: macos root userid uid setuid


【解决方案1】:

通常,当您运行二进制文件时,它会像您一样运行。即:您的 UID。 当您 setuid 时,二进制文件不再以您的身份运行,而是以文件的所有者身份运行。 在这种情况下,该用户是 root。

root (uid=0) 几乎可以做任何事情,包括更改自己的 UID。 (0,0) (501,0) 之间应该没有任何区别,除了..... 一个是您以 root 身份运行某些东西,另一个是 root 以 root 身份运行某些东西。 从本质上讲,它使您成为根。

【讨论】:

  • 当然,我从概念上理解这一点。但我不清楚这会产生什么功能差异(如果有的话)。例如,我可以在 ps 输出中看到有一个二进制文件代表我以 root 身份运行,但这实际上只是提供信息。
  • 我在 sudo 源代码中找到了一条线索:/* Become full root (not just setuid) so user cannot kill us. */ if (setuid(ROOT_UID) == -1)。现在我看到了这一点很明显。但我试图了解还有哪些其他影响。
  • firehol 之类的程序将读取 uid 并采取不同的操作,具体取决于请求操作的用户是否为 root 用户并为此获取 uid。
猜你喜欢
  • 2015-08-10
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
相关资源
最近更新 更多