SUID 位为什么值得清点
文件设置 SUID 位后,任何用户执行它都会以文件属主的权限运行——如果属主是 root,普通用户执行时就拿到了 root 权限。这个机制在系统里大量用于 passwd、su 等程序,因此攻击者常把新增的 SUID 文件当作本地提权与持久化手段。排查方法不是逐个看文件「像不像恶意」,而是先落地一份基线清单,再用差异比较:新出现的 SUID 文件才是重点。
基本信息
| 适用平台 | Linux/Unix;权限位含义由内核实现 |
|---|---|
| 扫描命令 | find 配合 -perm -4000(SUID)、-perm -2000(SGID) |
| 范围控制 | -xdev 避免跨挂载点,防止扫描网络或外部存储 |
| 基线方法 | 在可信主机上生成标准清单,与目标主机比对差异 |
| 相关机制 | 文件能力(capabilities)可替代部分 SUID 用途,需一并检查 |
| 挂载影响 | nosuid 挂载点上的 SUID 位不生效,扫描结果要结合挂载选项 |
典型使用场景
- 清点主机上全部 SUID/SGID 文件并建立基线
- 排查本地提权路径:新增的 SUID 可执行文件
- 对比不同主机的清单,找出被单独植入的文件
- 结合包管理器校验(如 rpm -V)判断文件是否被替换
- 检查文件能力配置,找出被授予能力的程序
- 为清理与加固提供清单:哪些 SUID 位可以回收
清点与比对
清点与比对
# 清点 SUID 文件(-xdev 限定在当前文件系统内)
find / -xdev -perm -4000 -type f 2>/dev/null | sort
# 清点 SGID 文件
find / -xdev -perm -2000 -type f 2>/dev/null | sort | head -20
# 记录属性与哈希,便于与基线比对
find / -xdev -perm -4000 -type f -printf '%TY-%Tm-%Td %TH:%TM %m %u %p\n' 2>/dev/null | sort | head -30
# 检查文件能力(现代替代机制)
getcap -r / 2>/dev/null | head -20
# 用包管理器校验:被替换的文件会被标出来
rpm -Va 2>/dev/null | grep -E '^..5|^M' | head -20
# 与基线清单做差异比较
diff baseline_suid.txt current_suid.txt | head -40结果判读
| 观察项 | 含义 | 异常表现 |
|---|---|---|
| 属主 | 以谁的身份执行 | 属主为 root 的新增文件风险最高 |
| 路径 | 文件所在目录 | 出现在 /tmp、/dev/shm、用户家目录属高度可疑 |
| 时间戳 | 文件创建与修改时间 | 时间落在入侵窗口内 |
| 权限位 | SUID/SGID 组合 | 原本无 SUID 的系统工具被加上该位 |
| 文件能力 | capabilities 配置 | 被授予了不必要的高危能力 |
| 挂载选项 | nosuid 是否生效 | 挂载点带 nosuid 时,该位不生效 |
先落地一次标准清单作为基线,后续差异比单次结果更有意义。同一发行版不同版本的基线也不同,基线要在相近环境中生成。
扫描范围要明确:跨挂载点扫描会遍历网络文件系统与外部存储,既慢又可能触发大量访问。用 -xdev 限定范围,必要时逐挂载点单独扫描。