【问题标题】:Java FileLock: How to Load Dynamic Library From Locked File?Java FileLock:如何从锁定的文件中加载动态库?
【发布时间】: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 那么问题仍然存在吗?还是您面临其他问题?

标签: java filelock


【解决方案1】:
  1. 在 Java 7 中,您可以实现内存中的文件系统(请参阅 java.nio.file.spi.FileSystemProvider),因此库内容将完全在内存中,从而使攻击者的生活更加困难。
  2. 另一种可能的方法是对库进行签名并让操作系统在从磁盘读取文件后进行安全检查;不过可能不太便携。
  3. 最重要的是——这真的是您面临的最大安全问题吗?两次调用之间的时间将是几微秒(好吧,也许是毫秒)——必须深入文件系统才能做坏事。通过网络传输文件时更改文件不是更容易吗?或者你不认为一个高级的攻击者可能......假设在将库写入磁盘时破解 JVM 并替换内容?没有什么是万无一失的,也许这是您可以接受的风险?

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

【讨论】:

  • (1) 绝对是一个有趣的功能,但是很可惜,这段特殊的代码必须与 Java 1.4 兼容!
  • (2) 我曾想过让 DLL/SO 构造函数在执行时对文件进行自检,但在这个特定的设置中,这对某些东西来说工作量太大了我无法说服自己会工作。
  • (3) 我完全同意这更像是一种理论上的黑客攻击,但权力要求我对此进行调查并提供无可辩驳的证据表明 a) 它无法完成,或 b ) 解决此问题所需的工作量超过了攻击的实际危险和/或风险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多