Heartbleed: как надежно и портативно проверить версию OpenSSL?

88

Я искал надежный и портативный способ проверки версии OpenSSL в GNU / Linux и других системах, чтобы пользователи могли легко определить, следует ли им обновить свой SSL из-за ошибки Heartbleed.

Я думал, что это будет легко, но я быстро столкнулся с проблемой на Ubuntu 12.04 LTS с последней версией OpenSSL 1.0.1g:

версия openssl -a

Я ожидал увидеть полную версию, но вместо этого я получил это:

OpenSSL 1.0.1 14 марта 2012 г.
Построен: вт июн 4 07:26:06 UTC 2013
Платформа: [...]

К моему неприятному удивлению, письмо с версией не показывается. Нет f, нет g там, просто "1.0.1" и все. Перечисленные даты также не помогают обнаружить (не) уязвимую версию.

Разница между 1.0.1 (af) и 1.0.1g имеет решающее значение.

Вопросов:

  • Какой надежный способ проверить версию, желательно перекрестный дистрибутив?
  • Почему буква версии не отображается в первую очередь? Я не смог проверить это ни на чем другом, кроме Ubuntu 12.04 LTS.

Другие также сообщают об этом поведении. Несколько примеров:

Некоторые (специфичные для дистрибутива) предложения, появляющиеся в:

  • Ubuntu и Debian: apt-cache policy opensslи apt-cache policy libssl1.0.0. Сравните номера версий с пакетами здесь: http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(спасибо @znmeb в твиттере) иyum info openssl-libs

Проверка, является ли более старая версия OpenSSL все еще резидентной:

Оказывается, что обновления пакета OpenSSL в Ubuntu и Debian не всегда достаточно. Вам также следует обновить пакет libssl1.0.0 и -then- check, если openssl version -aуказывает built on: Mon Apr 7 20:33:29 UTC 2014.

