Запускать ненадежный код Python, который может взаимодействовать с основной программой, но изолирован от системы
Пролог: я знаю, что многие люди уже пытались изолировать Python-код внутри Python и потерпели неудачу, но я не видел подхода к дополнительной предварительной обработке сценариев как текстовых и отклоняющих сценариев, содержащих такие ключевые слова, как __base__
которые могут быть использованы для восстановления скрытого __buuiltins__
, Я думаю, что этот подход является новым и еще не доказал свою несостоятельность - не так ли?
Я планирую написать многопользовательскую стратегическую игру, в которой игроки обычно не могут взаимодействовать со своими юнитами, используя команды клавиатуры / мыши, а только через сценарии, которые они должны представить, чтобы изменить автоматическое поведение юнитов. Это основано на идее http://screeps.com/.
Я хотел бы написать это в Python 3, но главная проблема, похоже, заключается в безопасном выполнении сценариев ненадежного иностранного игрока на сервере. Я знаю, что я не могу доверять exec()
или же eval()
даже при прохождении их пусто globals
а также locals
как среда. Я также знаю, что просто стирая __builtins__
также не работает, потому что все еще можно легко восстановить их, используя возможности самоанализа Python, как описано здесь: http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html
Я уже узнал, что у PyPy или Jython может быть какая-то особенность песочницы, которая, вероятно, будет работать для моих целей, но я бы предпочел остаться с эталонным интерпретатором CPython. Кроме того, я мог только найти примеры, когда эти функции песочницы работают для целых программ, но ни одна из них не состоит из основной программы, выполняющей ненадежные сценарии в качестве дочерних потоков и эффективно взаимодействующей с ними.
Но я думаю, что у меня есть еще один шанс: я могу буквально обработать представленные сценарии и искать такие строки, как __class__
или же __base__
и отклонить сценарии, содержащие эти ключевые слова. Я также должен был бы заменить eval()
а также exec()
в сценарии с моими собственными, защищенными функциями, которые также отказываются запускать код, содержащий эти ключевые слова.
Будет ли этот подход, вместе с перезаписью всех потенциально опасных элементов (какие это будут?) С использованием пользовательских globals
аргумент в пользу exec()
быть в безопасности? Какие ключевые слова мне нужно искать?
Если нет, то почему бы это не сработало? Можете ли вы предложить лучшее решение?
1 ответ
Я не уверен, что это хорошая идея. Существуют возможности использования pypy или даже специальной изолированной программной среды python проекта, которая уже имела дело с большей частью изоляции системы. Но для создания безопасной среды первому требуется много работы, а второй напрямую не поддерживает Python 3.x.
Но автор pysandbox прекратил разработку с 2013 года, потому что он объявил на своем сайте github
pysandbox BROKEN BY DESIGN, перейдите к новому решению для песочницы (запустите python в песочнице, а не наоборот!) https://lwn.net/Articles/574215/*
Если вы можете принять ограниченный синтаксис, было бы гораздо безопаснее определить специальную грамматику и создать собственный интерпретатор с PythonLexYacc.
Я должен признать, что это больше подсказок, чем полный ответ, но это лучшее, что я могу сделать сейчас (и на песочницу python не ссылались на этот бывший вопрос SO