“其他”无法读取 /proc/PID/ 下具有 -r--r--r-- 权限的“smaps_rollup”文件。为什么?

Fir*_*ord 6 permissions proc

我正在尝试读取两个特定文件,即statussmaps_rollup下的所有进程/proc。所有进程目录都有dr-xr-xr-x权限,我可以进入这些目录中的每一个。

对于所有进程,这两个文件的权限都是-r--r--r--.

这是奇怪的行为。假设我尝试读取 PID 1 的两个文件。我可以读取statusfile,但不能读取smaps_rollup. 见下文:

$ cd /proc/1

$ ls -l status smaps_rollup
-r--r--r-- 1 root root 0 Apr  5 18:34 smaps_rollup
-r--r--r-- 1 root root 0 Mar 21 12:18 status

$ grep "Swap:" status
VmSwap:     1072 kB

$ grep "Swap:" smaps_rollup
grep: smaps_rollup: Permission denied

$ cat smaps_rollup
cat: smaps_rollup: Permission denied
Run Code Online (Sandbox Code Playgroud)

我查找了相关问题并遇到了其中的一些问题[1][2][3][4]。他们都没有同样的问题。这些其他问题的解决方案必须修复目录上缺少的可执行权限。这里的情况并非如此。

这是 proc 的挂载信息:

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
Run Code Online (Sandbox Code Playgroud)

我正在使用 Arch Linux 提供的内核 6.2.7-arch1-1 运行 Arch Linux。

我正在寻找对这种奇怪行为的正确解释。除了使用 sudo 作为解决方法之外,我还能做些什么来解决这个问题吗?


  1. 即使权限正确也无法读取文件

  2. 为什么我无法读取文件?

  3. “其他”的文件读取权限不起作用

  4. 如何检查 /proc/ /文件的读取权限?

Ste*_*itt 10

\xe2\x80\x99t 似乎没有明确记录;it\xe2\x80\x99sman 5 proc通过以下文档传递地记录在 中/proc/[pid]/maps

\n
\n

访问此文件的权限由ptrace\n访问模式PTRACE_MODE_READ_FSCREDS检查控制;看ptrace(2)

\n
\n

文档smaps

\n
\n

这些行中的第一行显示的信息与\n中为映射显示的信息相同/proc/[pid]/maps

\n
\n

由于后者很敏感,因此以类似的方式对其进行保护。smaps_rollup不太敏感,可以打开,但据我所知,后一个补丁还没有 \xe2\x80\x99 到任何地方。

\n

应该可以使用功能来解决这个问题,但我还没有尝试过\xe2\x80\x99t。

\n

\xe2\x80\x99中的许多文件、目录和链接/proc不一定可以按照其权限指示进行访问;maps特别是,许多文件需要与和smaps,相同的权限PTRACE_MODE_READ_FSCREDS。这些要求详见man 5 proc。这意味着可见权限只能被视为权限的上限;特别是,它们可用于确定/proc条目是否用于更新内核设置(it\xe2\x80\x99s 可写),而不仅仅是查看它们。

\n

  • 也许值得补充的是,procfs 非常神奇,它的文件权限只是一个非常粗略的指示,表明您可能想对给定文件执行什么操作。他们唯一告诉你的是“这个文件在某些​​情况下可能是可写的”或者“你永远无法访问这个文件,忘了它吧”。 (8认同)
  • 对,就是这样。procfs 是它自己的特殊驱动程序,可以随时返回所需的任何内容,无论“常规文件”是否会这样做。如果当前分钟是主分钟,则在 procfile 上读取可能会返回“太多打开的文件”;如果是复合分钟(如果内核中的实现希望如此),则返回“没有到主机的路由”。 (2认同)