必须启用 nosuid+noexec+nodev 组合的挂载点包括:/tmp、/var/tmp、独立挂载的 /home、web 上传目录(如 /var/www/uploads)、容器 bind 挂载的目标路径(如 /host/logs);三者缺一不可,且仅对“用户可写 + 无合法执行需求”场景启用。

用 mount -o nosuid,noexec 加固外部挂载点,核心不是堆参数,而是精准识别风险场景、匹配最小权限原则,并配合其他关键选项形成闭环。单独加这两个选项效果有限,必须组合使用、分类施策。
哪些挂载点必须启用 nosuid + noexec
只对“用户可写 + 无合法执行需求”的路径启用,否则会直接破坏业务。重点包括:
-
/tmp 和 /var/tmp:攻击者最常上传并直接执行恶意二进制或 shell 脚本的位置,必须加
noexec,nosuid,nodev - 独立挂载的 /home:普通用户主目录极少需要运行本地编译程序;启用后可阻断提权类 payload,但需确认开发/运维流程不依赖其中执行临时工具
- Web 上传目录(如 /var/www/uploads 或独立挂载的 /web/uploads):文件由 PHP/Python 解释执行,不应允许 chmod +x 后 ./xxx 运行
-
容器 bind 挂载的目标路径(如 /host/logs、/host/config):宿主机向容器暴露的只读配置或日志目录,应加
ro,nosuid,noexec,nodev
必须搭配的第三项:nodev 是硬性要求
nosuid 和 noexec 单独存在时仍有缺口:nodev 能阻止挂载点内创建或访问设备节点(如 /dev/sda、/dev/zero),避免攻击者通过设备文件绕过限制或触发内核漏洞。三者缺一不可:
- 没
nodev:用户可在 /tmp 下 mknod 创建设备节点,再用 dd 或 raw I/O 绕过文件系统层限制 - 没
nosuid:即使不能执行,仍可通过 setuid 程序(如已存在的 suid bash)提权 - 没
noexec:脚本或二进制上传后仍可直接运行
标准组合永远是:noexec,nosuid,nodev(顺序无关)。
临时验证与永久生效操作要点
不要直接改 fstab 上线,先用 remount 快速验证兼容性:
- 测试命令:
sudo mount -o remount,noexec,nosuid,nodev /tmp - 验证方法:在 /tmp 下新建脚本
echo '#!/bin/sh; echo ok' > test.sh && chmod +x test.sh,再执行./test.sh—— 应报Permission denied - 若业务异常(如某 Java 工具强制在 /tmp 解压并运行 native lib),立即回退:
sudo mount -o remount,exec,suid,dev /tmp - 确认无误后,编辑
/etc/fstab,在对应行第4列追加逗号分隔的选项,例如:
UUID=abcd1234 /tmp tmpfs defaults,nosuid,nodev,noexec 0 0 - 保存前务必执行
sudo mount -a检查语法,避免重启失败
注意解释器执行不受影响,这不是漏洞
noexec 仅禁止直接执行(./script 或 execve() 系统调用),不影响解释器加载运行(python script.py、perl script.pl、php index.php)。这是设计行为,不是绕过。Web 服务、脚本自动化等正常逻辑完全不受影响。真正被拦住的是攻击者上传的 ELF 二进制、恶意 shell、编译后的后门程序等。











