非法s位文件排查核心是“先找全、再过滤、后验证”:用find / -xdev -type f ( -perm -4000 -o -perm -2000 ) 2>/dev/null扫描,排除标准路径但警惕/usr/local/bin,重点核查/tmp、/home/*/bin等用户可写目录下root属主的s位文件;通过rpm -qf或dpkg -s确认是否系统原生,结合ls -l、file、strings、sha256sum及strace验证来源、完整性与提权风险,并自动化日志留存和7日内变更监控。

排查非法 S 位(Setuid/Setgid)非系统原生二进制文件,核心是“先找全、再过滤、后验证”——重点不是看它有没有 S 位,而是它“为什么有、谁放的、能不能用”。
快速定位所有 S 位文件并排除可信路径
执行基础扫描,但不盲目信任常见路径名:
- 运行 find / -xdev -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null,加
-xdev避免跨挂载点(如 /proc、/sys、NFS),减少误报和卡顿 - 用
grep -vE '^/(bin|sbin|usr/bin|usr/sbin|usr/libexec)/'初筛,但注意:/usr/local/bin 下的程序也可能是管理员手动编译安装的,不能直接划入“可信” - 真正要盯紧的是:/tmp、/dev/shm、/home/*/{.local/bin,bin}、/opt/*/{bin,sbin}、/var/www/* 等用户可写目录下的 S 位文件——这些位置出现 root 权限执行的二进制,99% 是异常
判断是否为系统原生文件
不能只看路径,得查来源和状态:
- 对每个可疑文件,运行 rpm -qf
(RHEL/CentOS)或 dpkg -S (Debian/Ubuntu)——返回包名才是原生;若报“no package owns”,即非包管理器安装 - 检查 ls -l
:属主是 root 但属组是普通用户、修改时间在最近 7 天内、大小明显偏离同类命令(如一个“ping”有 8MB),都需标记 - 用 file
看类型:若显示 “ELF … not stripped” 或 “data” 而非 “executable”,可能被混淆或加壳;strings | grep -i '/bin/\|sh\|exec\|getpw\|system(' 可暴露可疑行为痕迹
验证完整性与运行风险
确认它没被篡改,并测试是否可被利用:
- 已知包管理器安装的,用 rpm -V
或 dpkg --verify 校验;若校验失败且非预期更新,说明文件被改写 - 无包来源的,比对可信哈希:sha256sum
并与原始发布页、构建日志或备份中的值对照;不一致即为非法替换 - 小范围测试其行为:用 strace -e trace=execve,setuid,setgid ./
id 2>&1 | grep -E '(exec|set)' 观察是否提权调用;再尝试传参如 ./';id' ,看是否执行了拼接命令
自动化留痕与持续监控
人工一次扫描容易漏,应固化为周期任务:
- 将扫描结果按日期存档,例如写入 /var/log/suid-scan-$(date +\%F).log,并用 diff 对比前后两天输出,快速发现新增项
- 加入定时任务(如 cron 每日 3 点执行),自动过滤出 mtime 在 7 天内 的 S 位文件:
find … -mtime -7 - 对确认非法的文件,记录路径、哈希、进程树(ps auxf | grep
)、网络连接(lsof -p $(pgrep -f ) 2>/dev/null ),作为溯源依据










