flawopen.com/Travessia de caminho/Zip Slip
O que é uma vulnerabilidade Zip Slip?
Um arquivo ZIP pode conter nomes como ../../outside.txt. Se o extrator confiar nesses nomes, um arquivo pode ser gravado fora da pasta de destino — limitado apenas pelas permissões do processo.
Por que isso passa despercebido
Extrair um arquivo parece uma operação rotineira, mas cada nome de entrada dentro de um ZIP ou TAR é controlado por quem criou o arquivo, quando a origem não é confiável. Juntar outputDir + entry.name sem validar o caminho cria uma travessia de diretório por meio do conteúdo do arquivo.
for entry in zip_file:
dest = os.path.join(output_dir, entry.name)
write_file(dest, entry.read())
# entry.name pode ser "../../outside.txt"
root = os.path.realpath(output_dir)
os.makedirs(root, exist_ok=True)
for entry in zip_file:
dest = os.path.realpath(
os.path.join(root, entry.name)
)
try:
inside_root = os.path.commonpath([root, dest]) == root
except ValueError:
inside_root = False
if not inside_root:
raise ValueError("Unsafe entry path")
write_file(dest, entry.read())
Essa verificação impede escapes do caminho, inclusive nomes irmãos que compartilham um prefixo textual. Extraia em um diretório novo e privado; rejeite entradas symlink e considere symlinks preexistentes ou alterações concorrentes no sistema de arquivos, que exigem APIs resistentes a corridas ou uma biblioteca de extração mantida.
Perguntas frequentes
As APIs de arquivos Python oferecem proteções diferentes
O par de código acima é um exemplo conceitual de extração personalizada; não é o ZipFile.extractall() integrado do Python. A documentação do Python informa que ZipFile.extract() e extractall() tentam impedir escapes por caminhos absolutos e .., mas ainda recomenda inspecionar arquivos não confiáveis. zipfile.Path não sanitiza os nomes dos membros, portanto o chamador precisa validá-los. Para arquivos TAR, os filtros de extração chegaram ao Python 3.12; no Python 3.14, o padrão passou a ser filter="data". Defina esse filtro explicitamente em runtimes compatíveis cujo padrão possa ser menos restritivo. Mesmo o filtro data não bloqueia todo comportamento inseguro nem riscos de esgotamento de recursos. Extraia em um diretório temporário novo e privado e limite o tamanho do arquivo, a quantidade de membros, o total descompactado e o tempo de processamento.
Algumas versões de bibliotecas passaram a incluir proteções após a divulgação ampla do padrão em 2018; outras não validam os caminhos por padrão. Consulte a documentação da versão usada e valide explicitamente cada entrada.