Linux文件权限

4

有一个进程正在以root用户身份运行。

ps aux | grep ProcessX
root     11565  0.0  0.7  82120 22976 ?        Ssl  14:57   0:02 ProcessX

现在运行 ls -l /proc/11565/ (pid)命令会得到以下结果。
total 0
dr-xr-xr-x 2 root root 0 Aug  9 16:06 attr
-rw-r--r-- 1 root root 0 Aug  9 16:06 autogroup
-r-------- 1 root root 0 Aug  9 16:06 auxv
-r--r--r-- 1 root root 0 Aug  9 16:06 cgroup
--w------- 1 root root 0 Aug  9 16:06 clear_refs
-r--r--r-- 1 root root 0 Aug  9 16:06 cmdline
-rw-r--r-- 1 root root 0 Aug  9 16:06 coredump_filter
-r--r--r-- 1 root root 0 Aug  9 16:06 cpuset
lrwxrwxrwx 1 root root 0 Aug  9 16:06 cwd -> /usr/local/bin
-r-------- 1 root root 0 Aug  9 16:06 environ
lrwxrwxrwx 1 root root 0 Aug  9 16:06 exe -> /usr/local/bin/ProcessX
dr-x------ 2 root root 0 Aug  9 16:06 fd
dr-x------ 2 root root 0 Aug  9 16:06 fdinfo
-r-------- 1 root root 0 Aug  9 16:06 io
-rw------- 1 root root 0 Aug  9 16:06 limits
-rw-r--r-- 1 root root 0 Aug  9 16:06 loginuid
-r--r--r-- 1 root root 0 Aug  9 16:06 maps
-rw------- 1 root root 0 Aug  9 16:06 mem
-r--r--r-- 1 root root 0 Aug  9 16:06 mountinfo
-r--r--r-- 1 root root 0 Aug  9 16:06 mounts
-r-------- 1 root root 0 Aug  9 16:06 mountstats
dr-xr-xr-x 6 root root 0 Aug  9 16:06 net
-r--r--r-- 1 root root 0 Aug  9 16:06 numa_maps
-rw-r--r-- 1 root root 0 Aug  9 16:06 oom_adj
-r--r--r-- 1 root root 0 Aug  9 16:06 oom_score
-rw-r--r-- 1 root root 0 Aug  9 16:06 oom_score_adj
-r--r--r-- 1 root root 0 Aug  9 16:06 pagemap
-r--r--r-- 1 root root 0 Aug  9 16:06 personality
lrwxrwxrwx 1 root root 0 Aug  9 16:06 root -> /
-rw-r--r-- 1 root root 0 Aug  9 16:06 sched
-r--r--r-- 1 root root 0 Aug  9 16:06 schedstat
-r--r--r-- 1 root root 0 Aug  9 16:06 sessionid
-r--r--r-- 1 root root 0 Aug  9 16:06 smaps
-r--r--r-- 1 root root 0 Aug  9 16:06 stack
-r--r--r-- 1 root root 0 Aug  9 16:06 stat
-r--r--r-- 1 root root 0 Aug  9 16:06 statm
-r--r--r-- 1 root root 0 Aug  9 16:06 status
-r--r--r-- 1 root root 0 Aug  9 16:06 syscall
dr-xr-xr-x 6 root root 0 Aug  9 16:06 task
-r--r--r-- 1 root root 0 Aug  9 16:06 wchan

现在状态和地图文件的权限都是一样的(-r--r--r--)。但是当我使用非特权用户(非root用户)执行cat /proc/11565/maps时,它会给出一个权限被拒绝的错误。但对于cat /proc/11565/status,输出如预期那样。
这里有什么我忽略了的东西吗?
2个回答

8
这是因为文件权限不是您遇到的唯一保护措施。那些不仅仅是常规文件系统上的文本文件,procfs 是进程内部的一个窗口,您必须通过文件权限以及其他任何已经存在的保护措施。地图显示了关于内存使用情况和可执行代码在进程空间中所在位置的潜在危险信息。如果您研究 ASLR,您会发现这是一种方法,用于防止潜在攻击者了解代码加载的位置,并且在 procfs 的 world-readable 条目中透露这些信息是毫无意义的。这种保护于2007年添加:(参见此处):“这个改变通过 "ptrace_may_attach" 实现了一个检查,然后允许访问读取映射内容。为了控制这个保护,新的 /proc/sys/kernel/maps_protect 旋钮已经被添加,同时更新了 procfs 文档。” 在 ptrace_may_attach() 函数中(实际上是它调用的函数之一),以下代码位于其中:
if (((current->uid != task->euid) ||
     (current->uid != task->suid) ||
     (current->uid != task->uid) ||
     (current->gid != task->egid) ||
     (current->gid != task->sgid) ||
     (current->gid != task->gid))     && !capable(CAP_SYS_PTRACE))
   return -EPERM;

因此,除非您具有相同的真实用户/组ID、保存的用户/组ID和有效用户/组ID(即没有诡计的setuid东西),并且它们与拥有该进程的用户/组ID相同,否则您不被允许查看该“文件”内部(当然,如果您的进程具有CAP_SYS_PTRACE能力,则除外)。


0

进程的 UID 必须匹配 Smaps 的 UID,进程的 GID 必须匹配 Smaps 的 GID。

$ ls -l /proc/15889/smaps /proc/16139/smaps
-r--r--r--. 1 oracle dba      0 Feb 10 16:42 /proc/15889/smaps
-r--r--r--. 1 oracle asmadmin 0 Feb 10 16:42 /proc/16139/smaps
$ wc /proc/15889/smaps /proc/16139/smaps
6851 23498 224275 /proc/15889/smaps
wc: /proc/16139/smaps: Permission denied
6851 23498 224275 total
$ id
uid=400(oracle) gid=400(dba) groups=400(dba),522(asmadmin),etc.

对于environ、io和所有内存映射也是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接