Как запустить ненадежный код Ruby в безопасной песочнице? - PullRequest
14 голосов
/ 04 октября 2008

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

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 способа сделать это:

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

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

Ответы [ 4 ]

12 голосов
/ 04 октября 2008

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

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

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

Но помните и повторяйте: «БЕЗОПАСНО не справиться с враждебным».

3 голосов
/ 27 октября 2014

$SAFE не защищает вас от всего, что может сделать злоумышленник.

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

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

3 голосов
/ 21 марта 2012

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

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

1 голос
/ 01 ноября 2014

Я создал гем под названием «надежная песочница», который запускает код Ruby в полностью контролируемом контейнере Docker. Вы можете отключить сеть, установить дисковые квоты, ограничить время выполнения, сбалансировать ЦП с другими работающими контейнерами, установить ограничения памяти и т. Д. И издержки довольно низкие.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...