盘点 SUID 是最低成本的安全动作
SUID 程序以文件属主的身份运行(passwd、sudo 都属此类),SGID 则继承属组权限。攻击者拿到 root 后常常留一个隐藏的 SUID 后门,因此“定期导出 SUID/SGID 清单并与基线比对”是最省事的入侵检测手段:新出现、且不在发行版默认集合里的 SUID 二进制应当优先审计。
基本信息
| 适用平台 | Linux(GNU findutils) |
|---|---|
| 扫描命令 | find / -xdev -type f -perm -4000(SUID)与 -perm -2000(SGID) |
| 权限要求 | root(否则大量目录报权限错误,结果不完整) |
| 产出 | 带日期与主机名的清单文件,用于后续比对 |
| 交叉验证 | rpm -V / dpkg -V 判断文件是否被篡改 |
| 范围控制 | -xdev 限制在当前文件系统 |
典型使用场景
- 安全基线巡检与合规检查
- 应急响应时查找后门与异常提权面
- 系统加固前后对比 SUID 集合的变化
- 新装机与模板机核对默认 SUID 清单
- 发行版大版本升级后复核权限面
全盘扫描与比对
全盘扫描与比对
sudo find / -xdev -type f -perm -4000 -ls 2>/dev/null | tee /var/log/suid-audit-$(date +%F).txt
sudo find / -xdev -type f -perm -2000 -ls 2>/dev/null | tee -a /var/log/suid-audit-$(date +%F).txt
# 与昨日基线比对(只对比路径差异)
sudo diff <(awk '{print $11}' /var/log/suid-audit-$(date -d yesterday +%F).txt | sort) \
<(awk '{print $11}' /var/log/suid-audit-$(date +%F).txt | sort)
# 判断新出现的二进制是否被篡改
rpm -Vf /usr/bin/passwd # RHEL 系:校验该文件是否被改动
dpkg -V passwd 2>/dev/null # Debian 系:校验包内文件
sudo find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -newermt '-7 days' 2>/dev/null # 近 7 天新增扫描要点
| 要点 | 做法 | 说明 |
|---|---|---|
| 权限 | 用 root 执行 | 否则结果不完整,容易漏掉关键目录 |
| 范围 | 加 -xdev | 不跨文件系统,避免扫备份盘与网络存储 |
| 同时看 SGID | 加 -perm -2000 | SGID 同样能带来越权风险 |
| 留档 | 输出重定向到带日期的文件 | 有基线才能看出新增项 |
| 交叉验证 | rpm -V / dpkg -V | 判断二进制是否被替换 |
| 缩小范围 | 按修改时间筛近期文件 | 快速定位可疑新增 |
-xdev 把扫描限制在当前文件系统内,能避免对挂载的备份盘与 NFS 做全量遍历,既快又少噪音,是日常巡检的推荐写法。
不要贸然去掉系统 SUID 位:passwd、sudo、mount 这类程序依赖 SUID 工作,去掉会导致用户无法改密码等故障,处理前先确认该文件是否属于发行版默认集合。
把扫描放进定期任务(cron 或 systemd timer)比临时想起来跑一次有效得多:清单按日期留存,逐日比对就能发现新增项,也便于纳入安全基线检查项做验收。