如何确保Ruby使用不易受Heartbleed攻击的OpenSSL?

关于Heartbleed错误, ruby-lang.org上的这篇文章描述了如何检查漏洞和升级。

它包括这个建议:


要validation链接到Ruby的OpenSSL库的哪个版本,请使用以下命令:

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

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

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

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

在其他地方提出一些问题后,我目前的理解是:

  • OpenSSL永远不会与Ruby一起编译; Ruby在编译时被告知在哪里寻找OpenSSL。
  • ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'告诉你Ruby会在哪里查找各种可执行文件,包括OpenSSL
  • 重要的是该位置的OpenSSL副本是最新的; 在那里使用./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可能已过时; 它会报告编译时找到的版本。

您的系统上可以安装多个版本的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与OS X中包含的OpenSSL相关联,但尚未被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

此外,请确保使用brew cleanup openssl删除旧版本的OpenSSL

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

Interesting Posts