Skip to main content

Mitiga las vulnerabilidades de recorrido de rutas en Java con Snyk Code

Escrito por
snyk code featured

6 de marzo de 2023

0 minutos de lectura

El recorrido de rutas es un tipo de vulnerabilidad de seguridad que puede ocurrir cuando una aplicación o servicio web permite que un atacante acceda a archivos o directorios del servidor que están fuera de la estructura de directorios prevista. Esto puede dar lugar a la lectura o modificación no autorizada de datos confidenciales. En el contexto de la carga de archivos, puede producirse una vulnerabilidad de recorrido de rutas cuando una aplicación no valida correctamente la ruta especificada por el usuario, lo que puede permitir que el atacante cargue un archivo malicioso cuyo nombre le dé acceso a archivos restringidos del servidor.

Prevenir el recorrido de rutas al cargar archivos es fundamental para la seguridad de las aplicaciones Java, ya que ayuda a proteger los datos confidenciales y evita el acceso no autorizado a archivos y directorios restringidos. En esta publicación del blog, analizaremos con más detalle el recorrido de rutas en la carga de archivos y te mostraremos cómo prevenir esta vulnerabilidad en aplicaciones Java con Snyk Code.

Tanto si eres desarrollador como si simplemente te interesa aprender más sobre seguridad en Java, esta publicación te brindará información y conocimientos para ayudarte a mantener seguras tus aplicaciones Java.

Cómo funciona el recorrido de rutas al cargar archivos

Imagina una aplicación que permite a los usuarios cargar fotos de perfil. La aplicación las almacena en un directorio del servidor, como /images/profiles/. Si no valida correctamente el nombre de archivo especificado por el usuario, un atacante podría cargar un archivo malicioso con un nombre como ../../etc/passwd. Esto le permitiría acceder a archivos confidenciales del sistema que están fuera de la estructura de directorios prevista. 

Veamos el siguiente ejemplo de una aplicación Spring Boot que usa Thymeleaf.

@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
   var name = file.getOriginalFilename().replace(" ", "_");
   var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
   Files.write(fileNameAndPath, file.getBytes());
   model.addAttribute("msg", "Uploaded images: " + name);
   return "person/upload";
}

Los formularios web son una forma muy común de cargar imágenes. Al cargar un archivo, usamos originalFilename del MultipartFile recibido. Si interceptamos e inspeccionamos la solicitud HTTP POST, veremos que filename es solo metadato en esta solicitud HTTP, como se muestra en la línea 24.

Fragmento de código que muestra una cookie JSESSIONID y la carga de una imagen JPEG mediante multipart/form-data.

¡Con las herramientas adecuadas, es fácil cambiar el nombre del archivo por el que queramos! Si lo cambiamos a ../../../../../../../etc/passwd, nuestro código cargará el archivo en images/profiles/../../../../../../../etc/passwd. La ruta llegará hasta el directorio raíz y el archivo sobrescribirá /etc/passwd.

Cómo detecta Snyk Code el recorrido de rutas.

Snyk Code es una herramienta SAST en tiempo real que ayuda a los desarrolladores de Java a identificar vulnerabilidades en sus aplicaciones, incluido el recorrido de rutas al cargar archivos. La herramienta analiza tu código mediante un modelo avanzado de aprendizaje automático e identifica posibles riesgos de seguridad.

En lo que respecta al recorrido de rutas, Snyk Code puede ayudarte a identificar partes de tu código que usan rutas de archivo especificadas por el usuario sin validarlas correctamente. Por ejemplo, cuando conecté mi repositorio de GitHub a Snyk, Snyk Code detectó el problema de recorrido de rutas en la interfaz web.

Interfaz de Snyk Code que destaca una vulnerabilidad de path traversal en código Java para subir archivos, con la línea insegura que escribe el archivo y una explicación de cómo corregirla.

Luego, usé el complemento de Snyk para IntelliJ IDEA con Snyk Code habilitado. El análisis en mi equipo durante el desarrollo ya detectó el problema de recorrido de rutas en la carga de archivos. Además, también me sugirió algunas medidas posibles para mitigar el problema.