Мартейн
источник
2
по крайней мере, убедитесь, что версия OpenSSL, которая у вас есть , не доступна из-за даты, которую она показывает
Pato Sáinz
3
Это работает на CentOS[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Jacob
1
@ PatoSáinz Я проверил, apt-cache policy opensslи он ответил: Installed: 1.0.1-4ubuntu5.12это 1.0.1g, только что выпущенный Ubuntu для 12.04 LTS. Я вышел из системы и вернулся обратно. Могу ли я проверить что-нибудь еще?
Мартейн
1
Я укажу, для этого, что не знаю, в случае, если это полезно ... Ubuntu 12.04 LTS поставляется с OpenSSL 1.0.1 (vanilla).
HopelessN00b
1
Если эта дата сборки является точной, вы не можете иметь «версию с версиями», более позднюю, чем 1.0.1e, поскольку 1.0.1f вышла в 2014 году в соответствии с примечаниями к выпуску OpenSSL 1.0.1 . Конечно, отдельные строки или разделы могли быть перенесены в вашу версию Ubuntu до официального выпуска OpenSSL 1.0.1f. И дата сборки может быть менее полезной.
Анти-слабые пароли

Ответы:

66

На основании отображаемой версии OpenSSL даты, вы, кажется , будете видеть полную версию отображается там.

Open SSL 1.0.1 был выпущен 14 марта 2012 года . 1.0.1a был выпущен 19 апреля 2012 года.

Итак, я собираюсь пойти дальше и утверждать, что openssl version -aэто правильный перекрестный дистрибутив для отображения полной версии OpenSSL, установленной в системе. Похоже, что он работает для всех дистрибутивов Linux, к которым у меня есть доступ, и это метод, предложенный также в документации OpenSSL help.ubuntu.com . Ubuntu LTS 12.04 поставляется с vanilla OpenSSL v1.0.1, которая является версией, которая выглядит как сокращенная версия, из-за отсутствия следующей за ней буквы.

Сказав это, кажется, что есть серьезная ошибка в Ubuntu (или как они упаковывают OpenSSL), которая openssl version -aпродолжает возвращать исходную версию 1.0.1 с 14 марта 2012 года, независимо от того, был ли OpenSSL обновлен до какого-либо из более новых версий. И, как с большинством вещей, когда идет дождь, он льет.

Ubuntu - не единственный крупный дистрибутив, в котором есть привычка пересылать обновления в OpenSSL (или другие пакеты), скорее, чем полагаться на обновления и нумерацию версий, которые все признают. В случае OpenSSL, где буквенные номера версий представляют только исправления ошибок и обновления безопасности, это кажется почти непонятным, но мне сообщили, что это может быть из -за проверенного FIPS плагина основных дистрибутивов Linux, поставляемого в комплекте с OpenSSL. Из-за требований, связанных с повторной проверкой, которые инициируются из-за любых изменений, даже изменений, которые закрывают дыры в безопасности, он заблокирован по версии.

Например, в Debian исправленная версия отображает номер версии 1.0.1e-2+deb7u5вместо исходной версии 1.0.1g.

В результате в настоящее время не существует надежного, портативного способа проверки версий SSL во всех дистрибутивах Linux , поскольку все они используют свои собственные патчи и обновления с резервным копированием с различными схемами нумерации версий. Вам нужно будет найти фиксированный номер версии для каждого отдельного дистрибутива Linux, который вы используете, и сравнить установленную версию OpenSSL с нумерацией версий этого дистрибутива, чтобы определить, работают ли на ваших серверах уязвимая версия или нет.

HopelessN00b
источник
3
Моя установка - это простая Ubuntu 12.04 LTS без каких-либо сборок, которые я сам компилировал или загружал из других источников, кроме репозиториев Ubuntu. Если Ubuntu распространяет OpenSSL с сокращенными номерами версий, то openssl version -aэто не переносимый метод (по крайней мере, не переносимый для Ubuntu). Я проверил, apt-cache policy opensslи он ответил: Installed: 1.0.1-4ubuntu5.12это 1.0.1g, выпущенный Ubuntu для 12.04 LTS. Я вышел из системы и вернулся, прежде чем проверять.
Мартейн
19
HopelessN00b, нет ничего сомнительного в политике бэкаптинга исправлений вместо повышения версий; это очень хороший способ обеспечения стабильности платформы, что очень желательно в серверной среде. Как и любое решение, оно имеет последствия, о которых необходимо знать пользователям; но только потому, что это нарушает линию рассуждений « Я использую foo xyz, поэтому я / не уязвим к последнему подвигу », это не делает его плохим.
MadHatter
10
@towo Номера версий существуют по причине. Если мы просто собираемся выбросить номера версий верхнего уровня из окна, потому что «корпоративные» или что-то еще, зачем вообще беспокоиться о номерах версий? Можно также просто начать называть все наши вещи с аллитерациями. Мы можем назвать уязвимые версии OpenSSL Holy Heartbleed, а исправленные - Cunning Coagulant .
HopelessN00b
7
@ HopelessN00b Я думаю, что вы попали в ловушку «это было исправлено в версии XYZ», они не следуют номерам версий, потому что все, что импортируется в последнюю версию, это исправления ошибок и безопасности. Если бы они изменили номер версии, вы также ожидаете дополнительную функциональность .. «У меня OpenSSL v XYZ, почему у меня нет ECDHA ???? ..etc». Это имеет смысл, когда вы понимаете, что это только исправления ошибок.
NickW
13
@NickW @Jubal @MadHatter, однако, с OpenSSL дело в том, что After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter releases (e.g. 1.0.1a) can only contain bug and security fixes and no new features.ничего не получится, если отказаться от вышестоящей схемы управления версиями; Бэкпортирование обновлений по существу аналогично использованию обновленной версии, поскольку обновление в любом случае включает только безопасность и исправление ошибок. То, что он делает, - это запутывает вещи и не дает нам возможности проверить версию OpenSSL в разных дистрибутивах Linux.
HopelessN00b
18

Если вы хотите что-то действительно кроссплатформенное, проверьте наличие самой уязвимости, а не полагайтесь на номера версий.

Возможно, у вас есть код, сообщающий номер версии, который, как известно, уязвим, но реальный код не уязвим . И наоборот - тихо уязвимый код - может быть еще хуже!

Многие поставщики, которые объединяют продукты с открытым исходным кодом, такие как OpenSSL и OpenSSH, будут выборочно модифицировать срочные исправления к более старой версии кода, чтобы поддерживать стабильность и предсказуемость API. Это особенно актуально для платформ "долгосрочного выпуска" и устройств.

Но поставщики, которые делают это молча (без добавления собственного строкового суффикса версии), рискуют вызвать ложные срабатывания в сканерах уязвимостей (и вводят пользователей в заблуждение). Таким образом, чтобы сделать это прозрачным и проверяемым, некоторые поставщики добавляют свои собственные строки к основной версии пакета. И Debian (OpenSSL), и FreeBSD (в OpenSSH через VersionAddendumдирективу sshd_config) иногда делают это.

Производители, которые этого не делают, вероятно, делают это, чтобы свести к минимуму вероятность поломки из-за множества прямых и косвенных способов, которыми другие программы проверяют номера версий.

Так это может выглядеть так:

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

$ openssl version
OpenSSL 1.0.1 14 Mar 2012

... хотя это было исправлено :

$ dpkg -l openssl | grep openssl
ii  openssl  1.0.1-4ubuntu5.12  [truncated]

$ ls -la `which openssl`
-rwxr-xr-x 1 root root 513208 Apr  7 12:37 /usr/bin/openssl

$ md5sum /usr/bin/openssl
ea2a858ab594905beb8088c7c2b84748  /usr/bin/openssl

С такими вещами в игре вам будет лучше, если вы не будете доверять номеру версии.

Ройс Уильямс
источник
Понятно, что проверка версий не так проста и прозрачна, как я надеялся. Проверка на наличие уязвимости является кросс-платформенной, но ее также сложнее сделать: у вас должен быть надежный PoC или удобный тест для конкретной уязвимой службы программного обеспечения, которую вы используете. В этом случае все началось с PoC для Apache и nginx. Что если в тот момент я использовал только SMTP с SSL и хотел проверить, уязвим ли я? В конце концов у нас будут тесты для большинства сервисов, но это может занять некоторое время.
Мартин
Мартейн, это справедливо. Когда тест недоступен, вторичные методы (такие как отслеживание контрольной суммы для затронутых двоичных файлов в ваших целевых системах) менее оптимальны, но могут быть достаточно хороши, чтобы выполнить работу ... и затем перейти к следующему пожару. :-)
Ройс Уильямс
14

