Java有什么方法可以安全地写出临时文件吗?java等价于mkstemp
据我所知,创建临时文件(createTempFile)的唯一方法并不是实际同时打开它,因此在文件打开&文件写入之间存在争用条件。我错过了什么吗?我找不到UnixFileSystem.java中的createFileExclusively(String)背后的C源代码,但是我怀疑它是否真的可以做任何事情,因为在临时文件创建后文件打开发生在Java代码中(除非它试图用文件锁?)。
问题
创建临时文件时之间&你打开它,恶意攻击者可以解除连接的临时文件&把恶意的东西在那里。例如,攻击者可以创建一个命名管道来读取敏感数据。或者类似地,如果您最终通过阅读文件来复制文件,那么命名管道可能会忽略写入的所有内容&提供要读取的恶意内容。
我记得在过去10多年中,有很多临时文件攻击的例子,它们利用名称出现在名称空间和文件实际打开之间的竞争条件。
希望缓解因素是Java正确设置了umask,因此权限较低的用户无法读取/写入文件,通常/ tmp目录会正确限制权限,因此您无法执行取消链接攻击。
当然,如果您传递一个自定义目录用于被权限较低的特权用户拥有的临时文件,那么用户可以对您执行一个取消链接攻击。地狱,与inotify,它可能更容易利用竞争条件,而不仅仅是一个强制循环,目录列表。
你能解释什么样的竞争条件存在吗? – 2012-04-18 01:20:28
对此的任何更新(如在解决方法或Java7技巧中)? – 2013-11-08 12:33:14
@Mr_and_Mrs_D我刚刚添加了一个实际答案。 – OrangeDog 2016-08-02 11:19:25