必须对独立挂载、用户可写且无本地执行需求的路径(如/tmp、/var/tmp、独立挂载的/home、Web上传目录、容器bind挂载目标)强制启用noexec,nosuid,nodev三者组合,缺一不可;单独启用任一选项均存在明确绕过路径。

要对对外开放的公共挂载点做最高等级安全防御,核心不是堆砌参数,而是精准识别风险路径、严格匹配“用户可写 + 无合法执行需求”这一前提,并强制组合启用 noexec,nosuid,nodev 三项选项——缺一不可。
哪些挂载点必须启用这组组合
只对以下独立挂载、用户可控写入、且业务本身不依赖本地执行的路径启用:
- /tmp 和 /var/tmp:攻击者上传 shell 脚本或二进制后常直接 ./xxx 执行,是提权第一入口
- 独立挂载的 /home:普通用户主目录极少需要运行编译程序;启用后可阻断恶意 suid 工具或临时 payload
- Web 上传目录(如 /var/www/uploads):PHP/Python 由解释器处理,不应允许 chmod +x 后直接执行
- 容器 bind 挂载目标(如 /host/logs、/host/config):宿主机暴露给容器的路径,应设为只读并加三件套
为什么必须三者同时存在
单独启用任一选项都存在明确绕过路径:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 没 nodev:用户可在 /tmp 下用 mknod 创建 /dev/zero 或 /dev/sda,再通过 dd 或 raw I/O 绕过文件系统层限制
- 没 nosuid:即使不能执行,仍可能利用已存在的 setuid 程序(如 suid bash)完成提权
- 没 noexec:上传的恶意二进制或 shell 脚本仍可直接运行,完全失去执行拦截能力
操作要点:先验证,再固化
切勿直接改 fstab 上线,务必分步验证兼容性:
- 临时启用测试: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 不影响解释器调用:python script.py 或 php shell.php 仍可运行,它只禁止 ./script.py 这类直接 execve 调用
- 仅对独立挂载点生效:若 /home 是根分区子目录(非独立分区),nodev 和 nosuid 都不会起作用,可用 findmnt /home 确认
- 别误伤系统关键路径:/、/usr、/bin、/lib 等绝对不可加 noexec/nosuid,否则 sudo、passwd 等命令会失效
- 某些旧工具依赖 suid 行为:如特定备份软件或容器运行时,上线前必须在测试环境走通完整流程

















