Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + tecnología especializada

Obtener Rutas Absolutas Canónicas

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al obtener rutas absolutas canónicas. La validación de entradas es un proceso esencial para evitar ataques de inyección de código malicioso.

Necesidad

Obtener rutas absolutas canónicas para evitar ataques de directorio transversal.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. La aplicación está construida en Java.

  2. La aplicación emplea rutas que referencian archivos o directorios del sistema operativo que deben ser validados.

  3. La aplicación se está desarrollando en ambientes UNIX. Para Windows consultar el uso del comando mklink.

  4. Se está desarrollando para una versión anterior que Java 7. A partir de Java 7 se recomienda en cambio hacer uso del método toRealPath de la interfaz java.nio.file.Path.

Solución

Para desarrollar una aplicación robusta y segura es necesario tener en cuenta muchos criterios y recomendaciones. Entre ellas una de las más importantes consiste en validar las entradas proporcionadas por los usuarios. Esto se realiza para evitar ataques comunes de inyección de código como Cross Site Scripting (XSS) o SQL Injection (SQLi), pero también puede evitar ataques de escalado de directorios (Path Traversal).

En un ataque de directorio transversal, el atacante es capaz de acceder de forma no autorizada a archivos y carpetas de directorios superiores de la aplicación, comprometiendo la confidencialidad de la información allí almacenada.

Existen muchas alternativas para impedir los ataques de directorios transversales como la validación con expresiones regulares o la validación de redirecciones. En este artículo mostraremos cómo evitar este tipo de ataques en tu aplicación, al obtener rutas absolutas canónicas.

  1. Java proporciona la función getCanonicalPath() de la clase java.io.File que se encarga de retornar el nombre de la ruta absoluta normalizada. A continuación se presenta un fragmento de código fuente implementando esta función:

    CanonPath.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    import java.io.File;
    import java.io.IOException;
    
    class Main {
      public static void main(String[] args) {
        try{
            String link_name = "../../../tmp/prueba";
            File dirLog= new File( link_name );
            System.out.println("Path: " + dirLog.getPath());
            String canonicalPath = dirLog.getCanonicalPath();
            System.out.println("Canonical path: " + canonicalPath);
        ...
    
  2. Esta función se encarga de remover elementos especiales como ., .. y resolver enlaces simbólicos, alias shortcuts en todas las plataformas, devolviendo la versión canónica de la ruta especificada [1].

  3. Para el siguiente ejemplo se crea un archivo llamado /tmp/hola y luego un enlace simbólico a este llamado /tmp/prueba:

    1
    2
    3
    4
    5
    ryepes@const /tmp % echo hola > hola
    ryepes@const /tmp % ln -s hola prueba
    ryepes@const /tmp % ls -la | grep hola
    -rw-r--r--  1 ryepes ryepes    5 Nov 21 08:14 hola
    lrwxrwxrwx  1 ryepes ryepes    4 Nov 21 08:14 prueba -> hola
    
  4. Para determinar si la ruta ingresada es un enlace simbólico se realiza el siguiente procedimiento [2]:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
      File file = new File("/tmp/prueba");
      System.out.println("\nAbsolute path: " + file.getAbsolutePath());
      System.out.println("Canonical path: " + file.getCanonicalPath());
    
        if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
          System.out.println("Direccionan la misma ruta");
        }
    
        else {
          System.out.println("Posible link simbólico");
        }
    }
      catch(IOException e){
        System.out.println(e);
      }
    
  5. Se observa, luego de la ejecución, la siguiente salida:

    1
    2
    3
    4
    5
    6
    7
    $ java Main
    Path: ../../../tmp/prueba
    Canonical path: /home/ryepes/tmp/prueba
    
    Absolute path: /tmp/prueba
    Canonical path: /tmp/hola
    Posible link simbólico
    



Haz un comentario

Estado de los servicios - Términos de Uso