Ruby OpenSSL 模块的安全修复:允许“0/n 分割”作为防止 TLS BEAST 攻击的一种手段。

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

到目前为止,Ruby OpenSSL 扩展默认对所有 SSL 连接使用 OpenSSL 的 SSL_OP_ALL 选项,该选项是 OpenSSL 为各种漏洞提供的组合选项,应该说是无害的。它只允许用户添加其他选项,因此您无法删除 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 分割”的错误,因此我们(以及 OpenSSL)不会将其设置为默认选项。请在生产环境中启用此选项之前测试 SSL 连接。如果您连接的其他端点无法处理“0/n 分割”,您必须使用其他方法来防止 TLS BEAST 攻击,例如强制使用 RC4 密码套件。有关详细信息,请查找有关 CVE-2011-3389 的讨论和资源。