Описание тега pysandbox
Веб-сайт: 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 для полного статуса.
Смотрите также
питон
- http://wiki.python.org/moin/SandboxedPython
- патчи tav CPython: http://codereview.appspot.com/20051 http://codereview.appspot.com/21043
- безопасный *.py в plexnet http://github.com/tav/plexnet/tree/master/source/plexnet/util
- Безопасность в Python Wiki: http://wiki.python.org/moin/Security
- safelite.py: http://tav.espians.com/a-challenge-to-break-python-security.html
- Безопасность Zope: http://pypi.python.org/pypi/RestrictedPython http://svn.zope.org/zope.security/trunk/src/zope/security/
- Режим заражения Python: http://www.cats-muvva.net/software/
- Управление доступом к ресурсам в интерпретаторе Python: http://www.cs.ubc.ca/~drifty/papers/python_security.pdf
- Песочница PyPy: http://codespeak.net/pypy/dist/pypy/doc/sandbox.html
- mxProxy: http://www.egenix.com/products/python/mxBase/mxProxy/
- Python 2.3: рексек и бастион
Список рассылки Python-dev
- "Тюрьма Питона: белый список против черного списка" Виктор Стиннер, вторник, 24 февраля 13:50:40 CET 2009 http://mail.python.org/pipermail/python-dev/2009-February/086444.html February/086444.html
- "Вызов: пожалуйста, сломай это!" tav, понедельник, 23 февраля 23:41:30 CET 2009 http://mail.python.org/pipermail/python-dev/2009-February/086401.html February/086401.html http://mail.python.org/pipermail/python-dev /2009- февраль/086413.html http://mail.python.org/pipermail/python-dev/2009-February/086439.html февраля/086439.html
- "Оживление ограниченного режима?" Гвидо ван Россум, вс 22 февраля 17:45:27 CET 2009 http://mail.python.org/pipermail/python-dev/2009-February/086352.html февраля/086352.html
- "возможность объекта; func_closure; подклассы" тав, чт 28 июня 03:04:42 CEST 2007 http://mail.python.org/pipermail/python-dev/2007-June/073724.html
- "Возможности" Гвидо ван Россум, пт, 07 марта 2003 г. 12:41:16 -0500 http://mail.python.org/pipermail/python-dev/2003-March/033820.html http: //mail.python. org / pipermail / python-dev / 2003-March / 033854.html... (читать весь архив за март и апрель 2003 года)
Другой
- http://lua-users.org/wiki/SandBoxes
- "Финансовые инструменты на основе возможностей" Марк С. Миллер, Чип Морнингстар и Билл Франц, 2000 г. http://www.erights.org/elib/capability/ode/index.html