Une faille vieille de 15 ans présente dans Python menace potentiellement 300 000 projets open source
ven, 23/09/2022 - 13:28
C'est en procédant à des investigations au départ sans rapport avec leur découverte que des chercheurs en sécurité de l'Advanced Research Center de la société Trellix sont tombés sur une vulnérabilité présente dans le module tarfile 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'.
Un billet sur le blog de Trellix explique en détail cette vulnérabilité et montre comment l'exploiter est très facile.
En résumé, la vulnérabilité, qui est située dans les fonctions extract et extractall du module tarfile, permet à un attaquant d'écraser des fichiers arbitraires sur le systèmle attaqué en ajoutant la séquence ".." aux noms de fichiers dans une archive TAR.
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.
É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
Un exploit très 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 :
C'est ainsi que, comme Jan Matejek le signalait il y a 15 ans, 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 ...