在心脏出血漏洞之后,this post on ruby-lang.org描述了如何检查漏洞和升级。
它包括这样的建议:
要验证链接到OpenSSL的Ruby库的版本,请使用以下命令:
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'
这两个检查之间有什么不同,如果这两个命令都返回了错误的版本,建议采取什么措施?
发布于 2014-04-19 03:48:19
在问了一些问题elsewhere之后,我目前的理解是:
Ruby从来不会和out.
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 -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'
应该告诉你Ruby在哪里寻找各种可执行文件,包括number
OpenSSL::OPENSSL_VERSION
./openssl version
查找openssl version
应该给出与直接运行openssl version
相同的答案,因为它实际上询问了Ruby用来报告其版本number
OpenSSL::OPENSSL_VERSION
的OpenSSL副本可能是过时的;它会报告编译时发现的版本。发布于 2014-04-18 22:26:38
可以在您的系统上安装多个版本的OpenSSL。这两个测试告诉您,如果进行构建,哪个版本将链接到您的Ruby,以及您当前使用的Ruby中实际链接的版本。
例如,假设您仍在使用Ruby 1.9.3,并在去年安装/编译了它。它将链接到您当时安装的OpenSSL版本。在此期间,您更新了您的OpenSSL版本(例如,使用Homebrew ),以响应心脏出血问题。
如果您运行第一个测试,您将得到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
Ruby2.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附带的OpenSSL
链接在一起,而苹果尚未对其进行修补。在使用Homebrew
升级我安装的OpenSSL
之后,我重新构建了Ruby2.1.1。
[~] $ 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版本。
https://stackoverflow.com/questions/22993541
复制相似问题