22

继 Heartbleed 漏洞之后,ruby-lang.org 上的这篇文章描述了如何检查漏洞和升级。

它包括以下建议:


要验证您链接到 Ruby 的 OpenSSL 库的版本,请使用以下命令:

ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'

要验证当前随 Ruby 安装的 OpenSSL 版本,请使用以下命令:

ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'

这两项检查有什么区别,如果任一命令返回错误版本,建议采取什么措施?

4

2 回答 2

20

在别处问了一些问题后,我目前的理解是这样的:

  • OpenSSL 永远不会与 Ruby 一起编译。Ruby 在编译时被简单地告知在哪里寻找 OpenSSL。
  • ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'应该告诉你 Ruby 将在哪里寻找各种可执行文件,包括 OpenSSL
  • 重要的是该位置的 OpenSSL 副本是最新的;cd 那里和使用./openssl version找出。
  • ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'应该给出与直接运行相同的答案,openssl version因为它实际上会询问 Ruby 用于报告其版本号的 OpenSSL 副本
  • OpenSSL::OPENSSL_VERSION可能已过时;它报告编译时找到的版本。
于 2014-04-18T19:48:19.487 回答
9

您的系统上可以安装多个版本的 OpenSSL。这两个测试告诉您如果要进行构建,哪个版本将链接到您的 Ruby,以及您当前使用的 Ruby 中实际链接的版本。

例如,假设您仍在使用 Ruby 1.9.3,并在去年安装/编译了它。它会与您当时安装的 OpenSSL 版本相关联。与此同时,您更新了 OpenSSL 版本(例如,使用Homebrew),以响应 Heartbleed 问题。

如果您运行第一个测试,您将返回 OpenSSL 1.0.1g,即您刚刚升级的链接的当前版本。

如果您运行第二个测试,它将显示您的 Ruby 副本可能仍链接到较旧的、易受攻击的 OpenSSL 副本。

例如,我将使用我自己的系统(Mac OSX 10.9)的输出:

系统 Ruby (2.0.0) 上的结果:

[~] $ ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil ["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'` 

ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/openssl/ssl.rb:10    1: warning: assigned but unused variable - id
OpenSSL 0.9.8y 5 Feb 2013


[~] $ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 0.9.8y 5 Feb 2013

Ruby 2.1.1p76 上的结果(由 rbenv 管理,但可能是 RVM 或其他):

[~] $ ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
OpenSSL 1.0.1g 7 Apr 2014
[~] $ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 1.0.1g 7 Apr 2014

如您所见,系统 rubyOpenSSL​​ 与 OS X 附带的相关联,尚未由 Apple 修补。Ruby 2.1.1 我在使用Homebrew升级我安装的OpenSSL.

[~] $ brew list openssl
/usr/local/Cellar/openssl/1.0.1g/bin/openssl
/usr/local/Cellar/openssl/1.0.1g/bin/c_rehash
/usr/local/Cellar/openssl/1.0.1g/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.1g/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.1g/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.1g/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.1g/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.1g/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.1g/share/man/ (1126 files)

首先确保您拥有最新的 OpenSSL,如果您使用的是Homebrew,只需使用:

brew upgrade openssl.

此外,请确保删除旧版本的 OpenSSLbrew cleanup openssl

我不建议修补系统 Ruby,最好使用 Ruby 版本管理器,例如rbenvRVM。更新 SSL 后,按照版本管理器的正常构建/安装说明删除并重新构建您使用的 Ruby 版本。

于 2014-04-18T14:26:38.030 回答