首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何才能确保Ruby使用的OpenSSL不会受到心脏出血的攻击?

我如何才能确保Ruby使用的OpenSSL不会受到心脏出血的攻击?
EN

Stack Overflow用户
提问于 2014-04-11 00:18:06
回答 2查看 14.3K关注 0票数 22

在心脏出血漏洞之后,this post on ruby-lang.org描述了如何检查漏洞和升级。

它包括这样的建议:

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

代码语言:javascript
复制
ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'

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

代码语言:javascript
复制
ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'

这两个检查之间有什么不同,如果这两个命令都返回了错误的版本,建议采取什么措施?

EN

回答 2

Stack Overflow用户

发布于 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副本是最新的;在那里cd并使用./openssl version查找openssl version应该给出与直接运行openssl version相同的答案,因为它实际上询问了Ruby用来报告其版本number

  • OpenSSL::OPENSSL_VERSION的OpenSSL副本可能是过时的;它会报告编译时发现的版本。
票数 20
EN

Stack Overflow用户

发布于 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)系统上的结果:

代码语言:javascript
复制
[~] $ 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或其他):

代码语言:javascript
复制
[~] $ 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。

代码语言:javascript
复制
[~] $ 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版本管理器,如rbenvRVM。在更新SSL之后,按照版本管理器的正常构建/安装说明删除并重新构建您使用的Ruby版本。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22993541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档