本日ネットを震撼させているopensslの脆弱性。
OpenSSLの重大バグが発覚。インターネットの大部分に影響の可能性|TechCrunch Japan

私のMacbookAirにインストールしたrubyはHomebrewのopensslをリンクして
いるので、状況を調べてみました。

[2014-01-25-2] の方法でrubyをビルドしているので、Homebrewのopensslを
リンクしています。

$ otool -L ~/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle
/Users/masutaka/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle:
        /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) ★これ
        /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) ★これ
        /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

brew info opensslによると、Homebrewのopensslは1.0.1fです。
今回の対象です。

以下のコマンドでも調べられるようです。同様の結果を得られました。

$ ruby -ropenssl -e “p OpenSSL::OPENSSL_VERSION”
“OpenSSL 1.0.1f 6 Jan 2014”

対策が施された1.0.1gにアップデートします。

$ brew upgrade openssl

shared libraryが置き換わりました。

$ ls -alF /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
-r--r--r--  1 masutaka  admin  1569360  4  8 20:21 /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
-r--r--r--  1 masutaka  admin   358016  4  8 20:21 /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

しかし、OpenSSL::OPENSSL_VERSIONはそのままです。

$ ruby -ropenssl -e “p OpenSSL::OPENSSL_VERSION”
“OpenSSL 1.0.1f 6 Jan 2014”

Ruby-2.1.0の.rbには定義されてなかったので、ruby-2.1.0.tar.gzのCソー
スをgrepしたらext/openssl/ossl.cに以下を発見。

rb_define_const(mOSSL, "OPENSSL_VERSION", rb_str_new2(OPENSSL_VERSION_TEXT));

OPENSSL_VERSION_TEXTは
/usr/local/opt/openssl/include/openssl/opensslv.hに定義されていました。

#define OPENSSL_VERSION_TEXT	"OpenSSL 1.0.1g 7 Apr 2014"

どうやらOpenSSL::OPENSSL_VERSIONはRubyビルド時に決定されるようです。
opensslはダイナミックリンクなのに、なぜ定数なんだろう?と思った次第
であります。教えて偉い人!

関連ツイート: https://twitter.com/tmd45/status/453383314523439104

追記(2014-04-09):
こんな情報が。いつもありがとうございます。

追記(2014-04-10):
以下の方法でRubyがダイナミックリンクしているopensslのバージョンを
表示できました。

$ ruby -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
OpenSSL 1.0.1g 7 Apr 2014

OpenSSL Severe Vulnerability in TLS Heartbeat Extension (CVE-2014-0160)