Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Limitar tiempo de vida de recursos

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la creación, manipulación y eliminación correcta de recursos dentro de un programa Scala, evitando que información disponible en memoria pueda ser capturada por usuarios no autorizados.

Necesidad

Eliminar (limpiar) recursos dentro de la aplicación cuando ya no estén en uso.

Contexto

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

  1. Se está desarrollando una aplicación en Scala versión 2.11.6 o superior.

  2. El código debe eliminar información sensible en memoria.

  3. La aplicación debe liberar recursos cuando ya no estén en uso,[1] limitando así su tiempo de vida.

Solución

Existen diversas formas de leer ficheros en Scala. La primera consiste en el uso de una sintaxis concisa de una sola línea, sin embargo, tiene el efecto secundario de dejar el archivo o recurso abierto, lo cual representa una falla de seguridad. El segundo, consiste de la implementación de código Scala algo más robusto, permitiendo cerrar el recurso manualmente desde el mismo código. En este artículo se abordan ambas formas de lectura de ficheros.

  • Lectura no segura de ficheros:

    1. Importamos las librerías necesarias:

      readfileone.scala
      1
      import scala.io.Source
      
    2. Posterior a lo anterior, se procede a crear un objeto tipo Singleton llamado ReadFileOne. Dentro de este, se define el método main el cual no retorna ningún dato (esto se especifica mediante Unit =).

      readfileone.scala
      1
      2
      3
      object ReadFileOne {
      
        def main(args: Array[String]): Unit = {
      
    3. Definimos la variable inmutable filename, cuyo contenido corresponde a la ruta del fichero o recurso a leer:

      1
        val filename = "exampleone.txt"
      
    4. A través del método scala.io.Source.fromFile y de un ciclo for se lee el contenido del fichero línea por línea y se imprime en pantalla:

      1
      2
      3
      4
      5
          for (line <-Source.fromFile(filename).getLines) {
            println(line)
          }
        }
      }
      

      Sin embargo, como se mencionó al principio de este artículo, este enfoque no es seguro debido a que deja el archivo o recurso abierto en el búfer.

  • Lectura segura de ficheros:

    1. Importamos las librerías necesarias:

      readfiletwo.scala
      1
        import scala.io.Source
      
    2. Posterior a lo anterior, se procede a crear un objeto tipo Singleton llamado ReadFileTwo. Dentro de este, se define el método main el cual no retorna ningún dato (esto se especifica mediante Unit =).

      1
      2
      3
      object ReadFileTwo {
      
        def main(args: Array[String]): Unit = {
      
    3. Definimos la variable inmutable bufferedSource, cuyo contenido corresponde a la ruta del fichero o recurso a leer:

      1
        val bufferedSource = Source.fromFile("exampletwo.txt")
      
    4. Se lee el contenido del fichero línea por línea y se imprime en pantalla:

      1
      2
      3
        for (line <- bufferedSource.getLines) {
          println(line)
        }
      
    5. Por último, cerramos el recurso abierto una vez éste no sea necesario:

      1
      2
      3
          bufferedSource.close
        }
      }
      
    6. Para ejecutar el anterior programa, desde la terminal se debe ubicar primero en el directorio del proyecto y ejecutar el comando scalac (se debe tener instalado Scala previamente):

      1
      2
      3
      4
      5
      $ ls
      exampletwo.txt ReadFileTwo.scala
      $ scalac ReadFileTwo.scala
      $ ls
      exampletwo.txt ReadFileTwo.class ReadFileTwo.scala ReadFileTwo$.class ReadFileTwo$$anonfun$main$1.class
      
    7. Luego de compilar el programa correctamente, se obtiene el bytecode (archivo .class) del programa y se procede a ejecutar el mismo mediante el comando Scala:

      1
      $ scala ReadFileTwo
      
    8. La salida en consola luego de ejecutar el programa es la siguiente (en este caso el contenido del fichero son contraseñas de prueba):

      1
      2
      3
      4
      Contrasenas:
      FLUIDtest
      admin123
      scalaTest
      

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. ReadFileTwo.scala contiene las instrucciones Scala para la manipulación segura de ficheros.




Haz un comentario

Estado de los servicios - Términos de Uso