Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Obtener Rutas Absolutas Canónicas

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Scala al obtener rutas absolutas canónicas. A través de este mecanismo es posible proteger a la aplicación de ataques de directorio transversal.

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. Se esta desarrollando una aplicación en lenguaje de programación Scala v2.10.4.

  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.

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), también conocidos como ataques de directorio transversal.

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. Para obtener las rutas absolutas canónicas se puede utilizar la función getCanonicalPath() de la clase java.io.File la cual devuelve el nombre de la ruta absoluta canonizada. La siguiente porción de código muestra la utilización del procedimiento mencionado anteriormente:

    Pathvalidation.scala
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import java.io.{File,IOException}
    object Main {
      def main(args: Array[String]) {
        try{
          val link_name = "../../../tmp/prueba"
          val dirLog= new File( link_name )
          println("Path: " + dirLog.getPath())
          val canonicalPath = dirLog.getCanonicalPath()
          println("Canonical path: " + canonicalPath)
    
  2. La función getCanonicalPath() 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-rw-r--  1 pablo pablo    5 Dic 11 16:18 hola
    lrwxrwxrwx  1 pablo pablo    4 Dic 11 16:18 prueba -> hola
    
  4. Para determinar si la ruta ingresada es un enlace simbólico se realiza lo siguiente [2]:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
      val file = new File("/tmp/prueba");
      println("\nAbsolute path: " + file.getAbsolutePath());
      println("Canonical path: " + file.getCanonicalPath());
      if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
        println("Direccionan la misma ruta");
      }
      else {
        println("Posible link simbólico");
      }
    }catch{
      case e: Exception => 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/pablo/tmp/prueba
    
    Absolute path: /tmp/prueba
    Canonical path: /tmp/hola
    Posible link simbólico
    
  6. Aquí se aprecia como se ha transformado la ruta inicial en su versión canónica y también se ha podido determinar que el archivo /tmp/prueba es en realidad un enlace simbólico.




Haz un comentario

Estado de los servicios - Términos de Uso