find / -xdev -perm -2000 -type f 2>/dev/null可准确列出所有sgid可执行文件,需结合路径、属主、时间、大小、调用逻辑及cve验证其提权风险,并通过chmod g-s清除非必要sgid位。

直接用 find / -perm -2000 -type f 2>/dev/null 就能列出所有带 SGID 权限的可执行文件,但光找出来远远不够——关键是要判断哪些可能被用于本地提权,尤其是结合缓冲区溢出等漏洞场景。
准确识别SGID文件的命令与过滤技巧
SGID 对应的权限数值是 2000(八进制),-perm -2000 表示“包含 SGID 位”,这是最稳妥的匹配方式:
-
find / -xdev -perm -2000 -type f 2>/dev/null:加-xdev避免跨挂载点(如 /proc、/sys、NFS),减少误报和卡顿 - 若只想看系统关键路径下的结果,可追加
| grep -E '^/(usr/|bin/|sbin/|opt/|home/)',重点盯住用户可控目录(如 /home/*/bin、/opt/app/bin) - 避免用
-perm /2000,它会匹配任意含 SGID 位的权限组合(比如 2755、2711、2044),但实际 SGID 程序必须可执行(即至少有 x 位),-perm -2000已隐含该条件
哪些SGID文件更可能成为溢出利用入口
不是所有 SGID 文件都危险,但以下几类需立即人工核查:
- 属主为 root 但路径在非标准位置(如 /tmp/mytool、/home/attacker/suid-bin)——极可能是植入后门
- 修改时间异常新(
stat -c '%y %n' 文件名查看),尤其在最近 7 天内创建或写入过 - 文件大小异常小(10MB),且无包管理器归属(
dpkg -S 文件名或rpm -qf 文件名返回空) - 用
file检查类型,若显示 “ELF … not stripped” 或 “data”,再用strings 文件名 | grep -i 'sh\|exec\|system\|/bin/'扫描可疑调用逻辑
验证是否可被缓冲区溢出利用的关键动作
发现可疑 SGID 二进制后,不能只看权限,要快速验证其运行时行为是否易受控:
- 用
strace -e trace=execve,openat ./binary AAAA…(输入超长字符串)观察是否触发 exec 调用外部命令——若调用路径拼接了用户输入,就存在命令注入风险 - 测试是否对输入长度不设防:
python3 -c "print('A' * 500)" | timeout 2 ./binary 2>/dev/null || echo "crashed"。段错误不等于安全,而是说明内存边界未校验 - 查 CVE:
searchsploit $(basename binary)或访问 cvedetails.com 输入程序名+版本,重点关注 “Local Privilege Escalation” 类型 - 特别注意 SGID + setgid(getegid()) 未重置的组合——这类程序常保留组权限后继续解析用户数据,是溢出后稳定提权的温床
日常加固建议
生产环境应主动收缩 SGID 面:
- 禁用非必要 SGID:如
/usr/bin/write、/usr/bin/locate、/usr/bin/mail,用chmod g-s清除 - 禁止在 /tmp、/dev/shm、用户家目录下部署任何 SGID 程序——这些位置可被普通用户写入,极易被替换或劫持
- 启用内核保护:确认
kernel.randomize_va_space = 2(ASLR 开启)和vm.mmap_min_addr = 65536(防止低地址映射) - 将 SGID 扫描集成进定时任务,配合哈希比对(
sha256sum 文件名 >> /etc/.sgid-whitelist),自动告警变更项











