Ve standardních knihovnách jazyků Rust a Go byly odhaleny zranitelnosti související s nesprávným zpracováním IP adres obsahujících osmičková čísla v funkcích pro analýzu adres. Tyto zranitelnosti umožňují obejít kontroly platných adres v aplikacích, například pro přístup k adresám smyčkového rozhraní (127.x.x.x) nebo intranetovým podsítím při provádění útoků SSRF (Server-side request forgery). Zranitelnosti doplňují cyklus 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ěla být řetězcová hodnota IP adress, která začíná nulou, interpretována jako osmičkové číslo, ale mnohé knihovny tuto skutečnost nezohledňují a prostě odstraňují nulu, zpracovávajíce hodnotu jako desetinné číslo. Například číslo 0177 v osmičkové soustavě odpovídá 127 v desítkové. Útočník může požádat o zdroj tím, že uvede hodnotu „0177.0.0.1“, která v desítkovém vyjádření odpovídá „127.0.0.1“. Pokud je použita problematická knihovna, aplikace neidentifikuje adresu 0177.0.0.1 jako součást podsítě 127.0.0.1/8, ale ve skutečnosti při odeslání požadavku může provést přístup k adrese „0177.0.0.1“, kterou síťové funkce zpracují jako 127.0.0.1. Podobně lze oklamat i kontrolu přístupu k intranetovým adresám uvedením hodnot jako „012.0.0.1“ (ekvivalent „10.0.0.1“).
V Rustu byla zranitelnost přítomna ve standardní knihovně „std::net“ (CVE-2021-29922). Parsovač IP adres této knihovny odstraňoval nulu před hodnotami v adrese, ale pouze pokud bylo uvedeno nejvýše tři číslice, například „0177.0.0.1“ bude považováno za neplatnou hodnotu, zatímco na 010.8.8.8 a 127.0.026.1 bude vrácen nesprávný výsledek. Aplikace, které používají std::net::IpAddr při analýze uživatelsky zadaných adres, jsou potenciálně náchylné k útokům SSRF (Server-side request forgery), RFI (Remote File Inclusion) a LFI (Local File Inclusion). Zranitelnost byla odstraněna ve verzi Rust 1.53.0.

V jazyce Go se standardní knihovna „net“ potýká s problémem (CVE-2021-29923). Vestavěná funkce net.ParseCIDR ignoruje nuly před osmičkovými čísly místo jejich zpracování. Například, útočník může poslat hodnotu 00000177.0.0.1, která při kontrole ve funkci net.ParseCIDR(00000177.0.0.1/24) bude zpracována jako 177.0.0.1/24, a ne 127.0.0.1/24. Tento problém se také projevuje na platformě Kubernetes. Zranitelnost byla odstraněna ve verzi Go 1.16.3 a beta verzi 1.17.


Zdroj: opennet.ru
