最有效方式是为/tmp、/var/tmp等临时目录挂载noexec,nosuid,nodev选项,配合sticky bit权限与auditd监控,可拦截直接执行并限制恶意脚本落地。

临时目录(如 /tmp、/var/tmp)是恶意脚本最常利用的“落脚点”——攻击者上传、解压、执行恶意载荷,依赖其可写+可执行权限完成持久化。单纯删文件或清 crontab 无法根治,必须从挂载策略、权限控制、运行时拦截三方面同步收紧。
一、强制 noexec 挂载临时目录
这是最基础也最有效的防线:让脚本即使被写入也无法直接执行。
- 检查当前挂载选项:
mount | grep -E "(tmp|var.tmp)",确认是否含noexec - 若未启用,临时生效:
sudo mount -o remount,noexec,nosuid /tmp - 永久生效:编辑
/etc/fstab,为对应行添加noexec,nosuid(例如:tmpfs /tmp tmpfs defaults,noexec,nosuid,size=2G 0 0) - 同样处理
/var/tmp(它常被忽略,但默认可能独立挂载且未限制)
二、收紧目录写入与继承权限
noexec 只防执行,不防写入和提权。需配合严格权限控制:
- 设置 sticky bit + 严格属主:
sudo chmod 1777 /tmp /var/tmp(确保只有文件创建者能删改自己文件) - 禁用 world-writable 子目录:
find /tmp -type d -perm -002 -ls 2>/dev/null,对非必要目录chmod o-w - 限制用户在
/tmp下创建新目录的默认权限:在/etc/profile或/etc/bash.bashrc中设umask 0077(仅属主读写)
三、监控异常脚本落地与执行尝试
noexec 不等于零风险——攻击者可能通过 bash script.sh 或 python payload.py 绕过(因解释器本身可执行)。需行为级防护:
- 启用 auditd 监控关键调用:
sudo auditctl -a always,exit -F path=/tmp -F perm=wa -k tmp_write;-F perm=x捕获执行尝试 - 用
inotifywait实时告警(轻量级补充):inotifywait -m -e create,attrib /tmp --format '%w%f %e' | while read file event; do [[ "$event" =~ (CREATE|ATTRIB) ]] && echo "$(date): suspicious file in /tmp: $file" | logger; done - 定期扫描可疑脚本:
find /tmp /var/tmp -type f \( -name "*.sh" -o -name "*.py" -o -name "*.pl" \) -size -5M -mtime -7 -ls 2>/dev/null
四、阻断常见持久化路径联动
临时目录常不是终点,而是跳板。需同步清理其关联的持久化入口:
- 查定时任务是否引用临时路径:
crontab -l | grep -E "/tmp|/var/tmp"; sudo grep -r "/tmp" /etc/cron* /var/spool/cron/ 2>/dev/null - 检查环境变量注入:
grep -r "TMPDIR\|TEMP" /etc/environment /etc/profile.d/ ~/.bashrc 2>/dev/null - 验证 systemd 用户服务是否加载临时脚本:
systemctl --user list-unit-files --state=enabled | grep -i tmp











