Уязвимост (CVE-2023-38545) е открита в curl, помощна програма за изпращане и получаване на данни по мрежата, и в библиотеката libcurl, която се разработва паралелно. Тази уязвимост може да доведе до препълване на буфера и потенциално до изпълнение на код от страна на клиента при достъп до контролиран от хакер HTTPS сървър, използвайки curl или приложение, базирано на libcurl. Проблемът се проявява само когато 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 KB. (Стойността от 16 KB се определя от минималния размер, необходим за препълване на разпределения буфер, а стойността от 65 KB е свързана с максимално разрешената дължина на името на хоста в URL адрес.) Ако пренасочването е активирано в настройките на libcurl и използваният SOCKS5 прокси е достатъчно бавен, дългото име на хоста ще бъде записано в по-малък, очевидно по-малък буфер.
Уязвимостта засяга предимно приложения, базирани на libcurl, и се проявява в помощната програма curl само когато опцията "--limit-rate" се използва със стойност по-малка от 65541 - libcurl заделя буфер от 16 KB по подразбиране, докато помощната програма curl заделя 100 KB, но този размер се променя в зависимост от стойността на параметъра "--limit-rate".
Даниел Стенберг, авторът на проекта, отбеляза, че уязвимостта е останала неоткрита в продължение на 1315 дни. Той също така заяви, че 41% от идентифицираните по-рано уязвимости в curl вероятно биха могли да бъдат избегнати, ако curl беше написан на език, безопасен за паметта, но няма планове за пренаписване на curl на друг език в обозримо бъдеще. Мерките за подобряване на сигурността на кодовата база включват разширяване на инструментите за тестване на код и по-широко използване на зависимости, написани на езици, безопасни за паметта. Обмисля се и постепенна замяна на части от curl с варианти, написани на езици, безопасни за паметта, като например експерименталния Hyper HTTP backend, реализиран в Rust.
Източник: opennet.ru
