【发布时间】:2011-11-01 10:34:20
【问题描述】:
我有一个从后端服务器检索字节数组的小程序。此字节数组包含一个动态库(DLL 或 SO,取决于运行小程序的操作系统),必须将其写入磁盘,然后通过调用 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 兼容。
【问题讨论】:
-
我不确定,但计算文件的 md5/sha 会有所帮助吗?您可以在执行 system.load 之前检查签名..
-
@ManishSharma 同意哈希摘要的想法。没有什么能阻止用户“伪造”操作系统锁并仍然更改文件。虽然有人为此目的更改文件系统代码会令人印象深刻,但您不能指望没有人会疯狂地尝试它。
-
摘要不能满足以下原因: 1) 它只会显示文件已被篡改之前或之后文件有由操作系统加载,并且 2) 如果攻击者可以替换调用 System.load() 之前的内容,他也可以在调用之后和摘要计算之前进行替换,从而使攻击不可见。不过感谢您的建议!
-
@PeterVils 是代码的最后一行,应该是“System.load(f.getAbsolutePath());”。你的代码对我不起作用。
-
@PeterVils 那么问题仍然存在吗?还是您面临其他问题?