Ruby OpenSSL 模块的安全修复:允许“0/n 分割”以防止 TLS BEAST 攻击。

Urabe Shyouhei 发布于 2012 年 2 月 16 日

在 OpenSSL 中,SSL 连接的 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 选项用于防止 TLS-CBC-IV 漏洞,该漏洞在 [1] 中有所描述。这是 TLSv1/SSLv3 的已知问题,但最近作为 BEAST 攻击 [2] (CVE-2011-3389) 而备受关注。Ruby 相关主题可在我们的问题跟踪器 [3] 中找到。

到目前为止,Ruby OpenSSL 扩展默认使用 SSL_OP_ALL 选项,这是 OpenSSL 中用于各种可能无害的 bug 修复的组合选项,适用于所有 SSL 连接。它只允许用户添加其他选项,因此您无法删除 SSL_OP_ALL 选项中包含的功能,例如 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS。这是故意的,因为它没有暴露像 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 这样的常量,但我们应该允许取消设置该选项,以便 Ruby OpenSSL 扩展在 SSL 连接的开头插入空片段(称为“0/n 分割”)来防范 TLS BEAST 攻击。

此版本定义了额外的常量,并允许用户取消设置 SSL_OP_ALL 中的选项。默认选项仍然是 SSL_OP_ALL,但您可以设置 SSLSocket 以执行“0/n 分割”来预防 BEAST,如下所示。

ctx = SSLContext.new
ctx.options = OP_ALL & ~OP_DONT_INSERT_EMPTY_FRAGMENTS
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
SSLSocket.new(socket, ctx)

感谢 Apple 报告此问题。

注意:已知某些 SSL 端点存在无法正确处理“0/n 分割”的 bug,因此我们(以及 OpenSSL)不将其设置为默认选项。请在生产环境中启用此功能之前测试 SSL 连接性。如果您连接的其他端点无法处理“0/n 分割”,您必须使用其他方法来防范 TLS BEAST 攻击,例如强制使用 RC4 的密码套件。有关详细信息,请查找关于 CVE-2011-3389 的讨论和资源。

近期新闻

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 日

更多新闻...