【问题标题】:Why do we need mktemp? [closed]为什么我们需要 mktemp? [关闭]
【发布时间】:2012-07-24 18:09:19
【问题描述】:

我不明白mktemp 的功能以及临时文件的含义。

touch xyzmktemp xyz 之间的区别是什么(除了 mktemp 会创建一些附加 xxx 的文件并拥有 600 个权限?)

请澄清。

【问题讨论】:

  • @MarcB 最初的问题似乎是在询问mktemp 命令,该命令将在 shell 脚本中使用。这是安全的。它是 mktemp 库函数,将在不安全的编译程序中使用。这与操作系统的现代程度无关,它从来都不是安全的,只是最初没有实现。
  • 有人可以添加评论,解释为什么这不符合准则 - 这对我来说并不明显,对于许多遇到它的其他人来说可能并不明显。
  • @mtraceur 我认为关闭的原因是有些人没有意识到这对于任何编写 Unix shell 脚本(即编程)的人来说实际上是有用的信息。他们将其视为需要有关 MS Word 或 Excel 的信息!
  • mktemp 命令的原作者 Todd C. Miller 写道:mktemp.org/readme.html

标签: linux shell filesystems


【解决方案1】:

mktemp 随机化名称。从安全的角度来看,这非常重要。

想象一下你做了这样的事情:

echo something > /tmp/temporary-file

在您的根运行脚本中。

有人(读过你的剧本)会这样做

ln -s /etc/passwd /tmp/temporary-file

之前。

这会导致/etc/passwd 被覆盖,并可能意味着从系统开始的不同不愉快的事情被破坏,并以系统结束被黑客入侵(当输入something 可以精心设计时)。

mktemp 命令可以在这种情况下为您提供帮助:

TEMP=$(mktemp /tmp/temporary-file.XXXXXXXX)
echo something > ${TEMP}

现在ln /etc/passwd 攻击将不起作用。

简要了解 mktemp 的历史mktemp 命令由 OpenBSD 人员发明,并于 1997 年首次出现在 OpenBSD 2.1 中。他们的目标是提高 shell 的安全性脚本。以前的标准是在临时文件名中添加$$,这是绝对不安全的。现在所有的 UNIX/Linux 系统都有mktemp 或者它的替代品,并且它成为事实上的标准。有趣的是,mktemp C 函数因不安全而被弃用。

【讨论】:

  • 我不同意。将敏感数据放入 /tmp 的根运行脚本应该首先确保它创建的文件具有足够的限制性权限;即使使用 mktemp,“攻击者”也可以继续扫描 /tmp 以获取可读文件。安全性不是 mktemp 的主要目的;这是为了确保同一程序的多个实例不会相互破坏彼此的临时文件。
  • @Lqueryvg:当然这是一种安全措施。请查看 CERT 的 CWE-377 和“临时文件 - CERT 安全编码标准”以及与该主题相关的许多其他文档
  • 最初的问题是为什么要使用 mktemp 而不是只使用“说”触摸命令来创建文件。答案是避免名称冲突——这可能导致不可预知的行为和数据损坏(例如,如果您的脚本的两个实例同时运行)。当然也必须考虑安全性,但这不是 mktemp 存在的理由。
  • 不,我不会删除我的 cmets。我和这里的其他人一样有发言权。另外,说我的cmets有害是荒谬的。我没有说安全不重要;如果有什么我说相反的话。在开发人员关心临时文件的安全性和其他不关心的情况下,将存在用例。但是说使用mktemp 的主要原因是安全是完全错误的。这就是我评论这个答案的原因。
  • @Lqueryvg 像你这样的 cmets 是 StackOverflow 危险的一半......另一半是那些相信他们阅读的第一件事而没有更多挖掘的人。 mktemp 的联机帮助页不断提到安全、保护、攻击和安全、FFS。感谢那些提供背景信息的人!
【解决方案2】:

您经常需要一个“便签本文件”(或目录)。此外,您可能同时需要多个此类文件,并且您不想费心弄清楚如何命名它们,因此不会发生冲突。

“mktemp”符合要求 :)

【讨论】:

  • 这是最正确的答案。这与安全无关。主要原因是确保同一程序或脚本的多个实例(可能由相同或不同用户运行)不会覆盖彼此的临时运行时数据。
  • 任何阅读@Lqueryvg 上述评论的人:暗示没有安全优势是危险错误的。请在Igor's answer 上查看我的 cmets 了解原因。
  • 叹息。我没有说没有安全优势。
  • mktemp 命令是由 OpenBSD 人发明的。他们的目标是提高 shell 脚本的安全性。以前的标准是在临时文件名中添加 $$。 man.openbsd.org/mktemp.1
【解决方案3】:

还有一个额外的原因:并非所有系统都使用/tmp 作为临时目录。 例如https://termux.com/由于技术原因(它在Android内部作为进程运行),它的tmp目录具有不同的长路径。

使用mktemp 创建临时文件或目录的脚本将是可移植的,并且也可以在此类特殊环境中工作。

【讨论】:

    【解决方案4】:

    好的,实际上它在手册页中写得很清楚。

    mktemp - 创建一个临时文件或目录。

    安全地创建一个临时文件或目录,并打印其名称。

    它安全地创建一个文件或目录意味着没有其他用户可以访问它,这就是它的权限是600的原因

    触摸 - 更改文件时间戳

    如果已创建文件,它只是更改文件的时间戳,如果不存在则创建文件。但是文件权限默认还是644。

    更多详情请查看以下手册页:

    http://linux.die.net/man/1/mktemp

    http://linux.die.net/man/1/touch

    【讨论】:

    • 不,安全也意味着它可以缓解攻击者使用链接覆盖任意文件!
    【解决方案5】:

    至少在 bash shell 中,您可以执行以下操作:

    dirpath="/tmp/dir1-$$/dir2-$$"  
    mkdir -p $dirpath  
    chmod -R 0700 /tmp/dir1-$$  
    

    例如。

    【讨论】:

    • 这段代码中有几个竞争条件,第一个在调用 mkdir 之前,第二个在 mkdir 和 chmod 命令之间。正确的做法是先运行 umask,然后运行 ​​mkdir,然后检查 mkdir 的返回值。当 mktemp 命令不可用时,这可能是最好的解决方案。
    猜你喜欢
    • 2011-05-27
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多