Я играю с файлом java .policy и задавался вопросом, как я могу сделать что-то вроде предотвращения вызовов java.util.Date () в качестве примера.
Я просто хочу лучше понять, как работает файл .policy и как его можно использовать для кода песочницы.
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()
и других магических методов.)
Чтобы ограничить доступ к определенным пакетам, вам нужно изменить не файл .policy
, а security.properties
. Есть запись package.access=...
, в которой перечислены пакеты, для которых требуются разрешения RuntimePermissions. Таким образом, вы не можете конкретно ограничить доступ к одному классу, только ко всему пакету (включая подпакеты, если необходимо), то есть java.util
. (Вы также можете получить доступ к нему с помощью методов Security.?etProperty
.)
Если вы это сделали, то позже вы можете добавить правильное разрешение RuntimePermission в политику, чтобы позволить «хорошему» коду использовать его.
Я думаю, что довольно большая часть JRE перестанет работать, если вы ограничите доступ к java.util, поэтому лучше попробуйте другой класс для тестирования.
Принцип работы песочницы в основном заключается в том, что из классов, которые делают важные для безопасности вещи, обращаются к текущему SecurityManager, чтобы проверить, должен ли такой вызов быть успешным. Поскольку класс Date не воспринимается как чувствительный к безопасности, в его коде не существует таких вызовов, и поэтому, как объяснили Том и Пауло, его очень сложно ограничить.
Например, для сравнения: операции с файлами считаются чувствительными к безопасности, поэтому класс File имеет вызовы SecurityManager. В качестве примера метод удаления:
public boolean delete() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkDelete(path);
}
return fs.delete(this);
}
А благодаря проверке SecurityManager в классе File вы можете с большей легкостью ограничить операции удаления файлов в файле .policy.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.