使用 mktemp --dry-run 时我应该担心什么

Jon*_*Jon 9 bash

我一直在尝试创建一个临时命名的 fifo 并在引用Bash: create anonymous fifo我看到他们正在使用mktemp -u来获取 fifo 的文件名。手册页指出这是不安全的。

-u, --dry-run
       do not create anything; merely print a name (unsafe)
Run Code Online (Sandbox Code Playgroud)

为什么这是不安全的,我如何负责任地使用这种技术?

小智 7

他们上面所说的“不安全”的含义如下。假设你有这个场景:

  • 你跑 mktemp -u
  • 它打印一个名字,说 /tmp/tmp.njxOsokU9u
  • 您将该名称保存在某处,大概是在 bash 变量中(例如tmp
  • 你的脚本做了一些与该文件无关的工作
  • 然后您的脚本尝试使用临时文件 ( echo hello > $tmp)

没有错,是吗?这是一个类似的场景:

  • 你跑 mktemp -u
  • 它打印一个名字,说 /tmp/tmp.njxOsokU9u
  • 您将该名称保存在某处,大概是在 bash 变量中(例如tmp
  • 你的脚本做了一些与该文件无关的工作
  • 与您的脚本无关的其他一些进程会创建具有相同名称的文件(即/tmp/tmp.njxOsokU9u
  • 然后您的脚本尝试使用临时文件 ( echo hello > $tmp)

现在您的脚本和其他进程可能正在写入同一个文件,这可能不会很好地结束。这就是它被标记为不安全的原因。

  • 但是后一种情况与不使用 `-u` 调用 `mktemp` 的情况有何不同?即使创建了文件(而不仅仅是名称),[没有什么可以阻止另一个进程写入同一个文件](/sf/answers/34963211/) 一旦创建。 (3认同)
  • 如果脚本中的 `mktemp` 创建了该文件,则另一个脚本中的 `mktemp` 将不会使用相同的文件名,因为该文件已经存在。它不是试图防止恶意脚本,只是防止意外使用相同的名称。 (2认同)
  • @stephenwade,我认为这不是关键原因。该问题在 https://www.owasp.org/index.php/Insecure_Temporary_File 中有详细说明。一个关键原因是,如果另一个进程猜测了该名称,并且他们的权限比您低,他们可以创建一个该名称的文件作为指向重要系统文件的符号链接。然后你的代码会不知不觉地覆盖那个重要的系统文件。 (2认同)
  • @Clément 发布的 owasp 链接已失效。我能够找到我认为是同一页面的新位置:https://owasp.org/www-community/vulnerability/Insecure_Temporary_File (2认同)