Java FileLock: Как загрузить динамическую библиотеку из заблокированного файла? - PullRequest
2 голосов
/ 01 ноября 2011

У меня есть апплет, который извлекает байтовый массив с внутреннего сервера. Этот байтовый массив содержит динамическую библиотеку (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.

1 Ответ

0 голосов
/ 01 ноября 2011
  1. В Java 7 вы можете реализовать файловую систему в памяти (см. java.nio.file.spi.FileSystemProvider), поэтому содержимое библиотеки будет полностью в памяти, что значительно усложнит жизнь злоумышленнику.
  2. Другой возможный подход - подписать библиотеку и позволить ОС выполнять проверки безопасности после чтения файла с диска; может быть не очень переносимым.
  3. Самое важное - действительно ли это самая большая проблема безопасности, с которой вы сталкиваетесь? Время между двумя вызовами будет составлять несколько микросекунд (хорошо, может быть, миллисекунд) - нужно очень глубоко взломать файловую систему, чтобы делать плохие вещи. Не было бы проще изменить файл, когда он передается по сети? Или вы не думаете, что продвинутый злоумышленник может ... скажем, взломать JVM и заменить контент, пока библиотека записывается на диск? Ничто не является пуленепробиваемым, может быть, это риск, который вы можете принять?

Просто из интереса - какую именно ошибку вы получаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...