Документация Python неофициальный перевод

30. Ограниченное выполнениеRestricted Execution

Предупреждение

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

Ограниченное выполнение – это базовый фреймворк в Python, позволяющий разделять доверенный и недоверенный код. Фреймворк основан на том, что доверенный код Python (супервизор) может создать «изолированную ячейку» (или окружение) с ограниченными правами и запустить в ней недоверенный код. Недоверенный код не может выйти за пределы своей ячейки и взаимодействует с чувствительными системными ресурсами только через интерфейсы, определённые и управляемые доверенным кодом. Термин «ограниченное выполнение» предпочтительнее «безопасного Python», поскольку настоящую безопасность трудно определить, и она зависит от способа создания ограниченного окружения. Обратите внимание, что ограниченные окружения могут быть вложенными: внутренние ячейки создают подъячейки с меньшими, но никогда не с большими привилегиями.

Интересная особенность модели ограниченного выполнения в Python заключается в том, что интерфейсы, предоставляемые недоверенному коду, обычно имеют те же имена, что и для доверенного кода. Поэтому для написания кода, предназначенного для работы в ограниченном окружении, не нужно изучать специальные интерфейсы. А поскольку точный характер изолированной ячейки определяется супервизором, можно накладывать разные ограничения в зависимости от приложения. Например, может считаться «безопасным», что недоверенный код может читать любой файл в определённом каталоге, но никогда не записывать файл. В этом случае супервизор может переопределить встроенную функцию open() так, что она будет вызывать исключение, когда параметр mode равен 'w'. Он также может выполнить операцию, подобную chroot(), над параметром filename, так что корень всегда будет относиться к некоторой безопасной «песочнице» файловой системы. В этом случае недоверенный код по-прежнему будет видеть в своём окружении встроенную функцию open() с тем же интерфейсом вызова. Семантика также будет идентичной: исключения IOError будут возбуждаться, когда супервизор определит использование недопустимого параметра.

Среда выполнения Python определяет, выполняется ли данный блок кода в режиме ограниченного выполнения, на основе идентичности объекта __builtins__ в его глобальных переменных: если это (словарь) стандартного модуля __builtin__, то код считается неограниченным, в противном случае он считается ограниченным.

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

Два модуля предоставляют фреймворк для создания окружений ограниченного выполнения:

См. также

Домашняя страница Grail

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