CVE-2024-41991
Django: обработка длинного текста как причина недоступности
Старые версии Django могли слишком долго обрабатывать некоторые тексты с большим числом Unicode-символов при превращении адресов в ссылки. Проверьте фильтры urlize, urlizetrunc и виджет AdminURLFieldWidget, затем обновите приложение.
Кому нужно проверить
Разработчикам комментариев, профилей, сообщений и других страниц на Django, автоматически превращающих текстовые адреса в ссылки; администраторам проектов с соответствующим виджетом административной части. Важна не только марка продукта, но и конкретная версия, способ установки, операционная система и конфигурация.
В чём риск
Сайт может превращать написанный человеком адрес в кликабельную ссылку. Для этого программа разбирает текст. В уязвимой версии определённый очень большой ввод может потребовать чрезмерного времени обработки. Пока рабочий процесс занят, он хуже обслуживает обычные запросы; при достаточной нагрузке часть функций становится недоступной. Unicode — стандарт представления символов разных письменностей, а не признак вредоносности. Ограничивать только кириллицу или запрещать все неанглийские символы бессмысленно: проблема в конкретной обработке и размере входа. Место, где человек ввёл текст, и место, где его позже показывают, могут различаться.
Затронутые версии
Django 4.2 до 4.2.15 и 5.0 до 5.0.8 по записи CVE. Затронуты фильтры шаблонов urlize и urlizetrunc, а также AdminURLFieldWidget при определённых входных данных с очень большим количеством Unicode-символов. Advisory также отмечал разрабатывавшиеся main и 5.1 release candidate. Пользователь должен иметь возможность передать данные в затронутую обработку; для виджета административной части отдельно учитывайте права на ввод и просмотр. Это не утверждение об опасности любого русского текста.
Исправленные версии
Первоначальные исправленные релизы — Django 4.2.15 и 5.0.8; патчи внесены также в main и готовившуюся 5.1. На 26 октября 2026 года ветки 4.2 и 5.0 уже сняты с поддержки. Переходите на поддерживаемую ветку и её актуальный патч, сверяя Python и зависимости с документацией. Исторический исправленный релиз закрывает эту CVE, но не заменяет последующие обновления.
Что сделать
- 1Проверьте Django в окружении сайта. Найдите использование urlize, urlizetrunc и AdminURLFieldWidget и определите, откуда поступает текст. Учтите сохранённые записи: обработка может запускаться позже при просмотре, а не при отправке формы.
- 2Временно ограничьте длину принимаемых значений на сервере до разумного для конкретного поля размера и при необходимости отключите автоматическое создание ссылок. Лимит только в браузере обходится другим клиентом. Ограничение ввода не защищает уже сохранённые длинные записи и не заменяет исправление библиотеки.
- 3Если функцию приходится отключить, выводите текст штатным способом с экранированием HTML, а не как доверенную разметку. Попросите разработчика проверить это изменение. Не заменяйте фильтр самодельным сложным регулярным выражением без анализа: оно тоже может слишком долго работать.
- 4Сделайте резервную копию базы и зафиксируйте версии зависимостей. На тестовой среде установите поддерживаемую исправленную ветку Django. Проверьте обычные русские и другие многоязычные тексты, нормальные ссылки и ожидаемое сообщение об отказе для превышения выбранного лимита. Не воспроизводите истощение ресурсов на рабочем сайте.
- 5Разверните обновление во всех веб-процессах и фоновых обработчиках. При миграции на другую ветку заранее проверьте совместимость Python, расширений и схемы базы. План отката должен учитывать данные и сохранять временное отключение проблемного преобразования, если возвращается старый Django.
- 6После обновления проверьте страницы с сохранёнными сообщениями и административные формы. Сравните время ответа, занятость процессов и ошибки с обычным уровнем. Не включайте пользовательские тексты целиком в диагностические логи. Рост задержек требует расследования, но сам по себе не доказывает именно эту CVE.
Почему показ текста может занять рабочий процесс
Недоверенный текст поступает в форму или хранилище. Занятые процессы задерживают обычные запросы пользователей.
- 1Недоверенный текст поступает в форму или хранилище.
- 2Страница или виджет пытается превратить адреса в ссылки.
- 3Затронутый обработчик слишком долго разбирает определённый большой ввод.
- 4Занятые процессы задерживают обычные запросы пользователей.
Примеры конфигурации и проверки
python -m django --versionДля доверенного виртуального окружения или контейнера проекта с Django и совместимым Python. Запускайте от обычной учётной записи приложения без sudo после выбора правильного окружения. Ожидается номер версии; команда не отправляет текст сайту, не запускает миграции и ничего не меняет, откат не нужен. Если модуль не найден, уточните окружение. Результат не доказывает использование фильтров и не отражает автоматически все уже работающие экземпляры приложения.
Как не подпустить ботов к сайту
BotProtection принимает запросы перед вашим сайтом и фильтрует автоматизированные обращения. Поэтому ботам сложнее добраться до уязвимого компонента и начать его проверять или атаковать, а вероятность успешной автоматизированной атаки становится значительно ниже. Это дополнительный слой защиты: обновление уязвимых компонентов, проверка журналов и реагирование на инциденты остаются обязательными.
Первоисточники
Снизьте шанс атаки до того, как бот дойдёт до сайта
Подключите BotProtection как фильтр перед сайтом: подозрительные автоматизированные запросы отсекаются до обращения к вашему серверу. Это значительно снижает вероятность автоматизированной атаки, но не исправляет саму уязвимость, поэтому обновление и настройка компонентов остаются обязательными.