Как обеспечить безопасный запуск сценариев с помощью javax.scripting?

Я использую javax.scripting, чтобы добавить поддержку запуска произвольных загруженных пользователем JavaScript-кодов на стороне сервера. Очевидно, я хочу защитить эти сценарии!

Rhino сам по себе имеет структуру для защиты сценариев во время выполнения. В документации для javax.scripting, однако, не упоминаются безопасность, разрешения или ограничивающие классы, доступные для скрипта. Так это просто огромная дыра в javax.scripting API, что он не предлагает структуру для защиты выполняемых скриптов?

Я не хочу использовать Rhino напрямую, потому что я изначально пытался это сделать, но у меня возникли проблемы с предоставлением экземпляров Java работающему сценарию. Фреймворк javax.scripting (который использует Rhino под капотом) сделал это тривиальным, а также упростил выполнение скриптов на многопоточном сервере.

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


person Jeffrey D. Hoffman    schedule 28.08.2009    source источник


Ответы (3)


Оказывается, javax.scripting не предлагает фреймворк безопасности. После некоторых поисков я нашел документ в кеше Google, в котором предлагалось использовать Java-фреймворк doPrivilegedAction, но после некоторых экспериментов я не смог получить его, чтобы предотвратить открытие сокетов или доступ к файловой системе сценариями.

После того, как я задал этот вопрос, я обнаружил, что он ранее задавался здесь, в StackOverflow: Как вы можете запустить Javascript с помощью Rhino для Java в песочнице? На этой странице ложно указано, что Rhino, включенный в JDK6, уже имеет защиту. Как я указал, я смог открыть сокеты и другие вредоносные действия из скрипта.

В конце концов я отказался от javax.scripting и напрямую встроил Rhino. Создав собственный ContextFactory, который также является ClassShutter, я смог легко добиться двух результатов:

  1. Ограничивает время выполнения скрипта до максимального срока
  2. Ограничивает доступ к классам тем, которые я внес в белый список, что в основном составляет java.lang.* и несколько избранных классов в иерархии моего сервера.

CodeUtopia (на которую я не могу ссылаться, потому что, как новый пользователь, мне не разрешено ссылаться на несколько страниц в одном сообщении, но ссылка на него есть в другом сообщении StackOverflow) была полезна для описания архитектуры ClassShutter и собственного Rhino. Страница ContextFactory API описывает, как создать собственный ContextFactory.

person Jeffrey D. Hoffman    schedule 29.08.2009

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ описывает способ песочницы rhino, а javax.scripting использует Rhino в качестве обработчика сценариев JS, поэтому вы сможете использовать описанное выше, хотя имена пакетов могут отличаться.

Я работал над Java-приложением, для которого Rhino был необходим для написания сценариев. Приложению нужно было запускать ненадежный код JavaScript от третьих лиц, поэтому мне пришлось найти способ заблокировать доступ ко всем методам Java, кроме тех, которые мне нужны. Это не было бы проблемой, если бы существовал простой способ отключить LiveConnect — функцию Rhino, обеспечивающую доступ Java к сценариям, — но такой вещи не существует.

Однако, после долгих поисков, я, наконец, нашел способ сделать это без особых усилий. На самом деле это можно сделать, просто расширив несколько классов Rhino и используя предоставленные сеттеры для переопределения некоторых стандартных.

person Mike Samuel    schedule 21.10.2009

К вашему сведению, теперь это возможно в новой реализации Java 8 javax.scripting, которая использует новый движок под названием Nashorn. См. раздел Безопасное выполнение Nashorn JS.

person Kevin Albrecht    schedule 18.02.2015