La librairie « net » de Rust et Go affectée par une faille de validation d’adresse IP

0

La librairie « net » couramment utilisée dans les langages Go et Rust est également affectée par la vulnérabilité de validation d’adresse IP de format mixte.

Le bogue est lié à la façon dont net traite les adresses IP comme décimales, même lorsqu’elles sont fournies dans un format mixte (octal-décimal).

Par conséquent, les applications s’appuyant sur net pourraient être vulnérables à des failles indéterminées de falsification de demande côté serveur (SSRF) et d’inclusion de fichier distant (RFI).

Auparavant, la faille affectait diverses implémentations de la librairie « netmask » (masques de réseau), utilisée par des milliers d’applications.

Plus tard, la librairie standard Python appelée ipaddress s’est également révélée vulnérable à la faille.

Le zéro non significatif modifie l’adresse IP

Lors de la DEF CON, les chercheurs en sécurité Cheng Xu, Victor Viale, Sick Codes, Nick Sahler, Kelly Kaoudis, opennota et John Jackson ont révélé une faille dans le module net des langages Go et Rust.

La vulnérabilité, identifiée comme CVE-2021-29922 (pour Rust) et CVE-2021-29923 (pour Golang) concerne la façon dont net gère les adresses IP au format mixte, ou plus précisément lorsqu’une adresse IPv4 décimale contient un zéro non significatif.

Une simple recherche de « import net » sur GitHub révèle plus de 4 millions de fichiers pour Go uniquement en s’appuyant sur la librairie net.

Une adresse IP peut être représentée dans une variété de formats, y compris hexadécimal et entier, bien que les adresses IPv4 les plus courantes soient exprimées au format décimal.

Par exemple, l’adresse IPv4 représentée au format décimal est 104.20.59.209, mais la même chose peut être exprimée au format octal comme 0150.0024.0073.0321.

Supposons que l’on vous donne une adresse IP au format décimal, 127.0.0.1, qui est largement comprise comme l’adresse de loop local ou localhost.

Si vous deviez y ajouter un 0, une application devrait-elle toujours analyser 0127.0.0.1 en tant que 127.0.0.1 ou autre chose ?

Essayez ceci dans votre navigateur Web. Dans les tests, en tapant 0127.0.0.1/ dans la barre d’adresse de Chrome, le navigateur la traite comme une adresse IP au format octal.

En appuyant sur Entrée ou Retour, l’IP passe en fait à son équivalent décimal de 87.0.0.1, c’est ainsi que la plupart des applications sont censées gérer de telles adresses IP ambiguës.

net go rust
La plupart des navigateurs Web comme Chrome compensent automatiquement les adresses IP de formats mixtes.

Il est à noter en particulier que 127.0.0.1 n’est pas une adresse IP publique mais une adresse de loop, cependant, sa représentation ambiguë la transforme en une adresse IP publique menant à un hôte complètement différent.

Mais, dans le cas de la bibliothèque réseau, tous les zéros non significatifs seraient simplement supprimés.

Selon un projet de l’IETF (qui a expiré avant de pouvoir être formalisé dans une spécification), les parties d’une adresse IPv4 peuvent être interprétées comme octales si elles sont préfixées par un « 0 ».

En tant que telles, les règles concernant la façon dont une adresse IPv4 de format mixte doit être analysée varient selon les applications.

Le module net de Go et de Rust, par exemple, considère tous les octets d’une adresse IPv4 comme décimaux, comme le montrent les rapports des chercheurs [1, 2].

Par conséquent, si un développeur utilisait net pour valider si une adresse IP appartient à une certaine plage (par exemple, en analysant une liste d’adresses IP par rapport à une liste de contrôle d’accès (ACL)), le résultat peut être erroné pour les représentations octales des adresses IPv4.

go rust net
Le code de preuve de concept utilisant le module net de Rust montre que les adresses IP de formats mixtes sont traitées comme des décimales
Source : Sick.Codes

Cela peut entraîner des vulnérabilités indéterminées de falsification des demandes côté serveur (SSRF) et d’inclusion de fichiers distants (RFI) dans les applications.

Plusieurs applications et langages impactés

Go et Rust ne sont pas les seuls langages impactés par ce bug.

Ce bogue de validation d’adresse IP au format mixte avait précédemment affecté la librairie d’adresses IP de Python (CVE-2021-29921), les implémentations de masque de réseau (CVE-2021-28918, CVE-2021-29418) et des librairies similaires.

Dans la plupart des cas, le bogue a été classé comme ayant une gravité élevée ou critique:

Selon les mainteneurs du projet, le module net de Golang aurait un correctif [1, 2] publié dans la version (bêta) 1.17.

Sick Codes a partagé quelques informations:

« La vulnérabilité Go est légèrement moins impactante que Rust car elle n’affecte que des blocs CIDR. »

« Dans l’ensemble, puisqu’il s’agissait de modifications de bibliothèque standard qui affecteraient tous les projets écrits dans la langue elles-mêmes, ils avaient besoin de nombreux tests ou de rendre les correctifs redondants », a déclaré Sick Codes dans une interview.

Pour Rust, un correctif a déjà été fusionné dans la librairie net:

rust
Correction poussée vers le module net du langage Rust (GitHub)

Les utilisateurs du langage Rust doivent utiliser la version 1.53.0 ou supérieure qui contient les atténuations de cette vulnérabilité.

Laisser un commentaire