连接到不受信任的公钥服务器存在哪些风险?

信息安全 已知漏洞 pgp
2021-09-08 17:18:15

Thomas Pornin 在回答最近的一个问题时提出了一个关于 PGP 密钥服务器的好观点,这里:

GPG 密钥获取不应该使用安全连接吗?

...您不应该信任密钥服务器...

毕竟,密钥服务器只是托管本质上是用户生成内容的另一种服务类型。这让我想到,从公钥服务器接收内容固有的安全风险是什么,就其本质而言,它不能保证它托管的内容?

我能想到的唯一真正的风险是,如果 OpenPGP 协议或其实现之一碰巧存在漏洞,这将允许攻击者通过格式错误的密钥或签名执行任意代码执行。有过这样的漏洞吗?是否还有其他我没有想到的风险?如何减轻这些风险(如果有)?

2个回答

我不确定是否有任何特定于 OpenPGP 的内容,但您描述的问题似乎并不特定于这种情况。

据我所知,导致任意代码执行(例如基于缓冲区溢出)的漏洞可能发生在处理任何类型的可以处理的先验不受信任的数据中。它是否发生在处理格式错误的密钥的代码或任何其他形式的数据中,在这种情况下可能并不重要。

每当您运行一些代码来处理您尚未信任的某些数据(并且以您信任的方式)时,您希望该代码没有错误,至少没有会导致任意代码执行或其他错误的错误安全问题。在这种情况下,安全机制是否稍后使用数据是次要问题。(当然,您还希望必要的签名验证的实现是正确的。这对安全目的很重要。)

例如,任何基于 X.509 的 TLS 堆栈都可能发生相同类型的问题。您希望 TLS 堆栈不允许格式错误的证书让攻击者控制您的系统(同样,任何处理一堆它事先不知道的字节的系统都是如此)。一旦握手成功完成,证书的正确验证和验证将让您信任建立的 TLS 连接非常重要,但这只是次要问题。

我认为与其他类型数据相比的主要区别在于正确实现此类代码的难度。在 PGP 或 X.509 的上下文中使用的存储结构往往依赖于 ASN.1,在许多情况下它可能像泥巴一样清晰。编写处理 ASN.1 的无错误代码并不容易(恕我直言)。

我认为 Thomas 的引用(“ ......你不应该信任密钥服务器...... ”)更多地与你不能信任密钥服务器作为担保它所服务的密钥的实体这一事实有关。这只是一个托管服务,而不是编辑/出版商/作者。

你的担心是非常有道理的。

2000 年,Ralf Senderek 在 NAI 的 PGP 商业版本 5.5.x 到 6.5.3 中发现了一个错误:Key-Experiments这尤其令人尴尬,因为它涉及“附加解密密钥 (ADK)”功能的实现(目标类似于密钥托管),这是商业 PGP 软件的一个方面,许多人原则上已经反对。它允许攻击者修改用户的密钥(证书)以添加他们自己的密钥作为额外的解密密钥,从而解密使用易受攻击的 PGP 版本制作的截获消息。NAI 很快发布了固定版本,并且还更新了密钥服务器以检测该问题以及指定撤销者的两个相关问题 - 请参阅Zimmerman 的回复请注意,GnuPG 根本拒绝支持 ADK。

这是另一个示例,但不是使用密钥服务器或 PGP。2010 年至少有一款具有 X.509 证书的产品出现了“可能允许执行任意代码”的缓冲区溢出攻击。在这种情况下,它实际上发生在与不可信端点的对话期间:yaSSL 证书处理缓冲区溢出漏洞 - CNET

如何避免这些问题?在这种特定情况下,最好直接从您想要通信的人那里安全地获取您的密钥。我列出了比传统(但非标准化和不安全)HKP 密钥服务器协议更安全的协议,在GPG 密钥提取是否应该使用安全连接?.

除此之外,一般软件卫生适用。使用以安全实践着称的人们精心研究过的软件,使您的软件保持最新,注意您在计算机上处​​理的任何类型的数据从哪里获取,最小化您的攻击面,划分您的数据处理等。