Какие встроенные функции не должны запускаться ненадежными пользователями? - PullRequest
1 голос
/ 13 ноября 2010

Я создаю приложение типа corewars, которое работает на django и позволяет пользователю загружать некоторый код на python, который будет контролировать их персонаж. Теперь я знаю, что real ответ на этот вопрос заключается в том, что, пока я принимаю код от ненадежных пользователей, у меня будут уязвимости в безопасности. Я просто пытаюсь максимально снизить риск. Вот некоторые, которые приходят на ум:

  • __import__ (я, вероятно, также сделаю небольшое сканирование, чтобы убедиться, что нет операторов import)
  • open
  • file
  • input
  • raw_input

Есть ли другие, по которым я скучаю?

Ответы [ 6 ]

3 голосов
/ 13 ноября 2010

Есть много ответов о том, что в целом делать с ограничением Python на http://wiki.python.org/moin/SandboxedPython. Когда я смотрел на это некоторое время назад, Zope RestrictedPython выглядел лучшим решением, работая с системой белого списка.Вам все равно придется позаботиться о своем собственном коде, чтобы не подвергать уязвимостям безопасности, но, похоже, это лучшая из существующих систем.

2 голосов
/ 13 ноября 2010

Да, вы должны белый список.Есть так много способов скрыть плохие команды.

Это НЕ худший сценарий:

худший сценарий, когда кто-то попадаетбаза данных

Наихудший сценарий - получение всей машины с рутом, и вы не заметите, как она проверяет ваши другие машины и блокирует ваши пароли.Изолируйте эту машину и считайте ее враждебной (DMZ, блокируйте ее от возможности запуска атак внутри и снаружи и т. Д.).Запустите tripwire или AIDE на неперезаписываемом носителе и запишите все на второй хост.

Наконец, как показывает plash , существует множество опасных системных вызовов, от которых необходимо защититься.

2 голосов
/ 13 ноября 2010

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

В частности, под заголовком "Определениеограниченные среды "перечислены несколько модулей и функций, которые были сочтены разумно безопасными разработчиком rexec;они могут быть использованы в качестве начального белого списка.Я бы также предложил изучить его код для других ошибок, о которых вы могли и не подумать.

2 голосов
/ 13 ноября 2010

Вам действительно нужно избегать eval.Представьте себе код, такой как:

eval("__impor" + "t__('whatever').destroy_your_server")

Это, пожалуй, самый важный.

1 голос
/ 13 ноября 2010

Если вы не намерены использовать Python в качестве языка внутри игры, одной из возможностей будет встраивание Lua с использованием LunaticPython (я предлагаю ветку исправлений ошибок в https://code.launchpad.net/~dne/lunatic-python/bugfixes).

В песочнице Lua гораздо прощечем Python, и встраивать Lua гораздо проще, чем создавать свой собственный язык программирования.

1 голос
/ 13 ноября 2010

Вы должны использовать белый, а не черный список. Если вы используете черный список, вы всегда что-то пропустите. Даже если вы этого не сделаете, Python добавит функцию в стандартную библиотеку, и вы не будете своевременно обновлять черный список.

Вещи, которые вы сейчас разрешаете, но, вероятно, не должны включать:

  • compile
  • eval
  • reload (если они каким-то образом получают доступ к файловой системе, это в основном import)

Я согласен, что это было бы очень сложно сделать правильно. Одним из осложнений (среди многих) может быть доступ пользователя к одной из этих функций через поле в другом классе.

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

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