изолированные плагины Python - PullRequest
2 голосов
/ 20 апреля 2010

Я планирую написать подключаемое приложение на python (+ qt4). Однако у меня есть большие опасения по поводу безопасности. Плагины должны быть достаточно мощными, чтобы делать в приложении все, что им нравится (и в качестве дополнительного ограничения будет использоваться процесс подписания и предупреждения для пользователя при использовании такого плагина), но взаимодействовать со средой (файловой системой, другими процессами). , сеть и т. д.) должны быть сделаны подключаемыми модулями только через некоторый код на Python, который я напишу.

Существует ли какой-либо безопасный и простой способ добиться этого, кроме необходимости выполнять статический анализ кода над кодом плагинов перед их установкой?

Ответы [ 3 ]

5 голосов
/ 20 апреля 2010

Короче говоря: №

Объяснение: В течение многих лет гуру Python пытались создать песочницу для Python. Проблема с песочницей состоит в том, что вам нужно несколько вещей для выполнения любого ввода-вывода (то есть возможность вообще передавать данные между песочницей и приложением). Они не нашли автоматического, питонского способа сделать это. Либо вы не можете обмениваться данными с плагином, либо интроспекция позволит затем просматривать дерево объектов в приложении -> доступ ко всему, что вам нравится.

Представьте себе вашу идею: плагин вызывает некоторый код Python, который вы пишете. Вероятно, это означает вызов метода или функции. Это означает, что вы должны предоставить мне действительный метод или объект функции. Из метода или объекта функции я могу получить объект вашего модуля. Из вашего модуля я могу получить все символы (то есть импорт). Оттуда я могу сделать все, что может сделать ваш модуль (по крайней мере).

См. Эту статью для некоторых указателей.

2 голосов
/ 17 января 2011

Код Python, выполняемый в обычном процессе Python, не может быть помещен в «песочницу», так как вы всегда можете отсканировать, но вы можете поместить в песочницу весь интерпретатор Python.

Например, PyPy поддерживает песочницу: http://codespeak.net/pypy/dist/pypy/doc/sandbox.html

Если вы хотите, вы, вероятно, могли бы написать библиотеку python для запуска сценария python в защищенном экземпляре pypy-c с некоторой общей памятью, используемой для передачи данных, которым вы доверяете, и какими-то сигналами для запуска событий в вашей программе.

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

1 голос
/ 19 июня 2014

Это очень старый вопрос, но, возможно, QtScript может быть ответом. Тем не менее, я понятия не имею, можете ли вы сделать это в песочнице и достаточно ли QtScript для вашего приложения.

...