Могу ли я гарантировать, что мое Java-приложение будет выполняться с помощью Security Manager с ограничительной политикой?

1

Я буду распространять автономное приложение Java, которое будет установлено на общедоступном/общем компьютере. Я хочу как можно лучше защитить приложение от возможных злонамеренных/любопытных пользователей. Это означает, что я хочу, чтобы приложение выполнялось в контексте SecurityManager с настраиваемым файлом политики.

Я знаю два способа запуска приложения Java с помощью Security Manager.

  1. При запуске приложения укажите параметры -Djava.security.manager и -Djava.security.policy=someUrl. Похоже, что этот подход страдает следующими недостатками:
    • Если someUrl ссылается на местоположение на локальном компьютере, злоумышленник может изменить файл политики и эффективно обойти изолированную программную среду безопасности.
    • Если злоумышленник может перезапустить приложение, он может запустить его, не передавая ни один из этих параметров, и запускать приложение без диспетчера безопасности и, следовательно, обходить изолированную программную среду безопасности.
    • Если someUrl ссылается на местоположение на удаленном компьютере, а удаленный компьютер недоступен при запуске приложения, приложение (предположительно) не запускается.
  2. Внутри приложения выполните следующий код: System.setProperty("java.security.policy", "path/to/policy/file"); System.setSecurityManager(new SecurityManager());
    Этот подход, похоже, страдает от следующей слабости:
    • Поскольку диспетчер безопасности не запускается JVM до загрузки приложения, злоумышленник может вмешиваться в файлы классов в приложении и обходить изолированную программную среду безопасности.

В любом случае, мне кажется, что невозможно гарантировать, что автономное приложение будет запущено в контексте диспетчера безопасности на общедоступном/общем компьютере.

Является ли мой анализ неправильным? Возможно ли разработчик приложения гарантировать, что приложение запущено в диспетчере безопасности, и гарантировать, что файл политики не был изменен, когда приложение запущено на общедоступном/общем компьютере?

Теги:
security
jvm
securitymanager

2 ответа

3
Лучший ответ

Ваш анализ верен, вы не можете получить такую гарантию.

Ваша программа выполняется виртуальной машиной Java. Независимо от свойства, которое вы хотите требовать от JVM, вы должны спросить его, "это свойство имеет место?". Таким образом, вы спрашиваете JVM: "Защищаете ли вы мое приложение против людей, которые управляют вами?", И люди, которые работают с JVM, могут настроить его на ложь - просто скажите "да", хотя ответ отрицательный. В лучшем случае вам понадобится небольшой патч для JVM, и, вероятно, даже это не так, поскольку любой, кто хочет увидеть ваш запуск приложения, может просто запустить отладчик.

Менеджер безопасности контролирует разделение между приложениями. Он защищает ваше приложение от других приложений Java. Он не защищает вас от JVM: при запуске приложения на него вы доверяете.

Меня иногда шокируют богохульства тех, кто считает себя благочестивыми - например, монахинь, которые никогда не купаются без халата все время. Когда его спросили, почему, так как никто не может их видеть, они отвечают: "О, но ты забыл хорошего Бога". По-видимому, они понимают Божество как Подглядывающего Тома, чье всемогущество позволяет Ему видеть сквозь стены ванной комнаты, но кто измучен купальными халатами. Мне это кажется любопытным. (Бертран Рассел)

2

Я хочу как можно лучше защитить приложение от возможных злонамеренных/любопытных пользователей.

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

Конечно, приложение может проверить, установлен ли SecurityManager, и либо отказаться от работы без одного, либо программно установить SecurityManager.

Если вам необходимо защитить приложение от изменений, тогда диспетчер безопасности/контроллер доступа не является правильным механизмом. Ваша первая остановка будет заключаться в подписании вашего приложения и запуске его в виде апплета или в качестве более общего приложения для веб-запуска.

Если вам нужно запретить определенному пользователю (или группе пользователей) что-то делать, вам потребуется какая-то схема аутентификации и авторизации. Тип политики безопасности имеет понятие политик для каждого пользователя, и это полезно в контексте ручной настройки развертывания приложения на одном конкретном компьютере, но его сложно использовать в общем случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню