Java中有没有办法安全地写出临时文件?
据我所知,创建临时文件(createTempFile)的唯一方法实际上并不是同时打开它,因此文件打开和文件写入之间存在竞争条件.我错过了什么吗?我在UnixFileSystem.java中找不到createFileExclusively(String)背后的C源代码,但是我怀疑它真的可以做任何事情,因为在创建临时文件后文件打开发生在Java代码中(除非它试图做一些事情文件锁?).
问题
在创建临时文件并打开它之间,恶意攻击者可以取消链接该临时文件并将恶意内容放在那里.例如,攻击者可以创建命名管道来读取敏感数据.或者类似地,如果您最终通过读取文件来复制文件,那么命名管道可能会忽略所写的所有内容并提供要读取的恶意内容.
我记得在过去的10多年中读过许多临时文件攻击的例子,这些例子利用了名称出现在命名空间和文件实际打开之间的竞争条件.
希望减少因素是Java设置正确的umask,因此权限较低的用户无法读取/写入文件,并且/ tmp目录通常会正确限制权限,因此您无法执行取消链接攻击.
当然,如果您为受到攻击的权限较低的用户拥有的临时文件传递自定义目录,则用户可以对您进行取消链接攻击.地狱,使用inotify,利用竞争条件可能比仅仅执行目录列表的暴力循环更容易.
请记住,在许多系统上,仅仅因为文件没有名称并不意味着它无法访问。例如,在 Linux 上,打开文件描述符可在/proc/<pid>/fd/<fdno>. 因此,即使有人知道/拥有对打开文件的引用,您也应该确保对临时文件的使用是安全的。
如果您准确指定要阻止的攻击类别,您可能会得到更有用的答案。