keepass_dumper.py
Porte Python de vdohney/keepass-password-dumper
(CVE-2023-32784) — todo o crédito pela implementação original em C# e pela
técnica subjacente vai para vdohney.
O script analisa um dump de memória de processo em busca das strings de renderização residuais que
o SecureTextBoxEx do KeePass 2.x deixa para trás enquanto o usuário digita a
senha mestra, e recupera todos os caracteres dessa senha, exceto o
primeiro. Opcionalmente, ele então força bruta o primeiro caractere desconhecido
contra um arquivo KDBX usando keepassxc-cli.
Versões afetadas
- Vulnerável: KeePass 2.53.1 e anteriores (Windows e Linux).
- Corrigido: KeePass 2.54 e posteriores.
- KeePassXC, KeePass 1.x e Strongbox não são afetados.
A falha está no controle personalizado SecureTextBoxEx: para cada caractere
digitado, o .NET mantém uma string residual na memória gerenciada no formato
●a, ●●s, ●●●s, … da qual cada caractere da senha após o primeiro
pode ser recuperado.
Pré-requisitos e limitações do ataque
- Requer um artefato de memória do processo KeePass: um dump de processo, o
arquivo de página/swap, um arquivo de hibernação, um dump de crash do kernel ou uma captura
completa de RAM. Nenhuma execução de código no host alvo é necessária.
- Funciona esteja o workspace bloqueado ou desbloqueado, e até mesmo após o
processo KeePass ter sido encerrado (desde que as páginas de memória sobrevivam em algum lugar).
- O primeiro caractere da senha não é recuperável a partir do vazamento.
- O vazamento captura caracteres ASCII imprimíveis de forma confiável; caracteres não ASCII são
menos confiáveis.
- Múltiplas senhas mestras inseridas na mesma sessão podem produzir
strings residuais sobrepostas e degradar a precisão.
Mitigação
Se você usou KeePass ≤ 2.53.1, considere a senha mestra comprometida:
- Atualize o KeePass para 2.54 ou mais recente.
- Altere a senha mestra (e rotacione quaisquer segredos de alto valor armazenados no
banco de dados que foram inseridos enquanto a senha mestra antiga estava em uso).
- Elimine artefatos de memória que ainda possam conter as strings residuais:
- exclua dumps de crash (ex.:
C:\Windows\memory.dmp),
- desative/limpe a hibernação (
powercfg /h off no Windows),
- exclua ou apague o pagefile / swapfile,
- sobrescreva o espaço livre em disco (ex.:
cipher /w: no Windows) para que os
resíduos não possam ser extraídos de setores previamente alocados,
- reinicie — ou, para cenários de alta segurança, reinstale o sistema operacional.
Requisitos
- Python 3.10+ (apenas biblioteca padrão — nenhum pacote de terceiros)
keepassxc-cli no $PATH (necessário apenas para --kdbx)
Instalação
No Debian / Ubuntu, instale o CLI do KeePassXC se você planeja usar força bruta:
sudo apt install keepassxc
Uso
# Recupera caracteres candidatos e os imprime
python3 keepass_dumper.py memory.dmp
# Despeja a lista de candidatos gerada em um arquivo
python3 keepass_dumper.py memory.dmp -p candidates.txt
# Recupera e força bruta o primeiro caractere ausente contra um KDBX
python3 keepass_dumper.py memory.dmp --kdbx db.kdbx
Execute python3 keepass_dumper.py --help para a lista completa de opções.
O que é diferente do original
- Filtro de varredura mais rigoroso (ASCII imprimível por padrão) para reduzir falsos positivos.
- Charset ordenado por prioridade (letras → dígitos → pontuação comum → resto)
para que os candidatos mais prováveis sejam testados primeiro.
- Leitor de dump baseado em mmap, barra de progresso de linha única, saída mais silenciosa.