/proc/$PID 中的文件(例如 ssh-agent、Chrome)不属于用户,而是属于 root

/proc/$PID 中的文件(例如 ssh-agent、Chrome)不属于用户,而是属于 root

我只是在这里回答另一个问题:-),因此看了一下 –通缉查看/proc/$PID/fdssh-agent找出它使用哪个套接字。但我不能。我很惊讶地发现大多数文件和目录都属于根目录。ssh-agent以我的用户身份运行(其父进程也是如此)并且未安装 SUID root。我无法找出 KDE 到底从哪里启动它。我好奇;有人可以告诉我这里发生了什么事吗?

或者这根本与用户无关,进程是否可以使用一些内核魔法来向/proc公众(甚至同一用户的其他进程)隐藏(大部分)其信息?

我刚刚检查了/proc/$PID/fd所有进程,发现这ssh-agent并不是唯一具有这种奇怪属性的进程。其他的是一堆 Chrome 进程kdesud(也没有 SUID 根二进制文件)。

答案1

[以下内容改编自我刚刚添加到的过程中的文字过程(5)手册页,回答了这个问题。]

下面的文件/proc/PID通常由进程的有效用户和有效组 ID 拥有。但是,作为一项安全措施,root:root如果进程的“dumpable”属性设置为 1 以外的值,则所有权会被授予。 [此属性的默认值为 1。将此属性设置为 0 会导致进程不生成核心转储,因为它们可能包含敏感信息。同样,某些文件/proc/PID可以提供对敏感信息的访问。]

该属性可能因以下原因而更改:

  1. 该属性是通过操作显式设置的prctl(2) PR_SET_DUMPABLE
  2. 该属性已重置为文件中的值/proc/sys/fs/suid_dumpable

默认值为/proc/sys/fs/suid_dumpable0。可转储属性可能被重置为文件中的值的原因suid_dumpableprctl(2)手册页:

  • 进程的有效用户或组 ID 已更改。
  • 进程的文件系统用户或组 ID 已更改。
  • 该进程执行set-user-ID或set-group-ID程序,或者具有功能的程序。

答案2

对于 chrome 来说,原因是它chrome-sandbox具有 suid 位,因此它以 root 权限运行。

关于您的问题,ssh-agent我不确定,但在我的情况下/usr/bin/ssh-agent设置了 suid 位,即根条目有意义。我不知道 kde 如何处理 ssh-agent,但我很确定涉及到一个 suid 帮助程序。

一般来说,没有什么神奇的事情,通常程序必须有一个 suid 位,明确指定CAPABILITIES或利用某种外部帮助程序,或者通过直接执行它或类似的方式polkit

由于这些程序以 root 身份运行,但随后放弃了它们的权限,您会看到它们以您的用户身份运行,ps但文件仍然由 suid 位所有者拥有。

答案3

您的显示管理器(lightdm、openbox 等)是 init 的子级,由 root 拥有。 Init 不是 set-uid,因为它是一个非常特殊的进程,并且刚刚以 uid 0 启动。该命令ps -eaH给出了起源的结构化视图,相关位是:

r    1 ?        00:00:00 init
r 1521 ?        00:00:00   lightdm
r 1531 tty7     00:00:12     Xorg
m 2035 ?        00:00:00     lightdm
m 2177 ?        00:00:00       gnome-session
m 2225 ?        00:00:00         ssh-agent

我在前面添加了进程的所有者(Root 或 Me)。请记住,/proc 不是真正的文件系统,但提供对内部内核结构的类似文件的访问,并且内核可以设置任何认为合适的权限。尽管 2035 有一个真实有效的我的 UID,但 /proc/2035 中的条目归 root 所有,并且 /proc/2035/fd 的权限为 0700 (-rx------)。直到我们到达 2177,我才拥有 proc 中的伪文件,因为 2177 的 PPID 不是 UID root。

为什么?因为如果我是由 root 程序生成的,我的某些文件可能允许我利用系统安全性。这曾经是另外的情况/proc/sys/fs/protected_hardlinks 下的 proc(5) man 注释:

该文件中的默认值为 0。将该值设置为 1 可防止由基于硬链接的检查时间、使用时间竞争引起的一类长期存在的安全问题,这些问题最常见于全局可写目录中,例如作为/tmp。利用此缺陷的常见方法是在遵循给定的硬链接(即根进程遵循另一个用户创建的硬链接)时跨越权限边界。此外,在没有单独分区的系统上,这可以阻止未经授权的用户“固定”易受攻击的 set-user-ID 和 set-group-ID 文件,防止管理员升级或链接到特殊文件。

虽然这篇文章没有准确说明为什么 /proc/fd 攻击向量可以被利用,但它确实比 kernel/fs/proc 中的几千行代码给人更好的感觉。

答案4

/proc 是一个特殊的伪文件系统。从proc(5)man 5 proc):

   The proc file system is a pseudo-file system which is used as an inter-
   face to kernel data structures.  It is commonly mounted at /proc.  Most
   of  it  is  read-only,  but  some  files  allow  kernel variables to be
   changed.

我建议阅读完整的手册页以获得解释。

相关内容