Joven hacker sonriendo

Limitar tiempo de vida de variables

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

Necesidad

Eliminar (limpiar) datos, variables y/o objetos creados por 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 limpiar/eliminar datos, variables y/o objetos creados por la misma cuando ya no estén en uso,[1] limitando así su tiempo de vida.

Solución

  • Lectura segura de credenciales:

    1. El siguiente bloque de código C#, declara la clase Password y dentro de ella se define el método Main:

      password.cs
      1
      2
      3
      4
      5
      6
      7
      using System;
      using System.Security;
      
      class Password
      {
        static void Main(string[] args)
        {
      
    2. A continuación se lee desde la consola las credenciales de acceso para un usuario, solicitando el nombre de usuario y su respectiva contraseña. Dichas credenciales son almacenadas en las variables loginid y password respectivamente:

      1
      2
      3
      4
        Console.WriteLine("Ingresa tu nombre de usuario: ");
        var loginid = Console.ReadLine();
        Console.WriteLine("Ingresa tu contraseña: ");
        var password = Console.ReadLine();
      
    3. Posterior a ello, convertimos la cadena que contiene la contraseña en un array de caracteres (char[] myArray) mediante el método ToCharArray(). Y mediante el método verify que recibe el nombre usuario y contraseña, simulamos el proceso de validación del usuario para una plataforma en particular (el lector debe implementar este método de acuerdo a sus necesidades):

      1
      2
      3
        char[] mArray = password.ToCharArray();
      
        bool isValidUser = verify(loginid, mArray);
      
    4. Como se observa en el siguiente bloque de código, una vez no son necesarias las credenciales de usuario, éstas son inmediatamente sobrescritas o eliminadas de memoria mediante el método MyArray.Fill de la clase MyArray.

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
          MyArray.Fill(mArray,' '); // limpiar la contraseña
          if (!isValidUser)
          {
            throw new SecurityException("Credenciales no validas");
          }
        }
        // Validación simulada, siempre devuelve true
        private static bool verify(string username, char[] password)
        {
          return true;
        }
      }
      
    5. La implementación de la clase MyArray es la siguiente:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      internal static class MyArray
      {
      
        internal static void Fill<T>(T[] array, T value)
        {
          for (int i = 0; i < array.Length; i++)
          {
            array[i] = value;
          }
        }
      
      }
      

      De lo anterior, el método Fill es el encargado de sobrescribir el array de caracteres (T[] array) que recibe como primer parámetro, es decir, la contraseña, por el caracter incluido en el segundo parámetro (T value).

    6. 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
      Password.cs
      $ mcs Password.cs
      $ ls
      Password.cs Password.exe
      
    7. 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 Password.exe
      
    8. La salida en consola luego de ejecutar el programa es la siguiente:

      1
      2
      3
      4
      Ingresa tu nombre de usuario:
      FLUIDuser
      Ingresa tu contraseña:
      FLUIDpwd
      

Descargas

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

  1. password.cs contiene las instrucciones C# descritas anteriormente para el manejo de credenciales de manera segura.




Haz un comentario

Estado de los servicios - Términos de Uso