我的 GnuPG 客户端自动从密钥服务器刷新其密钥环中的密钥,并导入了一个中毒密钥。如何在不删除中毒公钥的情况下修复我的密钥环?
上个月,许多备受瞩目的 pgp 证书受到证书泛洪攻击 ( CVE-2019-13050 )的攻击,他们用数万(或数十万)个签名向他们的公钥发送垃圾邮件,并将他们的中毒公钥上传到密钥服务器。
例如,如果您的密钥环中有“ Tor Browser Developers(签名密钥) ”,并且您--refresh-keys
在 2019 年 6 月 30 日之后尝试从密钥服务器获取(当时他们的密钥被 121,000 个虚假签名淹没),那么您的 gpg(和因此,如果您正在使用 thunderbird 和 enigmail,您的电子邮件将挂起并变得无法使用。
这个问题的大部分报道都说解决方案只是删除密钥——但是我如何才能在本地清理公钥而不必下载新副本(这会引入不必要的篡改向量)?
我花了一些时间研究如何解决这个问题,并在我的网站上发表了一篇关于它的文章。下面是对这个问题的解决方案的总结。
1.识别中毒密钥
首先,我们可以使用以下命令列出密钥环中公钥的大小(以字节为单位)(如GnuPG 问题跟踪器中所报告):
如果上面的命令运行时间超过几秒钟,那么你就有问题了。给它 20 分钟左右,您会在底部看到有问题的键。任何具有 8 位数字 (>10 MB) 的内容都是危险信号。
2.导出中毒密钥
现在我们已经确定了中毒的密钥,让我们在删除它之前将其导出以安全保存。
几分钟后,该命令将完成,您应该有一个以
pubkey.asc
中毒公钥的内容命名的文件。请注意,这个仅包含一个公钥的 ASCII 装甲文件是 22M!3.删除中毒密钥
现在我们已经在磁盘上安全地备份了中毒密钥,让我们将其从我们的密钥环中删除。
4.重新导入清理过的key
要重新导入公钥的干净副本,我们将使用
gpg
参数删除在证书被签名淹没之日创建的所有--import-filters
签名( )。drop-sig
给定一个公钥文件(就像我们刚刚导出的备份),我们可以使用以下命令列出证书每天收到的签名数量:
上面的输出表明
我们可以导入密钥,同时忽略这两天的这些垃圾邮件签名,如下所示(请务必将日期替换为您机器上上述命令打印的相应日期):
现在事情应该更加理智:
5. 更新你的 GnuPG 配置
正如 Robert J. Hansen(他的 pgp 密钥在 2019 年 6 月 19 日被发送了 149,100 个签名的垃圾邮件)在他们关于这个问题的优秀综合要点中指出的那样,您可以通过以下方式防止您的 gpg 客户端崩溃:
该
keys.openpgp.org
密钥服务器是一个新的实验服务器(有趣的是,它在这些中毒证书上传前几周就上线了),它更能抵抗这些攻击。请注意,它提供的证书完全没有第三方签名,并且它还会从密钥中剥离 UID 数据包,除非用户明确选择加入。6. 更新你的 MUA 配置
您可能还需要更新您的 MUA。例如,thunderbird 中的 enigmail 也可以配置为更新密钥环中的密钥。
要防止 enigmail 从密钥服务器刷新您的密钥,请转到您的 thunderbird 首选项 -> 高级 -> 配置编辑器... -> 我接受风险!
并设置
extensions.enigmail.keyRefreshOn
为false
附录
请注意,keybox keyring 格式将拒绝导入定位密钥,因为它的最大密钥大小为 5 MiB,并且使用旧安装的用户应考虑将其 keyring 迁移到 keybox 格式。
这可以在基于 debian 的系统中使用migrate-pubring-from-classic-gpg命令轻松完成
未经测试的方法:
gpg --edit-key <keyid> clean save
。另一种方法:
--export-options export-clean
(这将跳过所有无法根据密钥环中的受信任密钥进行验证的签名)。还有一种方法:
--keyserver-options self-sigs-only
根据指纹下载一个新副本(如果您选择使用密钥服务器,这次使用)。