Heartbleedのバグに続いて、 Ruby-lang.orgのこの投稿 は脆弱性をチェックしてアップグレードする方法を説明しています。
このアドバイスが含まれています:
RubyにリンクするOpenSSLライブラリのバージョンを確認するには、以下を使用します。
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 -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
これら2つのチェックの違いは何ですか。また、いずれかのコマンドから不正なバージョンが返された場合に推奨されるアクションは何ですか。
いくつかの質問をした後 他の場所 、私の現在の理解はこれです:
Ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'
_は、RubyがOpenSSLを含むさまざまな実行可能ファイルを検索する場所を教えてくれるはずです./openssl version
_を使用して調べます。Ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
は、_openssl version
_を直接実行するのと同じ答えを返す必要があります。これは、Rubyがバージョン番号の報告に使用しているOpenSSLのコピーを実際に要求するためです。OpenSSL::OPENSSL_VERSION
_は古くなっている可能性があります。コンパイル時に見つかったバージョンを報告します。システムに複数のバージョンのOpenSSLをインストールすることができます。これらの2つのテストは、ビルドを行う場合にどのバージョンがRubyにリンクされるか、また、どのバージョンがRuby you現在使用しています。
例として、まだRuby 1.9.3を使用していて、昨年インストール/コンパイルしたとします。これは、その時点でインストールしたOpenSSLのバージョンに対してリンクされているはずです。その間に、Heartbleedの問題に対応して、OpenSSLのバージョンを更新しました(たとえば、 Homebrew を使用)。
最初のテストを実行すると、OpenSSL 1.0.1gが返されます。これは、アップグレードしたばかりの現在のバージョンがリンクされています。
2番目のテストを実行した場合、Rubyのコピーは、OpenSSLの古い脆弱なコピーにリンクされている可能性があります。
例として、私は自分のシステム(Mac OSX 10.9)からの出力を使用します。
システムでの結果Ruby(2.0.0):
[~] $ 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
Ruby 2.1.1p76(rbenvによって管理されますが、RVMまたはその他の可能性があります)の結果:
[~] $ 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はOSXに含まれているOpenSSL
に対してリンクされており、Appleによってまだパッチが適用されていません。Ruby 2.1。 1 Homebrew
を使用してOpenSSL
のインストールをアップグレードした後、再構築しました。
[~] $ 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バージョンマネージャー、 rbenv や [〜#〜] rvm [〜# 〜] 。SSLを更新した後、バージョンマネージャーの通常のビルド/インストール手順に従って使用するRuby)のバージョンを削除して再構築します。