Описание тега pysandbox

pysandbox - это песочница Python. По умолчанию ненадежный код, выполняемый в песочнице, не может изменить среду (записать файл, использовать печать или импортировать модуль). Но вы можете настроить песочницу, чтобы выбрать, какие именно функции разрешены или нет, например. Импортируйте модуль sys и прочитайте файл /etc/issue.

Веб-сайт: http://github.com/haypo/pysandbox/

Характеристики

Заблокированные функции Python (по умолчанию):

  • Запретить доступ к файловой системе
  • Запретить импорт модулей Python
  • Запретить выход из Python
  • Запретить доступ к stdin, stdout или stderr
  • Запретить некоторые встроенные символы, такие как compile(), execfile() или KeyboardInterrupt
  • Запретить выполнение произвольного байт-кода (создание объекта произвольного кода)

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

Защита пространства имен:

  • Запретить доступ к закрытию функций, глобальным переменным, значениям по умолчанию и коду
  • Запретить доступ к фреймам
  • Запретить доступ к типам подклассов
  • __builtins__ только для чтения
  • Запретить доступ к методам dict, способным изменить dict, например. dict.__setitem__, Но вместо этого вы можете использовать "d[key] = value" и "del d[key]"

конфигурация

Используйте класс SandboxConfig для настройки вашей песочницы. Функции - это самый простой способ его настройки.

Характеристики

Чтобы включить функцию, используйте SandboxConfig('feature1', 'feature2', ...) или config.enable('feature'). Доступные функции:

  • "Кодеки": codecs модуль
  • "код": compile () builtin, frame.f_locals, frame.f_code а такжеgenerator.gi_code
  • "debug_sandbox": позволяет отобразить трассировку песочницы. Включить функцию трассировки.
  • "Дата и время": datetime модуль
  • "кодировки": модуль кодировок с кодеками ascii, latin_1, utf_8, utf_16_be, utf_32_be и rot_13 (подмодули). Включить функцию кодеков.
  • "выход": sys.exit(), BaseException, KeyboardInterrupt, SystemExit, quit()
  • "будущее": from __future__ import ...
  • "Помогите": pydoc.help()использовать import pydoc вне песочницы, чтобы использовать его. Включить функцию регулярного выражения.
  • "интерпретатор": предоставить доступ к стандартным потокам, включить трассировку. Включите функции кодирования, выхода, сайта, стандартного ввода, стандартного вывода, стандартного отслеживания и отслеживания.
  • "itertools": itertools модуль
  • "Математика": math модуль
  • "Случайный": random модуль. Включить математическую функцию.
  • "регулярное выражение": регулярное выражение компиляции, регулярное выражение поиска, регулярное выражение поиска и т. д. (re модуль)
  • "сайт": разрешить чтение файла лицензии
  • "Стандартный ввод": sys.stdin, input() а также raw_input()
  • "stdout", "stderr": sys.stdout а также sys.stderr
  • "время": time модуль (кроме sleep, strptime а также tzset функции)
  • "traceback": compile () builtin, frame.f_code, Следующие звонки allowModule()добавит имя файла модуля в белый список open(), чтобы Python мог отобразить обратную трассировку с исходным кодом. Эта функция должна быть включена перед всеми остальными функциями.
  • "Unicodedata": unicodedata модуль, необходимый для синтаксиса u \N{ATOM SYMBOL}

CPython ограниченный режим

ВНИМАНИЕ: ограниченный режим CPython небезопасен, поскольку возможно выполнение произвольного байт-кода.

Используйте SandboxConfig(cpython_restricted=True), чтобы включить ограниченный режим CPython. В этом режиме чтение файла и изменение класса блокируются. Некоторые атрибуты скрыты (например, method.__self__), другие только для чтения (например, func.__doc__).

Ограниченный режим CPython по умолчанию отключен. Ограниченный режим несовместим с функцией трассировки SandboxConfig и методом allowPath().

Ограниченный режим больше не существует в Python3, он был удален с помощью модулей bastion и rexec: http://svn.python.org/view?view=rev&revision=55301

Другие опции

  • config.timeout: время ожидания в секундах. Используйте None, чтобы отключить тайм-аут. Значение тайм-аута по умолчанию составляет 5 секунд.
  • config.allowPath(path) позволяет прочитать файл по указанному пути
  • config.allowModule(name, symbol1, symbol2, ...) позволяет импортировать указанный модуль, но дает доступ только к указанным символам

пример

С помощью метода call():

from sandbox import Sandbox

def func(a, b):
    return a + b

sandbox = Sandbox()
print sandbox.call(func, 1, 2)

С помощью метода execute():

from sandbox import Sandbox, SandboxConfig
sandbox = Sandbox(SandboxConfig('stdout'))
sandbox.execute('print("Code executed in the sandbox")')

execute() с локальной переменной:

from sandbox import Sandbox, SandboxConfig
sandbox = Sandbox(SandboxConfig('stdout'))
sandbox.execute('print(data)', locals={'data': [1, 2, 3]})    # ok
sandbox.execute('data.append(4)', locals={'data': [1, 2, 3]}) # error

Объекты переданы .call()globals/locals а также .execute() аргументы проксируются: они заменяются только для чтения представлений объектов.

Ограничения

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

pysandbox не может ограничить память процесса песочницы: вы должны использовать собственную защиту.

Статус

pysanbox протестирован на Python 2.5 и 2.6 на Debian Sid.

Смотрите файл TODO для полного статуса.

Смотрите также

питон

Список рассылки Python-dev

Другой