Существует ли «безопасное» подмножество Python для использования в качестве встроенного языка сценариев? - PullRequest
11 голосов
/ 14 мая 2009

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

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

Существует ли подмножество Python, которое считается "безопасным" для встраивания? Я понимаю, насколько безопасно это можно считать довольно субъективным. Тем не менее, и Java-апплеты, и Flash имеют четкую песочницу безопасности Мне интересно, есть ли версия Python с подобными правилами?

РЕДАКТИРОВАТЬ: Я спрашиваю не столько из-за подхода с использованием файла конфигурации, сколько потому, что мне интересно внедрить некоторые механизмы сценариев / плагинов в новое приложение, и я не хочу плагин сценарий, чтобы иметь возможность, скажем, удалять файлы. Это выходит за рамки возможностей приложения.

Ответы [ 12 ]

8 голосов
/ 14 мая 2009

Вот пара ссылок, чтобы дать вам представление о том, с чем вы столкнулись:

Существует также проект мертвого кода Google на http://code.google.com/p/sandbox-python/

3 голосов
/ 16 июля 2009

PyMite VM отвечает всем требованиям, если все, что вам нужно сделать, это установить простые переменные, циклы, условные выражения и функции. PyMite крошечный, написан на C, использует статический пул памяти и может быть встроен. Он имеет чрезвычайно ограниченный набор встроенных функций, которые легко настроить. Точно так же единственными стандартными библиотеками являются частичные реализации string, dict, list и sys. Виртуальная машина PyMite является частью проекта python-on-a-chip, поэтому она была разработана для работы на микроконтроллерах, но может работать на настольных системах в стиле posix. Недостатком является то, что PyMite не так сильно отлажен, как другие реализации Python.

3 голосов
/ 14 мая 2009

Нет, не существует готового к производству подмножества Python, которое было бы "безопасным". В Python есть несколько модулей песочницы, которые устарели из-за недостатков.

Лучше всего либо создать свой собственный анализатор, либо изолировать процесс python с помощью перехватчиков syscall и заблокированной учетной записи.

Некоторые люди могут указывать вам на PyPy, но он медленный и незавершенный.

3 голосов
/ 14 мая 2009

Проект pypy предлагает функции песочницы, см. http://doc.pypy.org/en/latest/sandbox.html.

2 голосов
/ 24 июня 2009

tinypy ( tinypy.org ) был создан, чтобы быть небольшим, встраиваемым подмножеством Python, написанным в стиле Lua. И так как у lua есть способ создать песочницу, я считаю, что tinypy можно взломать в том же духе. Поскольку база кода tinypy настолько мала, ее довольно легко изучить и выяснить, как изменить ситуацию в соответствии с вашими потребностями.

1 голос
/ 16 июня 2009

Немного трудно понять, что вы пытаетесь сделать - недостаточно подробностей.

Размещаете ли вы нативное приложение и разрешаете ли пользователям писать плагины? Подумайте об использовании решения на уровне ОС, запустив приложение Python в качестве отдельного процесса выполнения внутри jail / chroot / аналогичного и установив связь через сокеты.

Ожидаете ли вы, что ваши клиенты будут размещать собственное приложение и позволять "ненадежным сторонам" писать плагины? Есть ли причина, по которой вышеприведенное решение не сработает? (Например, клиент хотел бы развернуть на странных ОС без таких опций ...)

Ожидаете ли вы, что те же люди будут размещать нативное приложение и «ненадежный скрипт» и хотят защитить их от себя? В смысле защиты их от написания "os.remove" и заставить его делать то, что они написали? Вы можете объяснить, почему?

Обратите внимание, что одной изолированной среды часто недостаточно без более строгих ограничений (максимальные циклы ЦП, максимальная память, проблемы с владением памятью ...)? Какую вредоносность вы хотите остановить? Обратите внимание, что и здесь ОС обладают замечательными возможностями (приоритетами, процессами уничтожения, ограничениями), которые копируются не во всех средах песочницы, и, безусловно, менее проверены на безопасность, чем в ОС. (Я бы поверил, что у Linux не будет хрупких предельных значений, прежде чем доверять PyPy, чтобы он не позволял злонамеренному кодеру занимать неограниченные объемы памяти просто потому, что Linux подвергался атакам в дикой природе.)

1 голос
/ 14 мая 2009

Я не очень хорошо знаю, какие именно функции безопасности вы получаете в среде виртуальной машины Java или .NET, но вы, возможно, захотите подумать, если ваш код Python выполняется с Jython или IronPython может позволить вам получить дополнительную безопасность.

1 голос
/ 14 мая 2009

Вы можете попробовать IronPython на Silverlight / Moonlight, как эти парни впечатляюще делают. Существует много полезной информации об этих типах приложений IronPython от разработчиков Resolver One здесь .

1 голос
/ 14 мая 2009

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

Ваш нативный код, который «в дикой природе», одинаково уязвим для этой атаки; то, что это в машинном коде, является просто ударом скорости, и никакой безопасности.

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

Но песочница? Не беспокойся об этом!

1 голос
/ 14 мая 2009

AFAIK, некоторые попытки были сделаны в стандартной библиотеке Python, но они не увенчались успехом. Подробнее см. Ограниченное исполнение .

Внимание

В Python 2.3 эти модули были отключен из-за различных известных и не легко исправимые дыры в безопасности. модули все еще документированы здесь помочь в чтении старого кода, который использует модули rexec и Bastion.

...