真正可行的防护逻辑是让suid位无效或阻止带suid文件执行:对/tmp、/var/tmp、/home等挂载点启用nosuid;收紧/usr/bin等关键目录权限为755且仅root可写;定期扫描清理非必要suid文件;用capabilities替代传统suid。

不能靠“禁止创建”来阻止恶意用户设SUID——Linux内核不提供限制普通用户设置SUID位的开关,chmod +s 对拥有文件写权限的用户始终有效。真正可行的防护逻辑是:**让SUID位即使被设置了也无效,或让带SUID的文件根本无法执行**。
对可写挂载点启用 nosuid
这是最直接、最广泛适用的拦截手段。只要分区以 nosuid 选项挂载,该分区上所有SUID文件(无论谁设置、何时设置)在执行时都会被内核忽略SUID位,euid保持为运行者ID。
- 重点加固位置:
/tmp、/var/tmp、/home(若用户主目录独立挂载) - 操作方式:编辑
/etc/fstab,在对应行的挂载参数中加入nosuid(可同时加noexec进一步限制)
例如:/dev/sdb1 /tmp ext4 defaults,nosuid,noexec 0 2 - 生效:保存后执行
sudo mount -o remount /tmp,无需重启
确保只有root能修改关键目录权限
普通用户若能 chown 或 chmod 系统目录(如 /usr/bin),就可能植入恶意SUID程序。必须收紧这些路径的写权限:
- 检查
/usr/bin、/bin、/sbin所属用户和组是否为root:root,权限应为drwxr-xr-x(即755) - 禁用非root用户对这些目录的写入:
sudo chmod 755 /usr/bin(若已被改,需修复) - 避免将用户主目录或上传目录挂载到系统二进制路径下
定期扫描并清理非必要SUID文件
主动发现比被动防御更可靠。SUID不是越多越好,而是越少越安全:
- 扫描命令:
find / -xdev -type f -perm -4000 -ls 2>/dev/null(-xdev避免跨挂载点误扫) - 白名单原则:只保留
/usr/bin/passwd、/usr/bin/sudo、/bin/ping等明确必需项 - 高危项果断清除:
/usr/bin/find、/usr/bin/vim、/usr/bin/nmap等工具若非运维刚需,一律chmod u-s
用Capabilities替代传统SUID
让程序只拿它真正需要的权限,而不是整个root身份,从根本上降低SUID滥用风险:
- 先移除SUID:
sudo chmod u-s /bin/ping - 赋予最小能力:
sudo setcap cap_net_raw+ep /bin/ping - 验证:
getcap /bin/ping应返回/bin/ping = cap_net_raw+ep - 注意:并非所有程序都支持Capabilities,但主流工具(ping、tcpdump、curl等)均已适配











