在Java中有任何方法可以安全地写入临时文件吗?
据我所知,创建临时文件(createTempFile)的唯一方法并不是同时打开它,因此在文件打开和文件写入之间有一个竞争条件。我是不是遗漏了什么?我无法在createFileExclusively(String)的UnixFileSystem.java中找到C源代码,但我怀疑它真的能做任何事情,因为在创建临时文件之后,文件打开就会出现(除非它试图用文件锁来做一些事情?)
问题
在创建临时文件和打开临时文件之间,恶意攻击者可以断开该临时文件的链接,并将恶意内容放在其中。例如,攻击者可以创建一个命名管道来读取敏感数据。或者类似地,如果您最终通过读取文件来复制文件,那么命名管道就可以忽略所写的所有内容&提供要读取的恶意内容。
我记得在过去的10+年中阅读过许多临时文件攻击的例子,这些示例利用了名称空间中出现的名称和实际打开的文件之间的争用条件。
希望一个缓解因素是Java是正确的umask,因此特权较低的用户无法对文件进行读写,而且通常情况下,/tmp目录会适当地限制权限,从而无法执行取消链接攻击。
当然,如果您传递一个临时文件的自定义目录,该临时文件是由一个权限较低的用户拥有的,该用户可能会对您进行无链接攻击。当然,使用inotify,利用争用条件可能比只执行目录列表的蛮力循环更容易。
发布于 2012-09-24 18:45:23
http://kurt.seifried.org/2012/03/14/creating-temporary-files-securely/
Java
使用java.io.File.createTempFile() - http://www.veracode.com/blog/2009/01/how-boring-flaws-become-interesting/上的一些有趣的信息
对于目录,在How to create a temporary directory/folder in Java?上有一个有用的帖子
Java 7
对于文件,使用java.io.File.createTempFile()
对于目录,使用createTempDirectory()
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
发布于 2016-08-02 11:10:33
从Java 7开始,我们就有了OpenOption。
配置如何打开或创建文件的对象。
此类型的对象在打开或创建文件时由newOutputStream、newByteChannel、FileChannel.open和AsynchronousFileChannel.open等方法使用。
特别感兴趣的是StandardOpenOptions.CREATE_NEW。
创建一个新文件,如果该文件已经存在,则失败。对于其他文件系统操作而言,检查文件的存在和文件的创建(如果不存在)是原子的。
所以,你可以这样做:
FileChannel mkstemp() {
Path path = Files.createTempFile(null, null);
Files.delete(path);
return FileChannel.open(path, WRITE, CREATE_NEW);
}实现相同的模板行为是留给读者的练习。
发布于 2012-04-18 02:10:53
请记住,在许多系统上,仅仅因为一个文件没有名称并不意味着它是不可访问的。例如,在Linux上,开放的文件描述符可以在/proc/<pid>/fd/<fdno>中使用。因此,您应该确保使用临时文件是安全的,即使有人知道/具有对打开的文件的引用。
如果您指定要防止的攻击类型,您可能会得到一个更有用的答案。
https://stackoverflow.com/questions/10201472
复制相似问题