根据Heartbleed错误,this post on 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'
这两个检查之间有什么区别,如果从任一命令返回错误版本,建议采取什么操作?
答案 0 :(得分:17)
在问了一些问题后elsewhere,我目前的理解是:
ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'
应该告诉你Ruby将在哪里寻找各种可执行文件,包括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
可能已过时;它会报告编译时发现的版本。答案 1 :(得分: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
正如您所看到的,系统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
我不建议修补系统Ruby,最好使用Ruby版本管理器,如rbenv或RVM。更新SSL后,删除并重建您使用的Ruby版本,遵循版本管理器的正常构建/安装说明。