keepass_dumper.py
Portage Python de vdohney/keepass-password-dumper
(CVE-2023-32784) — tout le crédit pour l'implémentation C# originale et la
technique sous-jacente revient à vdohney.
Le script analyse un dump mémoire de processus à la recherche des chaînes de rendu résiduelles que
le SecureTextBoxEx de KeePass 2.x laisse derrière lui pendant que l'utilisateur tape le
mot de passe maître, et récupère chaque caractère de ce mot de passe à l'exception du
premier. En option, il force ensuite par brute-force le premier caractère inconnu
contre un fichier KDBX à l'aide de keepassxc-cli.
Versions concernées
- Vulnérables : KeePass 2.53.1 et antérieures (Windows et Linux).
- Corrigées : KeePass 2.54 et ultérieures.
- KeePassXC, KeePass 1.x et Strongbox ne sont pas concernés.
La faille se situe dans le contrôle personnalisé SecureTextBoxEx : pour chaque caractère
saisi, .NET conserve une chaîne résiduelle en mémoire managée de la forme
●a, ●●s, ●●●s, … à partir de laquelle chaque caractère du mot de passe après le premier
peut être récupéré.
Prérequis et limites de l'attaque
- Nécessite un artefact mémoire du processus KeePass : un dump de processus, le
fichier d'échange/pagination, un fichier d'hibernation, un dump de crash noyau ou une capture
complète de la RAM. Aucune exécution de code sur la machine cible n'est nécessaire.
- Fonctionne que l'espace de travail soit verrouillé ou déverrouillé, et même après la
sortie du processus KeePass (tant que les pages mémoire survivent quelque part).
- Le tout premier caractère du mot de passe n'est pas récupérable à partir de la fuite.
- La fuite capture de manière fiable les caractères ASCII imprimables ; les caractères non-ASCII
sont moins fiables.
- Plusieurs mots de passe maîtres saisis dans la même session peuvent produire
des chaînes résiduelles qui se chevauchent et dégrader la précision.
Atténuation
Si vous avez utilisé KeePass ≤ 2.53.1, considérez que le mot de passe maître est compromis :
- Mettez à jour KeePass vers 2.54 ou une version ultérieure.
- Changez le mot de passe maître (et faites pivoter tout secret de grande valeur stocké dans
la base qui a été saisi pendant que l'ancien mot de passe maître était en usage).
- Purgez les artefacts mémoire qui pourraient encore contenir les chaînes résiduelles :
- supprimez les dumps de crash (par ex.
C:\Windows\memory.dmp),
- désactivez/effacez l'hibernation (
powercfg /h off sous Windows),
- supprimez ou effacez le fichier d'échange / swapfile,
- écrasez l'espace disque libre (par ex.
cipher /w: sous Windows) afin que les
résidus ne puissent pas être extraits de secteurs précédemment alloués,
- redémarrez — ou, pour les scénarios à haute assurance, réinstallez le système d'exploitation.
Prérequis
- Python 3.10+ (bibliothèque standard uniquement — aucun paquet tiers)
keepassxc-cli dans $PATH (uniquement nécessaire pour --kdbx)
Installation
Sur Debian / Ubuntu, installez le CLI KeePassXC si vous prévoyez de faire du brute-force :
sudo apt install keepassxc
Utilisation
# Récupérer les caractères candidats et les afficher
python3 keepass_dumper.py memory.dmp
# Vider la liste de candidats générée dans un fichier
python3 keepass_dumper.py memory.dmp -p candidates.txt
# Récupérer et forcer par brute-force le premier caractère manquant contre un KDBX
python3 keepass_dumper.py memory.dmp --kdbx db.kdbx
Exécutez python3 keepass_dumper.py --help pour la liste complète des options.
Ce qui diffère de l'original
- Filtre de scan plus strict (ASCII imprimable par défaut) pour réduire les faux positifs.
- Jeu de caractères ordonné par priorité (lettres → chiffres → ponctuation courante → reste)
afin que les candidats les plus probables soient essayés en premier.
- Lecteur de dump basé sur mmap, barre de progression sur une seule ligne, sortie plus silencieuse.