SUID/SGID 为什么值得盘点
带 SUID 位的可执行文件以文件属主(通常是 root)权限运行,带 SGID 位的文件以属组权限运行。它们既是系统正常功能(passwd、sudo、ping 都需要),也是本地提权的常见观察点:任何一个存在缺陷或被误配的 SUID 程序,都可能把普通用户变成 root。适用平台为 Linux 与类 Unix 系统。
基本信息
| 适用系统 | Linux、BSD 等类 Unix |
|---|---|
| 盘点目标 | -perm -4000(SUID)与 -perm -2000(SGID) |
| 权限要求 | 读取全盘目录需 root,审计用普通用户可跳过无权限项 |
| 对账方式 | 与包管理器的文件清单比对 |
| 监控手段 | 建立基线清单,新增项触发告警 |
典型使用场景
- 存量盘点:新接手主机时先摸清有哪些 SUID/SGID 文件
- 合规检查:基线要求说明每个 SUID 文件的必要性
- 变更监控:定期比对清单,发现『新增』这类异常
- 提权排查:应急时按 SUID 清单逐个核对是否为已知后门
- 挂载加固:对 /tmp、/home 等目录应用 nosuid,缩小可利用面
盘点与对账
盘点与对账
find / -xdev -perm -4000 -type f 2>/dev/null | sort # SUID
find / -xdev -perm -2000 -type f 2>/dev/null | sort # SGID
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -ls # 含属主与属组
rpm -qf /usr/bin/passwd # RPM 系:确认文件属于哪个包
dpkg -S /usr/bin/sudo # DEB 系:反查归属包
debsums -e /usr/bin/sudo # 校验文件是否被改动常见文件与风险判断
| 文件 | 正常用途 | 风险信号 |
|---|---|---|
| /usr/bin/passwd | 用户改密 | 被替换或版本异常 |
| /usr/bin/sudo | 提权执行命令 | sudoers 过宽比 SUID 本身更危险 |
| /bin/ping | 原始套接字 | 现代发行版多已改用 cap_net_raw |
| 解释器类文件 | 不应有 SUID | 被误加 SUID 时影响面极大 |
| 自研脚本 | 通常不需要 | 历史上多为临时『解决问题』留下 |
现代 Linux 对 ping 等程序更多使用能力位(cap_net_raw)而不是 SUID,因此盘点时同时查看 getcap -r / 的输出,否则会漏掉真正的权限来源。
许多教程式配置会把权限放宽到 4755 来『解决问题』,盘点时应优先复核这类历史遗留,它们往往无人认领也无人敢动。
盘点结果要按主机类型分组:Web 服务器与数据库服务器的合理清单差异很大,同一份基线套到所有机器上会产生大量无意义的例外申请,最终没人再看这份清单。
复核节奏建议
- 每月自动跑一次盘点并与基线比对,差异直接进工单
- 每季度人工复核一次基线本身:新增软件带来的合理 SUID 项要登记入基线
- 重大变更(装机、装中间件、运维脚本上线)后即时复查,不等下个月