Переполнение буфера в curl и libcurl, проявляющееся при обращении через SOCKS5-прокси

В утилите для получения и отправки данных по сети curl и развивающейся параллельно библиотеке libcurl выявлена уязвимость (CVE-2023-38545), которая может привести к переполнению буфера и потенциально к выполнению кода атакующего на стороне клиента при обращении при помощи утилиты curl или приложения, использующего libcurl, к HTTPS-серверу, подконтрольному злоумышленнику. Проблема проявляется только в случае включения в curl доступа через прокси SOCKS5. При прямом обращении без прокси уязвимость не проявляется. Уязвимость устранена в выпуске curl 8.4.0. Выявивший ошибку исследователь безопасности получил вознаграждение, размером $4660 в рамках инициативы Internet Bug Bounty на Hackerone.

Уязвимость вызвана ошибкой в коде резолвинга имени хоста перед обращением к SOCKS5-прокси. При длине имени хоста до 256 символов curl сразу передаёт имя в SOCKS5-прокси для резолвинга на его стороне, а если имя больше 255 символов переключается на локальный резолвер и передаёт в SOCKS5 уже определённый адрес. Из-за ошибки в коде, флаг, указывающий на необходимость локального резолвинга, в процессе медленного согласования соединения через SOCKS5 мог быть выставлен не в то значение, что приводило к записи длинного имени хоста в буфер, выделенный с расчётом на сохранение IP-адреса или имени, не превышающего 255 символов.

Владелец сайта, к которому curl обращается через SOCKS5-прокси, может инициировать переполнение буфера на стороне клиента, вернув в ответ код перенаправления запроса (HTTP 30x) и выставив в заголовке “Location:” URL с именем хоста, размер которого находится в диапазоне от 16 до 64 КБ (значение 16 КБ обусловлено минимальным размером, необходимым для переполнения выделенного буфера, а значение 65 КБ связано с максимально разрешённой длиной имени хоста в URL). Если в настройках libcurl разрешено перенаправление запросов и используемый SOCKS5-прокси достаточно медленный, то имя длинное хоста будет записано в небольшой буфер, заведомо меньшего размера.

Уязвимость в основном затрагивает приложения на базе libcurl и проявляется в утилите curl только при использовании опции “–limit-rate” со значением, меньше 65541 – в libcurl по умолчанию выделяется буфер, размером 16 КБ, а в утилите curl – 100 КБ, но
этот размер меняется в зависимости от значения параметра “–limit-rate”.

Release. Ссылка here.