把 root 权限拆成能力位
capabilities 机制把传统上只有 root 才能做的事拆成若干独立能力,例如修改文件属主、绕过文件读权限检查、绑定低端口、加载内核模块。一个普通权限的可执行文件一旦被赋予某些能力,运行时就能完成对应的高权限操作,这让提权后门可以脱离 SUID 存在,靠传统的权限检查往往发现不了。
怎么清点
用 getcap 递归扫描文件系统可以得到当前所有带能力位的文件,输出里会标明具体能力。判断时要与基线对比:ping 这类工具带网络原始套接字能力属于正常,而某个位于临时目录或用户可写目录下的文件带 cap_setuid、cap_dac_read_search 则明显异常。
基本信息
| 适用平台 | Linux(libcap、内核 capabilities 支持) |
|---|---|
| 命令 | getcap -r / 递归扫描;setcap 设置与移除 |
| 常见基线 | ping 的 cap_net_raw、部分网络服务的绑定低端口能力 |
| 高风险能力 | cap_setuid、cap_setgid、cap_dac_read_search、cap_sys_admin |
| 注意 | 能力存在文件的扩展属性中,复制方式不当会丢失 |
典型使用场景
- 提权点排查:与 SUID 文件清单一并扫描,覆盖完整的权限异常面
- 发现异常程序:位于用户可写目录却带高权限能力,值得深查
- 处置前取证:记录原始能力位状态,再决定是否移除
- 合规检查:确认关键系统文件的能力位未偏离基线
- 打包证据:确保所用的打包方式能够保留扩展属性
清点与对照
清点与对照
# 递归扫描整个文件系统,输出带能力位的文件
getcap -r / 2>/dev/null
# 只扫当前文件系统,避免进入挂载点
find / -xdev -type f -exec getcap {} + 2>/dev/null | head
# 与 SUID 文件一起看,权限异常面才完整
find / -xdev -perm -4000 -type f 2>/dev/null | head
# 单文件确认,处置前先记录原始状态
getcap /usr/bin/ping
# getcap /tmp/suspicious 2>/dev/null常见能力与风险
| 能力 | 作用 | 风险判断 |
|---|---|---|
| cap_net_raw | 使用原始套接字 | ping 类工具带此项属正常 |
| cap_net_bind_service | 绑定低端口 | 网络服务常用,路径正常即可信 |
| cap_setuid | 切换用户身份 | 出现在普通程序上高度可疑 |
| cap_dac_read_search | 绕过文件读权限 | 可用于读取 shadow 等敏感文件 |
| cap_sys_admin | 系统管理操作 | 范围极广,出现即需核实 |
能力设置存放在扩展属性里,普通复制(如不带相应选项的 tar、cp)可能丢失。打包证据前先确认方式能保留扩展属性,否则记录状态与实物会对不上。
移除能力位用 setcap -r 文件路径,但处置前应先把原始状态写入清单;擅自清理会破坏后续核验与追责依据。