在 Linux 上,我正在查看/proc/1/cwd
。普通用户无法读取此符号链接:
$ ls /proc/1/cwd
ls: cannot access '/proc/1/cwd': Permission denied
但/proc/1
可以访问:
$ ls /proc/1
<output>
成为 root 之后,您会看到/proc/1/cwd
指向/
(文件系统根目录):
$ sudo ls -l /proc/1/cwd
lrwxrwxrwx 1 root root 0 Feb 21 12:56 /proc/1/cwd -> /
当然,作为普通用户,文件系统根是可读的:
$ ls /
<output>
如果符号链接在 Linux 上没有任何权限,那么当其目标(文件系统根目录)可读时,为什么这样的符号链接不可读?
读取
/
通常不具有特权,但了解其他用户进程的当前工作目录则具有特权。在允许之前/proc
添加了额外的检查readlink
:这适用于 内的其他链接
/proc
,特别是exe
和root
。原因类似:进程的可执行文件通常可供所有人读取,但了解给定进程的可执行文件是敏感信息。这是该进程的当前工作目录,被视为私密的并且可能是敏感的。
看
man 5 proc_pid_cwd
:使用 [
man 2 ptrace
] 具有:并且
man 7 credentials
具有:(本质上与有效ID相同,根据
setfsgid()
手册页,那些 Linux 特定的 FS ID 已被弃用,因为不再需要)。因此,基本上,为了能够执行
readlink()
或取消引用/proc/$pid/cwd
,调用进程(如果它与 无关$pid
)必须具有与 相同的凭据$pid
。请注意,它会根据 的所有有效、实际和已保存 ID 检查调用进程文件系统(有效)ID$pid
。因此,如果$pid
具有不同的有效和实际 gid(例如,当进程执行在其权限中设置了 sgid 位的文件时),则只有root
(或具有适当功能的进程)才能获取该信息。对于 pid 1 的情况,通常以 1 的身份运行
root
并且没有父进程,只能root
获取该信息。附注:请注意,
ls
有和没有 时的行为会有所不同-l
。使用
-l
(或使用一些其他选项来报告目标文件的某些属性,例如-F
),对文件ls
执行,因此对于符号链接,将返回有关符号链接本身的信息,但如果没有,它会执行,因此取消引用符号链接(并且如果成功,将列出 pid 1 的当前工作目录的内容)。lstat()
stat()
stat()
ls /proc/1/cwd