Дэниел Стенберг (автор проекта cURL) недавно объявлено через сообщение в блоге, информацию о уязвимость, обнаруженная в утилита для получения и отправки данных по сети Curl и библиотека libcurl.
Упоминается, что уязвимость (уже занесенная в каталог CVE-2023-38545) связано с ошибкой в коде разрешения имени хоста перед доступом к прокси SOCKS5.
SOCKS5 — это прокси-протокол. Это достаточно простой протокол настройки сетевого взаимодействия через выделенный «брокер». Например, протокол обычно используется при настройке связи через Tor, а также для доступа в Интернет организаций и компаний.
SOCKS5 имеет два разных режима разрешения имен хостов. Либо клиент разрешает имя хоста локально и передает пункт назначения в качестве разрешенного адреса, либо клиент передает полное имя хоста прокси-серверу и позволяет прокси-серверу удаленно разрешать хост.
Как таковой провал может вызвать переполнение буфера и потенциальное выполнение клиентского кода злоумышленника при доступе к HTTPS-серверу, контролируемому злоумышленником, через утилиту Curl или приложение, использующее libcurl. но проблема присутствует только при доступе через прокси SOCKS5 включен в Curl. При прямом доступе без прокси уязвимость не проявляется.
Владелец сайта, доступ к которому осуществляется через прокси-сервер SOCKS5, имеет возможность:
Вызовите переполнение буфера на стороне клиента, вернув код перенаправления запроса (HTTP 30x) и установив в заголовке Location: URL-адрес с именем хоста, размер которого варьируется от 16 до 64 КБ (16 КБ — максимальный размер). Минимальный требуемый размер. для переполнения выделенного буфера, а 65 КБ — это максимально допустимая длина имени хоста в URL-адресе).
Если в конфигурации libcurl включено перенаправление запросов и используемый прокси SOCKS5 достаточно медленный, то длинное имя хоста будет записано в небольшой буфер, очевидно, меньшего размера.
В своем блоге, Дэниел Стенберг отметил, что уязвимость оставалась незамеченной в течение 1315 дней.. В нем также говорится, что 41% ранее выявленных уязвимостей в Curl, вероятно, можно было бы избежать, если бы Curl был написан на языке, безопасном для памяти, но в обозримом будущем не планируется переписывать Curl на другом языке.
Уязвимость в первую очередь затрагивает приложения на базе libcurl. и появляется в утилите Curl только при использовании опции «-limit-rate» со значением меньше 65541, так как libcurl выделяет буфер размером 16 КБ по умолчанию и 100 КБ в Curl, но этот размер меняется в зависимости от значения параметра Параметр «–limit-rate».
Упоминается, что если имя хоста имеет длину до 256 символов, то Curl немедленно передает имя прокси-серверу SOCKS5 для разрешения, а если имя превышает 255 символов, он переключается на локальный преобразователь и передает уже определенный адрес SOCKS5. . Из-за ошибки в коде флаг, указывающий на необходимость локального разрешения, мог быть установлен на неправильное значение во время медленного согласования соединения через SOCKS5, что приводило к записи длинного имени хоста в буфер, назначенный с расчетом на сохранение IP-адреса. адрес или имя, не превышающее 255 символов.
Наконец, упоминается, что уязвимость исправлена в версии Curl 8.4.0 а в качестве мер по повышению безопасности кодовой базы предлагается расширить инструменты тестирования кода и более активно использовать зависимости, написанные на языках программирования, гарантирующих безопасную работу с памятью. Также рассматривается возможность постепенной замены частей curl опциями, написанными на безопасных языках, такими как экспериментальный бэкэнд Hyper HTTP, реализованный на Rust.
Если вы интересно узнать об этом больше, вы можете проверить подробности По следующей ссылке.