Pages

Tuesday, 8 October 2024

GPG SKS 同步网络被投毒事件及其影响

 

2019年6月,有不知名攻击者对 GPG SKS 密钥同步服务器投毒,详情见 SKS 网络和 GPG 的核心维护者 rjhansen的解释。 根据 rjhansen 的说法,投毒已成既成事实,该隐患短期内无法从SKS或OpenPGP协议中移除。

可能产生的严重后果有许多,比如说,如果有人再次对各大 Linux 发行版包管理器的 GPG 证书投毒,将导致受影响的 Linux 系统无法执行任何包更新。

因为关于这个重大事件的中文资料几乎没有,特此综合英文资料做一综合评述。

熟悉 GPG 的朋友从 rjhansen 文中已经可以明白前因后果。在开始讨论之前,先对不熟悉此事件的读者做一下科普。

  1. 什么是 GPG?为什么 GPG 证书服务器被破坏影响很大?

    GPG 是 GNU 开源版本的 PGP,是一个加密软件。可以用于加密、签署和验证身份。在开源软件世界中广为采用,尤其是 GNU 生态圈内的各大 Linux 发行版和软件的包管理器都广泛使用 GPG 对重要文件进行签名,以防用户下载到冒名恶意软件。

    因此,如果 GPG 不能正常工作,不能正常从其证书服务器拉取证书,可能导致一系列依赖 GPG 的软件出现故障,比如说无法正常升级软件包。

  2. 什么是 SKS 公钥服务器同步网络?

    GPG 与 SSL 证书系统不同,它不依赖一个权威的第三方来为每一个证书提供背书。相反,每个用户应该自行选择信任哪些证书。那么,如何解决无法见面验证时的 TOFU (trust on first use) 问题呢?这通过所谓的信任网络(Web of Trust)实现。

    譬如,我和张三见过面并检查过他的公钥,因而知道张三的公钥的的确确属于他本人,我选择信任张三。而张三同样审慎地验证了李四的证书并为李四的证书签名背书——张三的证书的持有人在此证明该证书是真实属于李四。那么我无须见亲见李四本人,也可以通过张三的背书而接受李四的证书。考虑到六度分隔假设,假如世界上所有人都使用 GPG 并积极为自己认识的人签名的话,并不需要多少中间链条,我就可以验证任何一个人的证书。这张网就是 GPG 信任网络。

    显然,为了验证一个未知的证书是否可靠,我必须构建从我到他的整个信任链条。这便需要有一个中央服务器来存储所有人的证书和签名以供检索。这就是公钥服务器存在的意义。当我收到一份未知证书时,我会选择从公钥服务器拉取所有为他背书的人的证书,逐层上溯,看看是否能够找到一张已经被我信任的证书。如果能的话,就建立了到目标证书的信任路径。

    为了保证这个机制可靠,全球的公钥服务器可以选择加入一个同步网络,以保证用户无论在哪里提交自己的证书,都可以在任何地方被检索到。任何一台服务器的下线也不会影响到用户的使用。这就是 SKS 网络。

  3. 这次投毒是怎么回事?

    简单地说,有人恶意向服务器提交了对两个著名网友的签名背书。此事件中的受害者 Robert J. Hansen 的证书就被签名了 15000 次。因而任何人的 GPG 在尝试验证他的证书时,都会拉取 15000 个签名。而 GPG 在验证这么多签名的过程中会卡住很久。

    由于被攻击的两个人在 GPG 社区中中地位很高,他们在 GPG 信任网络中处于相当核心的位置。这意味着——当你验证任意一份证书的时候,有不小的概率你会不小心拉取到他们俩的证书,然后你的 GPG 就会卡住。不但他们俩的证书没法用了,他们俩签名过的证书也都面临危险,乃至于他们俩签名过的证书所签名的证书……

以上是一些事实描述,下面对涉及到的其它问题做一下分析和解说

  1. 为什么 SKS 可以被投毒而且无法修正?

    由于GPG的去中心化设计, SKS 作为全球密钥同步网络,被设计为上面的任何内容都不允许被删除——这样任何政府和公司都无法摧毁这个同步网络或要求删除信息。

    然而,这个”永远不能删除”的设计在今天为 SKS 带来了许多问题。签名投毒只是其中之一

  2. SKS 的其它挑战

    和区块链之类的在设计之初就被设计为”永不删除”的服务类似,SKS 也有类似的问题:

    1. 欧洲 GDPR 的要求。GDPR 要求服务商提供删除个人信息的选项:而区块链或 SKS 都不能满足此要求。故而一个公开的 SKS 服务器在欧洲处于违法状态

    2. 蓄意在”永不删除”服务中存入违法信息,比如说儿童色情,将使所有节点的运营者面临刑事起诉。

    3. 被人滥用。此次投毒是一个典型的滥用。任何”永不删除”的服务都有可能被人滥用于文件存储服务。然而对于区块链来说,毕竟存储是有成本的,将大块头数据存入的成本太高。而对于纯粹靠公益运营的 SKS 来说,投毒者没有任何成本。故而攻击的可行性大大提高。

  3. 对 Linux 社区的影响

    为了避免因为 SKS 投毒而导致 gpg 崩溃并进而无法更新软件包,预计各大发行版的 gpg 默认 key server 都将从开放的全球同步 SKS 切换为中心化的 key server/key directory。

    当然,这对于 GPG 信任网络是一个极大的打击,没有全球同步人人可见的 SKS 网络,本就难以建立的 GPG 信任网络将更难以发挥其效果。

    各大 Linux 发行版的 gpg 证书的可信度,也将退化为中心化的信任机制:简单地相信发行版网站所提供的公钥。如果发行版网站被黑,那么用户将完全不受保护。

  4. 本次投毒的背景

    长期以来,GPG 和 SKS 的维护团队动作缓慢,许多陈年 pull request 没有得到及时的处理,他们对待许多提 issue 的人的态度也伤到不少玻璃心的人。

    我很怀疑这次投毒并非偶然,而是蓄意报复。

  5. GPG 的未来

    SKS 被摧毁,从根本上结束了 GPG “信任网络”的基础——虽然说 GPG 的用户从来都很少,这个”信任网络”一直都不能有效发挥作用,但现在则是再也不可能存在一个完整的”Web of Trust”了。

    GPG 长期以来因为高使用门槛,用户不友好而无法流行。以后不用 GPG 的理由又多了一个:连它理想中的 web of trust 都不复可能,那么它也就不过是一个过时的加密软件而已。

    如果不考虑“信任网络”这个理想,而只将它用于一般的加密、认证之用的话,在 SKS 之外还有很多公钥服务器可以使用。

    比如说 keys.openpgp.org 就是一个新的试图解决滥用和隐私问题的 key directory。只有邮箱被验证之后才能发布邮箱地址,用户随时可以要求删除自己的个人信息。可惜它是一个中心化的服务,并不能防范单点故障。另外由于 GPG 团队的极低效率,目前 GPG 在导入其中无名公钥的时候仍然会报错。

    不过个人倾向于,keybase.io 才是 GPG 的未来。keybase.io 解决了几点:将 GPG 用于日常聊天、网盘的易用性;用 github twitter 等帐户关联用户身份,使得用户无需建立”Web of Trust”就可以在相当程度上相信身份认证的可靠性。同时,它又不是一个像SSL证书一样完全中心化的设计:keybase.io 虽然扮演了一个集中目录的角色,但所有的加密都由用户端完成,所有的跨站身份认证都可以由用户在不依赖 keybase.io 的情况下独立验证。

No comments:

Post a Comment