Ограниченное выполнение
Предупреждение
В Python 2.3 эти модули были отключены из-за различных известных и нелегко устранимых проблем безопасности. Модули по-прежнему документированы здесь, чтобы помочь в чтении старого кода, использующего модули rexec и Bastion.
Ограниченное выполнение — это базовая структура в Python, которая позволяет изолировать доверенный и недоверенный код. Структура основана на концепции, что доверенный Python-код (супервизор) может создать «защищённую ячейку» (или среду) с ограниченными правами и запустить в ней недоверенный код. Недоверенный код не может выйти за пределы своей ячейки и может взаимодействовать с чувствительными системными ресурсами только через интерфейсы, определённые и управляемые доверенным кодом. Термин «ограниченное выполнение» предпочтительнее «безопасный Python», так как истинную безопасность трудно определить, и она определяется способом создания ограниченной среды. Обратите внимание, что ограниченные среды могут быть вложенными, при этом внутренние ячейки создают подячейки с меньшими, но никогда не большими, привилегиями.
Интересной особенностью модели ограниченного выполнения Python является то, что интерфейсы, представленные недоверенному коду, обычно имеют те же имена, что и представленные доверенному коду. Таким образом, не нужно изучать специальные интерфейсы для написания кода, предназначенного для выполнения в ограниченной среде. И поскольку точный характер защищённой ячейки определяется супервизором, могут быть наложены различные ограничения в зависимости от приложения. Например, может считаться «безопасным», что недоверенный код может читать любой файл в указанном каталоге, но никогда не записывать файл. В этом случае супервизор может переопределить встроенную функцию open() таким образом, чтобы она выбрасывала исключение всякий раз, когда параметр mode равен 'w'. Он также может выполнить операцию, похожую на chroot(), с параметром filename таким образом, что корень всегда является относительным по отношению к некоторой безопасной области «песочницы» в файловой системе. В этом случае недоверенный код по-прежнему увидит встроенную функцию open() в своей среде с тем же вызывающим интерфейсом. Семантика также будет идентичной, при этом IOError будут вызваны, когда супервизор определит, что используется недопустимый параметр.
Интерпретатор Python определяет, выполняется ли конкретный блок кода в режиме ограниченного выполнения, исходя из идентичности объекта __builtins__ в его глобальных переменных: если это (словарь) стандартного модуля __builtin__, то код считается неограниченным, иначе — ограниченным.
Код Python, выполняющийся в ограниченном режиме, сталкивается с рядом ограничений, которые предназначены для предотвращения выхода его за пределы защищённой ячейки. Например, атрибут объекта функции func_globals и атрибуты класса и экземпляра объекта __dict__ недоступны.
Два модуля предоставляют структуру для настройки сред ограниченного выполнения:
См. также
- Grail Home Page
-
Grail, веб-браузер, написанный на Python, использует эти модули для поддержки Python-апплетов. Дополнительную информацию об использовании режима ограниченного выполнения Python в Grail можно найти на веб-сайте.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/restricted.html