Une faille python, vieille de 15 ans, présente une menace potentielle pour 300 000 projets open source

En enquêtant sur une vulnérabilité non liée, Trellix Advanced Research Center est tombé sur une vulnérabilité dans le module tarfile de Python. Il s'agit d'un module de Python qui permet de manipuler des archives tar. En enquêtant ensuite sur l'impact possible de cette vulnérabilité, les chercheurs ont conclu que des centaines de référentiels open source étaient vulnérables.

Cette vulnérabilité est présente depuis 15 ans dans Python. Elle a été signalée par Jan Matejek, qui était à l'époque le responsable du paquet Python pour SUSE, et estampillée VE-2007-4559. Mais elle n'a jamais été corrigée, même si la documentation a été mise à jour en indiquant 'il peut être dangereux d’extraire des archives de sources non fiables'.

Une publication sur le blog de Trellix explique en détail cette vulnérabilité et montre comment l'exploiter est très facile. 

En effet, les archives tar sont une collection de plusieurs fichiers et métadonnées, ces dernières étant utilisées lors du décompactage de l'archive tar. Les métadonnées contenues dans une archive tar incluent, mais sans s'y limiter, des informations telles que le nom du fichier, la taille et la somme de contrôle du fichier et des informations sur le propriétaire du fichier lorsque le fichier a été archivé. Dans le module Python tarfile, ces informations sont gérées par des instances de classe TarInfo générées pour chaque élément de l'archive tar. Ces éléments peuvent représenter de nombreux types de structures différents dans un système de fichiers à partir de répertoires, de liens symboliques, de fichiers, etc.

L'extrait de code ci-dessous est tiré de la fonction extract du module tarfile. Cet extrait de code montre comment le nom de fichier est construit avant d'être transmis à la fonction qui extrait et écrit le fichier dans le système de fichiers lors du décompatage. Le code fait explicitement confiance aux informations présents dans l'objet TarInfo et joint le chemin qui est passé à la fonction d'extraction et le nom dans l'objet TarInfo permettant ainsi à un attaquant d'effectuer une attaque par traversée de répertoire.

python-trellix-tarfile


Étant donné que la fonction extractall s'appuie sur la fonction extract,  la fonction extractall est également vulnérable à l'attaque par traversée de répertoire, comme on peut le voir ci-dessous.

python-trellix-tarfile-2

 

Comment exploiter cette faille ?

L'exploit est assez simple à réaliser. Pour qu'un attaquant exploite cette vulnérabilité, il lui suffit d'ajouter ".." avec le séparateur du système d'exploitation ("/" ou "\") dans le nom du fichier pour échapper au répertoire dans lequel le fichier est censé être extrait. Ce que le module tarfile lui-même permet de faire très facilement, en ajoutant un filtre qui peut être utilisé pour analyser et modifier les métadonnées d'un fichier avant qu'il ne soit ajouté à l'archive tar :

python-trellix-tarfile-3

 

Ainsi, il est possible de créer une archive malicieuse contenant par exemple ../../../../../etc/passwd. Et quand un administrateur système décompacte une telle archive, il écrase sans le savoir son fichier système /etc/passwd. Plus d'authentication et on peut y accéder sans problème au système.

Comme démontré plus haut dans l'article, cette vulnérabilité est incroyablement facile à exploiter, nécessitant peu ou pas de connaissances sur des sujets de sécurité complexes. En raison de ce fait, le module tarfile de Python est devenu un énorme problème de supply chain menaçant les infrastructures dans le monde entier. Trellix mène la charge en corrigeant autant de référentiels open source que possible et en fournissant un moyen d'analyser les référentiels source propriétaires. 

La Rédaction d'Africa Cybersecurity Mag