本日ネットを震撼させている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):
こんな情報が。いつもありがとうございます。
@masutaka @tmd45 extension実装時からのもののようですね→ https://t.co/dmkhONHa75
— mat (@cvmat) April 9, 2014
extension作者がどの環境で確認したかを表しているんじゃないでしょうか。(他の版だと仕様変更で一部の関数が使えないor挙動変更されているかも)
追記(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)