Препълване на буфера в curl и libcurl, проявяващо се при достъп през SOCKS5 прокси

В инструментите за получаване и изпращане на данни по мрежата curl и съпровождащата библиотека libcurl е открито уязвимост (CVE-2023-38545), което може да доведе до препълване на буфера и потенциално до изпълнение на код от страна на атакуващия, когато се свързва чрез инструмента curl или приложение, използващо libcurl, към HTTPS-сървър, контролиран от злонамерен потребител. Проблемът се проявява само при активиран SOCKS5 прокси в curl. При директно свързване без прокси уязвимостта не се проявява. Уязвимостта е отстранена в версия 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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster