Примечания к выпуску Django 1.4.3

Декабрь 10, 2012

В Django 1.4.3 решены две проблемы безопасности, присутствовавшие в предыдущих выпусках Django серии 1.4.

Пожалуйста, обратите внимание, что этот выпуск безопасности несколько отличается от предыдущих. Обе проблемы, рассматриваемые здесь, были решены в предыдущих обновлениях безопасности Django. В одном случае мы получали постоянные сообщения о проблемах, а в другом мы решили предпринять дальнейшие шаги по ужесточению кода Django в ответ на независимое обнаружение потенциальных проблем из нескольких источников.

Отравление заголовка хоста

Несколько предыдущих выпусков безопасности Django были посвящены проблеме отравления заголовка HTTP Host, что заставляло Django генерировать URL, указывающие на произвольные, потенциально вредоносные домены.

В ответ на дальнейшее получение информации и сообщений о продолжающихся проблемах после предыдущего выпуска, мы предпринимаем дополнительные шаги по ужесточению проверки заголовков Host. Вместо того, чтобы пытаться учесть все функции, поддерживаемые HTTP, проверка заголовка Host в Django пытается поддерживать меньшее, но гораздо более распространенное подмножество:

  • Имена хостов должны состоять из символов [A-Za-z0-9] плюс дефис („-“) или точка („.“).
  • IP-адреса - как IPv4, так и IPv6 - разрешены.
  • Порт, если указан, имеет числовое значение.

Любое отклонение от этого будет отвергнуто, вызывая исключение django.core.exceptions.SuspiciousOperation.

Отравление перенаправления

Также в продолжение предыдущего вопроса: в июле этого года мы внесли изменения в классы HTTP-перенаправления Django, выполнив дополнительную проверку схемы URL для перенаправления (поскольку, как в собственных приложениях Django, так и во многих сторонних приложениях, принятие пользовательской цели перенаправления является распространенным шаблоном).

С тех пор два независимых аудита кода выявили дополнительные потенциальные проблемы. Поэтому, как и в случае с заголовком Host, мы предпринимаем шаги по обеспечению более жесткой валидации в ответ на сообщения о проблемах (в первую очередь со сторонними приложениями, но в некоторой степени и в самом Django). Это происходит в двух частях:

1. A new utility function, django.utils.http.is_safe_url, is added; this function takes a URL and a hostname, and checks that the URL is either relative, or if absolute matches the supplied hostname. This function is intended for use whenever user-supplied redirect targets are accepted, to ensure that such redirects cannot lead to arbitrary third-party sites.

2. All of Django’s own built-in views – primarily in the authentication system – which allow user-supplied redirect targets now use is_safe_url to validate the supplied URL.

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