Ruby 在 OpenSSL 心脏攻击中 Rubyist 该怎么办

lyfi2003 · 2014年04月10日 · 最后由 psvr 回复于 2014年04月28日 · 6586 次阅读
本帖已被管理员设置为精华贴

相信大家都知道这次 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/

躺枪 立马升级

用 jruby 的也一样躺枪么

昨晚下班前 AWS 来封邮件要求升级 openssl, 当时没太在意. 晚上回去看了下新闻, 好像这次闹得挺凶

#2 楼 @ywjno 依赖 openssl 的话都需要升级一下, 虽然没有像 nginx, apache 之类的那么严重.

被漏洞无视了,Debian squeeze 没受影响...

win 版 的 ruby 2.0.0p451 的 SSL 是 OpenSSL 1.0.0l 6 Jan 2014 一下感觉好安逸

如果包管理器的 ruby 版本足夠新就好,就不用自己編譯了……

刚查了 Ubuntu 最新的 package 都只有 1.0.1f,4 月 7 号出的,还说明了是应付这个问题的。http://www.ubuntu.com/usn/usn-2165-1/ 怎么破?

如果不是直接用 nginx 可以考虑升级,大部分 ssl 都是靠 nginx 在前端解签。

$ 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

升级完毕

#9 楼 @billy 修了啦,deb 系的包管理机制是不一样的,团队会 update

homebrew 怎么破?

~:$ brew upgrade openssl
Error: openssl-1.0.1f already installed

弱弱得问一下,如果没用 443 端口得话,是不是不会收到攻击呢?

#16 楼 @benzhang 嗯, 不是 ssl 的话就没有问题~

抗在 443 端口的一般是 nginx 吧,后端应用如果不是直接开端口,没必要搞

#11 楼 @Ryan jruby-ossl 0.9.4 算什么?

#19 楼 @xwf286

不用自己编译, 发行版第一时间就更新修复包了 (debian 是半个小时吧)。 直接更新系统的 library, 重启一下调用这些动态连接库的程序, 连调用程序的重新编译都免了。

debian/ubuntu/centos 这些传统发行版在固定版本维护周期内为了维护包之间的依赖, 不会变更除了 backports 源以外的软件版本,但是补丁会追加的。

你这样自己编译一个 library, 并且放到系统的 include path 和 library path 替换系统自带的版本, 可能会引起不可预料的后果。

#20 楼 @mimosa jruby 的不懂。。。

我的 mac 竟然是 0.9.8

#21 楼 @tnt 👍 同意,除非很了解相关的包管理机制,但能不编译就不要去编译了。

#18 楼 @ninehills 只要使用了有这个漏洞的 openssl 版本,都是有问题的。

要知道:这个漏洞可以 随机泄露服务器 64K 内存 ,其危害之大可想而知!

#25 楼 @tsl0922 「抗在 443 端口的一般是 nginx 吧,后端应用如果不是直接开端口,没必要搞」

应用没开 443 端口,你攻击一个给我看看。。。

#26 楼 @ninehills 看清楚我的前提:只要你 nginx 开了 443,就会出问题,nginx 也是使用 openssl 的。

你后端应用不需要直接开 443,也基本没人这么做。问题是后端应用一般都会走 nginx 之类的反向代理,数据还是要经过 nginx 的。

#27 楼 @tsl0922 只要 Nginx 链接的 OpenSSL 是修复过的,Rails app 就算开了 https,也不直接面向外网的,并不会被攻击。我想 #18 楼 #26 楼 @ninehills 就是这个意思吧。

#27 楼 @tsl0922 ?你再仔细阅读我的话 「抗在 443 端口的一般是 nginx 吧,后端应用如果不是直接开端口,没必要搞」

我有说过 ngnix 就不修漏洞么,nginx 修漏洞关 ruby 啥事?

#29 楼 @ninehills 这个问题没必要继续争论,都明白意思就 OK 了,就像 #28 楼 @kgen 所说的那样。

我反正要重装 Mac 一起搞了

躺枪!多谢提醒

需要 登录 后方可回复, 如果你还没有账号请 注册新账号