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

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 C#, 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 C# versión 5.0 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

  • Lectura segura de ficheros:

    En esta sección se va a implementar un programa el cual permite la lectura segura de ficheros almacenados en el ordenador:

    1. En primer lugar se define el nombre de la clase MyReadFile dentro del espacio de nombre mytest:

      myreadfile.cs
      1
      2
      3
      4
      5
      6
      7
      8
      using System;
      using System.IO;
      using System.Text;
      
      namespace mytest
      {
         class MyReadFile
         {
      
    2. A continuación se define el método ReadFile:

      1
      static void ReadFile(string fileName){
      

      Dicho método permite la lectura segura de ficheros mediante un objeto de la clase FileStream (esta clase almacena los datos en el búfer para obtener un mejor rendimiento), recibiendo como parámetro el string fileName el cual representa la ruta donde se encuentra almacenado el fichero en el ordenador.

    3. En primer lugar creamos una instancia de la clase FileStream (el objeto js):

      1
      FileStream fs = new FileStream(fileName,FileMode.Open,FileAccess.Read);
      

      En este caso, el constructor de dicha clase recibe tres argumentos:

      • string Path: ruta relativa o absoluta del archivo a ser procesado. En este caso la variable fileName.

      • FileMode mode: especifica cómo debería ser procesado el archivo por el sistema operativo. Existen varias constantes para este argumento, en este caso se utiliza el valor Open, lo cual implica que el sistema operativo debe abrir un fichero existente en el ordenador.

      • FileAccess access: constante que determina cómo puede obtener acceso al archivo el objeto FileStream. Existen tres constantes para este argumento, en este caso se utiliza el valor Read, lo cual implica acceso de lectura al fichero.

    4. Luego procesamos el fichero a leer:

      1
      2
      3
      4
        if(fs.CanRead){
      
          byte[] buffer = new byte[fs.Length];
          int bytesread = fs.Read(buffer,0,buffer.Length);
      

      Mediante el método CanRead se verifica si el flujo de datos actual admite lectura de los mismos. Posterior a ello, el método Read de la clase FileStream recibe tres parámetros:

      • byte[] array: contiene la matriz de bytes especificada con los valores entre offset y (offset + count - 1). En este caso le pasamos la variable buffer.

      • int offset: desplazamiento de bytes en el parámetro array donde se colocarán los bytes leídos, en este caso 0.

      • int count: número máximo de bytes que se pueden leer. En este caso le pasamos buffer.Length.

    5. Posterior a ello, mediante la sentencia Console.WriteLine se imprime en pantalla el contenido del fichero leído.

      1
      2
      3
      4
      5
      6
            Console.WriteLine(Encoding.ASCII.GetString(buffer,0,bytesread));
          }
          fs.Flush();//limpiamos el búfer
          fs.Close();
      
        }
      

      Finalmente, una vez no es necesario la lectura del fichero, se limpia el búfer de datos mediante el método Flush. Y por último mediante el método close se cierra el archivo leído y se libera los recursos asociados al flujo de datos del archivo actual.

    6. Para llamar al método ReadFile, dentro del método Main realizamos la llamada al mismo, pasando como argumento la variable fileText que contiene la ruta al fichero a ser leído:

      1
      2
      3
      4
      5
      6
      7
          public static void Main (string[] args)
          {
            string fileText = @"texto.txt";
            ReadFile(fileText);
          }
        }
      }
      
    7. Para ejecutar el anterior programa, desde la terminal se debe ubicar primero en el directorio del proyecto y, en el caso de sistemas basados en Linux se debe instalar los comandos mcs y mono los cuales permiten ejecutar aplicaciones desarrolladas en C# desde Linux. Ejecutamos el comando mcs seguido del nombre del archivo:

      1
      2
      3
      4
      5
      $ ls
      myreadfile.cs texto.txt
      $ mcs myreadfile.cs
      $ ls
      myreadfile.cs myreadfile.exe texto.txt
      
    8. Luego de compilar el programa correctamente, se obtiene el bytecode (archivo .exe) del programa y se procede a ejecutar el mismo mediante el comando mono:

      1
      $ mono myreadfile.exe
      
    9. 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
      csharpTest
      

Descargas

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

  1. myreadfile.cs contiene las instrucciones C# para la lectura de un fichero desde un búfer.




Haz un comentario

Estado de los servicios - Términos de Uso