SecurityManager для облачного сервиса «песочница» - PullRequest
7 голосов
/ 23 января 2011

Все,

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

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

Код клиента должен иметь возможность:

  • Взять столько жеВремя процессора, необходимое для одного потока
  • Выполнение любых вычислений с использованием стандартных классов Java (например, java.lang.Math, java.util.Random и т. Д.)
  • Вызов любых библиотек, входящих в составjar (но на него должны распространяться те же ограничения)

Но я бы специально запретил следующее:

  • Создание новых потоков (чтобы ресурс сервера мог бытьсправедливо управляемый!)
  • Любой доступ к файловой системе / IO / сети
  • Любой доступ к собственному коду
  • Любой доступ к данным в JVM, кроме тех, которые передаются в/ созданный клиентским кодом
  • Любой доступ к отражению в классах, отличных от тех, которые находятся в песочнице .jar
  • Любая возможность вызова методов для объектов вне песочницы, кроме стандартных библиотек Java

Возможно ли достичь этого с помощью пользовательской настройки ClassLoader / SecurityManager?Или мне нужно будет начать искать более сложное решение (например, запустить несколько JVM?)

Ответы [ 2 ]

4 голосов
/ 28 января 2011

Управление ресурсами и ограничение ресурсов невозможно в Java.Вы можете запретить вредоносному коду доступ к системным ресурсам (дисковым / сетевым и т. Д.) Или к самой JVM, но: ...

Создание новых потоков (так что ресурс сервера может управляться справедливо!)

  • Если я хочу быть злонамеренным, я собираюсь сделать весь свой код в потоке финализатора и просто заблокировать виртуальную машину.То же самое делает protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}} пока новые темы.
  • Съедая всю память, съедая всю прямую память и так далее.
  • Доступ к zip-файлам в моем собственном банке и ожидание их удаления, поэтому JVM падает (из-за ошибок в zlib)

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

Любая возможность вызывать методы для объектов вне изолированной программной среды, кроме стандартных библиотек Java

Что такое стандартные библиотеки?Знаете ли вы, когда / когда они, возможно, должны выполнить какой-то код в привилегированном методе.


Каждый клиент - отдельная виртуальная машина с полными ограничениями, сродством / приоритетом процесса, включая максимальное количество памяти / стека и т.

1 голос
/ 26 января 2011

Я думаю, что все, чего вы хотите достичь, можно сделать с помощью пользовательского SecurityManager. На самом деле все довольно просто: вы просто создаете класс, расширяющий SecurityManager, реализуете два метода checkPermission(..) и в первой итерации просто выбрасываете SecurityException для всего, что приходит (и записываете то, что вы только что опровергли). Затем вы разрешаете определенные операции, пока не окажетесь в ситуации, когда возможно создать полезные плагины и позволить своим клиентам поиграть с ними. Они будут жаловаться. Затем вы должны решить, разрешить ли им делать то, что они просили, или вы хотите придерживаться своих правил. Здесь начинается сложная часть ...

...