SSL客户端中的主机名检查绕过漏洞 (CVE-2013-4073)

Ruby 的 SSL 客户端中存在一个漏洞,可能允许中间人攻击者通过受信任的证书颁发机构颁发的有效证书来欺骗 SSL 服务器。

此漏洞已被分配 CVE 标识符 CVE-2013-4073。

摘要

Ruby 的 SSL 客户端实现了主机名身份检查,但它没有正确处理证书中包含空字节的主机名。

详情

OpenSSL::SSL.verify_certificate_identity 为 Ruby 的 SSL 客户端实现了 RFC2818 服务器身份检查,但它没有正确处理 subjectAltName X509 扩展中包含空字节的主机名。

lib/openssl/ssl.rb 中的现有代码使用 OpenSSL::X509::Extension#value 从 subjectAltName 中提取身份。Extension#value 依赖于 OpenSSL 函数 X509V3_EXT_print(),并且对于 subjectAltName 的 dNSName,它使用已知为空字节不安全的 sprintf()。因此,如果 subjectAltName 为 ‘www.ruby-lang.org\0.example.com’,则 Extension#value 返回 ‘www.ruby-lang.org’,并且 OpenSSL::SSL.verify_certificate_identity 错误地将证书识别为 ‘www.ruby-lang.org’ 的证书。

当受 SSL 客户端信任的 CA 允许颁发在 subjectAltName 中包含空字节的服务器证书时,远程攻击者可以从 CA 获取 ‘www.ruby-lang.org\0.example.com’ 的证书来欺骗 ‘www.ruby-lang.org’,并在 Ruby 的 SSL 客户端和 SSL 服务器之间进行中间人攻击。

受影响的版本

  • 所有 ruby 1.8 版本,早于 ruby 1.8.7 patchlevel 374
  • 所有 ruby 1.9 版本,早于 ruby 1.9.3 patchlevel 448
  • 所有 ruby 2.0 版本,早于 ruby 2.0.0 patchlevel 247
  • 早于 trunk 版本 41671

解决方案

建议所有用户升级到 Ruby 2.0.0-p247、1.9.3-p448 或 1.8.7-p374。

鸣谢

此漏洞由 William (B.J.) Snow Orvis 发现,并由 iSEC Partners 的 David Thiel 与 [email protected] 协调。

历史

  • 最初发布于 2013-06-27 11:00:00 (UTC)