Vulnérabilité dans les bibliothèques réseau des langages Rust and Go qui permet de contourner la vérification de l'adresse IP

Des vulnérabilités liées au traitement incorrect des adresses IP à chiffres octaux dans les fonctions d'analyse d'adresses ont été identifiées dans les bibliothèques standards des langages Rust and Go. Les vulnérabilités permettent de contourner les contrôles d'adresses valides dans les applications, par exemple pour organiser l'accès aux adresses d'interface de bouclage (127.xxx) ou aux sous-réseaux intranet lors de la réalisation d'attaques SSRF (Server-side request forgery). Les vulnérabilités poursuivent le cycle de problèmes précédemment identifiés dans les bibliothèques node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE-2021-29921). 2021-29662 ), Data::Validate::IP (Perl, CVE-2021-29424) et Net::Netmask (Perl, CVE-XNUMX-XNUMX).

Selon la spécification, les valeurs de chaîne d'adresse IP commençant par un zéro doivent être interprétées comme des nombres octaux, mais de nombreuses bibliothèques n'en tiennent pas compte et rejettent simplement le zéro, traitant la valeur comme un nombre décimal. Par exemple, le nombre 0177 en octal est égal à 127 en décimal. Un attaquant peut demander une ressource en précisant la valeur "0177.0.0.1", qui en notation décimale correspond à "127.0.0.1". Si la bibliothèque problématique est utilisée, l'application ne détectera pas que l'adresse 0177.0.0.1 se trouve dans le sous-réseau 127.0.0.1/8, mais en fait, lors de l'envoi d'une requête, elle pourra accéder à l'adresse « 0177.0.0.1 », que le les fonctions réseau seront traitées comme 127.0.0.1. De la même manière, vous pouvez tromper le contrôle d'accès aux adresses intranet en spécifiant des valeurs comme « 012.0.0.1 » (équivalent à « 10.0.0.1 »).

Dans Rust, la bibliothèque standard « std::net » était affectée par un problème (CVE-2021-29922). L'analyseur d'adresse IP de cette bibliothèque a rejeté un zéro avant les valeurs de l'adresse, mais seulement si pas plus de trois chiffres étaient spécifiés, par exemple, « 0177.0.0.1 » serait perçu comme une valeur invalide et un résultat incorrect serait renvoyé en réponse à 010.8.8.8 et 127.0.026.1 . Les applications qui utilisent std::net::IpAddr lors de l'analyse des adresses spécifiées par l'utilisateur sont potentiellement sensibles aux attaques SSRF (falsification de requête côté serveur), RFI (Remote File Inclusion) et LFI (Local File Inclusion). La vulnérabilité a été corrigée dans la branche Rust 1.53.0.

Vulnérabilité dans les bibliothèques réseau des langages Rust and Go qui permet de contourner la vérification de l'adresse IP

En Go, la bibliothèque standard « net » est concernée (CVE-2021-29923). La fonction intégrée net.ParseCIDR ignore les zéros non significatifs avant les nombres octaux au lieu de les traiter. Par exemple, un attaquant peut transmettre la valeur 00000177.0.0.1 qui, une fois vérifiée dans la fonction net.ParseCIDR(00000177.0.0.1/24), sera analysée comme 177.0.0.1/24, et non 127.0.0.1/24. Le problème se manifeste également dans la plateforme Kubernetes. La vulnérabilité est corrigée dans les versions Go 1.16.3 et bêta 1.17.

Vulnérabilité dans les bibliothèques réseau des langages Rust and Go qui permet de contourner la vérification de l'adresse IP


Source: opennet.ru

Ajouter un commentaire