2009-05-01 2 views
4

Я отвечаю за разработку большого приложения Python/Windows/Excel, используемого финансовым учреждением, имеющим офисы по всему миру. Недавно правила в одной стране изменились, и в результате нам сказали, что нам нужно создать «заблокированную» версию нашего дистрибутива.Как создать заблокированную среду python?

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

Мое первоначальное предложение состояло в том, чтобы отнять права выполнения на python.exe и pythonw.exe: наше приложение работает как плагин Excel, который использует только Python DLL. Эти exe-файлы никогда не используются.

Мой коллега по-прежнему обеспокоен тем, что кто-то может совершать звонки с Python DLL - хакер может использовать функцию «exec», например, с другого языка программирования или виртуальной машины, способной вызывать функции в Windows DLL, например VBA.

Есть ли что-то, что мы можем сделать для предотвращения того, чтобы DLL, которую мы хотим установить, подвергались насилию? На данный момент у меня кончились идеи. Мне нужно найти способ гарантировать, что Python будет запускать только наши авторизованные программы.

Конечно, в этом вопросе есть элемент абсурда: поскольку на компьютерах все есть Excel и Word, у всех их есть VBA, который является хорошо известным языком сценариев, несколько эквивалентным возможности Python.

Очевидно, что нет смысла беспокоиться о python, когда VBA Excel широко открыта, однако это корпоративная политика, и именно моя команда предлагает использовать Python, поэтому нам нужно доказать, что наши вещи можно сделать разумно безопасно.

ответ

9

«разумно безопасный» определяется произвольно как «более безопасный, чем Excel и VBA».

Вы не можете выиграть этот бой. Потому что борьба закончилась неправильно. Любой может использовать любой EXE или DLL.

Вам нужно определить «заблокировано» по-другому - таким образом, чтобы вы могли добиться успеха.

Вам необходимо определить «заблокировано», поскольку «невозможно изменить файлы .PY» или «мы можем проверить все изменения в файлах .PY». Если вы переключите игровое поле на то, что вы можете контролировать, у вас будет небольшой шанс выиграть.

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

Будьте абсолютно уверены в том, что требует регламент - не слушайте чужую интерпретацию.

+0

Хорошие пункты: на компьютерах есть JRE, поэтому теоретически любой может принести свои JAR-файлы и использовать Java VM. В этом случае не будет применена песочница Java. Возможно, одним из способов решения этой проблемы является количественная оценка риска относительно того, что уже существует в системах: риск - это язык, который понимают банкиры. –

+0

Количественная оценка не поможет. Вам нужно «закончить», как мы говорим, и прочитать фактическое положение. Часто они довольно просты и довольно легко обобщаются. –

3

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

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

+0

Из того, что я могу сказать, PyPy, в конечном итоге, сможет предоставить скрытый интерпретатор python, но я думаю, что это никогда не будет практичным с CPython. –

+0

Любая реализация Python на виртуальной машине - PyPy, Jython, IronPython и т. Д. - будет, очевидно, предоставлять любые преимущества использования песочницы, предоставляемые этой средой. Но любые библиотеки, использующие собственный код, всегда будут проблемой. – Kylotan

3

Одна из идей - запустить IronPython внутри AppDomain на .NET. См. Комментарий Дэвида В. here.

Кроме того, имеется модуль, который вы можете импортировать, чтобы ограничить интерпретатор от записи файлов. Это называется safelite.

Вы можете использовать это и указать, что даже изобретатель Python не смог сломать безопасность этого модуля! (Более двух раз.)

Я знаю, что писать файлы - это не единственная безопасность, о которой вы беспокоитесь. Но то, что вас просят сделать, глупо, поэтому, надеюсь, человек, спрашивающий вас, увидит «безопасный Python» и будет удовлетворен.

0

Я согласен, что вы должны изучить правила, чтобы узнать, что они на самом деле требуют. Если вам действительно нужна «заблокированная» Python DLL, вот как это сделать. Это, вероятно, займет некоторое время и будет нелегко получить право. Кстати, поскольку это теоретически, я размахиваю руками над работой, которая варьируется от массивной до тривиальной :-).

Идея состоит в том, чтобы модифицировать Python.DLL, поэтому он импортирует только модули .py, которые были подписаны вашим личным ключом. Он проверяет это, используя открытый ключ и подпись кода, спрятанную в переменной, которую вы добавляете к каждой .py, которой вы доверяете, с помощью инструмента подписи кода.

Таким образом, у вас есть:

  1. Построить частные сборки из источника Python.
  2. В вашей сборке измените оператор импорта, чтобы проверить наличие кодовой подписи на каждом модуле при импорте.
  3. Создайте инструмент подписи кода, который подписывает все модули, которые вы используете, и утверждаете, что они безопасны (ака доверенный код). Что-то вроде __code_signature__ = "ABD03402340"; но криптографически защищен в файле __init__.py каждого модуля.
  4. Создайте пару закрытых/открытых ключей для подписания кода и защиты секретного ключа.
  5. Возможно, вы не хотите подписывать какие-либо модули с возможностями типа exec() или eval().

Код подписи кода .NET может быть полезен здесь, если вы можете использовать IronPython.

Я не уверен, что это отличная идея, но в конце концов вы сможете утверждать, что ваша сборка Python.DLL будет работать только с кодом, который вы подписали с вашим личным ключом.

1

Следуйте по пути geordi.

Каждая подозрительная программа запускается в собственной тюрьме. Мониторинг системных вызовов из процесса (я знаю, как это сделать в Windows, но это выходит за рамки этого вопроса) и, если нужно, убейте процесс.

Смежные вопросы