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


Я смотрел надежный и портативный способ проверить версию 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
Платформа: [...]

К моему неприятному удивлению, письмо версии не показано. Нет, нет, нет, просто «1.0.1», и все. Указанные даты также не помогают обнаружить (не) уязвимую версию.

Разница между 1.0.1 (a-f) и 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 на twitter) и yum info openssl-libs

Проверка наличия еще старой версии OpenSSL:

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


86
2018-04-07 23:51


Источник


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


Ответы:


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

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

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

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

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

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

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


67
2018-04-08 00:05



Моя установка - это простой 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. Я вышел из системы и вернулся, прежде чем проверять. - Martijn
HopelessN00b, нет ничего сомнительного в отношении политики исправлений backporting вместо нагнетательных версий; это очень хороший способ обеспечения стабильности платформы, что очень желательно в серверной среде. Как и любое решение, оно имеет последствия, о которых пользователи должны знать; но только потому, что он ломает "Я запускаю foo x.y.z, поэтому я / не уязвим к последнему эксплойту«линия рассуждений, которая не делает это плохо. - MadHatter
@towo Номера версий существуют по какой-то причине. Если мы просто запустим номера версии вверх по течению из окна, потому что «enterpriseisey» или что-то еще, зачем вообще беспокоиться о номерах версий? Май также просто начнет называть все наши вещи аллитерациями. Мы можем назвать уязвимые версии OpenSSL Святое сердцебиение и фиксированные Хитроумный коагулянт, - HopelessN00b
@ HopelessN00b Я думаю, что вы попадаете в ловушку «это было исправлено в версии X.Y.Z», они не следуют номерам версий, потому что все, что импортируется в последнюю версию, являются ошибками и исправлениями безопасности. Если они столкнулись с номером версии, вы также ожидаете дополнительной функциональности. «У меня OpenSSL v X.Y.Z, почему бы мне не получить ECDHA ???? ..etc». Это имеет смысл, когда вы понимаете, что это только исправления. - NickW
@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. Таким образом, ничего не происходит, если отказаться от схемы управления версиями восходящего потока; backporting обновлений по существу то же самое, что и использование обновленной версии, так как обновление в любом случае включает в себя исправления безопасности и исправления ошибок. То, что он делает, это путаные вещи и не дает нам возможности переносить версию OpenSSL через дистрибутивы Linux. - HopelessN00b


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

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

Многие поставщики, которые объединяют продукты с открытым исходным кодом, такие как 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

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


18
2018-04-08 20:52



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


К сожалению, я не уверен, что там является кросс-платформенный способ сделать это. Как я обсуждаю в блоге, версия 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 за дополнительную информацию.


14
2018-04-08 03:15



Хорошо, в этом случае я должен добавить эту версию пакета 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
К сожалению, этого недостаточно. Вы должен также обновление libssl1.0.0 прямо на ubuntu. Если вы видите построенную дату до 7 апреля 2014 года, даже если версия openssl выглядит корректно (1.0.1-4ubuntu5.12 для Ubuntu 12.04), вы, вероятно, все еще уязвимы. - danny
@danny Ты просто спас меня, так много работы. Я пытался выяснить, почему дата сборки была правильной в некоторых системах 12,04 и неправильно для других. Ты спасатель! - Schof
openssl version -a может не понадобиться дата сборки 7 апреля, потому что исправление будет передано в старые версии. - Patrick James McDougle


Попробуйте следующее. Он будет извлекать все строки из крипто- библиотеки, с которой связан 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

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


4
2018-04-08 14:45



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


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

Eсть 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

Источник:

Существуют также следующие инструменты:


2
2018-04-09 11:43





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

aptitude show libssl1.0.0 | grep Version

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


0
2018-04-08 11:14





Вам лучше перейти на последнюю версию OpenSSL OpenSSL 1.0.1j.

http://blog.vincosolution.com/2014/10/upgrade-openssl-1-0-1j-debianubuntu.html


0
2017-10-19 01:57





я нашел этот скрипт в 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 или новее, чтобы это работало.


0
2018-04-08 09:12



Полезно, но не говорит вам, есть ли у вас версия с расширением и исправление, - mattdm
Это действительно хороший способ проверить уязвимость и что делают некоторые скрипты. На самом деле он не требует доступа к SSH. - Stefan Lasiewski
ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ - Машина, на которой вы работаете openssl s_client на ДОЛЖНО использовать OpenSSL 1.0.1 или новее, чтобы это работало. Если вы запустите эту команду на машине с 0,9 или 1,0,0 ИТ БУДЕТ ВСЕГДА ОТЧЕТ «Безопасный», даже для уязвимых серверов, - voretaq7
Странный. Я запускаю версию OpenSSL, на которую, как предполагается, влияет эта ошибка, но эта строка не отображается в результатах ... - Michael
@StefanLasiewski Я обновил свой ответ и удалил часть «need ssh» - egarcia