К сожалению, я не уверен, что есть кроссплатформенный способ сделать это. Как я обсуждаю в блоге , версия OpenSSL отображается в Ubuntu 12.04 REMAINS 1.0.1 после обновления до фиксированной версии.

ТОЛЬКО для Ubuntu 12.04 вы можете узнать, были ли вы обновлены, если все из приведенного ниже верно:

  1. dpkg -s openssl | grep Version показывает версию 1.0.1-4ubuntu5.12 или более позднюю.
  2. dpkg -s libssl1.0.0 | grep Version показывает версию 1.0.1-4ubuntu5.12 или более позднюю.
  3. openssl version -a показывает дату постройки 7 апреля 2014 года или позже.

Спасибо @danny за дополнительную информацию.

Schof
источник
2
Хорошо, в этом случае я должен добавить, что версия пакета 1.0.1-4ubuntu5.12ТОЛЬКО для Ubuntu 12.04 LTS. Если вы используете Ubuntu 12.10, вы должны увидеть хотя бы версию, 1.0.1c-3ubuntu2.7а если вы используете 13.10, то она должна быть как минимум версией 1.0.1e-3ubuntu1.2, согласно источнику: ubuntu.com/usn/usn-2165-1
Martijn
1
Это, к сожалению, недостаточно. Вы также должны выполнитьlibssl1.0.0 явное обновление в Ubuntu. Если вы видите дату сборки до 7 апреля 2014 года, даже если версия openssl выглядит правильно ( 1.0.1-4ubuntu5.12для Ubuntu 12.04), вы, вероятно, все еще уязвимы.
Дэнни
@danny Вы только что спасли мне так много работы. Я пытался выяснить, почему дата сборки была правильной в некоторых системах 12.04 и неправильной в других. Вы спасатель!
Schof
openssl version -aможет не потребоваться дата сборки 7 апреля, поскольку исправление переносится в более старые выпуски.
Патрик Джеймс Макдугл
4

