В утилитата за получаване и изпращане на данни по мрежата 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".
Даниел Стенберг (Daniel Stenberg), автор на проекта, спомена, че уязвимостта е останала незабелязана в продължение на 1315 дни. Също така е посочено, че 41% от преди откритите уязвимости в curl вероятно е можело да бъдат избегнати, ако curl бе написан на език, осигуряващ безопасна работа с паметта, но не се планира презаписването на curl на друг език в обозримо бъдеще. Като мерки за повишаване на безопасността на кодовата база се предлага разширяване на инструментариума за тестване на кода и по-активно използване на зависимости, написани на програмни езици, осигуряващи безопасна работа с паметта. Също така се разглежда възможността за поетапна замяна на части от curl с варианти, написани на безопасни езици, като експерименталният HTTP-бекенд Hyper, реализиран на езика Rust.
Източник: opennet.ru
