Как мне защитить скрипты, запущенные с использованием javax.scripting?

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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