Дайте следующую попытку. Он извлечет все строки из крипто- библиотеки, с которой связан ssh. Он производит более одной строки вывода, но при необходимости может быть преобразован в 1 строку.

ldd `which ssh` | awk '/\// { print $3 }' | grep crypto | xargs strings  | grep OpenSSL

производит

OpenSSLDie
DSA_OpenSSL
...
MD4 part of OpenSSL 1.0.1f 6 Jan 2014 
MD5 part of OpenSSL 1.0.1f 6 Jan 2014
... 
etc

например, на Gentoo до появления

[ebuild     U  ] dev-libs/openssl-1.0.1f [1.0.1c] USE="bindist (sse2) tls-heartbeat%* zlib -gmp -kerberos -rfc3779 -static-libs {-test} -vanilla" 4,404 kB

приведенная выше команда приводит к

...
OpenSSL 1.0.1c 10 May 2012

после

...
OpenSSL 1.0.1f 6 Jan 2014

Ой, до сих пор нет g.

waTeim
источник
3
Я думал, что вы очень близки к тому, чтобы предложить хорошее решение, но, к сожалению, это не работает для крипто-библиотеки в Ubuntu 12.04 LTS. Он отображает все строки с версией [...] part of OpenSSL 1.0.1 14 Mar 2012, так же, как openssl version -aи. Это трюк, который может работать в других случаях, хотя!
Мартейн
@ Martijn Что ж, это прискорбно, но оно работает на Ubuntu 12.10. Странно, что он ошибочно идентифицирует себя 12.04. Есть ли несколько библиотек? Возможно ли, что ssh не использует самый современный?
WaTeim
Мне не удалось найти другие исполняемые файлы openssl или криптографические библиотеки. Другие предполагают, что разница в том, что 12.04 LTS Ubuntu переносит изменения в 1.0.1 без повышения версии. Хотя 12.10 не является LTS, поэтому Ubuntu использует последнюю версию вместо бэкпорта.
Мартейн
2

Проверяет ли какой-либо из этих сценариев все службы или только HTTPS ? AFAIK , PostgreSQL уязвим, но это только слух, пока не всплывет атака в дикой природе.

Существует сценарий metasploit, доступный для использования.

https://github.com/rapid7/metasploit-framework/commit/dd69a9e5dd321915e07d8e3dc8fe60d3c54f551a

Вы можете напечатать это (протестировано с GnuWin32 OpenSSL бинарная версия 1.0.1.6, от 2014-01-14), или просто использовать скрипт в комментарии ниже этого. Это точнее и проще!

s_client -connect a23-75-248-141.deploy.static.akamaitechnologies.com:443 -debug -state

После подключения введите B, и вы увидите на уязвимом хосте, и вы не будете отключены:

B

