Fortigate泄露事件中的私钥安全风险与技术分析

本文分析了Fortigate设备配置文件泄露事件,涉及CVE-2022-40684和CVE-2019-6693漏洞,探讨了TLS和SSH私钥的加密机制、解密方法及其对网络安全的影响,并介绍了检测工具badkeys的使用。

Fortigate泄露事件中的私钥

几天前,一个互联网论坛上发布了一个Fortigate/Fortinet设备配置文件的泄露下载链接。这些数据似乎是在2022年由于一个名为CVE-2022-40684的安全漏洞而收集的。根据Fortinet在2022年的一篇博客文章,他们当时已经意识到该问题被积极利用。首次报道来自heise,Kevin Beaumont的一篇文章提供了更多信息。

未被广泛认识到的是,这次泄露还包含TLS和SSH私钥。由于我正在开发badkeys,一个用于识别不安全和解密密钥的工具,这引起了我的注意。(以下分析基于泄露的不完整子集。如果我获得更完整的信息,可能会更新本文。)

泄露的配置包含如下所示的密钥(并非泄露中的实际密钥):

1
2
3
4
5
6
set private-key "-----BEGIN ENCRYPTED PRIVATE KEY-----
MIGjMF8GCSqGSIb3DQEFDTBSMDEGCSqGSIb3DQEFDDAkBBC5oRB/b9iViG5YoFmw
03T1AgIIADAMBggqhkiG9w0CCQUAMB0GCWCGSAFlAwQBKgQQPsMiXQoINAe2uBZX
cbB1MARAXz1LwSJhElDvazEtfywe9pLSdCG9+A0G6CMk2Lp5eR954OjScEQY6Zqe
9J3V/fCQeDanrAE+/dpCefjAD4LhGg==
-----END ENCRYPTED PRIVATE KEY-----"

它们还包括OpenSSH格式的相应证书和密钥。如您所见,这些私钥是加密的。然而,在这些密钥上方,我们可以找到加密密码。密码也是加密的,看起来像这样:

1
set password ENC SGFja1RoZVBsYW5ldCF[...]UA==

快速搜索加密方法后,发现了一个包含解密这些密码代码的脚本。加密密钥是静态且公开已知的。

密码行包含一个Base64字符串,解码为148字节。前四个字节,填充12个零字节,是初始化向量。剩余字节是加密的有效载荷。加密使用AES-128 CBC模式。解密的密码大多是十六进制数字,并用零字节填充——有时还有其他字符。(我不清楚它们的含义。)

如果技术细节让您困惑,重要的是在几乎所有情况下,都可以解密私钥。(我可能会在稍后分享一个提取密钥的工具。)

使用静态加密密钥是一个已知漏洞,跟踪为CVE-2019-6693。根据Fortinet 2020年的公告,这是通过引入一个允许配置自定义密码的设置来“修复”的。

通过提供和记录更改密码的选项来“修复”默认密码,我对此有强烈意见。它不起作用(另见)。

这一事件的一个结果是,它为我们提供了一些真实世界的数据,关于如果给出选项并在安全公告中记录,有多少人实际会更改密码。99.5%的密钥可以用默认密码解密。(请将此视为下限而非精确数字。由于不清楚的填充机制,密码解密可能不稳定。)

总体而言,约有100,000个PKCS格式的私钥和60,000个OpenSSH格式的私钥。大多数相应证书是自签名的,但几千个是由公开信任的Web证书颁发机构颁发的,其中大多数已过期。然而,数据包括84个WebPKI证书的密钥,这些证书截至今天早上既未过期也未撤销。只有10个未过期证书已被撤销。

我已将仍然有效的证书报告给负责的证书颁发机构以进行撤销。CA有义务在24小时内撤销已知泄露密钥的证书。因此,这些证书都将很快被撤销。(由于一些CA的报告流程困难,我还提交了两份报告。)

如上所述,早在2022年就已经知道这个漏洞被积极利用。然而,似乎绝大多数情况下,这并未导致人们更换可能泄露的私钥并撤销证书。虽然我们无法从这一观察中判断密码和其他未用于公开信任证书的私钥是否也是如此,但似乎很可能。

抱怨

不幸的现实是,如今安全产品本身往往是安全漏洞的来源。虽然我没有经验证据(也没有其他人有数据,我以前抱怨过这个吗?),但我相信近年来我们已经进入了一种情况,安全产品从“大多无用,有时有害”转变为“几乎肯定导致的安全问题比它们预防的更多”。我对此有更多想法,可能会在另一个时间分享。

如果您想知道该怎么做,解决方案既不是修补和修复您的Fortinet设备,也不是从其同样糟糕的竞争对手那里购买额外的攻击面。而是停止相信添加更多攻击面会增加安全性。

检测受影响的密钥

对这些密钥的检测已添加到badkeys中。它是一个开源工具,可通过Python的包管理安装。您可以使用它扫描SSH主机密钥、证书或私钥。确保在此之前更新badkeys阻止列表(badkeys –update-bl)。

请注意,此检测目前基于不完整的数据,并未覆盖泄露中的所有密钥。可能会发布更完整覆盖的更新。另请注意,我尚未公开私钥。与其他情况不同,这意味着badkeys无法给您私钥。(我可能会在未来某个时候决定发布密钥。)

badkeys阻止列表使用一个尚未充分记录的格式(改进此格式在我的待办事项列表中)。我分享受影响密钥的SPKI SHA256哈希列表,以便其他人更容易编写自己的检测。

更新(2025-01-23)

如前所述,原始分析是使用不完整的数据集完成的。后来我能够访问更完整的数据,将密钥数量增加到约98,000个SSH密钥和167,000个PKCS密钥。这也导致报告了更多证书进行撤销。我没有跟踪确切数字。因此,上述所有数字均指不完整数据集。

您可以在此处找到一个脚本,用于从Fortigate配置文件中提取和解密密码和私钥。

更新(2025-01-24)

在进一步分析中,我发现数据集中包含314个属于Let’s Encrypt ACME账户的私钥。我现在已停用这些账户。鉴于事件首次报告已超过一周,这加深了印象,即Fortinet本身及其受影响的客户似乎都没有努力清理此事件。

更新(2025-04-16)

密钥。

图片来源:paomedia / Public Domain

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计