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 открывает файлы, пришедшие от пользователя, — это ровно тот сценарий, ради которого стоит поторопиться с обновлением.
Комментарии