Как безопасно реализовать безопасность плагина Java? - PullRequest
4 голосов
/ 27 ноября 2011

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

Мне не удалось понять, как программно использовать файлы политики без запуска аргумента -Djava.security.manager при запуске. Так что пока что.

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

Тогда возникла проблема, что единственный способ выяснить, кто запрашивает это разрешение, - это проверить идентификатор потока. Итак, я разработал систему, в которой все потоки плагинов находятся и могут находиться ТОЛЬКО в группе потоков PluginThreads.

Это работало ... пока все не начало взрываться. Проблема в том, что некоторые из блокируемых объектов - это внутренние операции, выполняемые кодом Sun.

Так что даже самые простые операции, такие как открытие окна, потерпят неудачу, потому что мой менеджер безопасности отказывал в доступе к коду Sun. Нет ничего другого в том, чтобы использовать мой метод проверки потоков, потому что код Sun выполняется в группе PluginThreads.

Итак, что мне нужно знать, это:

1) Есть ли способ, которым я мог бы выяснить контекст, в котором идет вызов, используя текущий поток?

2) Есть ли лучший способ сделать это, о котором я не знаю?

3) Если этот метод включает файлы политики, как вы загружаете их в свой код?

4) Можно ли придумать какой-нибудь другой способ предотвращения блокировки внутреннего Java-кода Sun?

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

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

Joe-E обеспечивает разложимую безопасность.От http://lambda -the-ultimate.org / node / 3830 :

Мы представляем язык Joe-E, разработанный для поддержки разработки безопасных программных систем.Joe-E - это подмножество Java, которое облегчает разработку и реализацию программ с сильными свойствами безопасности, которые можно проверить во время проверки безопасности.Это позволяет программистам применять принцип наименьших привилегий к своим программам;внедрить эталонные мониторы приложений, которые нельзя обойти;вводить и использовать предметные абстракции безопасности; безопасно выполнять и взаимодействовать с ненадежным кодом ;и создавать безопасные, расширяемые системы.Joe-E демонстрирует, как можно достичь сильных свойств безопасности языка объектных возможностей, сохраняя при этом свойства и ощущение основного объектно-ориентированного языка ...

0 голосов
/ 28 ноября 2011

Вам необходимо использовать java.security.AccessController / AccessControlContext с SecurityManager. API поддерживает объект контекста типа Object, но на практике вам нужно использовать AccessControlContext. Чтобы дать коду пользователя правильные разрешения, укажите соответствующий ProtectionDomain через подкласс SecureClassLoader (URLClassLoader.newInstance - разумный пример того, что вы должны получить правильно).

Для приложения с графическим интерфейсом (включая, например, все, что использует определенную часть java.beans), вам также потребуется обработать AppContext (в реализации "Sun" библиотеки Java). Это не публичный API.

Потоки и группы потоков не являются хорошим способом управления безопасностью. К сожалению, это часть того, как работает AppContext изоляция.

...