有什么理由要避免使用tmpnam()获取临时文件的名称?

201*_*ker 5 c c++ file-io

我打算使用tmpnam()一个临时文件命名,该文件稍后将重命名,而不是删除。但是我找到了以下文档,现在我对其中所说的那部分很感兴趣

“ ...天真的程序员可能会认为它是临时文件的合适名称。”

http://man7.org/linux/man-pages/man3/tmpnam.3.html

tmpnam()函数返回一个指向有效文件名的字符串的指针,这样,在某个时间点不存在具有该名称的文件,因此天真的程序员可能会认为它是临时文件的合适名称。如果参数s为NULL,则此名称在内部静态缓冲区中生成,并且可能在下次调用tmpnam()时被覆盖。如果s不为NULL,则将名称复制到s指向的字符数组(长度至少为L_tmpnam),并在成功的情况下返回值s。

有人可以解释为什么文档这么说吗?

我认为“它”是指生成的名称,只有天真的程序员会认为命名临时文件就足够了,否则为什么要提及它呢?如果这不是合适的解决方案,为什么会存在呢?

如果有人可以解决,我将不胜感激。

小智 3

另一个程序可能会同时创建一个具有完全相同名称的文件。为了确保您实际上可以获取具有该文件名的文件,文件名和文件本身的创建应该是一个原子的、不可分割的操作。

这有点理论化,因为 tmpnam() 和实际创建之间的时间可能非常短。但仍然有可能。

  • 让我补充@R..的评论:我已经在舞台上看到了这样的漏洞演示;是真的。攻击程序预测“tmpnam”的可能结果,创建相应的文件,并允许受害者打开它们。然后,攻击者可以读取受害者程序写入该文件的任何机密信息,因为攻击者对该文件拥有完全权限。他们也可以修改它。这种攻击可以泄露安全密钥并获得 root 访问权限。 (5认同)
  • 不,这不是“有点理论化”。如果你做错了,这就是一个很容易被利用的安全漏洞。 (4认同)