Примечания к выпуску Django 1.5.3¶
10 сентября 2013
Это Django 1.5.3, третий релиз в серии Django 1.5. В нем решена одна проблема безопасности, а также содержится функция opt-in для повышения безопасности django.contrib.sessions
.
Уязвимость обхода каталога в теге шаблона ssi
¶
В предыдущих версиях Django можно было обойти настройку ALLOWED_INCLUDE_ROOTS
, используемую для безопасности с тегом шаблона ssi
, указав относительный путь, начинающийся с одного из разрешенных корней. Например, если ALLOWED_INCLUDE_ROOTS = ("/var/www",)
, то можно было бы сделать следующее:
{% ssi "/var/www/../../etc/passwd" %}
На практике это не очень распространенная проблема, поскольку это потребовало бы от автора шаблона поместить файл ssi
в переменную, контролируемую пользователем, но в принципе это возможно.
Устранение уязвимости удаленного выполнения кода в django.contrib.sessions
¶
django.contrib.sessions
в настоящее время использует pickle
для сериализации данных сессии перед сохранением их в бэкенде. Если вы используете signed cookie session backend и SECRET_KEY
известно злоумышленнику (в Django нет врожденной уязвимости, которая могла бы привести к утечке), то злоумышленник может вставить в сессию строку, которая, будучи распакованной, выполнит произвольный код на сервере. Техника для этого проста и легко доступна в интернете. Хотя хранилище сессий cookie подписывает данные, хранящиеся в cookie, чтобы предотвратить подделку, утечка SECRET_KEY
немедленно перерастает в уязвимость удаленного выполнения кода.
Эту атаку можно предотвратить, если сериализовать данные сессии с помощью JSON, а не pickle
. Для этого в Django 1.5.3 появилась новая настройка SESSION_SERIALIZER
для настройки формата сериализации сессий. Для обратной совместимости эта настройка по умолчанию использует pickle
. Хотя сериализация JSON не поддерживает все объекты Python, как это делает pickle
, мы настоятельно рекомендуем перейти на JSON-сериализацию значений. Кроме того, поскольку JSON требует строковых ключей, вы можете столкнуться с проблемами, если используете нестроковые ключи в request.session
. Более подробную информацию смотрите в документации Сериализация сеанса.