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

时间:2011-11-01 10:34:20

标签: java filelock

我有一个从后端服务器检索字节数组的applet。此字节数组包含一个动态库(DLL或SO,具体取决于运行applet的操作系统),必须将其写入磁盘,然后通过调用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支持的所有平台。此解决方案还要求与Java 1.4兼容。

1 个答案:

答案 0 :(得分:0)

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