Примечания к выпуску 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. Более подробную информацию смотрите в документации Сериализация сеанса.

Вернуться на верх