Python est affecté par une faille de validation d’adresses IP

0

La librairie standard ipaddress de Python est impacté par une vulnérabilité critique de validation d’adresse IP identique à la faille qui a été signalée dans la bibliothèque « netmask » plus tôt cette année.

Les chercheurs qui avaient découvert la faille critique dans netmask, ont également découvert la même faille dans ce module Python et ont obtenu un identifiant de vulnérabilité : CVE-2021-29921.

Le bug s’est glissé dans le module ipaddress de Python 3.x à la suite d’une modification apportée en 2019 par les développeurs de Python.

Les zéros au début sont supprimés des adresses IP

En Mars, nous vous informions d’une vulnérabilité critique de validation d’adresse IP dans la librairie netmask qui est utilisée par des milliers d’applications.

La vulnérabilité, identifiée comme CVE-2021-28918 (Critique), CVE-2021-29418 (Moyen), et CVE-2021-29424 (High) existait dans les versions npm et Perl de netmask, et dans d’autres librairies similaires.

Il s’avère que la librairie standard ipaddress introduite dans Python 3.3 est également affectée par cette vulnérabilité, comme l’ont révélé Victor Viale, Sick Codes, Kelly Kaoudis, John Jackson et Nick Sahler.

Identifié en tant que CVE-2021-29921, la faille de sécurité concerne l’évaluation inappropriée des adresses IP par la librairie standard ipaddress.

Le module ipaddress de Python fournit aux développeurs des fonctions pour créer facilement des adresses IP, des réseaux et des interfaces; et d’affiner/normaliser les adresses IP saisies dans différents formats.

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

Disons qu’on vous donne une adresse IP en format décimal, 127.0.0.1, ce qui est largement compris comme l’adresse loopback locale ou localhost.

Si vous mettez un 0 devant, une requête devrait-elle encore la prendre en compte comme 0127.0.0.1, 127.0.0.1 ou autre chose ?

Essayez ceci dans votre navigateur Web. Dans nos tests, en tapant 0127.0.0.1/ dans la barre d’adresse de Chrome, le navigateur traite l’ensemble de la chaîne comme une adresse IP en format octal.

En appuyant sur entrée, l’adresse se transforme en fait en son équivalent décimal qui est 87.0.0.1, c’est ainsi que la plupart des applications sont censées traiter ces adresses IP ambiguës.

python ipaddress

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

Selon les spécifications originales de l’IETF, pour les adresses IP ambiguës, certaines parties d’une adresse IPv4 peuvent être interprétées comme octales si elles sont préfixées avec un « 0 ».

Mais, dans le cas de ipaddress, tout les zéros placé au début d’une adresse IPv4 de cette façon seront simplement supprimés.

Un test effectué par les chercheurs Sick Codes et Victor Viale montre que la librairie ipaddress de Python supprimera simplement tout les zéros placés au début d’une adresse.

En d’autres termes, lorsqu’elle est traitée par le module ipaddress de Python, l’adresse « 010.8.8.8 » serait traité comme « 10.8.8.8 », au lieu de « 8.8.8.8 ».

python ipadress

« La validation incorrecte des chaînes octales dans Python 3.8.0 par stdlib ipaddress v3.10 permet aux attaquants distants non authentifiés d’effectuer des attaques indéterminées [Server-Side Request Forgery (SSRF), Remote File Inclusion (RFI) et Local File Inclusion (LFI)] sur de nombreux programmes qui s’appuient sur stdlib ipaddress, » affirment les chercheurs.

Par exemple, si une liste de blocage anti-SSRF s’était fié à ipaddress de Python pour traiter une liste d’adresses IP, les adresses IPs ambiguës pourraient facilement contourner les sécurités et rendre les protections anti-contournement futiles.

Un bug introduit dans Python en 2019

Bien que le module ipaddress ait été introduit dans Python 3.3, ce bug s’est glissé dans le module en commençant par la version Python 3.8.0 à 3.10, selon les chercheurs.

Avant la version 3.8.0a4, l’ipaddress de Python avait mis en place des vérifications qui rejetaient les adresses IP fournies dans des formats mixtes (octal et décimal).

Toutefois, à partir de la version Python 3.8.0a4, ces contrôles ont été supprimés entièrement.

« Arrêtez de rejeter les octets IPv4 car elles sont octales. Les zéros en préfix sont ignorés et ne sont plus supposés spécifier les octets octaux. Les octets sont toujours des nombres décimaux. Les octets ne doivent toujours pas être plus de trois chiffres, y compris les zéros de tête », avait noté le programmeur Joel Croteau à l’époque lors de l’application de ce changement.

Une discussion avait peu de temps suivi parmi les responsables de Python quant aux raisons de ce changement, et aux raisons pratiques pour introduire ce changement quand il s’agit de traiter les adresses IP ambiguës.

Bien que les discussions sur un patch à venir sont en cours, les détails exacts sur la version de Python qui contiendra ce patch sont floues.

L’un des mainteneurs de Python a suggéré une approche différente à la place :

« Il est rare d’avoir des adresses IPv4 avec des zéros au début. »

« Si vous voulez tolérer les zéros au début, vous n’avez pas à modifier ipaddress pour cela, vous pouvez pré-traiter vos entrées: cela fonctionne sur n’importe quelle version de Python avec ou sans le correctif », a déclaré Victor Stinner, mainteneur de Python, proposant une solution de contournement alternative à la question:

patch temporaire

D’autres discussions sont en cours entre les mainteneurs de Python, incluant Joel Croteau, Christian Heimes, et Victor Stinner sur la meilleure façon d’aborder ce problème.

Les trouvailles techniques détaillés des chercheurs sont fournis dans un article de blog.

Vous pourriez aussi aimer
Laisser un commentaire

Votre adresse email ne sera pas publiée.