
# Original PoC für CVE-2023-32784
Die Schwachstelle wurde CVE-2023-32784 zugewiesen und in KeePass 2.54 behoben. Nochmals vielen Dank an Dominik Reichl für seine schnelle Reaktion und den kreativen Fix!
Klarstellung: Das Passwort muss über eine Tastatur eingegeben werden, nicht aus der Zwischenablage kopiert werden (siehe die Abschnitte „How it works“).
Zunächst: Aktualisiere auf KeePass 2.54 oder höher.
Zweitens: Wenn du KeePass schon lange verwendest, könnte sich dein Master-Passwort (und möglicherweise andere Passwörter) in deiner Auslagerungsdatei/pagefile/swapfile, der Ruhezustandsdatei und in Absturzprotokollen (Crash Dumps) befinden. Je nachdem, wie paranoid du bist, kannst du folgende Schritte in Betracht ziehen, um das Problem zu beheben:
C:\Windows\memory.dmp, aber möglicherweise gibt es weitere)/w unter Windows)Oder überschreibe einfach deine Festplatte und installiere das Betriebssystem neu.
Unvollständige Liste von Produkten, die nicht betroffen sind (bitte erstelle einen Pull-Request oder ein Issue, um weitere hinzuzufügen). Als Faustregel gilt: Wenn es nicht die ursprüngliche, in .NET geschriebene KeePass-2.X-Anwendung ist, ist es wahrscheinlich nicht betroffen.
Der KeePass-Master-Passwort-Dumper ist ein einfaches Proof-of-Concept-Tool, mit dem das Master-Passwort aus dem Speicher von KeePass ausgelesen werden kann. Abgesehen vom ersten Passwortzeichen kann das Passwort größtenteils im Klartext wiederhergestellt werden. Es ist keine Codeausführung auf dem Zielsystem erforderlich, nur ein Speicherabbild. Es spielt keine Rolle, woher der Speicher stammt – es kann sich um den Prozess-Dump, die Auslagerungsdatei (pagefile.sys), die Ruhezustandsdatei (hiberfil.sys), verschiedene Absturzprotokolle oder den RAM-Dump des gesamten Systems handeln. Es spielt keine Rolle, ob der Arbeitsbereich gesperrt ist oder nicht. Es ist auch möglich, das Passwort aus dem RAM zu extrahieren, nachdem KeePass nicht mehr läuft, wobei die Erfolgswahrscheinlichkeit mit der seitdem vergangenen Zeit abnimmt.
Getestet mit KeePass 2.53.1 unter Windows (Englisch) und KeePass 2.47 unter Debian (keepass2-Paket). Es sollte auch mit der macOS-Version funktionieren. Leider hilft die Aktivierung der Option Enter master key on secure desktop nicht, den Angriff zu verhindern. Der PoC könnte Probleme mit Datenbanken haben, die von älteren KeePass-Versionen erstellt wurden, aber ich konnte das nicht reproduzieren (siehe Issue #4).
Der Befund wurde von Dominik Reichl, dem Autor von KeePass, hier bestätigt. Ich schätze Dominiks schnelle Reaktion. Hoffentlich wird es bald behoben!
git clone https://github.com/vdohney/keepass-password-dumper oder lade es von GitHub heruntercd keepass-password-dumperdotnet run PATH_TO_DUMPDer einfachste Weg, dies unter Windows zu testen, besteht darin, im Task-Manager einen Prozess-Dump zu erstellen, indem du mit der rechten Maustaste auf den KeePass-Prozess klickst und „Create dump file“ auswählst.

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST hinzufügen, um eine Liste aller möglichen Passwörter ab dem zweiten Zeichen zu erzeugen.Hängt von deinem Bedrohungsmodell ab. Wenn dein Computer bereits mit Malware infiziert ist, die im Hintergrund mit den Rechten deines Benutzers läuft, macht dieser Befund deine Situation nicht viel schlimmer. Allerdings könnte es für die Malware einfacher sein, unauffällig zu bleiben und dem Antivirenprogramm zu entgehen, da im Gegensatz zu KeeTheft oder KeeFarce keine Prozessinjektion oder andere Art von Codeausführung erforderlich ist.
Wenn du begründeten Verdacht hast, dass jemand Zugriff auf deinen Computer erlangen und eine forensische Analyse durchführen könnte, könnte das problematisch sein. Im schlimmsten Fall wird das Master-Passwort wiederhergestellt, obwohl KeePass gesperrt ist oder gar nicht läuft.
Wenn du eine vollständige Festplattenverschlüsselung mit einem starken Passwort verwendest und dein System sauber ist, bist du wahrscheinlich sicher. Niemand kann allein mit diesem Befund deine Passwörter aus der Ferne über das Internet stehlen.
KeePass 2.X verwendet ein eigens entwickeltes Textfeld für die Passworteingabe, SecureTextBoxEx. Dieses Textfeld wird nicht nur für die Eingabe des Master-Passworts verwendet, sondern auch an anderen Stellen in KeePass, wie etwa bei Passwort-Eingabefeldern (der Angriff kann also auch verwendet werden, um deren Inhalte wiederherzustellen).
Der hier ausgenutzte Fehler besteht darin, dass für jedes eingegebene Zeichen eine Restzeichenfolge im Speicher erzeugt wird. Aufgrund der Funktionsweise von .NET ist es nahezu unmöglich, sie wieder loszuwerden, sobald sie erzeugt wurde. Wenn zum Beispiel „Password“ eingegeben wird, entstehen diese Restzeichenfolgen: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. Die POC-Anwendung durchsucht das Speicherabbild nach diesen Mustern und bietet ein wahrscheinliches Passwortzeichen für jede Position im Passwort an.
Die Zuverlässigkeit dieses Angriffs kann davon beeinflusst werden, wie das Passwort eingegeben wurde und wie viele Passwörter pro Sitzung eingegeben wurden. Ich habe jedoch festgestellt, dass die Art und Weise, wie die .NET-CLR diese Zeichenfolgen alloziert, dazu führt, dass sie selbst bei mehreren Passwörtern pro Sitzung oder Tippfehlern wahrscheinlich sauber im Speicher angeordnet sind. Wenn also drei verschiedene Passwörter eingegeben wurden, erhält man wahrscheinlich drei Kandidaten für jede Zeichenposition in dieser Reihenfolge, was es ermöglicht, alle drei Passwörter wiederherzustellen.
Es ist ein schneller PoC, daher wahrscheinlich nicht sehr zuverlässig und robust. Bitte erstelle einen Pull-Request, falls du ein Problem findest, und behebe es.
Erlaubte Passwortzeichen sind derzeit wie folgt fest codiert: ^[\x20-\x7E]+$ (alle druckbaren ASCII-Zeichen und Leerzeichen).
Dank an adridlug für das Hinzufügen der Möglichkeit, die Passwortliste automatisch zu generieren, und an ynuwenhof für das Refactoring des Codes.
Ich habe sie noch nicht überprüft.