Panel de seguridad de Snyk que destaca una vulnerabilidad de alta gravedad CWE-23 de recorrido de rutas y correcciones de código para evitar rutas de archivos inseguras.

Al usar Snyk Code, puedes identificar y corregir de forma proactiva estas vulnerabilidades de recorrido de rutas antes de que se exploten, lo que ayuda a garantizar la seguridad de tu aplicación y de los datos que maneja. 

En resumen, Snyk Code ayuda a los desarrolladores de Java a identificar vulnerabilidades de recorrido de rutas al cargar archivos mediante el análisis de su código y la detección de áreas donde no se implementó una validación adecuada. Esto puede ayudar a garantizar la seguridad de tu aplicación y protegerla frente a posibles ataques.

Cómo mitigar el recorrido de rutas al cargar archivos

La forma más sencilla de corregir una vulnerabilidad de recorrido de rutas es evitar usar file.getOriginalFilename(). Si generas el nombre por tu cuenta, tienes control absoluto sobre la ubicación donde se almacena el archivo, ya que esta depende de los datos que proporciona el usuario.

Sin embargo, si quieres conservar el nombre original del archivo, debemos comprobar que la ubicación donde se almacena sea la correcta. Snyk Code (como se ve en el ejemplo del complemento para IDE) ya sugirió que podemos normalizar la ruta con normalize.

Modifiquemos el ejemplo anterior para comprobar que la ruta normalizada comience, al menos, con la carpeta de carga prevista. De esta forma, evitamos problemas de recorrido de rutas.

Nota del editor: 31 de marzo de 2023

Este bloque de código se actualizó.

@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
   var name = file.getOriginalFilename().replace(" ", "_");
   var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);

   if (!fileNameAndPath.normalize().startsWith(UPLOAD_DIRECTORY)) {
        throw new IOException("Could not upload file: " + name);
   }

   Files.write(fileNameAndPath, file.getBytes());
   model.addAttribute("msg", "Uploaded images: " + name);
   return "person/upload";
}

Es fundamental prevenir las vulnerabilidades de recorrido de rutas.

Las vulnerabilidades de recorrido de rutas representan una grave amenaza para la seguridad de las aplicaciones web Java y actualmente se encuentran entre los principales problemas de seguridad que Snyk detecta en el código Java.
Los desarrolladores deben conocerlas y comprender cómo prevenirlas. Al implementar una validación adecuada y usar herramientas como Snyk Code para identificar posibles vulnerabilidades, pueden contribuir a garantizar la seguridad de sus aplicaciones y protegerlas frente a los riesgos de los ataques de recorrido de rutas. Es fundamental recordar que la seguridad es un proceso continuo. Mantenerse alerta y actuar de forma proactiva para identificar y mitigar vulnerabilidades es clave para mantener seguras tus aplicaciones Java.

Corrige las vulnerabilidades de recorrido de rutas y gana increíbles artículos promocionales

El evento de Snyk para corregir vulnerabilidades, The Big Fix, se lleva a cabo del 14 de febrero al 14 de marzo. Participa en la competencia y corrige vulnerabilidades en tus proyectos personales o en algún proyecto de código abierto que uses con frecuencia. Si acabas de descubrir una vulnerabilidad de recorrido de rutas en tu aplicación, agrega tu proyecto a The Big Fix. Corregir una sola vulnerabilidad te permitirá ganar una camiseta de edición limitada de The Big Fix 2023. Además, quienes corrijan más vulnerabilidades este año competirán por otros premios increíbles.

¿Qué esperas? Únete a The Big Fix y empieza a proteger tu aplicación hoy mismo.

Banner promocional de The Big Fix con el texto «Corrige vulnerabilidades y gana increíbles artículos promocionales», del 14 de feb. al 14 de mar., con un botón para unirte.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.

Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

blog feature ai violet
Blog

VulnBump: ¿Pueden los agentes de IA corregir dependencias vulnerables sin romper la compilación?

VulnBump prueba agentes de IA en 307 actualizaciones reales de dependencias. Una corrección cuenta solo si elimina la vulnerabilidad y mantiene en verde la compilación y las pruebas.

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.