Zranitelnost v síťových knihovnách jazyků Rust and Go, která vám umožňuje obejít ověření IP adresy

Ve standardních knihovnách jazyků Rust and Go byly zjištěny chyby zabezpečení související s nesprávným zpracováním IP adres s osmičkovými číslicemi ve funkcích analýzy adresy. Tyto chyby zabezpečení umožňují obejít kontroly platných adres v aplikacích, například organizovat přístup k adresám rozhraní zpětné smyčky (127.xxx) nebo intranetovým podsítím při provádění útoků SSRF (Server-side request forgery). Zranitelnosti pokračují v cyklu problémů dříve identifikovaných v knihovnách node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921), Data::Validate::IP (Perl, CVE-2021-29662) a Net::Netmask (Perl, CVE-2021-29424).

Podle specifikace by měly být hodnoty řetězce IP adres začínající nulou interpretovány jako osmičková čísla, ale mnoho knihoven to nebere v úvahu a jednoduše zahodí nulu a zachází s hodnotou jako s desetinným číslem. Například číslo 0177 v osmičkové soustavě se rovná 127 v desítkové soustavě. Útočník může požádat o zdroj zadáním hodnoty „0177.0.0.1“, která v desítkovém zápisu odpovídá „127.0.0.1“. V případě použití problematické knihovny aplikace nezjistí, že adresa 0177.0.0.1 je v podsíti 127.0.0.1/8, ale ve skutečnosti může při odesílání požadavku přistupovat na adresu „0177.0.0.1“, kterou síťové funkce budou zpracovány jako 127.0.0.1. Podobným způsobem můžete ošidit kontrolu přístupu k intranetovým adresám zadáním hodnot jako „012.0.0.1“ (ekvivalent „10.0.0.1“).

V Rustu byla standardní knihovna "std::net" ovlivněna problémem (CVE-2021-29922). Analyzátor IP adres této knihovny vyřadil nulu před hodnotami v adrese, ale pouze v případě, že nebyly zadány více než tři číslice, například „0177.0.0.1“ by bylo vnímáno jako neplatná hodnota a nesprávný výsledek bude vráceno jako odpověď na 010.8.8.8 a 127.0.026.1 . Aplikace, které při analýze adres zadaných uživatelem používají std::net::IpAddr, jsou potenciálně náchylné k útokům SSRF (falšování požadavků na straně serveru), RFI (začlenění vzdáleného souboru) a LFI (začlenění místního souboru). Chyba zabezpečení byla opravena ve větvi Rust 1.53.0.

Zranitelnost v síťových knihovnách jazyků Rust and Go, která vám umožňuje obejít ověření IP adresy

V Go je ovlivněna standardní knihovna "net" (CVE-2021-29923). Vestavěná funkce net.ParseCIDR přeskakuje úvodní nuly před osmičkovými čísly namísto jejich zpracování. Útočník může například předat hodnotu 00000177.0.0.1, která při kontrole ve funkci net.ParseCIDR(00000177.0.0.1/24) bude analyzována jako 177.0.0.1/24, a nikoli 127.0.0.1/24. Problém se projevuje i v platformě Kubernetes. Tato chyba zabezpečení je opravena ve verzi Go 1.16.3 a beta 1.17.

Zranitelnost v síťových knihovnách jazyků Rust and Go, která vám umožňuje obejít ověření IP adresy


Zdroj: opennet.ru

Přidat komentář