CVE-2023-23916
curl: многократное сжатие HTTP-ответа могло исчерпать память клиента
Проверьте загрузчики с curl/libcurl 7.57.0–7.87.0 и поддержкой сжатия gzip, brotli или zstd. Несколько заголовков ответа позволяли обойти общий предел этапов распаковки и увеличить расход памяти; исправлено в 7.88.0.
Кому нужно проверить
Владельцам загрузчиков файлов, проверки ссылок, мониторинга сайтов и фоновых интеграций, которые получают ответы внешних серверов через curl/libcurl. Важна не только марка продукта, но и конкретная версия, способ установки, операционная система и конфигурация.
В чём риск
Сжатие уменьшает данные при передаче, а распаковка снова увеличивает их в памяти. Ответ может иметь несколько слоёв сжатия. Старая libcurl считала предел отдельно для каждого заголовка, поэтому множество заголовков позволяло создать слишком длинную цепочку. Клиент мог израсходовать большой объём памяти или завершить запрос с ошибкой нехватки памяти. Это атака на принимающую программу; из описания не следует выполнение кода на ней или взлом отправляющего сервера.
Затронутые версии
Затронуты curl/libcurl 7.57.0–7.87.0, собранные хотя бы с одним алгоритмом gzip, brotli или zstd. Сервер мог задать много этапов распаковки через несколько Content-Encoding или Transfer-Encoding. Advisory относит ошибку ко всем версиям HTTP и уточняет: хотя автоматическая распаковка содержимого обычно включается отдельно, путь через Transfer-Encoding достижим и с настройками по умолчанию.
Исправленные версии
Исправлено в curl/libcurl 7.88.0: общий предел цепочки — пять алгоритмов независимо от количества заголовков. Это исторический первый исправленный релиз; устанавливайте поддерживаемый пакет с исправлением, включая подтверждённый backport поставщика в старую ветку.
Что сделать
- 1Найдите программы, которые загружают внешние HTTP-ответы, и уточните версию их libcurl и поддержку сжатия. Особенно проверьте сервисы, принимающие адрес загрузки от пользователей.
- 2Не считайте отсутствие --compressed достаточным доказательством безопасности: advisory отдельно описывает достижимость через Transfer-Encoding. Не воспроизводите расход памяти на рабочем сервере.
- 3Сохраните сборку и настройки заданий. Проверьте обновление на отдельном окружении с обычными небольшими сжатыми ответами и убедитесь, что ошибки загрузки обрабатываются корректно.
- 4Установите поддерживаемую версию с исправлением CVE-2023-23916. Если приложение содержит собственную libcurl, обновите его у поставщика либо пересоберите и перезапустите использующие библиотеку процессы.
- 5До обновления по возможности приостановите загрузки с недоверенных адресов и используйте штатные ограничения ресурсов процесса. Это дополнительное снижение риска, а не подтверждённое исправление цепочки распаковки. Остановка заданий влияет на бизнес-процесс и требует согласованного расписания.
- 6После развертывания проверьте память процесса, успешность фоновых заданий и обработку ошибок. Держите готовым откат приложения и настроек; при возврате уязвимой сборки оставьте недоверенные загрузки ограниченными.
Почему предел на один заголовок оказался недостаточным
Статичная схема заменяет демонстрацию опасного ответа: она показывает порядок действий без нагрузки на память. Все этапы выражены текстом, движение и отдельный reduced-motion вариант не требуются.
- 1Внешний сервер формирует многократно сжатый ответ.
- 2Он указывает этапы сжатия в нескольких заголовках.
- 3Старая libcurl применяет предел к каждому заголовку отдельно.
- 4Слишком длинная распаковка расходует память клиента.
- 5Исправленная версия считает общий предел для всей цепочки.
Примеры конфигурации и проверки
curl -q --versionТерминал Linux/macOS с установленным curl, без sudo. Ожидается локальный вывод версий и возможностей: сведения о zlib, brotli или zstd помогают уточнить поддержку сжатия конкретной сборки. Сетевого запроса, распаковки входных данных и изменения файлов нет; откат не нужен. Вывод относится только к этому CLI, не доказывает версию библиотеки другого приложения и не показывает backport-патчи. Отсутствие отдельного названия в выводе интерпретируйте по документации сборки.
Как не подпустить ботов к сайту
BotProtection принимает запросы перед вашим сайтом и фильтрует автоматизированные обращения. Поэтому ботам сложнее добраться до уязвимого компонента и начать его проверять или атаковать, а вероятность успешной автоматизированной атаки становится значительно ниже. Это дополнительный слой защиты: обновление уязвимых компонентов, проверка журналов и реагирование на инциденты остаются обязательными.
Первоисточники
Снизьте шанс атаки до того, как бот дойдёт до сайта
Подключите BotProtection как фильтр перед сайтом: подозрительные автоматизированные запросы отсекаются до обращения к вашему серверу. Это значительно снижает вероятность автоматизированной атаки, но не исправляет саму уязвимость, поэтому обновление и настройка компонентов остаются обязательными.