最直接有效的防护手段是给/tmp挂载点加noexec,nosuid,nodev选项,通过mount -o remount临时验证后写入/etc/fstab永久生效,可拦截直接执行的恶意脚本并报permission denied。

直接给 /tmp 加 noexec 是最轻量、最有效的防护手段——它不删文件、不改权限、不重启服务,只要攻击者试图运行 ./malware.sh 或 ./payload.bin,内核就会拦截并报 Permission denied。
/tmp 为什么必须加 noexec,nosuid,nodev
/tmp 默认对所有用户可写,是恶意脚本上传后直接执行的“黄金落点”。单独加 noexec 不够稳妥,必须三者合用:
-
noexec:阻止任何可执行文件(ELF、shell、Python 脚本等)被直接调用,哪怕
chmod +x也无效 -
nosuid:防止攻击者利用 setuid 程序提权(比如伪造的
/tmp/su) -
nodev:禁止在
/tmp中创建或解析设备文件(如/tmp/evil_device),堵住低层绕过路径
先临时启用,验证再固化
别急着改配置文件。用一条命令快速测试是否兼容当前系统:
- 执行:
sudo mount -o remount,noexec,nosuid,nodev /tmp - 确认生效:
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 - 若失败,可能是
/tmp并非独立挂载点(例如只是根分区下的子目录),可用df -h /tmp查清实际设备,再对对应设备操作
永久生效:写入 /etc/fstab
确认无异常后,固化到启动配置:
- 编辑:
sudo nano /etc/fstab - 找到
/tmp对应行(常见为tmpfs类型或磁盘分区) - 将第 4 列(挂载选项)改为:
defaults,noexec,nosuid,nodev(逗号分隔,无空格) - 示例(tmpfs):
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0 - 保存后运行:
sudo mount -a检查语法;无报错即成功
别忘了配套措施
noexec 拦不住 python /tmp/exploit.py 这类解释器调用,需同步加固:
- 清理已有脚本执行位:
find /tmp -type f \( -name "*.sh" -o -name "*.py" \) -exec chmod a-x {} \; - 限制新文件默认权限:设
umask 022,或对目录设默认 ACL:setfacl -d -m u::rw-,g::r--,o::r-- /tmp - 确保 sticky bit 已启用:
chmod 1777 /tmp,防止用户删除他人文件