HEARTBEATING
write to 0x801c17160 [0x801cbc003] (66 bytes => 66 (0x42))
0000 - 18 03 03 00 3d 8f 6f 3c-52 11 83 20 9c a2 c0 49   ....=.o 5 (0x5))
0000 - 18 03 03 00 3d                                    ....=
read from 0x801c17160 [0x801cb7008] (61 bytes => 61 (0x3D))
0000 - 05 4d f5 c0 db 96 d1 f5-c7 07 e5 17 1f 3b 48 34   .M...........;H4
0010 - 6e 11 9d ba 10 0c 3a 34-eb 7b a5 7c c4 b6 c0 c0   n.....:4.{.|....
0020 - b0 75 0e fe b7 fa 9e 04-e9 4e 4a 7d 51 d3 11 1f   .u.......NJ}Q...
0030 - e2 23 16 77 cb a6 e1 8e-77 84 2b f8 7f            .#.w....w.+..
read R BLOCK

Вы получите ответ сердцебиения, похожий на этот.

На пропатченном хосте вы увидите ответ, аналогичный приведенному ниже, и вы будете отключены:

Введите B

HEARTBEATING
write to 0x801818160 [0x8019d5803] (101 bytes => 101 (0x65))
0000 - 18 03 03 00 60 9c a3 1e-fc 3b 3f 1f 0e 3a fe 4c   ....`....;?..:.L
0010 - a9 33 08 cc 3d 43 54 75-44 7d 2c 7b f3 47 b9 56   .3..=CTuD},{.G.V
0020 - 89 37 c1 43 1c 80 7b 87-66 ff cb 55 5f 8d 1a 95   .7.C..{.f..U_...
0030 - 1b 4c 65 14 21 a1 95 ac-7a 70 79 fc cc a0 cf 51   .Le.!...zpy....Q
0040 - 0f 7e c5 56 14 c8 37 c1-40 0b b8 cb 43 96 8a e6   .~.V..7.@...C...
0050 - 21 42 64 58 62 15 fb 51-82 e6 7f ef 21 1b 6f 87   !BdXb..Q....!.o.
0060 - b9 c2 04 c8 47                                    ....G

Источник:

Есть также эти инструменты:

Джастин голдберг
источник
0

Для Ubuntu вы можете использовать:

aptitude show libssl1.0.0 | grep Version

И сравните с http://www.ubuntu.com/usn/usn-2165-1/ . После перезагрузки (!!!) вы можете проверить с помощью http://possible.lv/tools/hb.

Руфин
источник
0

Я нашел этот скрипт в devcentral :

openssl s_client -connect example.com:443 -tlsextdebug 2>&1| grep 'server extension "heartbeat" (id=15)' || echo safe

Замените example.comна имя или IP-адрес сервера, который вы хотите проверить.

Вернется, "safe"если ваш сервер в порядке или "server extension "heartbeat" (id=15)"если нет.

Это зависит не от номера версии, а от перечисления расширения сервера, вызывающего проблему, поэтому оно должно быть защищено от shenanigans версии библиотеки.

Машина вы работаете openssl s_clientна должны быть с помощью OpenSSL 1.0.1 или более поздней версии для того , чтобы это работало.

egarcia
источник
4
Полезно, но не говорит вам, есть ли у вас версия с расширением и исправлением .
Матдм
1
Это действительно хороший способ проверить уязвимость и это то, что делают некоторые скрипты. Это фактически не требует доступа SSH.
Стефан Ласевский
8
БОЛЬШОЕ СТРАШНОЕ ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ - машина, на которой вы работаете,openssl s_clientДОЛЖНА использовать OpenSSL 1.0.1 или новее, чтобы это работало. Если вы запустите эту команду на машине с 0.9.8 или 1.0.0, она всегда сообщит «Безопасно», даже для уязвимых серверов .
voretaq7
Странный. Я использую версию OpenSSL, которая предположительно затронута этой ошибкой, но эта строка не появляется в выводе ...
Майкл
@StefanLasiewski Я обновил свой ответ и удалил часть «need ssh»
egarcia