O vulnerabilitate în bibliotecile de rețea ale limbajelor Rust și Go care permite ocolirea verificării adreselor IP

Bibliotecile standard ale limbajelor Rust și Go au identificat vulnerabilități legate de procesarea incorectă a adreselor IP cu cifre octale în funcțiile de analiză a adreselor. Aceste vulnerabilități permit ocolirea verificărilor adreselor permise în aplicații, de exemplu, pentru a face apeluri către adresele interfeței loopback (127.x.x.x) sau subrețelele intranet în timpul atacurilor SSRF (Server-side request forgery). Vulnerabilitățile continuă un ciclu de probleme anterior identificate în bibliotecile 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) și Net::Netmask (Perl, CVE-2021-29424).

Conform specificației, valorile string adreselor IP, care încep cu zero, ar trebui să fie interpretate ca numere octale, dar multe biblioteci nu țin cont de această particularitate și pur și simplu elimină zero-ul, tratând valoarea ca un număr zecimal. De exemplu, numărul 0177 în sistemul octal este egal cu 127 în zecimal. Un atacator poate solicita o resursă specificând valoarea „0177.0.0.1”, care în reprezentarea zecimală corespunde „127.0.0.1”. În cazul utilizării unei biblioteci problematice, aplicația nu va identifica apariția adresei 0177.0.0.1 în subrețeaua 127.0.0.1/8, dar de fapt, atunci când se trimite cererea, aceasta poate efectua un apel către adresa „0177.0.0.1”, pe care funcțiile de rețea o vor trata ca pe 127.0.0.1. În același mod, se poate înșela și verificarea apelurilor către adresele intranet, specificând valori precum „012.0.0.1” (echivalent cu „10.0.0.1”).

În Rust, problema a afectat biblioteca standard „std::net” (CVE-2021-29922). Parserul de adrese IP din această bibliotecă elimina zero-ul din fața valorilor în adresă, dar doar dacă erau specificate nu mai mult de trei cifre; de exemplu, „0177.0.0.1” va fi interpretată ca o valoare invalidă, în timp ce pentru 010.8.8.8 și 127.0.026.1 se va returna un rezultat greșit. Aplicațiile care utilizează std::net::IpAddr pentru analizarea adreselor specificate de utilizator sunt potențial expuse atacurilor SSRF (Server-side request forgery), RFI (Remote File Inclusion) și LFI (Local File Inclusion). Vulnerabilitatea a fost remediată în ramura Rust 1.53.0.

O vulnerabilitate în bibliotecile de rețea ale limbajelor Rust și Go care permite ocolirea verificării adreselor IP

În limbajul Go, biblioteca standard „net” este afectată de problema CVE-2021-29923. Funcția încorporată net.ParseCIDR trece cu vederea zerourile din fața numerelor octale, în loc să le proceseze. De exemplu, un atacator poate trimite valoarea 00000177.0.0.1, care, atunci când este verificată în funcția net.ParseCIDR(00000177.0.0.1/24), va fi analizată ca 177.0.0.1/24, și nu ca 127.0.0.1/24. Problema se manifestă și în platforma Kubernetes. Vulnerabilitatea a fost remediată în versiunea Go 1.16.3 și în versiunea beta 1.17.

O vulnerabilitate în bibliotecile de rețea ale limbajelor Rust și Go care permite ocolirea verificării adreselor IP
Redați video


Sursa: opennet.ro
Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster