Přetečení bufferu v curl a libcurl, které se projevuje při používání přes SOCKS5 proxy

V nástroji pro příjem a odesílání dat přes síť curl a v paralelně se vyvíjející knihovně libcurl byla zjištěna zranitelnost (CVE-2023-38545), která může vést k přetečení vyrovnávací paměti a potenciálně k provedení kódu útočníka na straně klienta, když se nástroj curl nebo aplikace používající libcurl pokusí připojit k HTTPS serveru pod kontrolou útočníka. Problém se projevuje pouze při aktivovaném přístupu přes SOCKS5 proxy. Při přímém přístupu bez proxy se zranitelnost neprojevuje. Zranitelnost byla odstraněna ve verzi curl 8.4.0. Bezpečnostní výzkumník, který chybu objevil, obdržel odměnu ve výši 4660 $ v rámci iniciativy Internet Bug Bounty na Hackerone.

Zranitelnost je způsobena chybou v kódu při řešení názvu hostitele před připojením k SOCKS5 proxy. Při délce názvu hostitele do 256 znaků curl okamžitě předá název SOCKS5 proxy k řešení na její straně, zatímco pokud je název delší než 255 znaků, přepne na místní resolver a předá SOCKS5 již určenou adresu. V důsledku chyby v kódu mohl být flag označující potřebu místního řešení ve fázi pomalého vyjednávání spojení přes SOCKS5 nastaven na nesprávnou hodnotu, což vedlo k zápisu dlouhého názvu hostitele do vyrovnávací paměti určené pro uchování IP adres nebo názvu, který nepřesahuje 255 znaků.

Majitel webové stránky, ke které se curl připojuje přes SOCKS5 proxy, může iniciovat přetečení vyrovnávací paměti na straně klienta tím, že vrátí kód přesměrování požadavku (HTTP 30x) a nastaví v hlavičce "Location:" URL s názvem hostitele o velikosti mezi 16 a 64 KB (hodnota 16 KB je dána minimální velikostí potřebnou pro přetečení vyrovnávací paměti, a hodnota 65 KB souvisí s maximálně povolenou délkou názvu hostitele v URL). Pokud jsou v nastaveních libcurl povolena přesměrování požadavků a používaná SOCKS5 proxy je dostatečně pomalá, pak bude dlouhý název hostitele zapsán do malého vyrovnávací paměti, která je záměrně menší.

Zranitelnost se převážně dotýká aplikací založených na libcurl a projevuje se v nástroji curl pouze při použití volby "—limit-rate" s hodnotou menší než 65541 — v libcurl se standardně vyhradí vyrovnávací paměť o velikosti 16 KB, zatímco v nástroji curl — 100 KB, avšak tato velikost se mění v závislosti na hodnotě parametru "—limit-rate".

Daniel Stenberg, autor projektu, zmínil, že zranitelnost zůstávala nepovšimnuta po dobu 1315 dní. Také bylo uvedeno, že 41 % dříve zjištěných zranitelností v curl by pravděpodobně bylo možné se vyhnout, pokud by byl curl napsán v jazyce, který zajišťuje bezpečné práce s pamětí, ale přepsání curl do jiného jazyka se v blízké budoucnosti neplánuje. Jako opatření pro zvýšení bezpečnosti kódu se navrhuje rozšířit nástroje pro testování kódu a aktivněji používat závislosti napsané v programovacích jazycích, které zajišťují bezpečné práce s pamětí. Také se zvažuje možnost postupné výměny částí curl za varianty napsané v bezpečných jazycích, jako je experimentální HTTP backend Hyper, realizovaný v jazyce Rust.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster