8 сентября 2010 года разработчики Django выпустили релиз 1.2.2 чтобы закрыть уязвимости, позволяющие злоумышленникам устраивать XSS-атаки. По злой иронии, уязвимость к XSS оказалась в коде системы, выполняющем защиту от другого типа атак – CSRF. Система эта принципиально изменилась в версии 1.2 (в предыдущих версиях защита от CSRF не являлась частью ядра фреймворка и была всего лишь подключаемым слоем).
Теперь собственно об уязвимости: как оказалось, шаблонный тег
Можно вручную применить патч или посмотреть diff, чтобы лучше понять суть уязвимости.
P.S. странно, что за почти сутки на новость не обратили особого внимания, хотя некоторые среагировали оперативно
Суть
Защита от CSRF работает по следующему принципу: генерируется случайная последовательность (токен), которая вставляется в hidden-поле формы и та же последовательность записывается в специальную cookie. При отправке формы значения скрытого поля и cookie сравниваются и, если эти значения совпали, считается, что форма была заполнена достоверным пользователем.Теперь собственно об уязвимости: как оказалось, шаблонный тег
{% csrf_token %}
, используемый для вставки HTML-кода скрытого поля в код формы, безоговорочно доверяет значению токена и вставляет его, не экранируя. Значение же токена берётся из cookie. Таким образом, атакующий потенциально может подделать cookie и внедрить в его значение HTML-код, внедрив его тем самым на страницу.Уязвимые версии
- Текущая trunk-версия
- Django 1.2.x
Решение проблемы
Разработчики предлагают всем пользователям ветки 1.2 немедленно обновиться до 1.2.2 и отмечают, что они не делали предварительных уведомлений.Можно вручную применить патч или посмотреть diff, чтобы лучше понять суть уязвимости.
См. также
- Security release issued — оригинальный текст релиза (собственно, этот топик — его очень вольный перевод)
- Подделка межсайтовых запросов (CSRF)
- Межсайтовый скриптинг (XSS)
P.S. странно, что за почти сутки на новость не обратили особого внимания, хотя некоторые среагировали оперативно