排查 Linux 系统中的 SUID/SGID 文件时,很多人会直接使用 find / -type f -perm -4000 或 -perm -2000 进行搜索;这里加上 -type f,主要是为了排除目录和符号链接,避免结果中混入无关项目。再结合 -xdev 跳过其他挂载点,使用 2>/dev/null 屏蔽权限不足产生的报错,最后再通过 file 命令确认目标是否确实为可执行的 ELF 文件,这样筛选出的结果通常更准确、也更适合后续安全审计。

怎么用 find -perm 查 SUID/SGID 文件
在 Linux 权限排查中,最常见也最稳妥的做法,就是直接搜索 -perm -4000 或 -perm -2000。不过有一个细节非常关键:一定要配合 -type f 使用,把目录和符号链接排除在外,否则搜索结果里很容易混进大量无效项,影响后续分析和判断。
-perm -4000表示“权限中包含 SUID 位”,并不是“权限必须恰好等于 4000”——例如4755、4111这类权限同样会被匹配到-perm -2000同样用于匹配 SGID 文件,但要注意:SGID 放在普通文件上的实际利用价值通常有限,真正需要重点关注的是属组为root或wheel且具备可写权限的文件- 务必加上
2>/dev/null,否则在遍历/proc、/sys等目录时,大量 “Permission denied” 报错会淹没真正有价值的结果 - 建议同时添加
-xdev来跳过其他挂载点(例如/mnt、/media),既能避免误扫外部设备,也能减少扫描卡顿
为什么只看权限不够?必须用 file 确认是否真能执行
仅凭权限位判断一个文件是否危险并不充分。很多带 SUID 的文件可能只是 shell 脚本、空文件,甚至根本无法执行;同时,攻击者也可能伪造 ELF 头来绕过简单排查。因此,不能只看 find 输出的文件路径,还必须进一步确认文件类型。
- 使用
file /path/to/file查看输出中是否包含ELF.*executable,借此排除脚本、文本文件以及损坏文件 - 更稳妥的一行命令示例:
find / -type f -perm -4000 -exec sh -c 'file "$1" | grep -q "ELF.*executable" && echo "$1"' _ {} ; 2>/dev/null - 尤其要警惕
bash、python、vim、find这类工具带有 SUID 权限——它们大多都能直接 spawn shell,存在明显提权风险
哪些路径和属主组合基本等于“可疑”
正常情况下,系统自带的 SUID 文件通常集中在 /usr/bin、/bin 等标准路径下,并且属主一般都是 root。一旦发现文件路径或属主明显偏离这一规律,就应当立即进行人工复核。
- 高风险路径:
/tmp、/var/tmp、/dev/shm—— 正常 Linux 系统几乎不会在这些临时目录中放置 SUID 二进制文件 - 非标准路径:
/usr/local/bin、/opt、/home/*/bin、/home/*/local/bin—— 这类位置多为第三方程序或用户自建目录,出现 SUID 通常缺乏合理性 - 异常属主:
! -user root是非常实用的硬性过滤条件;如果属组是staff、users、www-data或普通用户名,往往比单纯看属主更值得怀疑 - 不要忽略修改时间:
find / -type f -mmin -10 -perm /4000 2>/dev/null可以帮助快速发现刚刚被植入的 SUID 文件
顺手排查其他权限异常类型
SUID/SGID 是 Linux 提权场景中的重点对象,但全局可写文件、关键配置权限异常、近期权限被修改的文件,同样可能暴露出明显的安全风险。
- 全局可写文件:
find / -type f -perm -o+w 2>/dev/null,重点检查/etc/cron.*、/var/spool/cron下那些属主不是root的文件 - 关键配置文件权限过宽:
find /etc -type f -uid 0 ! -perm 644 -ls 2>/dev/null,例如由root拥有的/etc/shadow显然不应该是666这样的权限 - 组合条件更适合实战:
find /usr -type f -perm -4000 ! -user root -exec ls -l {} ; 2>/dev/null,可以一步展示权限、属主和路径信息,省去再次执行ls -l的操作
find 的输出只能算是初步线索,每一个结果都应再结合 ls -l 和 file 逐项确认——真正危险的不是权限位本身,而是它出现在不该出现的位置、属于不该拥有它的用户,或文件内容与表面描述明显不一致。