Все,
Я работаю над созданием облачной службы, которая предоставит возможность выполнить некоторый код "плагина", представленный клиентами.Для того, чтобы эта работа работала, важно, чтобы плагины не могли угрожать целостности системы или иметь возможность доступа к данным других клиентов.
В идеале я бы хотел, чтобы клиенты могли отправлятьпростой файл jar (содержащий класс, соответствующий некоторому предопределенному интерфейсу), который затем будет запущен в песочнице.
Код клиента должен иметь возможность:
- Взять столько жеВремя процессора, необходимое для одного потока
- Выполнение любых вычислений с использованием стандартных классов Java (например, java.lang.Math, java.util.Random и т. Д.)
- Вызов любых библиотек, входящих в составjar (но на него должны распространяться те же ограничения)
Но я бы специально запретил следующее:
- Создание новых потоков (чтобы ресурс сервера мог бытьсправедливо управляемый!)
- Любой доступ к файловой системе / IO / сети
- Любой доступ к собственному коду
- Любой доступ к данным в JVM, кроме тех, которые передаются в/ созданный клиентским кодом
- Любой доступ к отражению в классах, отличных от тех, которые находятся в песочнице .jar
- Любая возможность вызова методов для объектов вне песочницы, кроме стандартных библиотек Java
Возможно ли достичь этого с помощью пользовательской настройки ClassLoader / SecurityManager?Или мне нужно будет начать искать более сложное решение (например, запустить несколько JVM?)