标准答案

  1. 创建临时文件应使用安全的原子接口和独占创建标志,而不是先判断不存在再 open。
  2. 目录权限、sticky bit、文件模式和运行用户共同决定其他用户能否删除或替换临时文件。
  3. 需要持久化时应先写私有临时文件、fsync 按要求完成,再用原子 rename 替换目标,并考虑目标目录和跨文件系统限制。
  4. 文件名、路径和符号链接都来自外部输入时,应使用目录 fd、openat 相关安全选项或允许列表限制访问范围。

题目解析

共享临时目录中的固定名称会产生竞态:攻击者可以提前创建符号链接,服务随后以高权限打开并覆盖目标。随机名称只能降低猜测概率,不能消除检查与使用之间的 TOCTOU 窗口;应使用安全临时文件 API、独占创建和严格模式。

需要把临时内容提交为正式文件时,先在私有目录写入,按持久化要求 flush/fsync,再在同一文件系统内原子 rename。路径、目录 fd、符号链接、文件权限和清理失败都要纳入设计,上传和解压还要限制大小与层级。

常见误区

  • 误区:使用 /tmp/固定名称。改正:使用 O_CREAT|O_EXCL 或安全临时文件接口,并设置私有权限。
  • 误区:先 access 检查再 open。改正:让打开操作本身完成权限和独占约束,减少 TOCTOU。
  • 误区:把临时文件设为全局可读写。改正:使用最小 mode、私有目录和受控运行用户。

作者信息