Серцебиття: як надійно і портативно перевірити версію 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,1 g є вирішальною.

Запитання:

  • Який надійний спосіб перевірити версію, бажано перехресного дистрибутива?
  • Чому в першу чергу не відображається лист версії? Я не зміг перевірити це на чому-небудь іншому, крім 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вказується , -then- built on: Mon Apr 7 20:33:29 UTC 2014.


2
принаймні будьте впевнені, що у вас версія OpenSSL не є через дату, яку вона відображає
Пато Сайнц

3
Це працює на CentOS[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Яків

1
@ PatoSáinz Я перевірив, apt-cache policy opensslі він відповів: Installed: 1.0.1-4ubuntu5.12що це 1.0.1g щойно випущений Ubuntu за 12.04 LTS. Я вийшов із системи та знову ввійшов. Чи можна ще щось зробити, щоб перевірити?
Martijn

1
Я зазначу, що це не знаю, на випадок, якщо це корисно ... Ubuntu 12.04 LTS постачається з OpenSSL 1.0.1 (ваніль).
HopelessN00b

1
Якщо ця дата складання точна, ви не можете мати код "реліз версії" останнім часом, ніж 1.0.1e, оскільки 1.0.1f вийшов у 2014 році за примітками до випуску OpenSSL 1.0.1 . Можливо, окремі рядки або розділи були підкріплені вашою версією Ubuntu до офіційного випуску OpenSSL 1.0.1f. І дата складання може бути менш корисною.
Анти-слабкі паролі

Відповіді:


66

На підставі інформації, що відображається версії OpenSSL дати, ви, здається , будете бачити повну версію відображається там.

Відкритий SSL 1.0.1 вийшов 14 березня 2012 року . 1.0.1a було випущено 19 квітня 2012 року.

Отже, я збираюся йти вперед і стверджувати, що openssl version -aце правильний, крос-дистрибутивний спосіб відображення повної версії OpenSSL, встановленої в системі. Здається, він працює для всіх дистрибутивів Linux, до яких я маю доступ, і є методом, запропонованим у документації help.ubuntu.com OpenSSL . Ubuntu LTS 12.04 поставляється з ванільним OpenSSL v1.0.1, що є версією, яка схожа на скорочену версію, зважаючи на відсутність листа після неї.

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

Ubuntu - не єдиний головний дистриб'ютор у звичці підтримувати оновлення у OpenSSL (або інші пакети), ніж репертируватись на оновлення та нумерацію версій, які всі визнають. У випадку OpenSSL, де номери версій букви представляють лише виправлення помилок та оновлення безпеки, це здається майже незрозумілим, але мені було відомо, що це може бути через перевірений плагіном основний дистрибутив Linux, що постачається разом із OpenSSL. Через вимоги щодо повторної перевірки, які запускаються через будь-які зміни, навіть зміни, що підключають отвори в безпеці, він заблокований версією.

Наприклад, у Debian фіксована версія відображає номер версії 1.0.1e-2+deb7u5замість версії версії для потоку 1.0.1g.

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


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. Я вийшов із системи та повернувся до перевірки.
Martijn

19
HopelessN00b, немає нічого сумнівного в політиці резервного виправлення виправлень замість ударів версій; це дуже хороший спосіб забезпечення стабільності платформи, що дуже бажано в серверному середовищі. Як і будь-яке рішення, воно має наслідки, про які користувачі повинні усвідомлювати; але тільки тому, що це порушує " я бігаю foo xyz, тому я / не вразливий до останнього подвигу " лінії міркувань, це не робить це поганим.
MadHatter

10
Номери версій @towo існують не просто так. Якщо ми просто збираємо номери версій за версією потоку у вікно, тому що "підприємець" чи що завгодно, навіщо взагалі турбуватися з номерами версій? Може також просто почати називати всі наші речі алітераціями. Ми можемо назвати вразливі версії OpenSSL Holy Heartbleed та виправлені ті, які є хитрими коагулянтами .
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 в той момент, і я хотів перевірити, чи я вразливий? Врешті-решт у нас буде тести на більшість сервісів, але це може зайняти деякий час.
Martijn

Мартійн, це справедливо. Якщо тест недоступний, вторинні методи (як-от відстеження контрольної суми пошкоджених бінарних файлів у ваших цільових системах) є менш оптимальними, але можуть бути досить хорошими, щоб виконати роботу ... і потім перейти до наступної пожежі. :-)
Ройс Вільямс

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 за додаткову інформацію.


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явно на Убунту. Якщо ви бачите вбудовану дату до 7 квітня 2014 року, навіть якщо версія Opensl виглядає правильною ( 1.0.1-4ubuntu5.12для Ubuntu 12.04), ви, ймовірно, все ще вразливі.
danny

@danny Ти щойно врятував мене ТАКІ багато роботи. Я намагався з'ясувати, чому дата складання була правильною для деяких систем 12.04, а для інших - неправильно. Ти рятівник!
Шоф

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

Ой, все ще немає г.


3
Я думав, що ви дуже близькі до надання хорошого рішення, але, на жаль, це не працює для бібліотеки криптовалют на 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

Мені не вдалося знайти жодних інших бінарних файлів openssl чи криптовалют. Інші вважають, що різниця полягає в тому, що 12.04 LTS Ubuntu підтримує зміни до версії 1.0.1 без оновлення версії. У той час як 12.10 - це не LTS, тому Ubuntu використовує там останню версію замість резервного.
Мартійн

2

Чи перевіряє будь-який із цих сценаріїв усі сервіси чи вони лише тестують HTTPS ? AFAIK , PostgreSQL вразливий, але це лише слух, поки не з'являться дикі атаки.

Для використання доступний сценарій метасплату .

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

Ви можете набрати це (протестовано з бінарною версією 1.0.1.6 GnuWin32 OpenSSL, датованою 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

Я знайшов цей сценарій у девцентральному :

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 або пізнішої версії для того , щоб це працювало.


4
Корисно, але не говорить про те, чи є у вас версія з розширенням та виправленням .
mattdm

1
Це дійсно хороший спосіб перевірити вразливість і це те, що роблять деякі сценарії. Він фактично не вимагає доступу до SSH.
Стефан Ласєвський

8
ВЕЛИЧЕ ВАЖЛИВО ВАЖЛИВЕ ПОПЕРЕДЖЕННЯ - Машина, на якій ви працюєте,openssl s_clientОБОВ'ЯЗКОВО використовує OpenSSL 1.0.1 або пізнішої версії, щоб це працювало. Якщо ви запускаєте цю команду на машині з версією 0.9.8 або 1.0.0, ВЖЕ ЗВІТАЙТЕ ЗВІТ "Безпечно", навіть для вразливих серверів .
voretaq7

Незвичайно. Я запускаю версію OpenSSL, на яку, ймовірно, впливає ця помилка, але ця рядок не відображається у виході ...
Michael

@StefanLasiewski Я оновив свою відповідь і видалив частину "need ssh"
egarcia
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.