Все уязвимости

CVE-2024-41989

Django floatformat: короткая запись числа может занять много памяти

В старом Django фильтр floatformat мог израсходовать много памяти при обработке числа в научной записи с большой степенью. Проверьте вывод пользовательских чисел и обновите Django; одного ограничения длины строки недостаточно.

Проверено 26 октября 2026Moderate по политике безопасности Django. Производитель подтверждает значительное потребление памяти; это не сообщение о выполнении кода или о краже данных.

Кому нужно проверить

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

В чём риск

Научная запись позволяет выразить большое число короткой строкой: небольшое значение умножается на десять в некоторой степени. Когда сайт превращает такую запись в обычный вид для человека, результат может требовать намного больше памяти, чем исходный текст. В уязвимом floatformat определённый большой показатель степени вызывал значительное потребление памяти. Процесс может перестать обслуживать запросы или быть остановлен системой при нехватке памяти; масштаб зависит от лимитов и устройства сервиса. Это объясняет, почему лимит количества введённых символов сам по себе не решает проблему: важен числовой смысл записи.

Затронутые версии

Django 4.2 до 4.2.15 и 5.0 до 5.0.8. Затронут фильтр шаблонов floatformat при получении строкового представления числа в научной записи с большим показателем степени. Advisory также перечислял ветки разработки main и 5.1, которая тогда была release candidate. Для применимости нужно установить, может ли недоверенное значение достичь этого фильтра. Простое наличие числовых полей или использование Django не подтверждает этот путь.

Исправленные версии

Исправленные исторические релизы — Django 4.2.15 и 5.0.8, с патчами также в main и 5.1. На дату редакционной проверки 4.2 и 5.0 уже не поддерживаются. Обновляйте проект до актуального патча поддерживаемой ветки с учётом совместимости Python, библиотек и приложения. Если поставщик сопровождает собственную сборку, запросите подтверждение переноса исправления именно этой CVE.

Что сделать

  1. 1Проверьте Django в каждом окружении приложения. Найдите шаблоны и код с floatformat, затем определите происхождение передаваемых значений: форма, импорт, база или внешний сервис. Сохранённое ранее значение тоже может попасть в обработку при открытии отчёта.
  2. 2До обновления задайте на сервере допустимый числовой диапазон и точность для конкретной задачи, например суммы заказа или измерения. Проверку должен реализовать разработчик до форматирования; один предел длины строки недостаточен. При необходимости временно отключите вывод затронутого поля. Это снижение риска, а не замена патчу.
  3. 3Не проверяйте проблему огромными степенями на рабочем сервере. Для функциональной проверки используйте обычные допустимые значения, границы выбранного бизнес-диапазона и корректный отказ за этими границами, не вызывающий ресурсоёмкого форматирования.
  4. 4Создайте резервную копию базы и зафиксируйте зависимости. На тестовой среде перейдите на поддерживаемую исправленную ветку Django. Проверьте отображение сумм, округление, десятичный разделитель и экспорт отчётов: обновление не должно незаметно менять важные для пользователей числа.
  5. 5Подготовьте план восстановления приложения и базы, если переход требует миграций. Разверните обновление и перезапустите веб-процессы и фоновые задания. При откате на уязвимую версию сохраняйте ограничения числовых значений или отключение проблемного вывода.
  6. 6После обновления проверьте фактические версии экземпляров приложения, расход памяти и обычные отчёты. Отдельно убедитесь, что ограничения чисел действуют на сервере для всех путей поступления данных. Не публикуйте реальные финансовые или персональные данные в диагностике; отсутствие прежних аварий не заменяет проверку применимости.

Размер записи и размер результата — не одно и то же

Внешний источник передаёт короткую научную запись числа. Исправление и проверка допустимого диапазона защищают обработку.

  1. 1Внешний источник передаёт короткую научную запись числа.
  2. 2Большая степень означает очень большое числовое значение.
  3. 3Уязвимый фильтр пытается подготовить его вывод и расходует память.
  4. 4Исправление и проверка допустимого диапазона защищают обработку.

Примеры конфигурации и проверки

Узнать версию без запуска форматирования числа (shell)
python -m django --version

Выполняйте в доверенном окружении проекта с установленным Django и совместимым Python, обычным пользователем без sudo. Выберите тот виртуальный environment или контейнер, из которого запускается приложение. Ожидается версия Django; отсутствие модуля требует уточнить окружение. Команда не форматирует числа, не обращается к базе и ничего не меняет, откат не нужен. Она не показывает пути вызова floatformat и не заменяет проверку версии уже работающих процессов.

Как не подпустить ботов к сайту

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

Первоисточники

Снизьте шанс атаки до того, как бот дойдёт до сайта

Подключите BotProtection как фильтр перед сайтом: подозрительные автоматизированные запросы отсекаются до обращения к вашему серверу. Это значительно снижает вероятность автоматизированной атаки, но не исправляет саму уязвимость, поэтому обновление и настройка компонентов остаются обязательными.