Vulnerabilità nelle librerie di rete dei linguaggi Rust e Go che consente di bypassare la verifica dell'indirizzo IP

Nelle librerie standard dei linguaggi Rust e Go sono state identificate vulnerabilità legate all'errata elaborazione degli indirizzi IP con cifre ottali nelle funzioni di analisi degli indirizzi. Le vulnerabilità consentono di aggirare il controllo degli indirizzi validi nelle applicazioni, ad esempio per organizzare l'accesso agli indirizzi delle interfacce di loopback (127.xxx) 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 ), Dati::Validate::IP (Perl, CVE-2021-29662) e Net::Netmask (Perl, CVE-2021-29424).

Secondo le specifiche, i valori delle stringhe di indirizzi IP che iniziano con uno zero dovrebbero essere interpretati come numeri ottali, ma molte biblioteche non ne tengono conto e semplicemente scartano lo zero, trattando il valore come un numero decimale. Ad esempio, il numero 0177 in ottale è uguale a 127 in decimale. Un utente malintenzionato può richiedere una risorsa specificando il valore "0177.0.0.1", che in notazione decimale corrisponde a "127.0.0.1". Se si utilizza la libreria problematica, l'applicazione non rileverà che l'indirizzo 0177.0.0.1 si trova nella sottorete 127.0.0.1/8, ma in realtà, quando invia una richiesta, può accedere all'indirizzo “0177.0.0.1”, che le funzioni di rete verranno elaborate come 127.0.0.1. In modo simile è possibile ingannare il controllo degli accessi agli indirizzi intranet specificando valori come “012.0.0.1” (equivalente a “10.0.0.1”).

In Rust, la libreria standard "std::net" era interessata da un problema (CVE-2021-29922). Il parser dell'indirizzo IP di questa libreria scartava uno zero prima dei valori nell'indirizzo, ma solo se non venivano specificate più di tre cifre, ad esempio "0177.0.0.1" verrebbe percepito come un valore non valido e un risultato errato verrebbe restituito in risposta a 010.8.8.8 e 127.0.026.1 . Le applicazioni che utilizzano std::net::IpAddr durante l'analisi degli indirizzi specificati dall'utente sono potenzialmente esposte agli attacchi SSRF (Server-side request forgery), RFI (Remote File Inclusion) e LFI (Local File Inclusion). La vulnerabilità è stata risolta nel ramo Rust 1.53.0.

Vulnerabilità nelle librerie di rete dei linguaggi Rust e Go che consente di bypassare la verifica dell'indirizzo IP

In Go è interessata la libreria standard "net" (CVE-2021-29923). La funzione integrata net.ParseCIDR salta gli zeri iniziali prima dei numeri ottali invece di elaborarli. Ad esempio, un utente malintenzionato può passare il valore 00000177.0.0.1 che, se controllato nella funzione net.ParseCIDR(00000177.0.0.1/24), verrà analizzato come 177.0.0.1/24 e non 127.0.0.1/24. Il problema si manifesta anche nella piattaforma Kubernetes. La vulnerabilità è stata risolta nella versione Go 1.16.3 e beta 1.17.

Vulnerabilità nelle librerie di rete dei linguaggi Rust e Go che consente di bypassare la verifica dell'indirizzo IP


Fonte: opennet.ru

Aggiungi un commento