linux中查找suid文件应使用find -perm -4000,配合-type f筛选普通文件、-ls详细输出及2>/dev/null屏蔽错误;需重点检查/tmp等可疑路径,排除非root所有或包管理器未记录的异常suid二进制。

使用 find -perm 精确匹配 SUID 位
推荐使用八进制模式 `-perm -4000`(带减号表示“包含该权限”,即文件必须有 SUID 位,其他位不限),这是最常用且可靠的写法:
find / -type f -perm -4000 -ls 2>/dev/null
说明:
- `-type f`:只查普通文件,排除目录、设备、符号链接等干扰项
- `-perm -4000`:匹配所有设置了 SUID 位的文件(`4000` 是 SUID 的八进制值;减号 `-` 表示“至少具备这些权限”)
- `-ls`:以详细格式输出(含权限、所有者、大小、路径),便于人工判断
- `2>/dev/null`:屏蔽 “Permission denied” 报错,避免结果刷屏
排除常见可信路径,聚焦可疑区域
系统默认 SUID 文件集中在 `/usr/bin/`、`/bin/`、`/usr/sbin/` 等目录,但攻击者常将恶意 SUID 二进制藏在 `/tmp`、`/dev/shm`、`/var/tmp` 或隐藏目录中。可针对性排查:
find /tmp /var/tmp /dev/shm /home -type f -perm -4000 -ls 2>/dev/null
注意:不要忽略 `/home` 下用户目录——尤其当存在共享服务器或弱口令账户时,攻击者可能上传自编译的 SUID shell。
区分真实 SUID 与误报(如 capabilites 或非可执行文件)
仅靠 `-perm -4000` 可能返回非二进制文件(如 SUID 脚本,实际不生效)或被 capabilities 替代的程序(如新版 `ping` 使用 `cap_net_raw` 而非 SUID)。建议加过滤:
- 确认是否为可执行文件:`-executable`(部分 find 支持)或用 `-name "*"` + 后续 `file` 检查
- 快速验证是否为 ELF 二进制:`find / -type f -perm -4000 -exec file {} \; 2>/dev/null | grep "ELF.*executable"`
- 检查是否被主流发行版认可:对比输出与 `/usr/share/doc/suid-list`(Debian/Ubuntu)或 `rpm -qf [path]`(RHEL/CentOS)
自动化筛查 + 高危特征标记(进阶建议)
对运维或安全响应场景,可编写简短脚本辅助判断异常:
find / -type f -perm -4000 2>/dev/null | while read f; do
owner=$(stat -c "%U" "$f" 2>/dev/null)
if [[ "$owner" != "root" ]]; then
echo "[!] Non-root SUID: $f (owned by $owner)"
elif ! rpm -qf "$f" >/dev/null 2>&1 && ! dpkg -S "$f" >/dev/null 2>&1; then
echo "[?] Unknown SUID binary: $f"
fi
done
该逻辑重点标记两类风险:
- 非 root 拥有的 SUID 文件(极大概率异常)
- 未被包管理器记录的 SUID 文件(可能是后门)











