直接用脚本扫描并初筛setuid隐患,关键在快速锁定高危目标:聚焦root属主、路径异常、近期修改、无包管理器签名的文件,通过三步自动初筛(属主为root、是否归属系统包、是否调用execve/openat)生成带风险等级的csv报告。

直接用脚本扫描并初筛SetUID隐患,关键不在“找全”,而在“快速锁定高危目标”。重点是过滤掉系统默认可信项,聚焦属主为root、路径异常、近期修改、无包管理器签名的文件。
一、基础扫描:只抓真正可疑的SUID文件
全盘扫描容易淹没在噪音里。建议限定范围+排除已知安全项:
- 执行:
find /usr/bin /bin /usr/sbin /sbin -perm -4000 -type f 2>/dev/null | xargs ls -l——先看核心命令目录下有哪些 - 再加一层过滤:
find / -xdev -perm -4000 -type f 2>/dev/null | grep -v '^/usr/bin/\|^/bin/\|^/usr/sbin/\|^/sbin/'——重点盯/tmp、/home、/opt等用户可写路径下的SUID文件 - 导出带元数据的清单:
find / -xdev -perm -4000 -type f 2>/dev/null | while read f; do stat -c "%y|%U:%G|%s|%n" "$f"; done | sort -k1,1r > suid_recent.log——按修改时间倒序,一眼识别新出现的SUID文件
二、自动初筛:三步判断是否值得深入
对每个SUID文件跑轻量逻辑,避免人工逐个查版本和CVE:
- 属主必须是root才可能提权:
stat -c "%U" "$file",非root直接跳过 - 检查是否来自系统包:
dpkg -S "$file" 2>/dev/null | grep -q "no path found"(Debian/Ubuntu)或rpm -qf "$file" 2>/dev/null(RHEL/CentOS),未归属包的二进制要标记“来源不明” - 快速探活输入面:
strace -e trace=execve,openat -q -o /dev/stdout "$file" --help 2>&1 | head -5——看是否调用外部命令或打开配置文件,有则说明存在参数注入或路径污染风险
三、生成可读报告:字段少但每项都管用
不用复杂模板,CSV格式最易后续处理。每行至少含:
-
路径:绝对路径,如
/usr/local/bin/backup-tool -
属主:属组:如
root:staff,普通用户own的root SUID程序极度危险 -
包来源:输出
dpkg -S或rpm -qf结果,空则填“standalone” - 风险提示:根据上面三步结果自动填“高危(无包+root+调用execve)”、“中危(有包但版本旧)”或“低危(非root或系统默认)”
可用awk拼接:printf "%s|%s|%s|%s\n" "$path" "$owner" "$pkg" "$risk"
四、集成到日常巡检
写成单文件脚本,加入crontab即可:
- 脚本开头加
#!/bin/bash和日志路径定义,每天凌晨运行一次 - 末尾加
diff -u suid_last.log suid_today.log | grep "^+" | grep -v "^+++" >> /var/log/suid-alert.log——只记录新增项,避免重复告警 - 发现高危项时,用
mail -s "NEW SUID ALERT" admin@local 发简短通知
不复杂但容易忽略:真正的风险往往不是sudo或passwd,而是某个运维自己编译、忘删SUID位、又没进包管理器的小工具。










