2014-04-10 4 views
16

Heartbleed 버그 다음에 this post on ruby-lang.org은 취약점 및 업그레이드를 확인하는 방법을 설명합니다.Ruby가 Heartbleed에 취약하지 않은 OpenSSL을 사용하도록하려면 어떻게해야합니까?

ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)' 

현재 루비와 함께 설치된 OpenSSL을의 버전을 확인하려면 :


당신이 루비로 연결되는으로 OpenSSL 라이브러리의 버전, 다음 사용 확인하려면 :

그것은이 조언을 포함

ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION' 

: 다음을 사용

이 두 검사의 차이점과 두 명령 중 하나에서 잘못된 버전이 반환 된 경우 어떤 작업을 권장합니까?

+2

OpenSSL을 Ruby 바이너리로 컴파일하거나 런타임시 시스템 라이브러리에 연결할 수 있다고 생각합니까? 그것이 맞다면 특정 루비 바이너리가 OpenSSL을 사용하는 방법을 어떻게 알 수 있습니까? –

답변

9

시스템에 여러 버전의 OpenSSL을 설치할 수 있습니다. 이 두 가지 테스트는 빌드를 수행하는 경우 루비에 링크 될 버전과 현재 사용중인 루비에서 실제로 링크 된 버전을 알려줍니다.

예를 들어, 아직 Ruby 1.9.3을 사용 중이며 작년에 설치/컴파일했다고 가정 해 봅시다. 그 당시에 설치 한 OpenSSL 버전과 링크되었을 것입니다. 그동안 Heartbleed 문제에 대한 응답으로 OpenSSL 버전 (예 : Homebrew 사용)을 업데이트했습니다.

첫 번째 테스트를 실행 한 경우 OpenSSL 1.0.1g가 다시 제공되며 업그레이드 한 현재 버전이 링크되어 있습니다.

두 번째 테스트를 실행하면 Ruby 복사본이 OpenSSL의 오래된 취약한 복사본에 여전히 연결되어있는 것으로 나타납니다. 시스템에

결과 루비 (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 

결과 예를 들어, 나는 내 자신의 시스템 (맥 OSX 10.9)의 출력을 사용합니다함으로써

루비 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 

를 내가 OS X에 포함 된 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) 

먼저 당신이 Homebrew를 사용하는 경우, 가장 최근에는 OpenSSL이 있는지 확인, 그냥 사용

brew upgrade openssl.

또한, I 시스템 루비, rbenv 또는 RVM 같은 루비 버전 관리자를 사용하는 것이 가장 패치를하지 않는 것이 좋습니다 brew cleanup openssl

와의 OpenSSL 이전 버전을 제거해야합니다.SSL을 업데이트 한 후 버전 관리자의 일반 빌드/설치 지침에 따라 사용하는 Ruby 버전을 제거하고 다시 작성하십시오.

13

몇 가지 질문 elsewhere을 요구 한 후, 나의 현재 이해는 이것이다 :

  • OpenSSL을 루비와 함께 컴파일되지 않습니다; 루비는 컴파일 타임에 OpenSSL을 어디에서 찾을 것인지 간단히 말합니다.
  • ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'은 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의 사본을 요구하기 때문에 직접 openssl version을 실행하는 것과 같은 대답을 주어야한다
  • OpenSSL::OPENSSL_VERSION 수 있습니다 오래된; 그것은 컴파일되었을 때 발견 한 버전을보고합니다.
+0

'OpenSSL :: OPENSSL_LIBRARY_VERSION'을 사용하여 루비 버전을 확인하십시오. – Jerrod

관련 문제