Запускать ненадежный код 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

Другие вопросы по тегам