Песочница Java. Использование SecurityManager для перенаправления доступа ввода-вывода

В настоящее время я пытаюсь написать песочницу для запуска ненадежного кода Java. Идея состоит в том, чтобы изолировать приложение Java от доступа к файловой системе или сетевым сокетам. Решение, которое у меня есть на данный момент, - это переписанный SecurityManager, который запрещает любой доступ к вводу-выводу или сети.

Теперь я хочу не запрещать, а перенаправлять вызовы в файловую систему, т.е. если приложение хочет записать в «/ home / user / application.txt» , путь к файлу следует заменить что-то вроде "/ temp / trust_folder / application.txt" . Итак, в основном я хочу разрешить приложениям получать доступ к файловой системе только в какой-то конкретной папке и перенаправлять все другие вызовы в эту папку.

Вот метод из класса FileOutputStream , где SM спрашивают, есть ли разрешение на запись по заданному пути.

 public FileOutputStream(File file, boolean append)
    throws FileNotFoundException
{
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(name);
    }
    if (name == null) {
        throw new NullPointerException();
    }
    fd = new FileDescriptor();
    fd.incrementAndGetUseCount();
    this.append = append;
    if (append) {
        openAppend(name);
    } else {
        open(name);
    }
}

Очевидно, SM не имеет доступа к FileOutputStream и не может изменять внутренние переменные в методе (например, name или file ]) или каким-либо образом повлиять на порядок выполнения, кроме выброса SecurityException. Я понимаю, что доступ к внутренним полям является нарушением объектно-ориентированных принципов, я понимаю, что локальные переменные видны и существуют только внутри метода, в котором они были объявлены.

У меня вопрос: есть ли способы разрешить Security Manager заменять вызовы файловой системы? Если нет, могу ли я использовать другие подходы для этого?

Надеюсь, я был достаточно ясен.

9
задан Thilo 1 December 2010 в 09:39
поделиться