Sårbarhet i nettverksbibliotekene til Rust and Go-språkene som lar deg omgå IP-adressebekreftelse

Sårbarheter knyttet til feilbehandling av IP-adresser med oktale sifre i adresseparsing-funksjoner er identifisert i standardbibliotekene til Rust- og Go-språkene. Sårbarhetene gjør det mulig å omgå sjekker for gyldige adresser i applikasjoner, for eksempel for å organisere tilgang til loopback-grensesnittadresser (127.xxx) eller intranettundernett når du utfører SSRF-angrep (Server-side request forgery). Sårbarhetene fortsetter syklusen av problemer som tidligere er identifisert i bibliotekene node-nettmaske (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 følge spesifikasjonen skal IP-adressestrengverdier som starter med en null tolkes som oktale tall, men mange biblioteker tar ikke hensyn til dette og forkaster bare null, og behandler verdien som et desimaltall. For eksempel er tallet 0177 i oktal lik 127 i desimal. En angriper kan be om en ressurs ved å spesifisere verdien "0177.0.0.1", som i desimalnotasjon tilsvarer "127.0.0.1". Hvis det problematiske biblioteket brukes, vil ikke applikasjonen oppdage at adressen 0177.0.0.1 er i undernettet 127.0.0.1/8, men faktisk, når du sender en forespørsel, kan den få tilgang til adressen "0177.0.0.1", som nettverksfunksjoner vil behandle som 127.0.0.1. På lignende måte kan du jukse kontrollen av tilgang til intranettadresser ved å spesifisere verdier som "012.0.0.1" (tilsvarer "10.0.0.1").

I Rust ble standardbiblioteket "std::net" berørt av et problem (CVE-2021-29922). IP-adresseparseren til dette biblioteket forkastet en null før verdiene i adressen, men bare hvis ikke mer enn tre sifre var spesifisert, for eksempel, ville "0177.0.0.1" bli oppfattet som en ugyldig verdi, og et feil resultat ville bli returnert som svar på 010.8.8.8 og 127.0.026.1. Applikasjoner som bruker std::net::IpAddr ved parsing av brukerspesifiserte adresser er potensielt utsatt for SSRF (Server-side request forgery), RFI (Remote File Inclusion) og LFI (Local File Inclusion) angrep. Sårbarheten ble løst i Rust 1.53.0-grenen.

Sårbarhet i nettverksbibliotekene til Rust and Go-språkene som lar deg omgå IP-adressebekreftelse

I Go påvirkes standardbiblioteket "net" (CVE-2021-29923). Den innebygde net.ParseCIDR-funksjonen hopper over innledende nuller før oktale tall i stedet for å behandle dem. For eksempel kan en angriper sende verdien 00000177.0.0.1, som, når den er sjekket i nett.ParseCIDR(00000177.0.0.1/24)-funksjonen, vil bli analysert som 177.0.0.1/24, og ikke 127.0.0.1/24. Problemet viser seg også i Kubernetes-plattformen. Sårbarheten er løst i Go-versjon 1.16.3 og beta 1.17.

Sårbarhet i nettverksbibliotekene til Rust and Go-språkene som lar deg omgå IP-adressebekreftelse


Kilde: opennet.ru

Legg til en kommentar