mktemp原子性创建可防范符号链接劫持,因其一步完成选名、创建与权限设置;手动拼接文件名或使用-u选项会引入竞态窗口,导致劫持风险。

直接用 mktemp 创建文件本身就能防范符号链接劫持——关键不在“高随机性”,而在原子性创建和权限隔离。
必须用原子创建,禁用所有手动拼接
攻击者能劫持,是因为你先生成名字、再创建文件,中间存在竞态窗口。以下写法全部危险:
-
tmpfile="/tmp/myapp_$$"; touch "$tmpfile"($$可预测,且touch前可能被抢先ln -s /etc/shadow "$tmpfile") -
tmpfile=$(mktemp -u); touch "$tmpfile"(-u破坏原子性,touch可能失败或被劫持) -
tmpfile="/tmp/myapp_$(date +%s%N)"; > "$tmpfile"(纳秒时间在容器中常重复,极易冲突)
正确做法只有一条:让 mktemp 一步完成“选名 + 创建 + 设置权限”:
-
tmpfile=$(mktemp)(自动在/tmp下建 0600 文件) -
tmpfile=$(mktemp --suffix=.log)(带后缀也安全) -
tmpfile=$(mktemp -p "$XDG_RUNTIME_DIR")(优先用用户会话级临时目录,更隔离)
模板中 X 数量不能少于 6 个
POSIX 要求至少 6 个连续大写 X,否则部分系统(如 Alpine、BusyBox)会降级为不安全行为或直接失败:
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
- ✅ 安全:
mktemp /tmp/app.XXXXXX、mktemp -d /var/tmp/work.XXXXXX - ❌ 危险:
mktemp /tmp/app.XXX(X 不足)、mktemp /tmp/app.xxx(小写 X 无效)
注意:不用模板时默认使用 tmp.XXXXXXXXXX(10 个 X),已满足要求,所以最简写法 mktemp 反而最稳妥。
目录权限与子进程协作要特别小心
若临时目录需被其他用户(如 sudo -u nobody)写入,不能简单 chmod 755——这会让组/其他用户可遍历,暴露内容。
- 推荐路径:
mktemp -d -p "$XDG_RUNTIME_DIR"(该目录默认 0700,且生命周期绑定用户登录会话) - 若必须用
/tmp:tempdir=$(mktemp -d); chmod 700 "$tempdir"(显式加固,绕过 umask 干扰) - 绝对禁止:
mktemp -d /tmp/myapp.XXXXXX(这会在当前工作目录而非/tmp下建目录,cwd 权限失控即风险)
退出清理必须用 trap 绑定,且只删自己创建的
不清理会堆积敏感数据;暴力清空 /tmp 会误删其他进程关键文件(如 systemd socket、X11 auth)。可靠做法是:
-
trap 'rm -f "$tmpfile"; rm -rf "$tempdir"' EXIT(正常退出或 Ctrl+C 都触发) - 若需保留错误现场:
trap 'mv "$tempdir" "/var/log/myapp/debug_$(date -Iseconds)"' ERR - 避免在 trap 中调用未导出函数或未初始化变量——trap 执行环境独立于主脚本作用域










