Как я могу гарантировать, что Ruby использует OpenSSL, не уязвимый для Heartbleed?
После ошибки Heartbleed, этот пост на ruby-lang.org описывает, как проверить уязвимость и обновить.
Он включает в себя этот совет:
Чтобы проверить, какая версия библиотеки OpenSSL вы связываете с Ruby, используйте следующее:
ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
Чтобы проверить версию OpenSSL, установленную в настоящее время в Ruby, используйте следующее:
ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
В чем разница между этими двумя проверками и какое действие рекомендуется, если неверная версия возвращается из любой команды?
Ответы
Ответ 1
После того, как вы задали несколько вопросов в другом месте, мое нынешнее понимание таково:
- 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
, потому что он фактически запрашивает копию OpenSSL, которую Ruby использует для сообщения своего номера версии
-
OpenSSL::OPENSSL_VERSION
может быть устаревшим; он сообщает версию, которую он нашел, когда он был скомпилирован.
Ответ 2
В вашей системе может быть установлено несколько версий OpenSSL. Эти два теста говорят вам, какая версия будет связана с вашим Ruby, если вы собираетесь делать сборку, а также какая версия на самом деле связана с Ruby, который вы сейчас используете.
В качестве примера предположим, что вы все еще используете Ruby 1.9.3, и установили/скомпилировали его в прошлом году. Это было бы связано с версией OpenSSL, которую вы установили в то время. Тем временем вы обновили версию OpenSSL (используя Homebrew, например), в ответ на проблему Heartbleed.
Если вы запустили первый тест, вы вернете OpenSSL 1.0.1g, текущую версию, связанную с тем, что вы только что обновили.
Если вы проведете второй тест, это покажет, что ваша копия 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 связана с OpenSSL
, включенной в OS X, и еще не исправлена 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
.
Кроме того, убедитесь, что старые версии OpenSSL удалены с помощью brew cleanup openssl
Я не рекомендую исправлять систему Ruby, лучше всего использовать менеджер версий Ruby, например rbenv или RVM. После обновления вашего SSL, удалите и перестройте версии Ruby, которые вы используете, следуя нормальным инструкциям по сборке/установке для вашего менеджера версий.