核心是给用户可写但不该执行代码的目录加noexec,nosuid,nodev,从内核层拦截./malware.sh等直接执行,不影响python script.py调用;必须加固的目录包括/tmp、/var/tmp、/dev/shm、/var/www/uploads、/mnt/usb及独立挂载的/home,需先用mount -o remount临时验证,再修改/etc/fstab永久生效,并辅以chmod、umask或acl控制新文件权限。

核心是给用户可写、但不该执行代码的目录加 noexec,nosuid,nodev,不改程序、不装新工具,从内核层拦住直接执行——比如 ./malware.sh 或编译好的二进制,但不影响 python script.py 这类解释器调用。
哪些目录必须加 noexec
重点不是分区类型,而是用途:谁可写 + 是否真需要执行。以下路径一旦独立挂载,就该立即加固:
- /tmp 和 /var/tmp:所有服务和用户默认可写,攻击者最爱在这里放提权 payload 并直接运行
- /dev/shm:内存型 tmpfs,无文件攻击(如 memfd_create)常落在这儿
-
Web 上传目录(如
/var/www/uploads):用户上传的 ZIP、图片可能藏脚本,LFI 或解析错误易触发执行 -
可移动设备挂载点(如
/mnt/usb):U 盘插入后自动挂载,.desktop或 autorun 类载荷直击桌面会话 - 独立挂载的 /home:普通用户主目录极少需直接运行二进制,启用后可阻断横向移动
临时验证:一条命令快速测试
别急着改配置文件,先用 mount -o remount 看是否兼容、业务是否受影响:
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
- 给
/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
永久生效:正确修改 /etc/fstab
临时设置重启就消失,永久防护得写进 /etc/fstab。新手注意三点:
- 找到对应行(例如
tmpfs /tmp tmpfs defaults 0 0),把第 4 列的defaults换成defaults,noexec,nosuid,nodev -
defaults默认含exec和suid,必须显式加noexec,nosuid才能覆盖 - 改完别直接重启,先测试:
sudo mount -a(无报错即语法通过),再用findmnt和脚本测试确认真实生效
补充控制:noexec 不是全部
noexec 拦得住 ./script.sh,但拦不住 python script.py——这时候得同步做权限收束:
- 批量清理已有脚本的执行位:
find /var/www/uploads -type f \( -name "*.sh" -name "*.py" \) -exec chmod a-x {} \; - 让新文件默认没执行权:在 Web 服务启动脚本里加
umask 022(新建文件权限为 644) - 更稳妥做法:对目录设默认 ACL,确保子文件一创建就是
-rw-r--r--:setfacl -d -m u::rw-,g::r--,o::r-- /var/www/uploads










