Clojure: облегченная тюрьма

Контекст:

В Lua тривиально и очень дешево (4 КБ памяти) создать новую виртуальную машину Lua. Таким образом, легко создавать дешевые lua-тюрьмы. Затем, если ненадежный код ведет себя неправильно, я просто убиваю виртуальную машину Lua.

Я знаю о https://github.com/Licenser/clj-sandbox, но он появляется просто обернуть вокруг Java... что сделало бы ненадежный поток кода родным потоком Java, который я тогда был бы бессилен убить.

Вопрос:

Есть ли способ создать дешевые/легкие тюрьмы Clojure?


person user1383359    schedule 09.06.2012    source источник


Ответы (1)


Я (со)автор небольшой библиотеки под названием clojail, которая была своего рода переосмыслением clj- песочница. Он также использует песочницу Java, но также предоставляет функции для изолирования вещей, специфичных для Clojure. tryclj и 4clojure использовать его.

Я не понимаю, что вы имеете в виду под остальным. Песочница JVM хороша тем, что может предотвратить ввод-вывод. Clojail идет дальше, разрешая тайм-ауты для предотвращения долгого выполнения кода. Если вы говорите, что «люди могут создавать потоки, а я не смогу их убить», clojail убивает потоки, созданные внутри «песочницы», и обычно делает все возможное, чтобы предотвратить бегство бродячих потоков. Песочница JVM (и специфичные для clojail вещи) по-прежнему предотвращает запуск опасного кода в потоках.

В общем, проверьте clojail. Это может быть то, что вам нужно. Этого достаточно для большинства целей, и это единственная игра в городе (за исключением clj-sandbox, которая не поддерживается) для тюрем. Это не всегда лучшее решение, но обычно самое простое.

Следующий шаг, если clojail не делает то, что вам нужно, — это развертывание собственного механизма тюремного заключения, который включает использование песочницы JVM и выделение JVM. Это имеет огромные накладные расходы, поэтому я бы по возможности избегал этого. Определенно больше не в 4KB Luatown. ;)

person Rayne    schedule 09.06.2012
comment
Мы создаем группу потоков, чтобы все потоки, созданные в контексте песочницы, находились внутри этой группы, а затем уничтожаем их после завершения оценки или истечения времени ожидания. Это не работает для потоков, созданных в пулах потоков, с которыми нам приходится иметь дело, поэтому мы пытаемся предотвратить создание этих потоков (будущие и подобные, которые создают такие типы потоков, занесены в черный список в песочнице). - person Rayne; 10.06.2012
comment
Вы убиваете ThreadGroups устаревшей остановкой? docs.oracle.com/javase/6/docs/ api/java/lang/ThreadGroup.html Если да, то как это сделать, не нарушая работу виртуальной машины? - person user1383359; 10.06.2012
comment
Да потому что других вариантов нет. Я не знаю, что вы подразумеваете под саботажем виртуальной машины. Идея состоит в том, чтобы поместить код в песочницу, а не очистить его должным образом. - person Rayne; 10.06.2012
comment
У меня сложилось впечатление, что thread.stop оставляет JVM в нечистом/нестабильном состоянии. Похоже, это может обеспечить (теоретическую/педантическую) атаку; т. е. длительные потоки -> thread.stop -> JVM в странном состоянии -> эксплойт. Кстати, я знаю об этом гораздо меньше, чем вы, так что это все теория / мое невежество. - person user1383359; 10.06.2012
comment
Я никогда не видел проблемы, когда JVM буквально ломалась из-за остановленного потока. При наличии песочницы не так много состояний, которые можно изменить, поэтому не так много данных для повреждения. :) - person Rayne; 10.06.2012
comment
Rayne: можно ли с достаточными ограничениями на песочницу гарантировать отсутствие случайных блокировок/мьютексов? Если это так, я бы рассмотрел возможность запуска моего обычного кода clojure в песочницах — просто чтобы я мог уничтожать бесконечные циклы без перезапуска JVM. - person user1383359; 11.06.2012