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