
PoC original pour CVE-2023-32784
La vulnérabilité a reçu l'identifiant CVE-2023-32784 et a été corrigée dans KeePass 2.54. Merci encore à Dominik Reichl pour sa réponse rapide et son correctif astucieux !
Précision : le mot de passe doit être saisi au clavier, et non copié depuis le presse-papiers (voir les sections « Comment ça fonctionne »).
Tout d'abord, mettez à jour KeePass vers la version 2.54 ou une version supérieure.
Ensuite, si vous utilisez KeePass depuis longtemps, votre mot de passe maître (et éventuellement d'autres mots de passe) pourrait se trouver dans votre pagefile/swapfile, dans votre fichier d'hibernation et dans vos fichiers de vidage sur incident. Selon votre niveau de paranoïa, vous pouvez envisager les étapes suivantes pour résoudre le problème :
C:\Windows\memory.dmp, mais il peut y en avoir d'autres)/w sous Windows)Ou alors, écrasez simplement votre disque dur et réinstallez votre système d'exploitation à neuf.
Liste incomplète des produits non concernés (merci de créer une pull request ou une issue pour en ajouter d'autres). En règle générale, si ce n'est pas l'application KeePass 2.X d'origine écrite en .NET, elle n'est probablement pas concernée.
KeePass Master Password Dumper est un outil simple de type preuve de concept utilisé pour extraire le mot de passe maître de la mémoire de KeePass. Hormis le premier caractère du mot de passe, il est généralement capable de récupérer le mot de passe en clair. Aucune exécution de code sur le système cible n'est requise, seulement un dump mémoire. Peu importe d'où provient la mémoire : il peut s'agir du dump du processus, du fichier d'échange (pagefile.sys), du fichier d'hibernation (hiberfil.sys), de divers fichiers de vidage sur incident ou d'un dump RAM de l'ensemble du système. Peu importe que l'espace de travail soit verrouillé ou non. Il est également possible d'extraire le mot de passe de la RAM après l'arrêt de KeePass, bien que les chances que cela fonctionne diminuent avec le temps écoulé depuis lors.
Testé avec KeePass 2.53.1 sous Windows (anglais) et KeePass 2.47 sous Debian (paquet keepass2). Il devrait également fonctionner avec la version macOS. Malheureusement, l'activation de l'option Enter master key on secure desktop ne permet pas d'empêcher l'attaque. Le PoC peut rencontrer des problèmes avec les bases de données créées par des versions plus anciennes de KeePass, mais je n'ai pas pu reproduire ce problème (voir issue #4).
La découverte a été confirmée par Dominik Reichl, l'auteur de KeePass, ici. J'apprécie la réponse rapide de Dominik. Espérons que cela sera corrigé bientôt !
git clone https://github.com/vdohney/keepass-password-dumper ou téléchargez-le depuis GitHubcd keepass-password-dumperdotnet run PATH_TO_DUMPLa façon la plus simple de tester cela sous Windows est de créer un dump du processus dans le Gestionnaire des tâches en cliquant avec le bouton droit sur le processus KeePass et en sélectionnant « Créer un fichier de vidage ».

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST pour générer une liste de tous les mots de passe possibles à partir du second caractère.Cela dépend de votre modèle de menace. Si votre ordinateur est déjà infecté par un malware qui s'exécute en arrière-plan avec les privilèges de votre utilisateur, cette découverte n'aggrave pas vraiment votre situation. Cependant, il pourrait être plus facile pour le malware de se faire discret et d'échapper à l'antivirus, car contrairement à KeeTheft ou KeeFarce, aucune injection de processus ni aucun autre type d'exécution de code n'est nécessaire.
Si vous avez un soupçon raisonnable que quelqu'un puisse accéder à votre ordinateur et effectuer une analyse forensique, cela pourrait être grave. Dans le pire des cas, le mot de passe maître sera récupéré, même si KeePass est verrouillé ou n'est pas du tout en cours d'exécution.
Si vous utilisez le chiffrement complet du disque avec un mot de passe fort et que votre système est sain, vous ne devriez avoir aucun problème. Personne ne peut voler vos mots de passe à distance via Internet avec cette seule découverte.
KeePass 2.X utilise une zone de texte développée sur mesure pour la saisie du mot de passe, SecureTextBoxEx. Cette zone de texte n'est pas utilisée uniquement pour la saisie du mot de passe maître, mais aussi à d'autres endroits de KeePass, comme les champs de modification des mots de passe (l'attaque peut donc également être utilisée pour récupérer leur contenu).
La faille exploitée ici est que pour chaque caractère saisi, une chaîne résiduelle est créée en mémoire. En raison du fonctionnement de .NET, il est presque impossible de s'en débarrasser une fois qu'elle est créée. Par exemple, lorsque « Password » est saisi, cela produit les chaînes résiduelles suivantes : •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. L'application POC recherche ces motifs dans le dump et propose un caractère de mot de passe probable pour chaque position du mot de passe.
La fiabilité de cette attaque peut varier selon la façon dont le mot de passe a été saisi et le nombre de mots de passe saisis par session. Cependant, j'ai découvert que même s'il y a plusieurs mots de passe par session ou des fautes de frappe, la manière dont le CLR .NET alloue ces chaînes fait qu'elles sont probablement bien ordonnées en mémoire. Ainsi, si trois mots de passe différents ont été saisis, vous obtiendrez probablement trois candidats pour chaque position de caractère, dans cet ordre, ce qui permet de récupérer les trois mots de passe.
C'est un POC rapide, donc probablement pas très fiable ni robuste. Merci de créer une pull request si vous trouvez un problème et de le corriger.
Les caractères autorisés pour le mot de passe sont actuellement codés en dur de cette façon : ^[\x20-\x7E]+$ (tous les caractères ASCII imprimables et l'espace).
Merci à adridlug pour avoir ajouté la possibilité de générer automatiquement la liste de mots de passe, et à ynuwenhof pour avoir remanié le code.
Je n'en ai encore vérifié aucun.