对 CVE-2014-2734 漏洞的争议

emboss 发布于 2014 年 5 月 9 日

我们最近获悉一项可能已发布的、被指定为 CVE-2014-2734 的安全漏洞。然而,基于我们下面的详细分析,我们认为 Ruby 存在此漏洞。

此漏洞可能允许攻击者通过修改证书的签名来伪造任意的根证书,从而有效地用攻击者选择的私钥替换证书的原始私钥。

概念验证

以下是我们对 CVE-2014-2734 的分析,我们能够精简原始的概念验证,我们认为它捕捉了概念验证的本质

require 'openssl'

forge_key = OpenSSL::PKey::RSA.new(2048)
raw_certificate = File.read("arbitrary.cer")
cert = OpenSSL::X509::Certificate.new(raw_certificate)
resigned_cert = cert.sign(spoof, OpenSSL::Digest::SHA1.new)

resigned_cert.verify(key) #=> true

您可能会惊讶于 X509Certificate#verify 返回 true。原始证书可能包含一个指向原始公钥的 主题公钥信息,该公钥与 forge_key 的公钥不同。显然,用于重新签名证书的公钥/私钥对不再与主题公钥信息中引用的原始公钥匹配。为什么 #verify 会在此场景下返回 true 呢?

密钥验证方式

X509Certificate#verify 在内部使用 OpenSSL 的 X509_verify 函数,该函数会委托给 ASN1_item_verify。这些函数在给定所提供的公钥的情况下建立签名的有效性。但是,它们 **不会** 验证给定的密钥是否与证书中引用的任何主题公钥匹配。这意味着在此场景下,返回 trueX509Certificate#verify 的预期行为。省略此检查对 X.509 信任模型的整体安全性没有重大影响。

RFC 5280 的第 4.1.1.3 节明确指出,通过计算证书的签名,CA 确认了证书中包含信息的正确性。虽然上面的示例代码违反了这一原则,但它不会对安全构成威胁。除非有人能说服您明确信任一个违反此原则的证书,否则以这种方式伪造或修改的证书无法被利用。

潜在风险

有两种情况需要考虑:

重新签名根证书

作为用户,我们无条件信任根证书。即使它们不包含有效信息,仅仅作为被公众认可的根证书的身份就足以使其保持完整。它们是我们浏览器或操作系统信任库中的预配置值。仅仅拥有它们就确立了它们作为有效信任锚的地位。例如,OpenSSL 本身默认不检查自签名根证书的签名,原因相同,参见 X509_V_FLAG_CHECK_SS_SIGNATURE 文档

重新签名的根证书变成了一个事实上的“自签名”证书(尽管具有不正确的主题公钥信息)。这并不比普通的自签名根证书更危险。事实上,任何人都可以生成自签名根证书,这些证书可能与有效根证书完全匹配——除了签名。由于我们仅仅通过拥有来信任根证书,这样一个冒充的证书在没有客户端主动同意信任它的情况下是无意义的。

重新签名中间证书或叶子证书

此外,重新签名非根证书也不会违反 X.509 信任模型的安全性。虽然我们通常不会提前拥有这些类型的证书,但在 路径验证过程 中会检测到它们的伪造。在这里,任何非根证书的签名都会使用颁发证书的公钥进行验证。在证书链的某个节点,伪造最终会以无效证书签名值的形式被检测到。

结论

总而言之,我们认为 X509Certificate#verify 的运行符合预期。其他人也独立得出了 相同的结论,因此我们已对 CVE-2014-2734 提出争议,并要求撤销该漏洞。您可以在这里找到我们对 原始概念验证 的完整分析,包括评论。

近期新闻

Ruby 4.0.0 发布

我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 25 日

Ruby 文档的全新外观

继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。

Stan Lo 发布于 2025 年 12 月 23 日

重新设计我们的网站标识

我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。

Hiroshi SHIBATA 发布于 2025 年 12 月 22 日

Ruby 4.0.0 preview3 发布

我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 18 日

更多新闻...