相信大家都知道这次 OpenSSL 的 HeartBleed 事情的严重性,如不知,请访问:http://heartbleed.com
Ruby 同样也是受到很大影响的。OpenSSL 的 1.0.1 - 1.0.1f 都是有问题的。而 Ruby 在编译的时候依赖于 OpenSSL, 既然 rvm 或 rbenv 也只是帮我们直接链接它们。
我们来看看 Ruby 中 OpenSSL 库的版本:
ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
再看看链接到 Ruby 版本中的 OpenSSL:
ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
如果以上版本显示在:1.0.1 - 1.0.1f
之间,请马上升级操作系统的 openssl, 并升级 Ruby 或重编译 Ruby.
如果你使用的是 rvm
, 则执行以下命令:
# 升级之前使用 brew install openssl 之类的将动态链接库先升好
rvm get head
rvm upgrade 2.0.0
之后,再次检验是否成功。
如果是自己编译的 Ruby, 则你应该知道你编译时用的动态链接库或者是静态链接库,更新动态库或者重新编译 Ruby.
更多信息请参考 ruby-lang.org: https://www.ruby-lang.org/en/news/2014/04/10/severe-openssl-vulnerability/
刚查了 Ubuntu 最新的 package 都只有 1.0.1f,4 月 7 号出的,还说明了是应付这个问题的。http://www.ubuntu.com/usn/usn-2165-1/ 怎么破?
$ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 1.0.1f 6 Jan 2014
$ 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
升级完毕
homebrew 怎么破?
~:$ brew upgrade openssl
Error: openssl-1.0.1f already installed
不用自己编译,发行版第一时间就更新修复包了 (debian 是半个小时吧)。直接更新系统的 library, 重启一下调用这些动态连接库的程序,连调用程序的重新编译都免了。
debian/ubuntu/centos这些传统发行版在固定版本维护周期内为了维护包之间的依赖,不会变更除了 backports 源以外的软件版本,但是补丁会追加的。
你这样自己编译一个 library, 并且放到系统的 include path 和 library path 替换系统自带的版本,可能会引起不可预料的后果。
#18 楼 @ninehills 只要使用了有这个漏洞的 openssl 版本,都是有问题的。
要知道:这个漏洞可以 随机泄露服务器 64K 内存 ,其危害之大可想而知!
#26 楼 @ninehills 看清楚我的前提:只要你 nginx 开了 443,就会出问题,nginx 也是使用 openssl 的。
你后端应用不需要直接开 443,也基本没人这么做。问题是后端应用一般都会走 nginx 之类的反向代理,数据还是要经过 nginx 的。
#27 楼 @tsl0922 只要 Nginx 链接的 OpenSSL 是修复过的,Rails app 就算开了 https,也不直接面向外网的,并不会被攻击。我想 #18 楼 #26 楼 @ninehills 就是这个意思吧。