linux - 文件权限的问题 cap_dac_read_search linux capabilities getcap tar
访问量: 35
refer to: https://www.doubao.com/thread/w23bcd93a749f6dc9
请问,一个普通用户 /home/cyber
目录下有个文件,属性为:-rwxr-xr-x 1 root root 531928 Oct 19 2021 tar
/var/backups 有:
-rw------- 1 root root 17 Oct 20 2021 .old_pass.bak
请问该用户 cyber 可以通过调用 ~/tar 方法,读取 /var/backups/.old_pass.bak ,然后把它压缩到 /tmp/a.zip 吗? 为什么?
AI回答:
不能。原因如下:
1. 关键权限分析
/home/cyber/tar 的权限:-rwxr-xr-x 表示
所有者(root):可读、可写、可执行
同组用户(root 组):可读、可执行
其他用户(包括 cyber):可读、可执行
因此,cyber 可以执行这个 tar 程序。
/var/backups/.old_pass.bak 的权限:-rw------- 表示
仅所有者(root)有读、写权限
同组用户(root 组)和其他用户(包括 cyber)无任何权限(不可读、不可写、不可执行)
2. 核心问题:进程的权限继承
当 cyber 执行 ~/tar 时,该 tar 进程的有效用户 ID(EUID)是 cyber(而非 root),因为:
~/tar 虽然所有者是 root,但未设置 SUID 特殊权限(权限位中无 s,SUID 会让进程以文件所有者身份运行)。
因此,tar 进程会以 cyber 的权限运行,而 cyber 对 /var/backups/.old_pass.bak 没有读取权限,导致 tar 无法访问该文件。
3. 结论
cyber 无法通过 ~/tar 读取 /var/backups/.old_pass.bak 并压缩,核心原因是目标文件 .old_pass.bak 对普通用户 cyber 完全无权限,且 tar 程序未以 root 权限运行。
关键原理:Linux Capabilities(能力机制)
Linux 的 capabilities 机制允许将 root 权限拆分为更细粒度的 “能力”,进程可以仅拥有特定的权限,而无需以完整 root 身份运行。
其中,cap_dac_read_search 是一个关键能力,它的作用是:
绕过文件 / 目录的 DAC(自主访问控制)权限检查,允许进程读取任何文件(即使文件权限是 -rw------- 且所有者为 root),并搜索任何目录(即使目录权限不允许当前用户进入)。
为什么这次能成功?
tar 被赋予了 cap_dac_read_search=ep
getcap tar 显示 cap_dac_read_search=ep,说明:
e(Effective):该能力当前生效;
p(Permitted):该能力被允许使用。
因此,tar 进程在运行时,会无视 /var/backups/.old_pass.bak 的 -rw------- 权限,直接读取其内容。
命令选项的作用
-cf 是 tar 的基本用法(-c 创建归档,-f 指定文件名),和 -cvf(多了 -v 显示详细过程)的核心功能一致,都能创建归档。
能否读取文件,关键不在于 -c 还是 -cv,而在于 tar 是否有绕过权限检查的能力。
流程解释
当执行 ./tar -cf pass.tar /var/backups/.old_pass.bak 时:
由于 tar 有 cap_dac_read_search 能力,即使 cyber 用户对 .old_pass.bak 无读权限,tar 仍能读取该文件内容并写入 pass.tar。
执行 tar -xf pass.tar 时:
解压是在当前用户(cyber)权限下创建文件,因此提取出的 var/backups/.old_pass.bak 所有者会是 cyber,自然可以用 cat 读取。
总结
核心是 cap_dac_read_search 能力,而非 tar 的命令选项。这个能力让 tar 绕过了常规权限检查,从而实现了对 root 私有文件的读取。这也解释了为什么之前没有这个能力时会失败,而赋予能力后能成功