CVE-2023-28322
libcurl: повторно использованный handle путал PUT и POST
Проверьте приложения с libcurl 7.7–8.0.1, если один и тот же easy handle повторно использовали сначала для PUT с callback чтения, затем для POST с CURLOPT_POSTFIELDS. Библиотека могла неожиданно запросить данные у callback; исправлено в 8.1.0.
Кому нужно проверить
Разработчикам приложений, которые используют libcurl API, callback чтения и повторно используют easy handle между запросами. Важна не только марка продукта, но и конкретная версия, способ установки, операционная система и конфигурация.
В чём риск
При описанной последовательности libcurl могла неожиданно вызвать callback чтения. Это могло привести к неверной работе приложения, отправке не тех данных или использованию уже освобождённой памяти в коде приложения; advisory отмечает эти последствия как возможные сценарии, а не гарантированный результат.
Затронутые версии
Затронут libcurl 7.7–8.0.1 при HTTP(S)-передачах, если один easy handle сначала выполнял PUT с CURLOPT_READFUNCTION, а затем переиспользовался для POST с CURLOPT_POSTFIELDS. Проблема связана с переходом между запросами на уже используемом handle. Проект curl указывает, что командная строка curl не затронута.
Исправленные версии
Исправлено в libcurl 8.1.0. Для системных пакетов проверяйте backport у дистрибутива; приложение с собственной статической libcurl нужно пересобрать.
Что сделать
- 1Найдите места, где приложение повторно использует один CURL easy handle и меняет запрос с PUT на POST. Сверьте порядок вызовов CURLOPT_READFUNCTION, CURLOPT_POSTFIELDS и CURLOPT_POST.
- 2До обновления, если такой переход найден, используйте отдельный handle для разных запросов либо явно задавайте метод POST согласно документации API. Изменение проверьте тестами приложения.
- 3Сохраните текущую сборку и протестируйте обновлённую libcurl на staging с безопасными тестовыми данными.
- 4Обновите до 8.1.0 или пакета с backport; приложения с встроенной библиотекой пересоберите и разверните.
- 5Проверьте, что тесты подтверждают метод и тело каждого запроса, а приложение не обращается к уже освобождённым данным. Сохраните откат на проверенную сборку.
Последовательность, при которой путались методы
Важно повторное использование одного handle и переход от PUT с callback к POSTFIELDS.
- 1Handle отправляет PUT, используя callback для чтения тела.
- 2Приложение повторно использует тот же handle.
- 3Приложение задаёт POSTFIELDS для следующей передачи.
- 4Уязвимая libcurl неожиданно вызывает старый callback.
Примеры конфигурации и проверки
curl -q --versionRead-only команда для терминала Linux/macOS. Она показывает версию CLI и сведения о связанной с ним libcurl без sudo и без подключения к сети. Она не может подтвердить версию библиотеки, встроенной в другое приложение; для этого изучите его зависимости или запросите сведения у сборщика. Ничего не меняется, откат не нужен.
Как не подпустить ботов к сайту
BotProtection принимает запросы перед вашим сайтом и фильтрует автоматизированные обращения. Поэтому ботам сложнее добраться до уязвимого компонента и начать его проверять или атаковать, а вероятность успешной автоматизированной атаки становится значительно ниже. Это дополнительный слой защиты: обновление уязвимых компонентов, проверка журналов и реагирование на инциденты остаются обязательными.
Первоисточники
Снизьте шанс атаки до того, как бот дойдёт до сайта
Подключите BotProtection как фильтр перед сайтом: подозрительные автоматизированные запросы отсекаются до обращения к вашему серверу. Это значительно снижает вероятность автоматизированной атаки, но не исправляет саму уязвимость, поэтому обновление и настройка компонентов остаются обязательными.