SKS 密钥服务器中毒对 Gentoo 的影响
2019年7月3日

最近,SKS 密钥服务器网络遭受了证书中毒攻击。用于存储库同步的 OpenPGP 验证可以抵御此攻击。但是,当用户直接使用 GnuPG 时可能会受到影响。在这篇文章中,我们想简要总结一下攻击的原理、我们采取的保护措施以及您可以采取的保护系统的方法。

证书中毒攻击利用了三个事实:OpenPGP 密钥可以包含无限数量的签名,任何人都可以向任何密钥添加签名,并且无法区分合法签名和垃圾签名。攻击者向存储在 SKS 密钥服务器上的密钥添加大量垃圾签名,导致密钥变得非常大,并导致获取它们的 GnuPG 客户端出现严重的性能问题。

攻击者已经毒害了 SKS 密钥服务器上一些高级 OpenPGP 用户的密钥,包括一位 Gentoo 开发人员的密钥。此外,目前预期问题在短期内不会得到解决,因此未来可能会有更多密钥受到影响。我们建议用户暂时不要从 SKS 密钥服务器网络(包括 keys.gnupg.net 等别名)获取或刷新密钥。GnuPG 上游正在开发客户端侧的应对措施,一旦发布,预计将会尽快引入 Gentoo。

Gentoo 密钥基础设施未受此攻击影响。在收到报告后不久,我们便禁用了从 SKS 获取开发人员密钥更新的功能,并且今天我们禁用了公共密钥上传访问权限,以防止存储在服务器上的密钥被恶意第三方污染。

用于验证 Gentoo ebuild 存储库的 gemato 工具默认使用 WKD。在正常运行期间,它应该不会受到此漏洞的影响。Gemat 有一个密钥服务器回退机制,如果 WKD 失败,可能会受到攻击,但是 gemato 在一个隔离的环境中运行,可以防止被污染的密钥对您的系统造成永久性损坏。在最坏的情况下,Gentoo 存储库同步会变慢或挂起。

webrsync 和 delta-webrsync 方法也支持 gemato,尽管目前默认情况下未使用。为了使用它,您需要从 /etc/portage/make.conf 中删除 PORTAGE_GPG_DIR(如果存在),并将以下值放入 /etc/portage/repos.conf

[gentoo]
sync-type = webrsync
sync-webrsync-delta = true  # false to use plain webrsync
sync-webrsync-verify-signature = true

之后,调用 emerge --syncemaint sync --repo gentoo 将使用 gemato 密钥管理而不是易受攻击的旧方法。在 Portage 的未来版本中,默认设置将更改。

当直接使用 GnuPG 时,可以安全地通过以下方式获取(和刷新)Gentoo 开发人员和服务密钥:

  1. Web 密钥目录,例如 gpg --locate-key [email protected]
  2. Gentoo 密钥服务器,例如 gpg --keyserver hkps://keys.gentoo.org ...
  3. 密钥包,例如:活跃开发者服务密钥

请注意,上述服务仅提供 Gentoo 特定的密钥。其他人的密钥将不会在我们的密钥服务器上找到。如果您正在寻找它们,您可以尝试 keys.openpgp.org 密钥服务器,该服务器不受此攻击影响,但代价是剥离所有签名和未经验证的 UID。