Extracción de la contraseña maestra de KeePass (CVE-2023-32784)

Ya sabéis que KeePass es un software gratuito y de código abierto que se utiliza para administrar contraseñas de forma segura, quizás el más extendido y usado en la actualidad. KeePass cifra los datos utilizando una contraseña maestra que se debe proporcionar para acceder a la información almacenada y recientemente se ha publicado la vulnerabilidad CVE-2023-32784 que permite obtenerla desde la memoria: "En KeePass 2.x anterior a 2.54, es posible recuperar la contraseña maestra en texto claro de un volcado de memoria, incluso cuando la sesión está bloqueada o ya no se está ejecutando. El volcado de memoria puede ser un dump de proceso de KeePass, un archivo de swap (pagefile.sys), un archivo de hibernación (hiberfil.sys) o un volcado de RAM de todo el sistema"

El problema se deriva del uso de un cuadro de texto custom ('SecureTextBoxEx') para introducir la contraseña, que no sólo se utiliza para eso, sino también en otros lugares de KeePass, como los cuadros de edición de contraseñas que permiten que un atacante lo use para recuperar su contenido.

Por cada carácter escrito, se crea una cadena sobrante en la memoria. "Debido a cómo funciona .NET, es casi imposible deshacerse de él una vez que se crea. Por ejemplo, cuando se escribe "password", se obtendrán estas cadenas sobrantes: •a, ••s, •••s, ••••w, •••••o, ••••••r , •••••••d." "La POC busca estos patrones en el volcado y ofrece un carácter de contraseña probable para cada posición de la contraseña". Eso sí “el primer carácter no se puede recuperar. En 2.54, hay un uso de API diferente y/o inserción de cadenas aleatorias para la mitigación”.

El éxito del ataque depende de cómo se escribió la contraseña y cuántas contraseñas se escribieron por sesión. Incluso si hay varias contraseñas por sesión o errores tipográficos, la forma en que .NET CLR asigna estas cadenas significa que es probable que estén bien ordenadas en la memoria. Por ejemplo, si el usuario escribió tres contraseñas diferentes, es probable que el atacante obtenga tres candidatos para cada posición de carácter en ese orden, lo que le permitirá recuperar las tres contraseñas.

La PoC la tenemos disponible en https://github.com/vdohney/keepass-password-dumper. Para probarlo rápidamente volcamos la memoria del proceso mediante el administrador de tareas de Windows:

Y luego lo ejecutamos mediante:

dotnet run "C:\Users\IEUser\AppData\Local\Temp\KeePass (6).DMP"

Como véis la contraseña 'Hackplayers' es totalmente legible }:)

En definitiva, hasta que actualice la versión de Keepass actual ten mucho cuidado con estos volcados de memoria. Otras alternativas funcionales son las que no usan .NET:

Otras vulnerabilidades recientes:

  • CVE-2023-24055: permite a un atacante con acceso de escritura al archivo de configuración XML robar las credenciales del vault

Otras herramientas para atacar KeePass:

Comentarios