直接用noexec挂载可拦截执行调用,适合/tmp、/var/tmp、Web上传目录、外部设备挂载点及纯存储数据盘;需配合nosuid和nodev组合使用,通过mount -o remount临时启用或修改/etc/fstab永久生效,严禁用于/、/usr等系统关键路径。

直接用 noexec 挂载选项就能禁止该分区上所有二进制程序和脚本的直接执行——它不删文件、不改权限,只在内核调用 execve() 时拦截,是最轻量也最有效的防护手段。
哪些目录适合加 noexec
重点防护“用户能写、程序能读、但不该跑代码”的位置:
- /tmp 和 /var/tmp:临时文件高频写入区,攻击者常在此丢 shell 脚本或编译后门
- Web 上传目录(如 /var/www/uploads):用户上传的 zip、图片可能被伪装成可执行文件
- 外部设备挂载点(如 /mnt/usb):U 盘插入后自动执行风险高
- 数据盘或备份盘(如 /mnt/data):纯存储用途,无需执行能力
临时启用 noexec(立即生效,重启失效)
不用改配置、不重启,一条命令验证效果:
- 给
/tmp加禁止执行:sudo mount -o remount,noexec,nosuid,nodev /tmp - 给上传目录加更严限制:sudo mount -o remount,ro,noexec,nosuid,nodev /var/www/uploads
- 验证是否生效:findmnt -o TARGET,OPTIONS /tmp,输出中应含
noexec
注意:如果报错 “not mounted” 或 “special device not found”,说明该路径不是独立挂载点(比如只是根分区下的子目录),需先查真实设备:df -h /tmp。
永久生效(写入 /etc/fstab)
编辑 /etc/fstab,找到对应分区那一行,在第 4 字段(options)里加入 noexec,nosuid,nodev:
- 原内容:UUID=1234abcd /tmp ext4 defaults 0 2
- 修改后:UUID=1234abcd /tmp ext4 defaults,noexec,nosuid,nodev 0 2
保存后执行 sudo mount -a 重载配置,立即生效,无需重启。
配套加固建议
noexec 单独使用虽能拦 ./script.sh,但无法阻止 python3 script.py 这类解释器调用。为防绕过,建议组合操作:
- 批量清除已有脚本的执行位:find /var/www/uploads -type f \( -name "*.sh" -o -name "*.py" \) -exec chmod a-x {} \;
- 设置默认 umask(如
umask 022),让新创建文件默认无 x 权限 - 对目录设默认 ACL:setfacl -d -m u::rw-,g::r--,o::r-- /var/www/uploads
严禁对 /、/usr、/bin 等系统关键路径加这些选项,否则系统命令会失效。


















