Vulnerabilità nelle librerie di rete dei linguaggi Rust e Go che consente di eludere il controllo degli indirizzi IP

Nelle librerie standard dei linguaggi Rust e Go sono state identificate vulnerabilità legate alla gestione errata degli indirizzi IP con cifre ottali nelle funzioni di parsing degli indirizzi. Queste vulnerabilità consentono di bypassare i controlli sugli indirizzi validi nelle applicazioni, ad esempio per effettuare chiamate agli indirizzi dell'interfaccia loopback (127.x.x.x) o alle sottoreti intranet durante gli attacchi SSRF (Server-side request forgery). Le vulnerabilità continuano il ciclo di problemi precedentemente identificati nelle librerie 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) e Net::Netmask (Perl, CVE-2021-29424).

Secondo la specifica, i valori stringa IP addresses, che iniziano con zero, devono essere interpretati come numeri ottali, ma molte librerie non considerano questa peculiarità e semplicemente rimuovono lo zero, trattando il valore come un numero decimale. Ad esempio, il numero 0177 nel sistema ottale corrisponde a 127 in decimale. Un attaccante potrebbe richiedere una risorsa specificando il valore "0177.0.0.1", che in rappresentazione decimale corrisponde a "127.0.0.1". In caso di utilizzo di una libreria problematica, l'applicazione non riconoscerebbe l'indirizzo 0177.0.0.1 nella sottorete 127.0.0.1/8, ma effettivamente, inviando la richiesta, potrebbe accedere all'indirizzo "0177.0.0.1", che le funzioni di rete tratterebbero come 127.0.0.1. Allo stesso modo, è possibile ingannare anche la verifica degli indirizzi intranet specificando valori simili a "012.0.0.1" (equivalente a "10.0.0.1").

In Rust, la problematica ha interessato la libreria standard "std::net" (CVE-2021-29922). Il parser degli indirizzi IP di questa libreria scartava lo zero davanti ai valori nell'indirizzo, ma solo se specificato un massimo di tre cifre; ad esempio, "0177.0.0.1" verrebbe considerato un valore non valido, mentre in risposta a 010.8.8.8 e 127.0.026.1 sarebbe restituito un risultato errato. Le applicazioni che utilizzano std::net::IpAddr per analizzare indirizzi forniti dall'utente sono potenzialmente vulnerabili ad attacchi SSRF (Server-side request forgery), RFI (Remote File Inclusion) e LFI (Local File Inclusion). La vulnerabilità è stata corretta nella versione Rust 1.53.0.

Vulnerabilità nelle librerie di rete dei linguaggi Rust e Go che consente di eludere il controllo degli indirizzi IP

Nel linguaggio Go, la problematica ha colpito la libreria standard "net" (CVE-2021-29923). La funzione incorporata net.ParseCIDR salta gli zeri davanti ai numeri ottali, invece di elaborarli. Ad esempio, un attaccante potrebbe inviare il valore 00000177.0.0.1, il quale, verificato nella funzione net.ParseCIDR(00000177.0.0.1/24), verrebbe analizzato come 177.0.0.1/24, e non come 127.0.0.1/24. Il problema si manifesta anche nella piattaforma Kubernetes. La vulnerabilità è stata corretta nella release Go 1.16.3 e nella versione beta 1.17.

Vulnerabilità nelle librerie di rete dei linguaggi Rust e Go che consente di eludere il controllo degli indirizzi IP
Riproduci video


Fonte: opennet.ru
Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster