Přetečení vyrovnávací paměti v curl a libcurl, projevující se při přístupu přes proxy SOCKS5

V nástroji pro příjem a odesílání dat přes síť curl a paralelně vyvíjenou knihovnu libcurl byla identifikována chyba zabezpečení (CVE-2023-38545), která může vést k přetečení vyrovnávací paměti a potenciálně ke spuštění kódu útočníka na straně klienta při přístupu pomocí obslužného programu curl nebo aplikace používající libcurl na server HTTPS ovládaný útočníkem. Problém se objeví pouze v případě, že je povolen přístup přes proxy SOCKS5. Při přímém přístupu bez proxy se zranitelnost neobjeví. Tato chyba zabezpečení je opravena ve verzi curl 8.4.0. Bezpečnostní výzkumník, který chybu objevil, obdržel odměnu 4660 XNUMX dolarů jako součást iniciativy Hackerone Internet Bug Bounty.

Tato chyba zabezpečení je způsobena chybou v kódu rozlišení názvu hostitele před přístupem k proxy serveru SOCKS5. Pokud je název hostitele dlouhý až 256 znaků, curl okamžitě předá název proxy SOCKS5 k rozlišení na své straně, a pokud je název delší než 255 znaků, přepne se na lokální resolver a předá již definovanou adresu SOCKS5. . Kvůli chybě v kódu mohl být příznak indikující potřebu lokálního rozlišení během pomalého vyjednávání spojení přes SOCKS5 nastaven na špatnou hodnotu, což vedlo k záznamu dlouhého názvu hostitele do vyrovnávací paměti přidělené podle očekávání. uložení IP adresy nebo jména nepřesahující 255 znaků.

Vlastník webu, ke kterému přistupuje curl přes proxy SOCKS5, může spustit přetečení vyrovnávací paměti na straně klienta vrácením kódu přesměrování požadavku (HTTP 30x) a nastavením záhlaví „Location:“ na adresu URL s názvem hostitele v rozsahu 16 až na 64 KB (16 KB je minimální velikost potřebná k přetečení přidělené vyrovnávací paměti a 65 KB je maximální povolená délka názvu hostitele v URL). Pokud je v nastavení libcurl povoleno přesměrování požadavku a použitý proxy server SOCKS5 je dostatečně pomalý, pak se dlouhé jméno hostitele zapíše do malé vyrovnávací paměti, samozřejmě menší velikosti.

Tato chyba zabezpečení se týká hlavně aplikací založených na libcurl a objeví se v obslužném programu curl pouze při použití možnosti „--limit-rate“ s hodnotou menší než 65541 – libcurl ve výchozím nastavení přiděluje vyrovnávací paměť o velikosti 16 KB a v obslužném programu curl je to 100 KB, ale tato velikost se mění v závislosti na hodnotě parametru „-limit-rate“.

Daniel Stenberg, autor projektu, zmínil, že zranitelnost zůstala nezjištěna 1315 dní. Také říká, že 41 % dříve identifikovaných zranitelností v curl by pravděpodobně bylo možné předejít, pokud by curl byl napsán v jazyce bezpečném pro paměť, ale neexistují žádné plány na přepsání curl do jiného jazyka v dohledné době. Jako opatření ke zlepšení bezpečnosti kódové základny se navrhuje rozšířit nástroje pro testování kódu a aktivněji využívat závislosti napsané v programovacích jazycích, které zajišťují bezpečný provoz s pamětí. Zvažuje také možnost postupného nahrazení částí curl volbami napsanými v zabezpečených jazycích, jako je experimentální Hyper HTTP backend implementovaný v Rustu.

Zdroj: opennet.ru

Přidat komentář