有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mkstemp的java等价物

Java中有没有安全地写入临时文件的方法

据我所知,创建临时文件(createTempFile)的唯一方法实际上并不是同时打开它,因此文件打开和;文件写入。我错过什么了吗?我在UnixFileSystem中找不到CreateFileExclusive(String)背后的C源代码。java,但我怀疑它是否真的能做任何事情,因为在创建临时文件之后,java代码中会出现文件打开(除非它试图用文件锁做些什么?)

问题

在创建临时文件的时间和;如果你打开它,恶意攻击者可能会取消该临时文件的链接&;把恶意的东西放在那里。例如,攻击者可以创建一个命名管道来读取敏感数据。或者类似地,如果您最终通过读取来复制文件,那么命名管道可能会忽略所有写入的内容&;提供要读取的恶意内容

我记得在过去的10多年中,我读到过许多临时文件攻击的例子,这些攻击利用了名称出现在名称空间中和文件实际打开之间的竞争条件

希望一个缓解因素是,Java正确设置了umask,因此权限较低的用户无法读/写该文件,并且通常/tmp目录会正确限制权限,因此您无法执行取消链接攻击

当然,如果您为临时文件传递一个自定义目录,该临时文件由一个权限较低的用户拥有,而该用户已被泄露,则该用户可能会对您发起取消链接攻击。见鬼,有了inotify,利用竞争条件可能比只利用蛮力循环进行目录列表更容易


共 (3) 个答案

  1. # 1 楼答案

    请记住,在许多系统上,文件没有名称并不意味着它无法访问。例如,Linux上的开放文件描述符可以在/proc/<pid>/fd/<fdno>中找到。因此,即使有人知道/拥有对打开文件的引用,也应该确保临时文件的使用是安全的

    如果您确切地指定要防止的攻击类别,您可能会得到一个更有用的答案

  2. # 2 楼答案

    针对其他普通用户ID的安全性?是的,在任何正常运行的多用户系统上

    保护你自己的用户ID还是超级用户?没有

  3. # 3 楼答案

    自Java7以来,我们有^{}

    An object that configures how to open or create a file.

    Objects of this type are used by methods such as newOutputStream, newByteChannel, FileChannel.open, and AsynchronousFileChannel.open when opening or creating a file.

    特别令人感兴趣的是^{}

    Create a new file, failing if the file already exists. The check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations.

    所以,你可以这样做:

    FileChannel mkstemp() {
        Path path = Files.createTempFile(null, null);
        Files.delete(path);
        return FileChannel.open(path, WRITE, CREATE_NEW);
    }
    

    实现相同的模板行为留给读者作为练习