Recorrido de ruta de acceso

Categoría de OWASP: MASVS-STORAGE: Almacenamiento

Descripción general

Las vulnerabilidades de salto de directorio se producen cuando un atacante puede controlar parte de la ruta que luego se pasa a las APIs del sistema de archivos sin validación. Esto puede generar operaciones de sistema de archivos no autorizadas. Por ejemplo, un atacante podría usar caracteres especiales, como ../, para cambiar el destino del recurso de forma inesperada, mientras se desplaza fuera del directorio de destino.

Impacto

El impacto varía según la operación y el contenido del archivo, pero, en general, provoca el reemplazo de un archivo (cuando se escriben archivos), la filtración de datos (cuando se leen archivos) o los cambios de permisos (cuando se cambian los permisos del archivo o del directorio).

Mitigaciones

Canonicaliza la ruta con File.getCanonicalPath() y compara el prefijo con el directorio esperado:

Kotlin

@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
    val f = File(path)
    val canonicalPath = f.canonicalPath
    require(canonicalPath.startsWith(expectedDir!!))
    return f
}

Java

public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
  File f = new File(path);
  String canonicalPath = f.getCanonicalPath();
  if (!canonicalPath.startsWith(expectedDir)) {
    throw new IllegalArgumentException();
  }
  return f;
}

Una práctica recomendada adicional es usar la validación para garantizar que solo se produzcan los resultados esperados. Estos son algunos ejemplos:

  • Verifica si el archivo ya existe para evitar un reemplazo accidental.
  • Verifica si el archivo de destino es un destino esperado para evitar que se filtren datos o se cambien los permisos de forma incorrecta.
  • Verifica si el directorio actual de la operación es el que se espera en el valor que se muestra de la ruta canónica.
  • Comprueba que un sistema de permisos tenga un alcance explícito para la operación, como verificar que no ejecute servicios como raíz y asegurarse de que los permisos del directorio tengan alcance en el servicio o el comando especificados.