必须对用户可写且无本地执行需求的web上传目录(如/var/www/uploads)强制启用noexec,nosuid,nodev组合,缺一不可;单独启用nodev或nosuid存在明确绕过路径,三者协同才能从内核层阻断设备滥用、suid提权和直接执行。

直接在挂载参数中启用 nodev 和 nosuid,能从内核层阻断两类关键攻击路径:设备节点滥用和 SUID 提权。但必须注意——这两个参数不能单独使用,必须与 noexec 组合,并且只适用于“用户可写、但业务本身不依赖本地执行”的目录,比如 Web 上传目录(如 /var/www/uploads)。
哪些上传目录必须加 nodev,nosuid
不是所有目录都适用,重点锁定以下场景:
- /var/www/uploads 或独立挂载的 /web/uploads:用户上传内容不可信,可能含伪装脚本、恶意二进制或带 SUID 位的 payload
- 容器 bind 挂载的目标路径(如 /host/uploads):宿主机暴露给容器的写入点,需严控特权行为
- 独立挂载的静态资源卷(如 /mnt/static),若允许用户上传且无编译/执行需求
- 外部设备自动挂载点(如 /media/usb),防止 U 盘载荷触发桌面级提权
为什么必须搭配 noexec 才算真正有效
单独启用 nodev 或 nosuid 存在明确绕过方式:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 没 noexec:攻击者上传
exploit.bin后仍可直接运行./exploit.bin,完全绕过防护 - 没 nosuid:即使不能执行新文件,仍可能利用目录中已存在的 setuid 程序(如被植入的 suid bash)提权
- 没 nodev:用户可在该目录下用
mknod创建/dev/zero或/dev/sda,再通过dd或 raw I/O 绕过文件系统限制
三者缺一不可,标准组合始终是:noexec,nosuid,nodev(顺序无关)。
操作步骤:先验证,再固化
切勿直接改配置上线,分步验证兼容性:
-
临时启用测试:
sudo mount -o remount,noexec,nosuid,nodev /var/www/uploads -
验证是否生效:
findmnt -o TARGET,OPTIONS /var/www/uploads,输出应包含三项参数 -
手动验证拦截效果:
- 创建测试脚本:
echo '#!/bin/sh; id' > /var/www/uploads/test.sh && chmod +x /var/www/uploads/test.sh - 尝试执行:
/var/www/uploads/test.sh→ 应返回Permission denied - 复制带 SUID 的程序:
cp /bin/bash /var/www/uploads/mysh && chmod u+s /var/www/uploads/mysh→ 运行后提示符仍是$而非#
- 创建测试脚本:
-
永久生效:编辑
/etc/fstab,将对应挂载行第 4 列(options 字段)改为defaults,noexec,nosuid,nodev,例如:
UUID=abc123 /var/www/uploads ext4 defaults,noexec,nosuid,nodev 0 2 -
测试配置语法:
sudo mount -a,无报错即表示合法;之后可重启或重新挂载
额外建议:配合权限与访问控制
挂载参数是底层防线,还需叠加基础管控:
- 上传目录属主设为专用服务用户(如
www-data),权限建议750(目录)和640(文件) - 禁止其他用户遍历父目录,确保
/var/www及其上级(如/var)不开放宽泛权限 - 若业务允许,可进一步加
ro(只读)选项,或对日志类子目录单独挂载并设noatime










