Я играю с файлом java .policy и задавался вопросом, как я могу сделать что-то вроде предотвращения вызовов java.util.Date () в качестве примера.

Я просто хочу лучше понять, как работает файл .policy и как его можно использовать для кода песочницы.

2
nazbot 22 Фев 2011 в 23:31

3 ответа

Лучший ответ

Боюсь, тебе там не повезет.

Как говорит Паоло Эберманн, package.access может блокировать иерархии пакетов. Вы можете уточнить это с помощью специального SecurityManager, что обычно является чертовски хорошим признаком того, что вы делаете что-то действительно хитрое.

В общем, вы можете создать ClassLoader, который не всегда делегируется своему родительскому элементу. Технически это противоречит текущей спецификации Java SE, хотя спецификация Java EE поощряет это. Вы можете заблокировать java.util.Date. Он по-прежнему доступен через отражение, если на него ссылается какой-либо другой класс, или вы можете получить его экземпляр. Вы можете заблокировать транзитивное закрытие использования Date, в том числе тех, которые каким-то образом возвращают Date. Однако, чтобы завершить схему с минимальной датой, вам нужно будет загрузить java.util.Date в загрузчик классов, что невозможно вместе со всеми другими классами java.*.

Итак, ошибся, замените класс java.util.Date в rt.jar (возможно, используя Java Agent) и замените в любом классе, который вы не хотите ограничивать, new Date() на new Date(System.currentTimeMillis()).

(Кстати, +1 ко всему, что снижает зависимость от System.currentTimeMillis() и других магических методов.)

3
Tom Hawtin - tackline 23 Фев 2011 в 01:19

Чтобы ограничить доступ к определенным пакетам, вам нужно изменить не файл .policy, а security.properties. Есть запись package.access=..., в которой перечислены пакеты, для которых требуются разрешения RuntimePermissions. Таким образом, вы не можете конкретно ограничить доступ к одному классу, только ко всему пакету (включая подпакеты, если необходимо), то есть java.util. (Вы также можете получить доступ к нему с помощью методов Security.?etProperty.)

Если вы это сделали, то позже вы можете добавить правильное разрешение RuntimePermission в политику, чтобы позволить «хорошему» коду использовать его.

Я думаю, что довольно большая часть JRE перестанет работать, если вы ограничите доступ к java.util, поэтому лучше попробуйте другой класс для тестирования.

2
Paŭlo Ebermann 22 Фев 2011 в 23:43
На каком пути присутствует security.properties
 – 
Bagira
2 Июл 2012 в 16:58

Принцип работы песочницы в основном заключается в том, что из классов, которые делают важные для безопасности вещи, обращаются к текущему SecurityManager, чтобы проверить, должен ли такой вызов быть успешным. Поскольку класс Date не воспринимается как чувствительный к безопасности, в его коде не существует таких вызовов, и поэтому, как объяснили Том и Пауло, его очень сложно ограничить.

Например, для сравнения: операции с файлами считаются чувствительными к безопасности, поэтому класс File имеет вызовы SecurityManager. В качестве примера метод удаления:

public boolean delete() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkDelete(path);
    }
    return fs.delete(this);
}

А благодаря проверке SecurityManager в классе File вы можете с большей легкостью ограничить операции удаления файлов в файле .policy.

1
Sami Koivu 24 Фев 2011 в 03:54