为什么带有 -u 选项的 mktemp 在其手册中被声明为不安全?

问题描述

我想创建一个临时文件并且正在阅读 mktemp 手册,发现带有 -u 选项的 mktemp 被声明为不安全,这背后的原因是什么?

  mktemp --help
    Usage: mktemp [OPTION]... [TEMPLATE]
    Create a temporary file or directory,safely,and print its name.
    TEMPLATE must contain at least 3 consecutive 'X's in last component.
    If TEMPLATE is not specified,use tmp.XXXXXXXXXX,and --tmpdir is implied.
    Files are created u+rw,and directories u+rwx,minus umask restrictions.
    
      -d,--directory     create a directory,not a file
      -u,--dry-run       do not create anything; merely print a name (unsafe)

解决方法

当您使用 -u 时,不会创建任何文件,因此以后使用该名称并不能保证访问您创建的临时文件。

在调用 mktemp 和使用结果之间有一个机会让另一个进程创建具有该名称的文件。该文件可能是一个符号链接,允许其他用户滥用您的权限在某处写入。

如果您使用 mktemp -u,您需要非常小心地确保此类竞赛不可利用。

通常,最好创建一个临时目录 (mktemp -d),并在该目录中使用您选择的名称。