Ограничение доступа к классам Java в скрипте JRuby

#security #jruby

#Безопасность #jruby

Вопрос:

Я хочу разрешить клиенту писать скрипты в JRuby и запускать их на веб-сервере. Есть ли способ отключить интеграцию java с jruby. Или, по крайней мере, способ отключить доступ к классам ceratain?

Ответ №1:

Взгляните на org.jruby.Profile интерфейс. С помощью этого вы можете реализовать пользовательскую версию, которая запрещает загрузку определенных файлов или классов. Как следует из комментариев выше, запрета загрузки «java» должно быть достаточно, чтобы отключить интеграцию Java.

Вы можете установить профиль среды выполнения с помощью org.jruby.RubyInstanceConfig#setProfile перед инициализацией среды выполнения. Если вы используете org.jruby.embed API, то используйте org.jruby.embed.ScriptingContainer#setProfile .

Ответ №2:

Разрешаете ли вы пользователю отправлять файл, а ваш сервер выполнять его как скрипт? Вероятно, это очень плохая идея по нескольким причинам. Для начала, что такого они могли бы сделать в Java, чего вы от них не хотите, чего они не могли бы сделать в обычном ruby?

С учетом сказанного, убедитесь, что в скрипте нет require 'java' , это предотвратит интеграцию Java.

Комментарии:

1. Я могу представить, что они могли бы каким-то образом получить доступ к коммуникационному уровню DB и испортить мои данные. Я протестировал require ‘java’, и оказалось, что он не нужен для создания экземпляра какого-либо класса Java. достаточно импортировать ‘abc.dbc.def.SomeClass’.

2. Можете ли вы проверить переменные среды оболочки RUBYOPTS и JRUBY_OPTS. Если я попытаюсь, s = java.lang.String не выполнив require 'java' сначала, я получу ошибку NameError

3. О да, я забыл упомянуть, что JRuby встроен в мое Java-приложение, поэтому, вероятно, я могу инициализировать все с помощью какой-то другой конфигурации для автономной установки. Поэтому, конечно, сценарии, которые отправляют пользователи, выполняются в той же JVM, что и все веб-приложение.