SUID 为什么值得单独建基线
带有 SUID 位的程序在被执行时会以文件属主的身份运行,权限通常就是 root。正常系统确实需要这类程序(su、passwd、mount 等),但攻击者同样需要——在可写目录里放一个 SUID 的 root 程序,本地提权就完成了。所以关键不是「消灭 SUID」,而是把当前清单固化成基线并持续比对:新增的 SUID 文件才是危险信号。
基本信息
| 加固项 | SUID 文件基线化与复核 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS/Debian/Ubuntu) |
| 风险等级 | 高 |
| 检查点 | 符合条件的文件清单与基线一致 |
| 命令要点 | find 的 -perm -4000(SUID)与 -perm -2000(SGID) |
典型使用场景
- 首次加固:建立一份可长期比对的 SUID 清单
- 周期巡检:与基线比对,新增项逐个核实来源
- 事件排查:攻击者常用 SUID 程序维持提权能力,这是必查项
- 变更后复核:安装新软件后确认带来了哪些 SUID 程序
- 合规留证:把基线与比对结果作为入侵防范的证据提交
建立基线
建立基线
find / -xdev -type f -perm -4000 -print 2>/dev/null | sort > /root/suid-baseline-$(date +%F).txt
find / -xdev -type f -perm -2000 -print 2>/dev/null | sort > /root/sgid-baseline-$(date +%F).txt
wc -l /root/suid-baseline-$(date +%F).txt # 记录条数,便于日后快速比较定期复核:与基线比对
定期复核:与基线比对
find / -xdev -type f -perm -4000 -print 2>/dev/null | sort > /tmp/suid-now.txt
diff /root/suid-baseline-2026-10-12.txt /tmp/suid-now.txt # 无输出=一致
find / -xdev -type f -perm -4000 -newermt '-30 days' 2>/dev/null | head # 近 30 天新增
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null | wc -l # 总量比对结果判读
| 比对情形 | 含义 | 处置 |
|---|---|---|
| 无差异 | 符合基线 | 记录归档即可 |
| 新增常见发行版文件 | 可能来自系统升级或新装软件 | 与变更记录核对,一致则更新基线 |
| 新增可写目录下的文件 | 高度可疑 | 立即取证,按事件流程排查 |
| 基线中消失的项目 | 被删除或被改权限 | 确认是否为正常变更或有人清理痕迹 |
| SUID 与 SGID 同时异常 | 改造更彻底 | 按同一事件扩大排查范围 |
不要盲目对清单里的文件执行 chmod u-s:su、sudo、passwd、mount、umount、ping 等依赖 SUID 工作,去掉之后登录改密挂载都会出问题。处置前先判断这个文件是否属于发行版默认清单,再看它的属主与所在目录是否合理。
-xdev 会跳过其他本地分区与挂载点,多分区服务器要对每个挂载点分别扫描;另外现代发行版可能用 capabilities 替代 SUID(例如只授予 ping 需要的网络能力),这类程序不在 SUID 清单里并不意味着异常。
清单之外还要看什么
SUID 清单要与另外几个视角合起来读:文件所在目录是否可写(可写目录下的 SUID 程序风险最高)、文件属主是否为 root、程序是否带有发行版签名或包管理器记录。只比对文件名而忽略这些属性,会漏掉「伪造同名文件」这种更隐蔽的替换手法。