
PoC original para CVE-2023-32784
A vulnerabilidade recebeu o identificador CVE-2023-32784 e foi corrigida no KeePass 2.54. Agradeço mais uma vez a Dominik Reichl pela resposta rápida e pela correção criativa!
Esclarecimento: a senha precisa ser digitada no teclado, não copiada da área de transferência (veja as seções Como Funciona).
Primeiro, atualize para o KeePass 2.54 ou superior.
Em segundo lugar, se você usa o KeePass há muito tempo, sua senha mestra (e possivelmente outras senhas) pode estar no pagefile/swapfile, no arquivo de hibernação e em dumps de falha. Dependendo do seu nível de paranoia, você pode considerar estas etapas para resolver o problema:
C:\Windows\memory.dmp, mas talvez haja outros)/w no Windows)Ou simplesmente sobrescreva seu HDD e faça uma instalação limpa do seu SO.
Lista incompleta de produtos que não são afetados (crie um pull request ou uma issue para adicionar mais). A regra geral é que, se não for o aplicativo KeePass 2.X original escrito em .NET, provavelmente não é afetado.
KeePass Master Password Dumper é uma ferramenta simples de prova de conceito usada para extrair a senha mestra da memória do KeePass. Com exceção do primeiro caractere da senha, ela é capaz de recuperar a senha em texto puro na maioria dos casos. Não é necessária execução de código no sistema alvo, apenas um dump de memória. Não importa de onde vem a memória — pode ser o dump de processo, arquivo de swap (pagefile.sys), arquivo de hibernação (hiberfil.sys), vários dumps de falha ou dump de RAM do sistema inteiro. Não importa se o espaço de trabalho está bloqueado ou não. Também é possível extrair a senha da RAM depois que o KeePass não está mais em execução, embora a chance de isso funcionar diminua com o tempo decorrido desde então.
Testado com KeePass 2.53.1 no Windows (inglês) e KeePass 2.47 no Debian (pacote keepass2). Deve funcionar também para a versão macOS. Infelizmente, ativar a opção Enter master key on secure desktop não ajuda a prevenir o ataque. A PoC pode ter problemas com bancos de dados criados por versões antigas do KeePass, mas não consegui reproduzir isso (veja issue #4).
A descoberta foi confirmada por Dominik Reichl, autor do KeePass, aqui. Agradeço a resposta rápida do Dominik. Espero que seja corrigido em breve!
git clone https://github.com/vdohney/keepass-password-dumper ou baixe-o do GitHubcd keepass-password-dumperdotnet run PATH_TO_DUMPA maneira mais fácil de testar isso no Windows é criar um dump de processo no gerenciador de tarefas clicando com o botão direito no processo do KeePass e selecionando "Criar arquivo de despejo".

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST para gerar uma lista de todas as senhas possíveis a partir do segundo caractere.Depende do seu modelo de ameaça. Se o seu computador já está infectado por malware executando em segundo plano com os privilégios do seu usuário, esta descoberta não piora muito a sua situação. No entanto, pode ser mais fácil para o malware ser furtivo e escapar do antivírus, já que, ao contrário do KeeTheft ou KeeFarce, não é necessária injeção de processo ou outro tipo de execução de código.
Se você tem uma suspeita razoável de que alguém possa obter acesso ao seu computador e realizar análise forense, isso pode ser ruim. No pior cenário, a senha mestra será recuperada mesmo com o KeePass bloqueado ou nem mesmo em execução.
Se você usa criptografia de disco completo com uma senha forte e seu sistema está limpo, você não terá problemas. Ninguém pode roubar suas senhas remotamente pela internet apenas com esta descoberta.
O KeePass 2.X usa uma caixa de texto de desenvolvimento próprio para inserção de senhas, SecureTextBoxEx. Essa caixa de texto não é usada apenas para a senha mestra, mas também em outros lugares do KeePass, como caixas de edição de senha (então o ataque também pode ser usado para recuperar o conteúdo delas).
A falha explorada aqui é que, para cada caractere digitado, uma string residual é criada na memória. Devido ao funcionamento do .NET, é quase impossível se livrar dela depois que é criada. Por exemplo, ao digitar "Password", estas strings residuais são criadas: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. O aplicativo POC procura esses padrões no dump e oferece um caractere provável para cada posição da senha.
A confiabilidade deste ataque pode ser influenciada dependendo de como a senha foi digitada e de quantas senhas foram digitadas por sessão. No entanto, descobri que, mesmo se houver várias senhas por sessão ou erros de digitação, a forma como o CLR do .NET aloca essas strings faz com que elas provavelmente fiquem bem ordenadas na memória. Portanto, se três senhas diferentes foram digitadas, você provavelmente obterá três candidatos para cada posição de caractere nessa ordem, o que possibilita recuperar as três senhas.
É uma POC rápida, então provavelmente não é muito confiável nem robusta. Crie um pull request se você encontrar um problema e corrigi-lo.
Os caracteres de senha permitidos atualmente estão codificados assim: ^[\x20-\x7E]+$ (todos os caracteres ASCII imprimíveis e espaço).
Agradecimentos a adridlug por adicionar a possibilidade de gerar automaticamente a lista de senhas, e a ynuwenhof por refatorar o código.
Ainda não verifiquei nenhum deles.