Подтвердить что ты не робот

Как запустить ненадежный код Ruby внутри безопасной песочницы?

Я хочу иметь возможность запускать unstrusted ruby ​​code. Я хочу иметь возможность передавать переменные в указанный ненадежный код, который он может использовать. Я также хочу, чтобы указанный код возвращал мне результат. Вот концептуальный пример того, что я думаю.

input = "sweet"
output = nil
Thread.start {
   $SAFE = 4
   #... untrusted code goes here, it uses the input variable(s)
   #to calculate some result that it places in the output variable
}
#parse the output variable as a string.

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

Теперь я могу подумать о 3 способах сделать это:

  • Используйте конструкцию уровня $SAFE выше.
  • Whytheluckystiff имеет плагин Sandbox для ruby ​​
  • Я могу запускать каждую функцию на своей собственной виртуальной машине, используя какое-то программное обеспечение для виртуализации os, такое как vmware или Xen или что-то в этом роде.

Мне интересно, есть ли у кого-нибудь рекомендации по запуску ненадежного кода ruby ​​функциональным способом? Какой вариант вы бы рекомендовали? Как бы вы это сделали? Спасибо.

4b9b3361

Ответ 1

$SAFE недостаточно; вам нужно быть, по крайней мере, на уровне Why freaky sandbox. Тем не менее, я не знаю, активно ли этот код песочницы, или если он когда-либо разрешил такие отверстия, как бесконечные петли и т.д.

Небезопасно вообще означает враждебность. Если вы можете расслабиться от враждебного, скажем, "наивного", и в зависимости от требований вашего приложения, вы можете уйти с песочницей в Ruby. Это не действительно первоклассный сценарий в дизайне языка.

Даже несмотря на это, вам, вероятно, не нужно идти на машинный уровень разделения. Я бы чувствовал себя достаточно безопасно, используя песочницу в отдельном процессе, и ваше приложение функционирует как диспетчер процессов, чтобы убить всех, кому удается висеть/плакать. Теперь это на несколько порядков больше работы, чем ваш простой блок выше.

Но помните и продолжайте повторять: "SAFE не может иметь дело с враждебным".

Ответ 2

Я бы настоятельно рекомендовал использовать JRuby.

У JVM была очень сильная модель безопасности, построенная с самого начала, и JRuby справляется с этим. Вы можете ограничить доступ к файлам, ограничить загрузку кода и многое другое. Это намного лучше, чем все, что существует в родных Ruby impls, и существует множество сайтов, на которых для JRuby работают изолированные, доступные для пользователей сайты на JRuby.

Ответ 3

$SAFE не защищает вас от всего, что мог сделать злонамеренный хакер.

Спустившись по этому пути (см. Ruby: создав изолированную версию eval?), я последовал советам мудрецов комментаторов и встроил интерпретатор приложения, который дал мне полный контроль над тем, что можно и не может сделать (см. Ruby: поиск рубинового встраиваемого интерпретатора или языка сценариев).

Это оказалось невероятно простым с использованием stickup (например, менее часа от загрузки драгоценного камня до настраиваемого интерпретатора) - см. https://github.com/jcoglan/stickup

Ответ 4

Я создал драгоценный камень под названием "trusted-sandbox", который запускает код Ruby в полностью контролируемом контейнере Docker. Вы можете отключить сеть, установить квоты на диске, ограничить время выполнения, балансировать CPU с другими запущенными контейнерами, установить пределы памяти и т.д. И накладные расходы довольно низки.

Подробнее об этом можно прочитать здесь: https://github.com/vaharoni/trusted-sandbox

Дайте мне знать, что вы думаете!