我如何确保Ruby使用不易受Heartbleed影响的OpenSSL?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

在Heartbleed bug之后,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'

这两种检查之间有什么区别,如果从任一命令返回了错误版本,建议采取什么操作?

提问于
用户回答回答于

您的系统上可能安装了多个版本的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

正如你所看到的,系统ruby OpenSSL与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.

另外,确保使用旧版本的OpenSSL brew cleanup openssl

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

用户回答回答于

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

  • 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可能已经过时; 它会报告它在编译时找到的版本。

扫码关注云+社区