nosuid 使挂载点上所有 setuid 位(如 4755)彻底失效,执行时不会提权;真正安全需 noexec,nosuid,nodev 三者组合,适用于 /tmp 等用户可写非系统路径,禁用于 /、/bin 等系统目录。

不能靠 chmod 4755 给挂载盘里的程序“加特权”,再用 mount -o nosuid 去“解毒”——这不是去毒,是白忙活。因为 nosuid 的作用机制,就是让所有 setuid 位(包括 4755 中那个“4”)在挂载点上彻底失效。它不看文件有没有被设成 4755,只看自己是否启用;一旦启用,所有 SUID/SGID 位都当没写过。
4755 在 nosuid 挂载点上根本不起作用
一个权限为 -rwsr-xr-x(即 4755)的二进制,放在 /tmp 下,而 /tmp 是以 nosuid 挂载的:
- 普通用户执行它时,不会切换到 root 身份,哪怕它属主是 root
- 进程实际有效 UID 就是当前用户的 UID,不是文件所有者的 UID
- 系统在 execve() 阶段就忽略 setuid 位,不触发提权逻辑
真正要防的是“挂载点本身被滥用”
攻击者不会等你先 chmod 4755 再去利用——他们更可能:
- 上传一个自己编译的 setuid 程序(比如伪装成
ls的恶意二进制),直接 chmod 4755 后运行 - 利用已存在的合法 suid 程序(如旧版
bash或cp)做提权跳板 - 配合
noexec缺失时,直接执行脚本或 ELF 文件绕过限制
所以重点不是“给谁加 4755”,而是让整个挂载点对 setuid 行为免疫。
安全加固必须组合生效
单靠 nosuid 不够,必须配齐三要素:
- noexec:禁止任何可执行文件运行(包括 shell 脚本、ELF、Python 字节码)
- nosuid:让所有 setuid/setgid 位失效,阻断身份切换路径
-
nodev:防止在挂载点内创建设备节点(如
/tmp/mknod sda b 8 0),避免绕过文件系统层访问硬件
标准写法:mount -o noexec,nosuid,nodev /dev/sdb1 /mnt/data 或写入 /etc/fstab 对应行的 options 字段。
哪些地方绝对不能加这些选项
这些限制只适用于非系统路径、用户可写、无合法执行需求的位置:
- ✅ 必须加:
/tmp、/var/tmp、Web 上传目录(/var/www/uploads)、容器 bind 挂载目标(/host/logs) - ❌ 绝对不能加:
/、/usr、/bin、/sbin、/lib等系统根路径——否则sudo、passwd、ping全部瘫痪 - ⚠️ 谨慎评估:
/home若独立挂载,可加,但需确认开发人员不依赖本地编译调试











