ETS5 密码恢复工具是 CVE-2021-36799 的概念验证(PoC)
您是否忘记了某个 ETS5 项目的密码,无法再访问 KNX 安装的配置?ETS5 密码恢复工具可让您检索存储在 ETS5 项目存储中的项目密码和其他机密。这是因为 ETS5 存在一个严重的设计缺陷,它使用硬编码的密码和盐值来加密项目信息(CVE-2021-36799)。
将加密秘密存储在源代码中是不明智的,因为它们可以通过逆向工程软件恢复,因此提供的保护比以明文形式存储信息好不了多少。这可能对 KNX 安装的安全构成威胁。如果攻击者能够访问项目存储中的文件,他们可以在不知道项目密码的情况下解密这些文件。其中包含的信息允许窃听、冒充和重新配置 KNX 设备。这尤其成问题,因为 ETS5 给用户的印象是项目密码将用于加密项目信息,而不仅仅是用于导出的项目。因此,许多用户和系统集成商很可能没有采取额外措施来确保项目存储的机密性。如果 ETS5 正确实现加密并选择了强项目密码,那么即使攻击者成功远程访问计算机,也会给他们带来更大的挑战。
以下机密信息被不当加密:
ETS5 密码恢复工具是一个概念验证,通过解密并显示敏感信息来演示该问题。它是作为协调漏洞披露的一部分开发的,并在 KNX 协会的许可下发布。发布该工具用于以下目的:
警告:仅在您获得合法授权查看项目信息的情况下使用此工具。绕过安全措施(即使是无效的措施)以获取您无权查看的信息,在您所在的司法管辖区可能构成重罪。
可执行文件可从发布页面下载。它无需安装,可以放在任何选择的目录中。
或者,如果您不想在系统上运行不受信任的二进制文件,您可以在 CyberChef 网站上解密项目 XML 文件中的各个属性。
该软件依赖于 .NET Framework 4.6 或更高版本。Windows 10 默认已包含合适的 .NET 版本。早期 Windows 版本的用户需要安装最新的 .NET Framework 版本才能运行该软件。
与用户界面的提示相反,ETS5 并没有使用项目密码加密您本地存储在 C:\ProgramData\KNX\ETS5\ProjectStore 中的项目文件。相反,它使用硬编码的密码 ETS5Password 和盐值 Ivan Medvedev 来混淆项目 XML 文件中的特定属性。硬编码的加密秘密违背了最佳实践,如 CWE-798 和 CWE-321 所述。
去混淆的过程如下:
Ivan Medvedev 的字节表示,作为 ASCII 或 UTF-8 编码的字符串。ETS5Password 作为密码,以 Ivan Medvedev 的字节表示作为盐值。密钥派生输出的前 32 个字节用作密钥,接下来的 16 个字节用作 IV。去混淆的实现可以在 Deobfuscator.cs 文件中找到。由于密码和盐值是固定的,可以预计算密钥和 IV 以跳过密钥派生。本软件的实现中没有这样做,因为它旨在展示去混淆的所有步骤。不过,如果您需要密钥和 IV,它们如下所示。
| Hex | Base64 | |
|---|---|---|
| Key | 22BD16CDBB96B0E18E977BB3FEFADD8886E7E38A2F8A6FD9D2F2F5663AC20371 | Ir0WzbuWsOGOl3uz/vrdiIbn44ovim/Z0vL1ZjrCA3E= |
| IV | 8E977BB3FEFADD88E6AE6CBEAE3E7CAF | jpd7s/763Yjmrmy+rj58rw== |
导出的项目文件(.knxproj)不受此设计缺陷影响,因此该工具无法用于恢复它们的项目密码。.knxproj 文件是一个 ZIP 文件,其中包含另一个包含敏感信息的 ZIP 文件。后者使用 Deflate 压缩、ZipCrypto / PKWARE 加密,并使用项目密码来派生加密密钥。
在准备我的论文《KNXnet/IP 安全协议的安全分析》期间,我调查了 ETS5 如何存储项目信息。由于 ETS 生成并存储 KNX IP Secure 设备用于相互认证、为多播通信提供机密性以及确保设备配置安全的加密密钥和密码,因此保持信息秘密至关重要。如果攻击者能够访问 ETS 存储的项目信息,将完全破坏 KNX 安装的安全性。
因此,检查了 ETS5 的项目存储,以检查数据是否以确保机密性的方式存储。C:\ProgramData\KNX\ETS5\ProjectStore 中的项目文件可以被每个用户帐户读取,无需管理员权限。发现以下指标引起了数据未正确加密的怀疑:
最后一点明确指出项目密码并未用于修改属性值的算法。下面可以看到一个例子,两个项目 P-02FB 和 P-0117 中的设备验证码设置为相同的值。尽管使用了不同的项目密码,但混淆后的输出也是相同的。由于在 ETS5 中打开项目时除了项目密码外没有提示输入任何其他内容,这意味着密钥要么必须存储在某个地方,要么是一个不需要任何密钥的简单混淆算法。看起来该解决方案并不理想,无法确保机密性,并可能使 KNX 安装面临风险。