Django закрыл три уязвимости: вышли 6.0.7 и 5.2.16

7 июля команда Django выпустила внеочередные security-релизы. Из трёх закрытых дыр самая неприятная — отравление общего кеша: ответ с Set-Cookie мог осесть в кеше и уехать другому пользователю.

DB
DBG · по материалам Django Weblog
0

7 июля команда Django выпустила внеочередные security-релизы — 6.0.7 и 5.2.16 (последняя — ветка LTS). Закрыты три уязвимости. Формально все три получили severity low по классификации проекта, но одна из них по природе своей ровно та, которую в проде замечают позже всех и болезненнее всех: отравление кеша.

Речь про CVE-2026-48588. UpdateCacheMiddleware и декоратор cache_page обязаны не класть в общий кеш ответы, которые устанавливают куку и при этом варьируются только по Cookie. Проверка работала — но срабатывала лишь тогда, когда во входящем запросе кук не было вообще. Если у клиента уже болталась любая посторонняя кука (аналитика, баннер о согласии, что угодно), защита не включалась, и ответ с Set-Cookie — например, с сессионной или CSRF-кукой — попадал в общий кеш. Дальше эту запись мог получить кто-то другой.

Вторая — CVE-2026-53877, heap buffer over-read в GDALRaster при обработке растров через виртуальную файловую систему GDAL. Чтение за границей буфера даёт утечку соседней памяти кучи, в редких случаях — segfault. Касается только GeoDjango и только тех, кто скармливает растры из недоверенных источников. Третья — CVE-2026-53878: DomainNameValidator пропускал переводы строки внутри доменного имени, что открывает дорогу к header injection, если такое значение потом подставляется в HTTP-ответ. В самом Django риск минимален: HttpResponse запрещает переводы строки в заголовках, а CharField по умолчанию срезает их ещё на входе. Проблема возникает, когда валидатор дёргают руками, вне форм.

Затронуты ветки main, 6.1 (beta), 6.0 и 5.2. Ветка 4.2 в этот цикл не попала — она уже вне поддержки, и если вы всё ещё на ней, это отдельный разговор.

Что делать. Обновиться: 6.0.x → 6.0.7, 5.2.x → 5.2.16. Но апдейт пакета — это половина работы. Если у вас включён cache_page или UpdateCacheMiddleware на страницах, которые могут выставлять куку (логин-редиректы, любые вьюхи, где по пути дёргается сессия или CSRF-токен), — сбросьте кеш после деплоя: уже отравленные записи новая версия из Redis/Memcached сама не выметет, они будут отдаваться до истечения TTL. Дальше — grep -r "DomainNameValidator" по проекту: если валидатор вызывается напрямую, а не через forms.CharField, добавьте нормализацию входа. И если у вас GeoDjango и GDALRaster открывает файлы, пришедшие от пользователя, — это ровно тот сценарий, ради которого стоит поторопиться с обновлением.

Комментарии