I standardbibliotekerne i Rust og Go er der opdaget sårbarheder relateret til forkert behandling af IP-adresser med oktale cifre i adresseringsfunktionerne. Sårbarhederne muliggør omgåelse af kontrol af gyldige adresser i applikationer, for eksempel til at henvise til loopback-adresser (127.x.x.x) eller intranet-subnet ved SSRF (Server-side request forgery) angreb. Sårbarhederne fortsætter en række problemer, der tidligere er blevet opdaget i bibliotekerne 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) og Net::Netmask (Perl, CVE-2021-29424).
I henhold til specifikationen skal strengværdier IP-adresser, der starter med nul, fortolkes som oktale tal, men mange biblioteker tager ikke denne detalje i betragtning og kasserer blot nullen og behandler værdien som et decimaltal. For eksempel svarer tallet 0177 i oktal til 127 i decimal. En angriber kan anmode om en ressource ved at angive værdien "0177.0.0.1", som i decimal repræsenterer "127.0.0.1". I tilfælde af brug af det problematiske bibliotek vil applikationen ikke opdage, at adressen 0177.0.0.1 tilhører subnettet 127.0.0.1/8, men faktisk, når der bliver sendt en anmodning, kan det have forbindelse til adressen "0177.0.0.1", som netværksfunktionerne vil behandle som 127.0.0.1. På samme måde kan man narre kontrol af intranet-adresser ved at angive værdier som "012.0.0.1" (ækvivalent til "10.0.0.1").
I Rust var den standardbibliotek, der var sårbar, "std::net" (CVE-2021-29922). IP-adresseparseren i dette bibliotek kassede nullen før værdierne i adressen, men kun hvis der blev angivet højst tre cifre, for eksempel ville "0177.0.0.1" blive opfattet som en ugyldig værdi, mens der vil blive returneret en forkert værdi for 010.8.8.8 og 127.0.026.1. Applikationer, der bruger std::net::IpAddr til at parse brugerdefinerede adresser, er potentielt sårbare over for SSRF (Server-side request forgery), RFI (Remote File Inclusion) og LFI (Local File Inclusion) angreb. Sårbarheden er blevet rettet i Rust version 1.53.0.

I Go-sproget er standardbiblioteket "net" (CVE-2021-29923) udsat for et problem. Den indbyggede funktion net.ParseCIDR springer nul decimaltal over foran oktalnumre i stedet for at behandle dem. For eksempel kan en angriber sende værdien 00000177.0.0.1, som ved kontrol i funktionen net.ParseCIDR(00000177.0.0.1/24) vil bli' parset som 177.0.0.1/24, og ikke 127.0.0.1/24. Problemet viser sig også i Kubernetes-platformen. Sårbarheden er blevet rettet i Go-version 1.16.3 og beta-version 1.17.


Kilde: opennet.ru
