Linux的/tmp目录需启用sticky bit(chmod 1777 /tmp)、挂载为noexec,nosuid,nodev的tmpfs,并优先使用$XDG_RUNTIME_DIR或PrivateTmp=yes隔离临时文件,辅以auditd监控和定期清理。

Linux的/tmp目录默认对所有用户可读写,是系统中最易被滥用的路径之一。攻击者常利用其存放恶意脚本、提权工具或临时后门,因此必须限制权限、监控行为并替代高风险使用方式。
设置sticky bit与合理权限
/tmp必须启用sticky bit(即权限末位为t),确保用户只能删除自己创建的文件,防止“越删越乱”或恶意覆盖他人临时文件。
- 执行
chmod 1777 /tmp(1=sticky bit,777=所有者/组/其他均有rwx) - 检查是否生效:
ls -ld /tmp,输出应类似drwxrwxrwt 12 root root 4096 ... /tmp - 若使用systemd,确认
/tmp未被挂载为noexec,nosuid,nodev以外的宽松选项(尤其避免exec)
禁用/tmp下的可执行与SUID行为
即使有sticky bit,攻击者仍可能上传并直接执行二进制文件或利用SUID程序提权。最有效手段是挂载限制:
- 编辑
/etc/fstab,添加或修改/tmp行:tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0 - 重启前测试:
mount -o remount /tmp;验证:touch /tmp/test && /tmp/test应报“Permission denied” - 注意:某些旧应用依赖
/tmp执行脚本(如部分Java或编译过程),需配合PrivateTmp=yes在服务单元中隔离
替代方案:优先使用$XDG_RUNTIME_DIR或私有临时目录
现代Linux桌面及服务应避免硬编码/tmp,改用更安全的运行时路径:
- 用户级程序优先用
$XDG_RUNTIME_DIR(通常为/run/user/$(id -u)),该目录由logind自动创建,权限为0700且生命周期绑定会话 - 服务进程启用
PrivateTmp=yes(在.service文件中),systemd会为其分配独立/tmp和/var/tmp命名空间 - 脚本中生成临时文件,用
mktemp -d创建私有子目录,而非直接写/tmp/myapp_*
监控与清理策略
权限加固只是基础,还需主动发现异常行为:
- 启用auditd监控
/tmp:添加规则-w /tmp -p wa -k tmp_access,再用ausearch -k tmp_access查可疑操作 - 定期清理过期文件:
find /tmp -type f -mtime +7 -delete(建议放入cron.daily,但避免rm -rf /tmp/*误删正在使用的文件) - 禁止非root用户在
/tmp创建新目录(除非明确需要):chmod o-w /tmp,但需确认不影响正常服务(如某些DB临时socket)

















