Сегодня команда Django выпустила несколько релизов -- Django 1.4.7 и Django 1.5.3 и Django 1.6 beta 3 -- для исправления дыр в безопасности, о которых нам сообщили. Релизы доступны через PyPi или на нашей странице.
Эти релизы исправляют уязвимость "directory-traversal" в одном из встроенных шаблонных тегов. Несмотря на то, что эксплуатация данной уязвимости требует крайне специфических условий, мы рекомендуем всем пользователям Django немедленно обновиться.
Подробности далее.
Проблема: возможен обратный путь в теге ssi
Шаблонная система Django обладает двумя методами подключения и рендеринга одного шаблона в другом:
- Тег {% include %} принимает имя шаблона и использует стандартный механизм загрузки шаблона, который ограничен каталогами, указанными в параметре конфигурации.
- Тег {% ssi %} принимает путь до файла и подключает содержимое этого файла (возможен его парсинг и рендеринг как шаблона).
Так как тег ssi не ограничен настройками параметра конфигурации TEMPLATE_DIRS, он приводит к риску нарушения безопасности. Необходимо использовать параметр конфигурации ALLOWED_INCLUDE_ROOTS, который определяет каталоги файловой системы, в которых данный тег может читать файлы.
Отчёт об этой проблеме был получен и подтверждён командой Django, показав, что обработка содержимого ALLOWED_INCLUDE_ROOTS может позволить атаку "directory-traversal" через указание абсолютного пути из разрешённого каталога с использованием относительных путей для преодоления наложенного ограничения. Таким образом, если каталог /var/includes разрешён в ALLOWED_INCLUDE_ROOTS, следующий пример бы сработал:
{% ssi '/var/includes/../../etc/passwd' %}
Эта строка подключила бы содержимое файла /etc/passwd в шаблон.
Следует отметить, для осуществления такой атаки необходимы следующие условия:
- Атакуемый сайт должен содержать шаблоны, которые используют ssi тег и использовать пользовательский ввод в качестве аргумента тега ssi, или
- Атакующий имеет возможность изменять шаблоны на сайте.
Для решения этой проблемы, тег ssi теперь использует стандартную функцию os.path.abspath для определения абсолютного пути к файлу и проверяет, что нужный файл располагается в каталоге, который указан в параметре конфигурации ALLOWED_INCLUDE_ROOTS.
Спасибо Rainer Koirikivi за уведомление нас об этой проблеме.
Версии, которые надо обновить
- Главная ветка разработки Django;
- Django 1.6 (бета версия в настоящее время);
- Django 1.5;
- Django 1.4.
Для всех этих версий Django используйте CVE-2013-4315 для ссылки на эту проблему.
Решение
На код Django были наложены патчи, во все указанные выше ветки. Каждый патч можно посмотреть:
Были выпущены следующие релизы:
- Django 1.6 beta 3 (скачать Django 1.6b3 | 1.6b3 хэш);
- Django 1.5.3 (скачать Django 1.5.3 | 1.5.3 хэш)
- Django 1.4.7 (скачать Django 1.4.7 | 1.4.7 хэш)
Важные замечания относительно уведомлений о проблемах с безопасностью
Как всегда, мы просим, чтобы информация о потенциальных проблемах с безопасностью передавалась через электронную почту на адрес security@djangoproject.com, а не через систему багтрекинга Django или рассылку разработчиков. Пожалуйста, ознакомьтесь с нашей политикой безопасности для дополнительной информации.
0 comments | Make a comment