OpenRefine Vulnerable a Path Traversal [CVE-2024-49760]

¿Qué es OpenRefine?

OpenRefine es una potente herramienta basada en Java que permite trabajar con datos desordenados, comprenderlos, limpiarlos, conciliarlos y aumentarlos con datos procedentes de la web. Todo ello desde un navegador web y la comodidad y privacidad de tu ordenador.

CVE-2024-49760 [Path Traversal]

El comando load-language espera un parámetro lang a partir del cual construye la ruta del fichero de localización a cargar, de la forma translations-$LANG.json. Pero al hacerlo en versiones anteriores a la 3.8.3, no comprueba que la ruta resultante esté en el directorio esperado, lo que significa que este comando podría ser explotado para leer otros ficheros JSON en el sistema de ficheros.

Analizando el Código Fuente

Fichero main/src/com/google/refine/commands/lang/LoadLanguageCommand.java

La línea de código vulnerable es:

File langFile = new File(module.getPath(), "langs" + File.separator + strLangFile);

La ruta del archivo de idioma langFile se construye utilizando datos de entrada strLang.

Si strLang proviene de un usuario o de una fuente externa, un atacante podría manipular esta entrada para incluir secuencias especiales, como ../ (que se utiliza para referirse al directorio padre). Esto permitiría al atacante salir del directorio langs y acceder a archivos en otros directorios del sistema.

Falta de Validación Inicial: Sin validaciones adecuadas en la entrada del usuario, la aplicación es vulnerable a un ataque de «Directory Traversal». Por ejemplo, si un atacante proporciona un valor para strLang como ../../etc/passwd, la aplicación podría intentar acceder a un archivo del sistema que no debería estar disponible.

Un ejemplo de este ataque sería algo como: /path/modulo/langs/../../etc/passwd

Para corregir la vulnerabilidad, se sustituye la línea anterior por:

Definición de Directorios Base:

  • File langsDir = new File(module.getPath(), "langs"); : Define explícitamente el directorio base lang) donde se espera que se encuentren los archivos de idioma. Esto crea una referencia clara a un lugar seguro.

Construcción de la Ruta del Archivo de Idioma:

File langFile = new File(langsDir, strLangFile); : Construye la ruta del archivo de idioma en base al directorio langsDir.

strLangFile se utiliza como parte del nombre del archivo, por eso es crucial que strLangFile esté validado y no contenga secuencias de travesía de directorios, para prevenir que se pueda intentar acceder a archivos fuera del directorio langs.

Encapsulación de la Lógica de Rutas:

Al crear el objeto langFile utilizando langsDir como base, se está encapsulando la lógica de ruta en un solo lugar y Eso facilita la validación posterior, ya que cualquier archivo construido a partir de langsDir es considerado un candidato seguro para su verificación.

Versión parcheada

OpenRefine 3.8.3

https://openrefine.org/download

https://github.com/OpenRefine/OpenRefine