Los peligros de las vulnerabilidades de más de 15 años

Los desarrolladores de un módulo común y corriente de Python descubrieron hace poco por qué pueden ser peligrosas las vulnerabilidades antiguas que no tienen parches.

En septiembre de 2022, Trellix publicó un informe sobre una vulnerabilidad en el módulo tarfile, que forma parte de una biblioteca estándar para el lenguaje de programación Python y que cualquier persona puede usarla. Esta vulnerabilidad permite escribir un archivo arbitrario en una carpeta arbitraria del disco duro y, en ocasiones, también permite que código malicioso sea ejecutado. Lo que es digno de mención sobre este estudio es que dicho problema en tarfile fue descubierto en agosto de 2007, ¡hace poco más de 15 años! En ese momento no era considerado como peligroso, sin embargo, veamos por qué razones no lo fue y qué problemas podría acarrear actualmente tanto a los desarrolladores de Python como a sus usuarios.

Tarfile a detalle

Tarfile contiene código para trabajar con archivos tar. Este formato se remonta a 1979 y es un frecuentemente se utiliza en sistemas operativos parecidos a UNIX. Tar es una forma sencilla de empaquetar una gran cantidad de archivos y carpetas. En sus inicios, se utilizó para escribir copias de seguridad en cinta magnética. En la actualidad, los archivos tar pueden usar la compresión de archivos de manera opcional. El tarfile es responsable de crear y extraer dichos archivos, y los desarrolladores de Python lo utilizan como herramienta especial para estas tareas.

La vulnerabilidad en tarfile es realidad es muy simple. Se describió exhaustivamente en el informe original sobre el error en agosto de 2007. De hecho, ni es una vulnerabilidad como tal; tarfile únicamente recrea la estructura de carpetas exactamente como está contenida en el archivo cuando se extrae. Esto incluye los casos en los que el nombre del documento en el archivo empaquetado es algo como “../../../../../etc/passwd”. Si se extrae este archivo siendo administrador del sistema, el archivo passwd no se escribe en el mismo directorio donde se encuentra el archivo empaquetado. Al encontrarse los elementos /../ en la ruta, la herramienta para desempaquetar primero llega al directorio raíz y luego sobrescribe el archivo passwd en el directorio /etc. En Linux, esto significa borrar el archivo regular que contiene los datos de todos los usuarios del sistema.

Aquí el peligro se encuentra en que el usuario de un programa que emplea el módulo tarfile desconoce cómo termina la extracción normal de un archivo regular. Puede que no tenga nada, que algunos archivos aparezcan en un lugar inesperado o que algunos archivos de usuario se sobrescriban. El autor del informe de este error menciona este mismo problema en el propio archivador tar, un problema que se solucionó hace más de 20 años, en 2001. No obstante, esta vulnerabilidad en tarfile nunca fue solucionada.

15 años después

Tras una discusión en 2007 sobre este potencial bug, la decisión fue… no hacer nada, por dos razones: primero, este procesamiento de archivos se ajusta totalmente al estándar UNIX POSIX (podemos confirmarlo). Segundo, “en la práctica, no hay posibilidad de explotación”. En ese momento, se consideró que bastaba con realizar una advertencia en la guía del usuario especificando que no era recomendable extraer archivos utilizando tarfile de fuentes no confiables.

No obstante, en 2022 esta afirmación fue refutada cuando Trellix demostró que, en la práctica, claro que es posible la explotación de dicha vulnerabilidad. No solo es posible escribir datos donde uno desee, sino que es posible ejecutar código arbitrario también. Queremos recordar que esta es una biblioteca para programadores; o sea, que la posibilidad de un ataque depende del software específico en el que se utilice el módulo tarfile. Trellix dio dos ejemplos:

Fragmento de código vulnerable en Universal Radio Hacker. Fuente.

El primero es Universal Radio Hacker, un programa de análisis de protocolos inalámbricos desconocidos. El programa guarda datos en forma de proyectos, que consisten en diversos archivos empaquetados en tar. Los investigadores demostraron cómo un intento de abrir un archivo predefinido lleva a que un archivo ejecutable se escriba en el directorio de ejecución automática de Windows. Por ende, a la próxima que el sistema sea reiniciado, este código será ejecutado. Esta vulnerabilidad puede explotarse en distintas plataformas, entre otras cosas.

El segundo ejemplo que aparece en el vídeo es un tanto más complejo. El entorno de desarrollo Spyder IDE almacena datos en archivos tar. En primer lugar, al importar estos datos, los investigadores repitieron el experimento implantando el archivo en el sistema, para luego hacer algo aún mejor: programar un código arbitrario para que fuera ejecutado en el siguiente inicio de Spyder. El resultado final de este experimento fue una solicitud para ejecutar código arbitrario, pero con los privilegios del administrador del sistema.

Consecuencias impredecibles

Esta historia sobre un error que data de hace 15 años muestra que nunca hay que subestimar a las vulnerabilidades que permiten escribir datos en cualquier parte, inclusive si se sigue el protocolo y las rutas de explotación no son evidentes.

Tarfile es parte de la biblioteca estándar de Python y puede encontrarse en casi cualquier sistema basado en Linux (entre otros). No obstante, el peligro está en el uso de una función vulnerable en específico. En términos generales, cualquier proyecto desarrollado en Python que utilice un módulo tarfile es una vulnerabilidad. Desde el punto de vista del usuario final, se trata de una situación complicada: los usuarios podrían estar ejecutando un programa potencialmente vulnerable sin ni siquiera saber que este utiliza tar. Nuestros expertos recomiendan:

  • limitar el procesamiento de archivos de fuentes no confiables;
  • ejecutar programas de terceros con privilegios mínimos para disminuir las oportunidades de un ataque;
  • examinar el software utilizado en los sistemas más críticos para identificar aquellos que usan una función vulnerable.

Para los desarrolladores, este problema les da una buena razón para revisar su propio código en busca de funciones vulnerables y modificarlo acorde a los resultados del análisis.

Consejos