文件 capabilities 是什么
Linux capabilities 把 root 的特权拆成若干细粒度能力,可以单独授予某个可执行文件。例如给程序加上 cap_setuid,普通用户运行它就能任意切换身份,效果等同本地 root。它比 SUID 更隐蔽:ls -l 看不出任何特殊权限位,只能用 getcap 全盘检查。
基本信息
| 查看命令 | getcap -r /(需 root,递归全盘) |
|---|---|
| 高危能力 | cap_setuid、cap_setgid、cap_sys_admin、cap_dac_read_search |
| 正常样例 | ping 与 traceroute 的 cap_net_raw |
| 授权命令 | setcap cap_net_raw+ep /path/to/bin |
| 清除命令 | setcap -r /path/to/bin |
| 与 SUID 关系 | 并列的两类提权面,必须一起排查 |
典型使用场景
- 排查本地提权点:找出被授予高能力、又可由普通用户执行的文件
- 处置中核对业务文件是否被偷偷加上了高危能力
- 加固巡检,建立本机正常能力基线
- 排查「为什么这个进程能读别人的文件」这类怪现象
- 与 SUID 文件清单一起梳理完整提权面
- 清理测试或调试阶段遗留的授权
- 容器镜像构建前检查基础镜像里预置的高危能力
列出全部文件能力
列出全部文件能力
sudo getcap -r / 2>/dev/null | head -n 40 # 全盘列出文件能力
sudo getcap -r / 2>/dev/null | grep -E 'cap_setuid|cap_setgid|cap_sys_admin' # 只看高危能力
sudo find / -perm -4000 -type f 2>/dev/null | head -n 40 # 对照:SUID 文件清单
ls -l /path/to/suspect # 权限位看不出能力
sudo getcap /path/to/suspect # 查看该文件的能力
sudo setcap -r /path/to/suspect # 清除能力后再复核常见能力与风险
| 能力 | 含义 | 风险判断 |
|---|---|---|
| cap_setuid | 切换任意用户身份 | 等同本地 root,最高危 |
| cap_setgid | 切换任意组身份 | 常与 setuid 组合使用 |
| cap_sys_admin | 近乎全能的系统管理能力 | 与容器逃逸密切相关 |
| cap_dac_read_search | 绕过文件读权限 | 可读取任意文件内容 |
| cap_net_raw | 使用原始套接字 | 诊断类工具正常使用 |
capabilities 保存在文件的扩展属性里,ls -l 完全看不出来:靠权限位做安全巡检会整片漏掉这类提权配置。
清除能力前先确认业务依赖:删掉 DNS 服务或容器运行时的能力会让服务直接起不来,先用包查询与官方文档核实。
全盘 getcap 在文件量大的主机上耗时明显,可先用 find 限定常见可执行目录(/usr/bin、/usr/sbin、/usr/local/bin)快速过一遍,再做全盘核对。