2014-04-10 12 views
16

Po wystąpieniu błędu Heartbleed, this post on ruby-lang.org opisuje sposób sprawdzania podatności i aktualizacji.Jak mogę się upewnić, że Ruby używa OpenSSL, który nie jest podatny na Heartbleed?

Obejmuje to radę:


Aby sprawdzić, która wersja biblioteki OpenSSL link do Ruby, należy użyć następujących:

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

Aby sprawdzić wersję OpenSSL aktualnie zainstalowanego z Ruby , użyj następującego:

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

Jaka jest różnica między tymi dwoma sprawdzeniami i jakie działanie jest zalecane, jeśli zwracana jest zła wersja z któregokolwiek polecenia?

+2

Zgaduję, że można skompilować OpenSSL do pliku binarnego Ruby lub pozwolić mu dotrzeć do biblioteki systemowej w czasie wykonywania? Jeśli to prawda, skąd mam wiedzieć, w jaki sposób konkretny plik binarny Ruby używa OpenSSL? –

Odpowiedz

9

Możliwe jest zainstalowanie w systemie wielu wersji OpenSSL. Te dwa testy podpowiedzą, która wersja byłaby powiązana z twoją Ruby, gdybyś zrobił kompilację, a także która wersja jest faktycznie połączona z Ruby, z której aktualnie korzystasz.

Jako przykład załóżmy, że nadal używasz Ruby 1.9.3 i zainstalowałeś/skompilowałeś go w zeszłym roku. Byłby powiązany z wersją OpenSSL zainstalowaną w tym czasie. W międzyczasie zaktualizowałeś swoją wersję OpenSSL (używając na przykład Homebrew), w odpowiedzi na problem Heartbleed.

Po pierwszym teście otrzymasz OpenSSL 1.0.1g, aktualną wersję, która właśnie została uaktualniona.

Jeśli przeprowadziłeś drugi test, okazałoby się, że twoja kopia Rubiego jest prawdopodobnie nadal powiązana ze starszą, wrażliwą kopią OpenSSL.

Tytułem przykładu użyję wyjście z własnego systemu (Mac OSX 10.9):

wyników na systemie 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 

wyników na Ruby 2.1.1p76 (zarządzany przez rbenv, ale może być RVM lub inny):

[~] $ 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 

Jak widać rubin System I s są połączone z OpenSSL dołączonymi do OS X, a nie są jeszcze załatane przez Apple. Ruby 2.1.1 Zostałem ponownie zbudowany po użyciu Homebrew w celu aktualizacji mojej instalacji 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) 

Najpierw upewnij się, że masz najnowszą OpenSSL, jeśli używasz Homebrew, wystarczy użyć:

brew upgrade openssl.

Ponadto, upewnij się, aby usunąć starsze wersje OpenSSL z brew cleanup openssl

Nie polecam łatanie systemu rubin, najlepiej użyć menedżera wersji Ruby, jak rbenv lub RVM.Po zaktualizowaniu protokołu SSL usuń i przebuduj wersje Rubiego, których używasz, postępując zgodnie z normalnymi instrukcjami dotyczącymi instalacji/instalacji menedżera wersji.

13

Po zapytaniu kilka pytań elsewhere, moja obecna wiedza jest taka:

  • OpenSSL nie jest kompilowany wraz z Ruby; Ruby jest po prostu informowana, w czasie kompilacji, gdzie szukać OpenSSL.
  • powinieneś powiedzieć, gdzie Ruby będzie szukać różnych plików wykonywalnych, w tym OpenSSL
  • Ważne jest tylko to, że kopia OpenSSL w tej lokalizacji jest aktualna; cd tam i użyj ./openssl version, aby się dowiedzieć.
  • ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)' powinien dać taką samą odpowiedź jak bieganie openssl version bezpośrednio, ponieważ faktycznie prosi kopię OpenSSL że Ruby korzysta zgłosić swój numer wersji
  • OpenSSL::OPENSSL_VERSION może być już nieaktualna; zgłasza wersję znalezioną podczas kompilacji.
+0

'OpenSSL :: OPENSSL_LIBRARY_VERSION', aby zobaczyć z jaką wersją działa ruby. – Jerrod

Powiązane problemy