Los peligros de vulnerabilidades que tienen más de 15 años

Los desarrolladores de un módulo de Python normal y corriente descubrieron recientemente por qué pueden ser peligrosas las vulnerabilidades antiguas que no se han parcheado.

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 puede ser utilizada por cualquier persona. La vulnerabilidad permite escribir un archivo arbitrario en una carpeta arbitraria del disco duro y, en algunos casos, también permite que se ejecute código malicioso. Lo que hace que este estudio sea digno de mención es que este problema en tarfile se descubrió en agosto de 2007, ¡hace nada menos que 15 años! En aquel momento no se consideraba peligroso, sin embargo, veamos por qué no lo fue entonces y qué problemas podría suponer en la actualidad para los desarrolladores de Python y sus usuarios.

Tarfile en detalle

Tarfile contiene código para trabajar con archivos tar. La historia de este formato se remonta a 1979 y es un formato que se utiliza frecuentemente en sistemas operativos similares a UNIX. Tar es una sencilla forma de empaquetar una gran cantidad de archivos y carpetas. En sus inicios, se utilizó para escribir copias de seguridad en cinta magnética. Hoy en día, los archivos tar pueden usar la compresión de archivos, aunque de forma opcional. El tarfile es responsable de crear y extraer dichos archivos, y los desarrolladores de Python lo usan como una herramienta confeccionada para estas tareas.

La vulnerabilidad en tarfile es bastante simple. Se describió de forma exhaustiva en el informe original sobre el error de agosto de 2007. Ni siquiera se trata de una vulnerabilidad como tal; tarfile únicamente recrea la estructura de carpetas exacta contenida en el archivo cuando se extrae. Esto incluye los casos en los que el nombre del archivo 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.

El peligro aquí se encuentra en que el usuario de un programa que emplea el módulo tarfile no sabe cómo termina la extracción normal de un archivo regular. Puede que no haya 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ó en 2001, hace más de 20 años. Sin embargo, en tarfile nunca se solucionó esta vulnerabilidad.

15 años de espera

Tras una discusión sobre este potencial bug en 2007, se decidió… no hacer nada, por dos razones: En primer lugar, este procesamiento de archivos se ajusta totalmente al estándar UNIX POSIX (podemos confirmarlo). En segundo lugar, “en la práctica, no hay posibilidad de explotación”. En aquel momento, se consideró que era suficiente con realizar una advertencia en la guía del usuario especificando que no se recomienda extraer archivos de fuentes no fiables utilizando tarfile.

Sin embargo, esta afirmación se refutó en 2022, cuando Trellix demostró que, en la práctica, es más que posible la explotación de esta vulnerabilidad. Y no solo es posible escribir datos donde se quiera, sino que también es posible ejecutar código arbitrario. Cabe recordar que esta es una biblioteca para programadores; es decir 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.

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

El primero es Universal Radio Hacker, un programa para analizar protocolos inalámbricos desconocidos. El programa guarda datos en forma de proyectos, que consisten en múltiples 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 lo tanto, la próxima vez que se reinicie el sistema, se ejecutará este código. Esta vulnerabilidad puede, ser explotada en diferentes plataformas, entre otras cosas.

El segundo ejemplo que se muestra en el vídeo es un poco más complejo. El entorno de desarrollo Spyder IDE almacena datos en archivos tar. Primero, al importar estos datos, los investigadores repitieron el experimento implantando el archivo en el sistema, pero luego hicieron algo aún mejor: programaron un código arbitrario para que se ejecutara en el próximo inicio de Spyder. El resultado final de este experimento fue una solicitud para ejecutar código arbitrario ahora con privilegios de administrador del sistema.

Consecuencias impredecibles

Esta historia de un error de hace 15 años demuestra una vez más que nunca se deben subestimar las vulnerabilidades que permitan escribir datos en cualquier parte, incluso si se hace acorde al protocolo y las rutas de explotación no son evidentes.

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

  • limitar el procesamiento de archivos de fuentes no fiables;
  • ejecutar programas de terceros con privilegios mínimos para minimizar las oportunidades de ataque;
  • examinar el software utilizado en los sistemas más críticos para identificar aquellos que utilizan la 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