web-dev-qa-db-ja.com

RubyがHeartbleedに対して脆弱ではないOpenSSLを使用していることを確認するにはどうすればよいですか?

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つのチェックの違いは何ですか。また、いずれかのコマンドから不正なバージョンが返された場合に推奨されるアクションは何ですか。

21
Nathan Long

いくつかの質問をした後 他の場所 、私の現在の理解はこれです:

  • OpenSSLがRubyと一緒にコンパイルされることはありません。 Rubyは、コンパイル時に、OpenSSLを探す場所を簡単に通知されます。
  • _Ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'_は、RubyがOpenSSLを含むさまざまな実行可能ファイルを検索する場所を教えてくれるはずです
  • 重要なのは、その場所にあるOpenSSLのコピーが最新であるということです。そこにCDを挿入し、_./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_は古くなっている可能性があります。コンパイル時に見つかったバージョンを報告します。
19
Nathan Long

システムに複数のバージョンの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)のバージョンを削除して再構築します。

9
bayendor