新手配置noexec防提权,核心是精准限制/tmp、/var/tmp、/dev/shm、Web上传目录等“用户能写但不该执行代码”的路径,配合nosuid和nodev形成基础隔离层,可拦./malware.sh但不防python script.py,需同步清理x位并设umask或默认ACL。

新手配置 Linux 的 noexec 挂载选项防提权,核心不是“堵住所有执行”,而是精准限制那些“用户能写、程序能读、但不该跑代码”的路径,配合 nosuid 和 nodev 形成基础隔离层——它不防解释器调用(如 python script.py),但能拦住 ./malware.sh 或恶意二进制落地后直接执行,从而切断常见提权链的最后一步。
哪些目录必须加 noexec + nosuid + nodev?
重点不是分区类型,而是用途。以下挂载点一旦被攻击者写入内容,就极可能成为提权跳板:
- /tmp 和 /var/tmp:几乎所有服务和用户都会往这里写临时文件,攻击者常上传编译好的提权工具(如脏牛补丁、SUID shell)并直接运行
- /dev/shm:基于内存的 tmpfs,常被用于进程间通信,但也是无文件落地攻击(fileless exploit)的温床
- Web 上传目录(如 /var/www/uploads):用户上传的 ZIP、图片可能藏有 .sh/.py 脚本,若 Web 服务配置不当或存在 LFI,极易触发执行
- 可移动设备挂载点(如 /mnt/usb):U 盘插入后自动挂载,若未限制,可能触发 .desktop 或 autorun 类恶意载荷
- 独立挂载的 /home(非根分区):普通用户主目录里存大量脚本、开发环境,启用后可阻止非授权编译/执行,降低横向移动风险
临时验证:一条命令快速测试效果
别急着改配置文件,先用 mount -o remount 看是否兼容:
- 给
/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,nosuid,nodev - 手动测试:
echo '#!/bin/sh; id' > /tmp/test.sh && chmod +x /tmp/test.sh && /tmp/test.sh→ 应报Permission denied
如果执行失败,大概率是该路径并非独立挂载点(比如只是 / 下的子目录),可用 df -h /tmp 查真实设备,再对对应设备操作。
永久生效:安全修改 /etc/fstab
临时设置重启即丢,生产环境必须落盘。新手注意三个关键细节:
- 找到对应行(例如
UUID=xxx /tmp ext4 defaults 0 2),把第 4 列的defaults替换为defaults,noexec,nosuid,nodev;defaults默认含exec和suid,不显式覆盖就无效 - 如果是 tmpfs(如
tmpfs /dev/shm tmpfs defaults 0 0),同样要改成defaults,noexec,nosuid,nodev - 改完别重启!先运行
sudo mount -a测试语法;若报错,说明 fstab 写错,及时修正;无报错再sudo mount -o remount /tmp等逐个重挂
noexec 不是万能的,必须补上权限控制
noexec 拦不住 python script.py,所以得从文件权限和新建机制入手:
- 批量清理已有脚本的执行位:
find /var/www/uploads -type f \( -name "*.sh" -o -name "*.py" -o -name "*.pl" \) -exec chmod a-x {} \; - 让新文件默认无执行权:在 Web 服务启动脚本(如 nginx 的 systemd service 文件)里加
UMask=022,或对目录设默认 ACL:setfacl -d -m u::rw-,g::r--,o::r-- /var/www/uploads - 检查关键服务是否依赖
/tmp执行:某些 Java 应用、Docker 构建过程会临时生成并运行二进制,上线前务必在测试环境走一遍完整流程


















