
Original PoC for CVE-2023-32784
该漏洞已被分配 CVE-2023-32784,并在 KeePass 2.54 中修复。再次感谢 Dominik Reichl 的快速响应和巧妙的修复!
说明:密码必须通过键盘输入,而非从剪贴板粘贴(请参见“工作原理”部分)。
首先,更新到 KeePass 2.54 或更高版本。
其次,如果你长期使用 KeePass,你的主密码(以及其他密码)可能存在于你的页面文件/交换文件、休眠文件和崩溃转储中。根据你的偏执程度,可以考虑以下步骤来解决这个问题:
C:\Windows\memory.dmp,但可能还有其他文件)/w 参数)或者直接覆盖整个硬盘并重新安装系统。
不受影响的产品列表(不完整,请通过拉取请求或问题添加更多)。经验法则是,如果不是用 .NET 编写的原始 KeePass 2.X 应用程序,则很可能不受影响。
KeePass Master Password Dumper 是一个简单的概念验证工具,用于从 KeePass 的内存中转储主密码。除第一个密码字符外,它基本上能够以明文形式恢复密码。无需在目标系统上执行代码,只需要一个内存转储。内存来自哪里并不重要——可以是进程转储、交换文件(pagefile.sys)、休眠文件(hiberfil.sys)、各种崩溃转储或整个系统的 RAM 转储。无论工作区是否锁定都没有关系。即使在 KeePass 不再运行后,也有可能从 RAM 中转储密码,尽管成功的可能性会随着时间推移而降低。
已在 Windows(英文版)的 KeePass 2.53.1 和 Debian(keepass2 包)的 KeePass 2.47 上测试。应该也适用于 macOS 版本。不幸的是,启用“在安全桌面上输入主密钥”选项并不能阻止此攻击。PoC 可能对旧版 KeePass 创建的数据库存在问题,但我无法复现(请参见 issue #4)。
该发现已得到 KeePass 作者 Dominik Reichl 的确认(链接)。我感谢 Dominik 的快速响应。希望它能很快得到修复!
git clone https://github.com/vdohney/keepass-password-dumper 或从 GitHub 下载。cd keepass-password-dumperdotnet run PATH_TO_DUMP在 Windows 上测试的最简单方法是,在任务管理器中右键点击 KeePass 进程,选择“创建转储文件”来创建一个进程转储。

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST,以生成从第二个字符开始的所有可能密码列表。这取决于你的威胁模型。**如果你的计算机已被恶意软件感染并在后台以你的用户权限运行,那么这个发现并不会使你的情况变得更糟。**不过,恶意软件可能更容易保持隐蔽并逃避杀毒软件,因为与 KeeTheft 或 KeeFarce 不同,它不需要进程注入或其他类型的代码执行。
如果你有合理的理由怀疑有人可能获得对你计算机的访问权限并进行取证分析,那么这可能是个坏消息。最坏的情况是,即使 KeePass 被锁定或根本没有运行,主密码也有可能被恢复。
如果你使用强密码的全盘加密且系统干净,那么你应该没问题。仅凭这个发现,没有人能远程通过互联网窃取你的密码。
KeePass 2.X 使用了一个自定义开发的密码输入框 SecureTextBoxEx。这个输入框不仅用于输入主密码,还用于 KeePass 中的其他位置,比如密码编辑框(因此该攻击也可用于恢复它们的内容)。
这里被利用的缺陷是:每输入一个字符,就会在内存中创建一个残留字符串。由于 .NET 的工作方式,一旦创建,几乎不可能完全清除。例如,当输入“Password”时,会产生以下残留字符串:•a、••s、•••s、••••w、•••••o、••••••r、•••••••d。POC 应用程序会在转储中搜索这些模式,并为密码中的每个位置提供一个可能字符。
此攻击的可靠性会受到密码输入方式以及每个会话中输入的密码数量的影响。然而,我发现即使一个会话中有多个密码或存在拼写错误,由于 .NET CLR 分配这些字符串的方式,它们很可能会在内存中有序排列。因此,如果输入了三个不同的密码,你很可能按顺序得到每个字符位置的三个候选字符,从而可以恢复所有三个密码。
这是一个快速的概念验证,因此可能不太可靠和健壮。如果你发现问题并修复了它,请创建一个拉取请求。
当前允许的密码字符被硬编码为:^[\x20-\x7E]+$(所有可打印的 ASCII 字符和空格)。
感谢 adridlug 添加了自动生成密码列表的功能,以及 ynuwenhof 重构了代码。
我还没有检查过它们。