
PoC original para CVE-2023-32784
La vulnerabilidad fue asignada CVE-2023-32784 y corregida en KeePass 2.54. Gracias nuevamente a Dominik Reichl por su rápida respuesta y solución creativa.
Aclaración: la contraseña debe escribirse en un teclado, no copiarse del portapapeles (consulte las secciones Cómo funciona).
Primero, actualiza a KeePass 2.54 o superior.
Segundo, si has estado usando KeePass por mucho tiempo, tu contraseña maestra (y potencialmente otras contraseñas) podría estar en tu archivo de paginación/swap, archivo de hibernación y volcados de memoria. Dependiendo de tu nivel de paranoia, puedes considerar estos pasos para resolver el problema:
C:\Windows\memory.dmp, pero puede haber otros)/w en Windows)O simplemente sobrescribe tu disco duro y realiza una instalación limpia de tu SO.
Lista incompleta de productos que no se ven afectados (por favor, crea un pull request o un issue para agregar más). La regla general es que si no es la aplicación original KeePass 2.X escrita en .NET, probablemente no se vea afectada.
KeePass Master Password Dumper es una herramienta simple de prueba de concepto utilizada para volcar la contraseña maestra de la memoria de KeePass. Aparte del primer carácter de la contraseña, es capaz de recuperar la mayor parte de la contraseña en texto plano. No se requiere ejecución de código en el sistema objetivo, solo un volcado de memoria. No importa de dónde provenga la memoria: puede ser el volcado de proceso, archivo de intercambio (pagefile.sys), archivo de hibernación (hiberfil.sys), varios volcados de memoria o volcado de RAM de todo el sistema. No importa si el espacio de trabajo está bloqueado o no. También es posible volcar la contraseña de la RAM después de que KeePass ya no se esté ejecutando, aunque la probabilidad de que funcione disminuye con el tiempo transcurrido desde entonces.
Probado con KeePass 2.53.1 en Windows (inglés) y KeePass 2.47 en Debian (paquete keepass2). También debería funcionar para la versión de macOS. Desafortunadamente, habilitar la opción Enter master key on secure desktop no ayuda a prevenir el ataque. El PoC podría tener problemas con bases de datos creadas por versiones antiguas de KeePass, pero no pude reproducirlo (ver issue #4).
El hallazgo fue confirmado por Dominik Reichl, autor de KeePass, aquí. Agradezco la rápida respuesta de Dominik. ¡Espero que se solucione pronto!
git clone https://github.com/vdohney/keepass-password-dumper o descárgalo desde GitHubcd keepass-password-dumperdotnet run PATH_TO_DUMPLa forma más fácil de probar esto en Windows es crear un volcado de proceso en el administrador de tareas haciendo clic derecho en el proceso de KeePass y seleccionando "Crear archivo de volcado".

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST para generar una lista de todas las contraseñas posibles a partir del segundo carácter.Depende de tu modelo de amenaza. Si tu computadora ya está infectada por malware que se ejecuta en segundo plano con los privilegios de tu usuario, este hallazgo no empeora mucho tu situación. Sin embargo, podría ser más fácil para el malware ser sigiloso y evadir el antivirus, ya que a diferencia de KeeTheft o KeeFarce, no es necesaria la inyección de procesos ni otro tipo de ejecución de código.
Si tienes una sospecha razonable de que alguien podría obtener acceso a tu computadora y realizar un análisis forense, esto podría ser malo. El peor escenario es que la contraseña maestra sea recuperada, a pesar de que KeePass esté bloqueado o no se esté ejecutando en absoluto.
Si usas cifrado de disco completo con una contraseña fuerte y tu sistema está limpio, deberías estar bien. Nadie puede robar tus contraseñas de forma remota a través de internet solo con este hallazgo.
KeePass 2.X utiliza un cuadro de texto desarrollado a medida para la entrada de contraseñas, SecureTextBoxEx. Este cuadro de texto no solo se usa para la entrada de la contraseña maestra, sino también en otros lugares de KeePass, como los cuadros de edición de contraseñas (por lo que el ataque también se puede usar para recuperar su contenido).
La falla explotada aquí es que por cada carácter escrito, se crea una cadena residual en la memoria. Debido a cómo funciona .NET, es casi imposible deshacerse de ella una vez creada. Por ejemplo, cuando se escribe "Password", resultará en estas cadenas residuales: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. La aplicación POC busca en el volcado estos patrones y ofrece un carácter probable para cada posición en la contraseña.
La confiabilidad de este ataque puede verse influenciada dependiendo de cómo se escribió la contraseña y cuántas contraseñas se escribieron por sesión. Sin embargo, he descubierto que incluso si hay múltiples 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. Entonces, si se escribieron tres contraseñas diferentes, es probable que obtengas tres candidatos para cada posición de carácter en ese orden, lo que hace posible recuperar las tres contraseñas.
Es un POC rápido, por lo que probablemente no sea muy confiable y robusto. Por favor, crea un pull request si encuentras algún problema y lo solucionas.
Los caracteres de contraseña permitidos están actualmente codificados así: ^[\x20-\x7E]+$ (todos los caracteres ASCII imprimibles y espacio).
Gracias a adridlug por agregar la posibilidad de generar automáticamente la lista de contraseñas, y a ynuwenhof por refactorizar el código.
Aún no he revisado ninguno de ellos.