2019年6月,有不知名攻击者对 GPG SKS 密钥同步服务器投毒,详情见 SKS 网络和 GPG 的核心维护者 rjhansen的解释。 根据 rjhansen 的说法,投毒已成既成事实,该隐患短期内无法从SKS或OpenPGP协议中移除。
可能产生的严重后果有许多,比如说,如果有人再次对各大 Linux 发行版包管理器的 GPG 证书投毒,将导致受影响的 Linux 系统无法执行任何包更新。
因为关于这个重大事件的中文资料几乎没有,特此综合英文资料做一综合评述。
熟悉 GPG 的朋友从 rjhansen 文中已经可以明白前因后果。在开始讨论之前,先对不熟悉此事件的读者做一下科普。
- 什么是 GPG?为什么 GPG 证书服务器被破坏影响很大?
GPG 是 GNU 开源版本的 PGP,是一个加密软件。可以用于加密、签署和验证身份。在开源软件世界中广为采用,尤其是 GNU 生态圈内的各大 Linux 发行版和软件的包管理器都广泛使用 GPG 对重要文件进行签名,以防用户下载到冒名恶意软件。
因此,如果 GPG 不能正常工作,不能正常从其证书服务器拉取证书,可能导致一系列依赖 GPG 的软件出现故障,比如说无法正常升级软件包。
-
什么是 SKS 公钥服务器同步网络?
GPG 与 SSL 证书系统不同,它不依赖一个权威的第三方来为每一个证书提供背书。相反,每个用户应该自行选择信任哪些证书。那么,如何解决无法见面验证时的 TOFU (trust on first use) 问题呢?这通过所谓的信任网络(Web of Trust)实现。
譬如,我和张三见过面并检查过他的公钥,因而知道张三的公钥的的确确属于他本人,我选择信任张三。而张三同样审慎地验证了李四的证书并为李四的证书签名背书——张三的证书的持有人在此证明该证书是真实属于李四。那么我无须见亲见李四本人,也可以通过张三的背书而接受李四的证书。考虑到六度分隔假设,假如世界上所有人都使用 GPG 并积极为自己认识的人签名的话,并不需要多少中间链条,我就可以验证任何一个人的证书。这张网就是 GPG 信任网络。
显然,为了验证一个未知的证书是否可靠,我必须构建从我到他的整个信任链条。这便需要有一个中央服务器来存储所有人的证书和签名以供检索。这就是公钥服务器存在的意义。当我收到一份未知证书时,我会选择从公钥服务器拉取所有为他背书的人的证书,逐层上溯,看看是否能够找到一张已经被我信任的证书。如果能的话,就建立了到目标证书的信任路径。
为了保证这个机制可靠,全球的公钥服务器可以选择加入一个同步网络,以保证用户无论在哪里提交自己的证书,都可以在任何地方被检索到。任何一台服务器的下线也不会影响到用户的使用。这就是 SKS 网络。
-
这次投毒是怎么回事?
简单地说,有人恶意向服务器提交了对两个著名网友的签名背书。此事件中的受害者 Robert J. Hansen 的证书就被签名了 15000 次。因而任何人的 GPG 在尝试验证他的证书时,都会拉取 15000 个签名。而 GPG 在验证这么多签名的过程中会卡住很久。
由于被攻击的两个人在 GPG 社区中中地位很高,他们在 GPG 信任网络中处于相当核心的位置。这意味着——当你验证任意一份证书的时候,有不小的概率你会不小心拉取到他们俩的证书,然后你的 GPG 就会卡住。不但他们俩的证书没法用了,他们俩签名过的证书也都面临危险,乃至于他们俩签名过的证书所签名的证书……
以上是一些事实描述,下面对涉及到的其它问题做一下分析和解说
- 为什么 SKS 可以被投毒而且无法修正?
由于GPG的去中心化设计, SKS 作为全球密钥同步网络,被设计为上面的任何内容都不允许被删除——这样任何政府和公司都无法摧毁这个同步网络或要求删除信息。
然而,这个”永远不能删除”的设计在今天为 SKS 带来了许多问题。签名投毒只是其中之一
-
SKS 的其它挑战
和区块链之类的在设计之初就被设计为”永不删除”的服务类似,SKS 也有类似的问题:
- 欧洲 GDPR 的要求。GDPR 要求服务商提供删除个人信息的选项:而区块链或 SKS 都不能满足此要求。故而一个公开的 SKS 服务器在欧洲处于违法状态
-
蓄意在”永不删除”服务中存入违法信息,比如说儿童色情,将使所有节点的运营者面临刑事起诉。
-
被人滥用。此次投毒是一个典型的滥用。任何”永不删除”的服务都有可能被人滥用于文件存储服务。然而对于区块链来说,毕竟存储是有成本的,将大块头数据存入的成本太高。而对于纯粹靠公益运营的 SKS 来说,投毒者没有任何成本。故而攻击的可行性大大提高。
-
对 Linux 社区的影响
为了避免因为 SKS 投毒而导致 gpg 崩溃并进而无法更新软件包,预计各大发行版的 gpg 默认 key server 都将从开放的全球同步 SKS 切换为中心化的 key server/key directory。
当然,这对于 GPG 信任网络是一个极大的打击,没有全球同步人人可见的 SKS 网络,本就难以建立的 GPG 信任网络将更难以发挥其效果。
各大 Linux 发行版的 gpg 证书的可信度,也将退化为中心化的信任机制:简单地相信发行版网站所提供的公钥。如果发行版网站被黑,那么用户将完全不受保护。
-
本次投毒的背景
长期以来,GPG 和 SKS 的维护团队动作缓慢,许多陈年 pull request 没有得到及时的处理,他们对待许多提 issue 的人的态度也伤到不少玻璃心的人。
我很怀疑这次投毒并非偶然,而是蓄意报复。
-
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 的情况下独立验证。
我的 keybase:https://keybase.io/wangxuan