Des vulnérabilités liées à un traitement incorrect des adresses IP avec des chiffres octaux ont été identifiées dans les bibliothèques standard des langages Rust et Go dans les fonctions d'analyse d'adresse. Ces vulnérabilités permettent de contourner les vérifications des adresses valides dans les applications, par exemple pour accéder aux adresses des interfaces loopback (127.x.x.x) ou aux sous-réseaux intranet lors d'attaques SSRF (Server-side request forgery). Ces vulnérabilités poursuivent le cycle de problèmes précédemment découverts dans les bibliothèques 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) et Net::Netmask (Perl, CVE-2021-29424).
Conformément à la spécification, les valeurs de chaîne adresses IP, commençant par un zéro, devraient être interprétées comme des nombres octaux, mais de nombreuses bibliothèques ne prennent pas en compte cette particularité et rejettent simplement le zéro, traitant la valeur comme un nombre décimal. Par exemple, le nombre 0177 dans le système octal équivaut à 127 en décimal. Un attaquant peut demander une ressource en spécifiant la valeur « 0177.0.0.1 », qui correspond en représentation décimale à « 127.0.0.1 ». Lorsque des bibliothèques problématiques sont utilisées, l'application ne reconnaîtra pas l'entrée de l'adresse 0177.0.0.1 dans le sous-réseau 127.0.0.1/8, mais en réalité, lorsque la requête est envoyée, elle peut se connecter à l'adresse « 0177.0.0.1 », que les fonctions réseau traiteront comme 127.0.0.1. De même, il est possible de tromper la vérification des adresses intranet en indiquant des valeurs telles que « 012.0.0.1 » (équivalent à « 10.0.0.1 »).
Dans Rust, la bibliothèque standard « std::net » a été affectée par le problème (CVE-2021-29922). Le parseur d'adresses IP de cette bibliothèque rejetait le zéro devant les valeurs d'adresse, mais uniquement si pas plus de trois chiffres étaient spécifiés, par exemple, « 0177.0.0.1 » serait considéré comme une valeur non valide, tandis que pour 010.8.8.8 et 127.0.026.1, un résultat incorrect serait retourné. Les applications utilisant std::net::IpAddr lors de l'analyse des adresses fournies par l'utilisateur sont potentiellement vulnérables aux attaques SSRF (Server-side request forgery), RFI (Remote File Inclusion) et LFI (Local File Inclusion). La vulnérabilité a été corrigée dans la version Rust 1.53.0.

Dans le langage Go, la bibliothèque standard « net » est affectée par un problème (CVE-2021-29923). La fonction intégrée net.ParseCIDR ignore les zéros devant les nombres octaux au lieu de les traiter. Par exemple, un attaquant peut transmettre la valeur 00000177.0.0.1, qui sera analysée par la fonction net.ParseCIDR(00000177.0.0.1/24) comme 177.0.0.1/24, et non 127.0.0.1/24. Ce problème se manifeste également sur la plateforme Kubernetes. La vulnérabilité a été corrigée dans la version Go 1.16.3 et la bêta 1.17.


Source : opennet.ru
