如何读取具有linux能力的进程的/proc/<pid>/fd目录?

Hak*_*aba 4 root permissions proc not-root-user capabilities

作为非 root 用户,我正在运行一个进程。进程二进制文件被赋予了 cap_sys_resource 能力。即使该进程由同一用户拥有,该用户也无法读取其 /proc//fd 目录。/proc/pid 中的权限如下所示:

dr-xr-xr-x.   9 ec2-user ec2-user 0 May 12 01:03 .
dr-xr-xr-x. 249 root     root     0 Apr  3 13:34 ..
dr-xr-xr-x.   2 ec2-user ec2-user 0 May 12 01:03 attr
-rw-r--r--.   1 root     root     0 May 12 01:04 autogroup
-r--------.   1 root     root     0 May 12 01:03 auxv
-r--r--r--.   1 root     root     0 May 12 01:04 cgroup
--w-------.   1 root     root     0 May 12 01:04 clear_refs
-r--r--r--.   1 root     root     0 May 12 01:03 cmdline
-rw-r--r--.   1 root     root     0 May 12 01:04 comm
-rw-r--r--.   1 root     root     0 May 12 01:04 coredump_filter
-r--r--r--.   1 root     root     0 May 12 01:04 cpuset
lrwxrwxrwx.   1 root     root     0 May 12 01:04 cwd
-r--------.   1 root     root     0 May 12 01:04 environ
lrwxrwxrwx.   1 root     root     0 May 12 01:04 exe
dr-x------.   2 root     root     0 May 12 01:03 fd
dr-x------.   2 root     root     0 May 12 01:04 fdinfo
-rw-r--r--.   1 root     root     0 May 12 01:04 gid_map
-r--------.   1 root     root     0 May 12 01:04 io
-r--r--r--.   1 root     root     0 May 12 01:04 limits
-rw-r--r--.   1 root     root     0 May 12 01:04 loginuid
dr-x------.   2 root     root     0 May 12 01:04 map_files
-r--r--r--.   1 root     root     0 May 12 01:04 maps
-rw-------.   1 root     root     0 May 12 01:04 mem
-r--r--r--.   1 root     root     0 May 12 01:04 mountinfo
-r--r--r--.   1 root     root     0 May 12 01:04 mounts
-r--------.   1 root     root     0 May 12 01:04 mountstats
dr-xr-xr-x.   5 ec2-user ec2-user 0 May 12 01:04 net
dr-x--x--x.   2 root     root     0 May 12 01:03 ns
-r--r--r--.   1 root     root     0 May 12 01:04 numa_maps
-rw-r--r--.   1 root     root     0 May 12 01:04 oom_adj
-r--r--r--.   1 root     root     0 May 12 01:04 oom_score
-rw-r--r--.   1 root     root     0 May 12 01:04 oom_score_adj
-r--r--r--.   1 root     root     0 May 12 01:04 pagemap
-r--r--r--.   1 root     root     0 May 12 01:04 personality
-rw-r--r--.   1 root     root     0 May 12 01:04 projid_map
lrwxrwxrwx.   1 root     root     0 May 12 01:04 root
-rw-r--r--.   1 root     root     0 May 12 01:04 sched
-r--r--r--.   1 root     root     0 May 12 01:04 schedstat
-r--r--r--.   1 root     root     0 May 12 01:04 sessionid
-rw-r--r--.   1 root     root     0 May 12 01:04 setgroups
-r--r--r--.   1 root     root     0 May 12 01:04 smaps
-r--r--r--.   1 root     root     0 May 12 01:04 stack
-r--r--r--.   1 root     root     0 May 12 01:03 stat
-r--r--r--.   1 root     root     0 May 12 01:03 statm
-r--r--r--.   1 root     root     0 May 12 01:03 status
-r--r--r--.   1 root     root     0 May 12 01:04 syscall
dr-xr-xr-x.   3 ec2-user ec2-user 0 May 12 01:03 task
-r--r--r--.   1 root     root     0 May 12 01:04 timers
-rw-r--r--.   1 root     root     0 May 12 01:04 uid_map
-r--r--r--.   1 root     root     0 May 12 01:04 wchan
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用root用户的情况下读取/proc//fd目录?

sou*_*edi 6

从技术上讲,有一些方法可以允许它。我不确定它们在大多数情况下是否实用或有用。

您可以修改您有兴趣调用的程序prctl(PR_SET_DUMPABLE, 1, ...)。如果目标程序正在使用访问更敏感信息(例如密码文件)的功能,这将是危险的。这种危险不适用于您的情况。因为您只使用了 CAP_SYS_RESOURCE 功能,它不允许程序访问比其他方式更多的信息。


问题 1:我们看到您被拒绝访问目录/proc/[pid]/fd/,因为它只能由所有者 ( r-x------)访问,而所有者是root。这是因为:

http://man7.org/linux/man-pages/man5/proc.5.html

每个 /proc/[pid] 目录中的文件通常由进程的有效用户和有效组 ID 拥有。但是,作为安全措施,如果进程的“可转储”属性设置为 1 以外的值,则所有权将变为 root:root。

[...]

由于以下原因,进程的“可转储”属性可能会发生变化:

  • 该属性是通过 prctl(2) PR_SET_DUMPABLE 操作显式设置的。

  • 由于 prctl(2) 中所述的原因,该属性已重置为文件 /proc/sys/fs/suid_dumpable(如下所述)中的值。

http://man7.org/linux/man-pages/man2/prctl.2.html

PR_SET_DUMPABLE(自 Linux 2.3.20 起)

设置“可转储”标志的状态,该标志确定在传递默认行为是生成核心转储的信号时是否为调用进程生成核心转储。

[...](另请参阅 proc(5) 中 /proc/sys/fs/suid_dumpable 的描述。)

通常,此标志设置为 1。但是,在以下情况下,它会重置为文件 /proc/sys/fs/suid_dumpable 中包含的当前值(默认值为 0):

  • 进程的有效用户或组 ID 已更改。

  • 进程的文件系统用户或组 ID 已更改(请参阅凭据 (7))。

  • 该进程执行(execve(2))一个set-user-ID 或set-group-ID 程序,导致有效用户ID 或有效组ID 的更改。

  • 进程执行 (execve(2)) 一个具有文件能力的程序(请参阅 capabilities(7)),但前提是获得的允许能力超过了该进程已经允许的能力。

问题 2:仅仅能够列出/proc/[pid]/fd/它本身并不是很有用。我希望你至少想看看打开的文件指的是什么。

在此目录的权限以及其中的文件的权限之后,proc手册页说还有另一个涉及此“可转储”标志的安全检查:

取消引用或读取(readlink(2))此目录中符号链接的权限由 ptrace 访问模式 PTRACE_MODE_READ_FSCREDS 检查控制;请参见 ptrace(2)。

http://man7.org/linux/man-pages/man2/ptrace.2.html

如果目标进程“dumpable”属性的值不是 1(SUID_DUMP_USER;请参阅 prctl(2) 中 PR_SET_DUMPABLE 的讨论),并且调用方在目标进程的用户命名空间中没有 CAP_SYS_PTRACE 功能,则拒绝访问。

因此,绕过问题 2 的另一种方法是,如果您有能力 CAP_SYS_PTRACE。请注意, CAP_SYS_PTRACE 将允许您控制任何其他进程。这是否比实际成为root用户更不强大是有争议的。

您还需要绕过问题 1,即文件权限。如果您具有 CAP_DAC_READ_SEARCH(或 CAP_DAC_OVERRIDE)功能,则可以完成此操作。