Перапаўненне буфера ў 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

Дадаць каментар