¿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
.
ButterflyModule module = servlet.getModule(strModule);
String strLangFile = "translation-" + strLang + ".json";
String strMessage = "[" + strModule + ":" + strLangFile + "]";
File langFile = new File(module.getPath(), "langs" + File.separator + strLangFile);
File langsDir = new File(module.getPath(), "langs");
File langFile = new File(langsDir, strLangFile);
if (!langFile.toPath().normalize().toAbsolutePath().startsWith(langsDir.toPath().normalize().toAbsolutePath())) {
logger.error("Security: Attempt to escape the langs directory to read another file");
return null;
}
FileInputStream fisLang = null;
try {
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 baselang
) 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