作为非 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
有没有办法在不使用root用户的情况下读取/proc//fd目录?
答案1
从技术上讲,有一些方法可以允许它。我不确定它们在大多数情况下是否实用或有用。
您可以修改您感兴趣的程序来调用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))设置用户ID或设置组ID程序,导致有效用户ID或有效组ID的改变。
该进程执行 (execve(2)) 具有文件功能的程序(参见能力(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)功能,则可以完成此操作。