Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileLock:如何从锁定的文件加载动态库?_Java_Filelock - Fatal编程技术网

Java FileLock:如何从锁定的文件加载动态库?

Java FileLock:如何从锁定的文件加载动态库?,java,filelock,Java,Filelock,我有一个从后端服务器检索字节数组的小程序。此字节数组包含一个动态库(DLL左右,取决于小程序运行的操作系统),必须将其写入磁盘,然后通过调用System.load()从磁盘加载 我需要确保文件在写入磁盘后,以及在操作系统通过调用System.load()加载之前未被篡改。在文件写入磁盘时,我获得了该文件的独占锁,但我的测试表明,我必须在调用System.load()之前释放该锁,否则它将无法加载库 有什么方法可以在加载文件时保持文件的锁定 示例代码: File f = File.createTe

我有一个从后端服务器检索字节数组的小程序。此字节数组包含一个动态库(DLL左右,取决于小程序运行的操作系统),必须将其写入磁盘,然后通过调用System.load()从磁盘加载

我需要确保文件在写入磁盘后,以及在操作系统通过调用System.load()加载之前未被篡改。在文件写入磁盘时,我获得了该文件的独占锁,但我的测试表明,我必须在调用System.load()之前释放该锁,否则它将无法加载库

有什么方法可以在加载文件时保持文件的锁定

示例代码:

File f = File.createTempFile("tmp", "");
RandomAccessFile raf = new RandomAccessFile(f, "rwd");
FileChannel channel = raf.getChannel();
FileLock lock = channel.lock(0, Long.MAX_VALUE, false);

// This would be where I write the DLL/SO from a byte array...             
raf.write((int)65); // 'A'
raf.write((int)66); // 'B'
raf.write((int)67); // 'C'

System.out.println("Wrote dynamic library to file...");

// Close and release lock
raf.close();

System.out.println("File closed. Lock released.");

// This call fails if the file is still locked.             
System.load(f.getAbsolutePath());
非常感谢您的帮助。解决方案(如果有的话)不能是任何操作系统的本机解决方案,而是可以在Java支持的所有平台上工作。解决方案也必须与Java1.4兼容

  • 在Java 7中,您可以在内存中实现文件系统(请参见
    Java.nio.file.spi.FileSystemProvider
    ),因此库内容将完全在内存中,从而使攻击者的生命更加艰难
  • 另一种可能的方法是对库进行签名,并让操作系统在从磁盘读取文件后进行安全检查;可能不是很方便携带
  • 最重要的是,这真的是你面临的最大的安全问题吗?两次调用之间的时间间隔将是一些微秒(好的,也许是毫秒),人们必须深入文件系统去做坏事。当文件通过网络传输时,修改它不是更容易吗?或者你不认为一个先进的攻击者可能。。。比方说,当库写入磁盘时,攻击JVM并替换内容?没有什么是防弹的,也许这就是你可以接受的风险
  • 只是出于兴趣-你到底犯了什么错误

  • 在Java 7中,您可以在内存中实现文件系统(请参见
    Java.nio.file.spi.FileSystemProvider
    ),因此库内容将完全在内存中,从而使攻击者的生命更加艰难
  • 另一种可能的方法是对库进行签名,并让操作系统在从磁盘读取文件后进行安全检查;可能不是很方便携带
  • 最重要的是,这真的是你面临的最大的安全问题吗?两次调用之间的时间间隔将是一些微秒(好的,也许是毫秒),人们必须深入文件系统去做坏事。当文件通过网络传输时,修改它不是更容易吗?或者你不认为一个先进的攻击者可能。。。比方说,当库写入磁盘时,攻击JVM并替换内容?没有什么是防弹的,也许这就是你可以接受的风险

  • 只是出于兴趣-您得到的错误到底是什么?

    我不确定,但是计算文件的md5/sha会有帮助吗?您可以在执行system.load之前检查签名。@Manishharma同意哈希摘要的想法。没有任何东西可以阻止用户“伪造”操作系统锁并继续修改文件。虽然有人为了这个目的修改文件系统代码会让人印象深刻,但你不能指望没有人会疯狂地尝试。摘要不足以满足以下原因:1)它只会显示文件在操作系统加载之前或之后被篡改过,2)如果攻击者可以在调用System.load()之前替换的内容,他也可以在调用之后和摘要计算之前替换,从而使攻击不可见。谢谢你的建议@PeterVils是代码的最后一行,应该是“System.load(f.getAbsolutePath());”。你的代码对我不起作用。@PeterVils那么这个问题还有待解决吗?或者您面临一些其他问题?我不确定,但是计算文件的md5/sha会有帮助吗?您可以在执行system.load之前检查签名。@Manishharma同意哈希摘要的想法。没有任何东西可以阻止用户“伪造”操作系统锁并继续修改文件。虽然有人为了这个目的修改文件系统代码会让人印象深刻,但你不能指望没有人会疯狂地尝试。摘要不足以满足以下原因:1)它只会显示文件在操作系统加载之前或之后被篡改过,2)如果攻击者可以在调用System.load()之前替换的内容,他也可以在调用之后和摘要计算之前替换,从而使攻击不可见。谢谢你的建议@PeterVils是代码的最后一行,应该是“System.load(f.getAbsolutePath());”。你的代码对我不起作用。@PeterVils那么这个问题还有待解决吗?或者您还面临其他一些问题?(1)肯定是一个有趣的特性,但遗憾的是,这段特定的代码必须与Java1.4兼容!(2) 我曾想过让DLL/SO构造函数在执行时对文件进行自检,但在这种特定的设置中,对于我无法说服自己能够工作的东西来说,这将是太多的工作了。(3)我完全同意这更像是一种理论上的黑客行为,但是权力决定了我要研究这一点,并提供无可辩驳的证据,证明a)这是不可能的,或者b)解决这一问题所需的工作量超过了攻击的实际危险和/或风险。(1)确实是一个有趣的特性,但遗憾的是,这段代码必须与Java 1.4兼容!(2) 我曾想过让DLL/SO构造函数在执行时对文件进行自检,但在这种特定的设置中,对于我无法说服自己能够工作的东西来说,这将是太多的工作了。(3)我完全同意这更像是一种理论上的黑客行为,但权力要求我调查此事,并提供无可辩驳的证据,证明a)这是不可能的,或b)解决这一问题所需的工作量超过了实际的危险和/或风险