Язык сценариев в песочнице для JVM?

Я хотел бы предложить нашим пользователям возможность писать сценарии на стороне сервера. (Наше приложение ориентировано на разработчиков). Мне бы хотелось, чтобы они могли вызывать несколько функций в нашем приложении, создавать переменные и выполнять основные циклы и переходы. Однако я хочу, чтобы их сценарии были помещены в "песочницу", чтобы они не могли разорваться и записать на диск или открыть сетевое соединение или испортить внутреннюю часть нашего приложения. Думайте об этом как о хранимой процедуре SQL: вы можете взаимодействовать с сервером, но не с внешним миром.

Существуют ли какие-либо встроенные языки сценариев для JVM, которые будут это делать? Я мог бы написать свой собственный DSL, но это много работы.

Несколько лет назад я начал что-то вроде этого, используя Rhino, но оказалось, что я не мог должным образом поместить его в песочницу. Был бы рад использовать GraalJS, но я не могу сказать, если это песочница. Существует некоторая ссылка на остановку вредоносного кода ( https://www.graalvm.org/docs/graalvm-as-a-platform/embed/), но он выглядит как сценарий JS все еще может получить доступ ко всем видам вещей в хост-приложении.

2 ответа

Решение

От: https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/Context.html

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

Вкратце: GraalJS, встроенный через PolyglotAPI, не может получить доступ к каким-либо собственным ресурсам, если это явно не разрешено.

Вероятно, вам следует запустить внешний процесс, поскольку даже логика с песочницей во время выполнения все еще может предпринимать попытки истощения ресурсов (нехватка памяти, переполнение стека, бесперебойные циклы и т. Д.). И как только вы это сделаете, вы можете положиться на средства безопасности вашей операционной системы, например, seccomp и пространства имен в linux.

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