Переполнение буфера в 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».

Дэниел Cтенберг (Daniel Stenberg), автор проекта, упомянул, что уязвимость оставалась незамеченной в течении 1315 дней. Также сказано, что 41% от ранее выявленных в curl уязвимостей вероятно удалось бы избежать, если бы curl был написан на языке, обеспечивающем безопасную работу с памятью, но переписывать curl на другой язык в обозримом будущем не планируется. В качестве мер для повышения безопасности кодовой базы предлагается расширить инструментарий для тестирования кода и более активно использовать зависимости, написанные на языках программирования, обеспечивающих безопасную работу с памятью. Также рассматривается возможность поэтапной замены частей curl на варианты, написанные на безопасных языках, такие как экспериментальный HTTP-бэкенд Hyper, реализованный на языке Rust.

Источник: opennet.ru

Добавить комментарий