Los SecureString protegen en RAM

La memoria RAM y los tricks que rodean a este elemento volátil son interesantes y un punto de exposición. Muchos usuarios piensan que de ella no se puede obtener datos de interés, pero cómo hemos visto en los artículos “Cómo sacar la contraseña de Gmail de la memoria del proceso de Firefox usando Metasploit” o el de “Volcar credenciales del proceso KeePass con Meterpreter”, se puede obtener datos jugosos o indicios que nos ayuden en un pentest.

En esta ocasión voy a tratar el tema de los SecureStrings. Según indica Microsoft en su MSDN los SecureString es un objeto similar a los Strings, el cual tiene un texto almacenado como atributo. Dicho atributo es almacenado en memoria, pero se utiliza un mecanismo que protege el valor del atributo. El mecanismo suele ser el cifrado que el propio sistema operativo proporcione. Esta es la principal diferente con un String. Con el String no es posible predecir cuando la instancia será eliminada del equipo, por lo que existe un riesgo de que esa información sea visualizada por otro usuario o proceso. Al final todo se reduce a: la información sensible, tales como contraseñas, deberían ser almacenadas en SecureString, mientras que el resto de información podría ser almacenada, sin más, en Strings.

Para esta prueba de concepto se ha utilizado un código .NET escrito en C#, el cual permite ejemplificar dos situaciones:
  1. En la primera situación el usuario utiliza SecureStrings para gestionar su clave. La clave no se imprime por pantalla y si buscamos la información en memoria RAM no debemos encontrar nada. 
  2. En la segunda situación el usuario gestiona su clave en un tipo String. Cómo ya hemos visto en anteriores artículos, la información será mostrada.

El trozo de código anterior muestra 2 funciones, una que permite convertir un String a SecureString y la otra realiza el proceso inverso. Una correcta gestión de los SecureString puede ayudarnos a solventar problemas de leaks a través de información en la RAM.

Para realizar el volcado de memoria RAM del proceso .NET utilizado, el cual en este caso solo gestiona información con SecureStrings, se utiliza el script de Meterpreter llamado proc_memdump para obtener el volcado remoto.


Cómo puede verse en la imagen, si buscamos cadenas como “System.Security” se encuentra Password: System.Security.SecureString. En el caso de que se utilizará un String ya tendríamos el leak y el valor de la contraseña.

Conociendo la contraseña que hemos almacenado en el SecureString realizamos una búsqueda sobre el dumpeo de memoria. El resultado es el que se puede ver en la imagen, nada. No encontramos información sobre la contraseña en el volcado, se está gestionando de forma correcta y segura.


Ahora vamos a ejecutar el proceso nuevamente pero haciendo que la contraseña se gestione a través de un String. Tal y como se puede ver en la imagen se ejecuta process_memdump y se obtiene el volcado en crudo del proceso.


Realizando la búsqueda sobre la captura de la palabra “Pass” podemos encontrar la contraseña en texto plano en la memoria RAM. Esta información ha sido mostrada por pantalla, por lo que obtenemos del proceso está ahí en la memoria del proceso.


Cómo conclusión decir que una correcta gestión del uso de Strings sensibles y unas buenas pautas a la hora de programar nos ayudan a hacer nuestro desarrollo más seguro. No son ataques sencillos o comunes en un pentesting, pero la información que, generalmente, almacena la memoria RAM es sensible, por lo que se debe cuidar de forma similar a mimamos la información que se encuentra en disco.