Java SecurityManager, который идентичен NO менеджер безопасности, за исключением одной настройки проверки для System.exit

Я не очень хорошо разбираюсь в менеджерах безопасности Java и поэтому хочу подтвердить свое понимание:

У меня есть Java-процесс, который случайным образом останавливается (запускается ловушка отключения), хотя нет никаких следов того, кто его убил. В результате я решил установить менеджер безопасности и переопределить checkExit(int status) чтобы убедиться, что причиной остановки не является что-то вызывающее System.exit(), В основном я написал это:

            System.setSecurityManager(new SecurityManager() {
                @Override
                public void checkExit(int status) {
                    Thread.dumpStack();
                    super.checkExit(status);
                }
            });

Я ожидал, что моя программа будет работать в обычном режиме, единственное изменение заключается в том, что трассировка стека будет сбрасываться при вызове System.exit(). Я обнаружил, что это не так. Не удается начать с этого исключения безопасности:

java.security.AccessControlException: access denied ("java.util.PropertyPermission" "config" "read")
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[na:1.8.0_74]
        at java.security.AccessController.checkPermission(AccessController.java:884) ~[na:1.8.0_74]
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) ~[na:1.8.0_74]
        at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294) ~[na:1.8.0_74]
        at java.lang.System.getProperty(System.java:717) ~[na:1.8.0_74]
        at Main.main(Main.java:161) ~[na:na]

Похоже, что SecurityManager НЕ реплицирует поведение по умолчанию и после прочтения о нем может показаться, что он применяет политику по умолчанию под ${JAVA_HOME}/jre/lib/security/java.policy что довольно ограничительно.

Каково реальное поведение Java по умолчанию, когда НЕТ менеджера безопасности? Это "разрешить все" или что-то еще происходит?

Что я должен установить в качестве диспетчера безопасности, если я хотел бы воспроизвести поведение по умолчанию, кроме этой единственной настройки выше?

По последнему пункту я вижу, что System.setSecurityManager() на самом деле ожидает экземпляр java.lang.SecurityManager Это означает, что я вынужден использовать эту реализацию (которая зависит от файлов политики). Каков был бы наиболее эффективный способ переопределения методов в этом классе для репликации фактического поведения по умолчанию БЕЗ менеджера безопасности?

РЕДАКТИРОВАТЬ: Согласно обсуждению ниже, это, кажется, делает это

            System.setSecurityManager(new SecurityManager() {
                @Override
                public void checkPermission(Permission perm) {
                    return; // no security manager behaviour
                }

                @Override
                public void checkPermission(Permission perm, Object context) {
                    return; // no security manager behaviour
                }

                @Override
                public void checkExit(int status) {
                    Thread.dumpStack();
                    super.checkExit(status);
                }
            });

1 ответ

Решение

Ты смущен.

Похоже, что SecurityManager НЕ реплицирует поведение по умолчанию, и после прочтения о нем может показаться, что он применяет политику по умолчанию в ${JAVA_HOME}/jre/lib/security/java.policy, что довольно ограничительно.

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

Каково реальное поведение Java по умолчанию, когда НЕТ менеджера безопасности? Это чтобы "позволить все"

Да.

или что-то еще происходит?

Нет.

Что я должен установить в качестве диспетчера безопасности, если я хотел бы воспроизвести поведение по умолчанию, кроме этой единственной настройки выше?

Менеджер по безопасности, который делает именно это. Если вы хотите, чтобы он не применял ничего, кроме одного переопределения, которое вы реализовали, вы должны предоставить пустые переопределения для всех других его методов.

Другие вопросы по тегам