Heartbleed: jak niezawodnie i przenośnie sprawdzić wersję OpenSSL?

88

Szukałem niezawodnego i przenośnego sposobu na sprawdzenie wersji OpenSSL na GNU / Linux i innych systemach, aby użytkownicy mogli łatwo dowiedzieć się, czy powinni zaktualizować swój SSL z powodu błędu Heartbleed.

Myślałem, że będzie to łatwe, ale szybko zetknąłem się z problemem Ubuntu 12.04 LTS z najnowszym OpenSSL 1.0.1g:

wersja openssl -a

Spodziewałem się zobaczyć pełną wersję, ale zamiast tego otrzymałem:

OpenSSL 1.0.1 14 marca 2012
zbudowany: Wt 4 czerwca 07:26:06 UTC 2013
Platforma: [...]

Ku mojemu niemiłemu zaskoczeniu list wersji nie pokazuje się. Nie ma f, nie ma, tylko „1.0.1” i to wszystko. Podane daty nie pomagają również w wykryciu wersji (nie) podatnej na ataki.

Różnica między 1.0.1 (af) a 1.0.1g jest kluczowa.

Pytania:

  • Jaki jest niezawodny sposób sprawdzenia wersji, najlepiej cross distro?
  • Dlaczego w pierwszej kolejności nie wyświetla się litera wersji? Nie byłem w stanie przetestować tego na niczym innym niż Ubuntu 12.04 LTS.

Inni też zgłaszają to zachowanie. Kilka przykładów:

Pojawiają się niektóre (specyficzne dla dystrybucji) sugestie:

  • Ubuntu i Debian: apt-cache policy openssli apt-cache policy libssl1.0.0. Porównaj numery wersji z pakietami tutaj: http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(dzięki @znmeb na Twitterze) iyum info openssl-libs

Sprawdzanie, czy starsza wersja OpenSSL jest nadal rezydentem:

Okazuje się, że aktualizacja pakietu OpenSSL na Ubuntu i Debianie nie zawsze wystarcza. Powinieneś także zaktualizować pakiet libssl1.0.0 i - następnie - sprawdź, czy to openssl version -awskazuje built on: Mon Apr 7 20:33:29 UTC 2014.

Martijn
źródło
2
przynajmniej upewnij się, że twoja wersja OpenSSL nie jest g z powodu daty, którą pokazuje
Pato Sáinz
3
Działa na CentOS[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Jacob
1
@ PatoSáinz Sprawdziłem apt-cache policy openssli odpowiedziałem: Installed: 1.0.1-4ubuntu5.12to jest wersja 1.0.1g właśnie wydana przez Ubuntu dla 12.04 LTS. Wylogowałem się i wróciłem. Czy mogę coś jeszcze zrobić, aby to zweryfikować?
Martijn
1
Zwrócę uwagę na to, że nie wiem, na wypadek, gdyby było to pomocne ... Ubuntu 12.04 LTS dostarczane z OpenSSL 1.0.1 (waniliowy).
HopelessN00b
1
Jeśli data kompilacji jest prawidłowa, nie można mieć kodu „wersji z wersją” nowszą niż 1.0.1e, ponieważ wersja 1.0.1f pojawiła się w 2014 r. Zgodnie z uwagami do wydania OpenSSL 1.0.1 . Oczywiście poszczególne linie lub sekcje mogły zostać przeniesione do wersji Ubuntu przed oficjalną wersją OpenSSL 1.0.1f. Data kompilacji może być mniej pomocna.
Anty-słabe hasła

Odpowiedzi:

66

Na podstawie daty wyświetlanej przez twoją wersją OpenSSL, wydaje Ci się zobaczyć pełną wersję wyświetlany tam.

Open SSL 1.0.1 został wydany 14 marca 2012 r . Wersja 1.0.1a została wydana 19 kwietnia 2012 r.

Zamierzam więc stwierdzić, że openssl version -ajest to właściwy sposób na wyświetlenie pełnej wersji OpenSSL zainstalowanej w systemie. Wygląda na to, że działa dla wszystkich dystrybucji systemu Linux, do których mam dostęp, i jest to metoda sugerowana również w dokumentacji OpenSSL help.ubuntu.com . Ubuntu LTS 12.04 dostarczany jest z waniliową OpenSSL v1.0.1, która jest wersją, która wygląda jak wersja skrócona, ponieważ nie ma za nią litery.

Mimo to wydaje się, że w Ubuntu występuje poważny błąd (lub sposób, w jaki pakują OpenSSL), który openssl version -anadal zwraca oryginalną wersję 1.0.1 od 14 marca 2012 r., Niezależnie od tego, czy OpenSSL został uaktualniony do dowolnej wersji nowszych wersji. I jak w przypadku większości rzeczy, gdy pada deszcz, leje.

Ubuntu nie jest jedyną poważną dystrybucją przyzwyczajoną do backportowania aktualizacji do OpenSSL (lub innych pakietów), a nie polegania na aktualizacjach i numeracji wersji, które wszyscy rozpoznają. W przypadku OpenSSL, gdzie literowe numery wersji reprezentują tylko poprawki błędów i aktualizacje bezpieczeństwa, wydaje się to prawie niezrozumiałe, ale zostałem poinformowany, że może to być spowodowane sprawdzonymi przez FIPS głównymi dystrybucjami Linuksa dostarczanymi z OpenSSL. Ze względu na wymagania dotyczące ponownej walidacji, które są wyzwalane z powodu jakiejkolwiek zmiany, nawet zmiany, które blokują luki bezpieczeństwa, jest ona zablokowana w wersji.

Na przykład w Debianie wersja stała wyświetla numer wersji 1.0.1e-2+deb7u5zamiast wersji upstream 1.0.1g.

W rezultacie w tej chwili nie ma niezawodnego, przenośnego sposobu sprawdzania wersji SSL we wszystkich dystrybucjach Linuksa , ponieważ wszystkie używają własnych poprawek i aktualizacji z różnymi schematami wersji. Będziesz musiał sprawdzić stały numer wersji dla każdej innej dystrybucji Linuksa, którą uruchamiasz, i porównać zainstalowaną wersję OpenSSL z konkretną numeracją wersji tej dystrybucji, aby ustalić, czy na twoich serwerach działa wersja podatna na atak.

Beznadziejny
źródło
3
Moja instalacja to prosty Ubuntu 12.04 LTS bez niczego, co sam skompilowałem lub pobrałem z innych źródeł niż repozytoria Ubuntu. Jeśli Ubuntu dystrybuuje OpenSSL ze skróconymi numerami wersji, openssl version -ato nie jest przenośną metodą (przynajmniej nie przenośną na Ubuntu). Sprawdziłem apt-cache policy openssli odpowiedziałem: Installed: 1.0.1-4ubuntu5.12który jest wersją 1.0.1g właśnie wydaną przez Ubuntu dla 12.04 LTS. Wylogowałem się i wróciłem przed sprawdzeniem.
Martijn,
19
Beznadziejna wersja 00b, nie ma nic wątpliwego w polityce poprawek dotyczących backportowania zamiast wersji zderzeniowych; jest to bardzo dobry sposób na zapewnienie stabilności platformy, co jest wysoce pożądane w środowisku serwerowym. Jak każda decyzja ma konsekwencje, o których użytkownicy powinni wiedzieć; ale tylko dlatego, że łamie on argumentację „ Uruchamiam foo xyz, dlatego jestem / nie jestem podatny na najnowszy exploit ”, co nie czyni tego złym.
MadHatter
10
@towo Numery wersji istnieją z jakiegoś powodu. Jeśli po prostu wyrzucimy numery wersji nadrzędnej przez okno, ponieważ „przedsiębiorczy”, czy cokolwiek innego, po co w ogóle zawracać sobie głowę numerami wersji? Również może po prostu zacząć nazywać wszystkie nasze rzeczy aliteracjami. Słabe wersje OpenSSL możemy nazwać Holy Heartbleed, a te naprawione Cunning Coagulant .
HopelessN00b
7
@ HopelessN00b Myślę, że łapiesz się na pułapkę „zostało to naprawione w wersji XYZ”, nie podążają za numerami wersji, ponieważ wszystko, co jest importowane do najnowszej wersji, to poprawki błędów i zabezpieczeń. Jeśli podbili numer wersji, można oczekiwać także dodatkowej funkcjonalności. „Mam OpenSSL v XYZ, dlaczego nie mam ECDHA ???? ..etc”. Ma to sens, gdy zrozumiesz, że to tylko poprawki błędów.
NickW
13
@NickW @Jubal @MadHatter jednak w OpenSSL chodzi o to, że: 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.Więc nic nie zyskuje porzucenie schematu wersjonowania; backportowanie aktualizacji jest zasadniczo takie samo jak korzystanie ze zaktualizowanej wersji, ponieważ aktualizacja i tak zawiera tylko poprawki bezpieczeństwa i poprawki. To robi zamieszanie i nie pozwala nam na przenośne sprawdzenie wersji OpenSSL w różnych dystrybucjach Linuksa.
HopelessN00b
18

Jeśli chcesz czegoś naprawdę wieloplatformowego, sprawdź samą lukę, zamiast polegać na numerach wersji.

Być może istnieje kod zgłaszający numer wersji, o której wiadomo, że jest podatny na atak, ale rzeczywisty kod nie jest podatny na atak . A odwrotność - cichy słaby kod - może być jeszcze gorsza!

Wielu dostawców, którzy łączą produkty typu open source, takie jak OpenSSL i OpenSSH, wybiórczo modernizuje pilne poprawki do starszej wersji kodu, aby zachować stabilność i przewidywalność API. Jest to szczególnie prawdziwe w przypadku „wersji długoterminowej” i platform urządzeń.

Ale dostawcy, którzy robią to po cichu (bez dodawania własnego przyrostka łańcucha wersji), ryzykują wywołanie fałszywych alarmów w skanerach podatności (i dezorientację użytkowników). Aby uczynić to przejrzystym i weryfikowalnym, niektórzy dostawcy dołączają własne ciągi znaków do głównej wersji pakietu. Zarówno Debian (OpenSSL), jak i FreeBSD (w OpenSSH, poprzez VersionAddendumdyrektywę sshd_config) czasami to robią.

Dostawcy, którzy tego nie robią, prawdopodobnie robią to, aby zminimalizować ryzyko uszkodzenia ze względu na wiele bezpośrednich i pośrednich sposobów sprawdzania numerów wersji przez inne programy.

Może więc wyglądać następująco:

$ 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

... mimo że został załatany :

$ 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

Dzięki takim rzeczom w grze lepiej, jeśli nie ufasz numerowi wersji.

Royce Williams
źródło
Oczywiste jest, że sprawdzanie wersji nie jest tak łatwe i przejrzyste, jak miałem nadzieję. Sprawdzanie podatności na zagrożenia jest wieloplatformowe, ale trudniejsze: musisz mieć niezawodny PoC lub przetestować pod kątem konkretnej usługi oprogramowania, której dotyczy luka. W tym przypadku wszystko zaczęło się od PoC dla Apache i nginx. Co jeśli w tym momencie korzystałem tylko z SMTP z SSL i chciałem sprawdzić, czy jestem podatny na atak? W końcu przeprowadzimy testy większości usług, ale może to chwilę potrwać.
Martijn
Martijn, to słuszna kwestia. Gdy test nie jest dostępny, metody wtórne (takie jak śledzenie sumy kontrolnej dotkniętych plików binarnych w systemach docelowych) są mniej optymalne, ale mogą być wystarczające, aby wykonać zadanie ... a następnie przejść do następnego pożaru. :-)
Royce Williams,
14

Niestety nie jestem pewien, czy można to zrobić na wiele platform. Jak dyskutuję na blogu , wersja OpenSSL wyświetlana na Ubuntu 12.04 REMAINS 1.0.1 po aktualizacji do wersji stałej.

TYLKO w przypadku Ubuntu 12.04 możesz stwierdzić, czy zostałeś zaktualizowany, czy spełnione są wszystkie poniższe warunki:

  1. dpkg -s openssl | grep Version pokazuje wersję 1.0.1-4ubuntu5.12 lub nowszą.
  2. dpkg -s libssl1.0.0 | grep Version pokazuje wersję 1.0.1-4ubuntu5.12 lub nowszą.
  3. openssl version -a pokazuje datę „wbudowania” z 7 kwietnia 2014 r. lub później.

Dzięki @danny za dodatkowe informacje.

Schof
źródło
2
Ok, w takim przypadku muszę dodać, że wersja pakietu 1.0.1-4ubuntu5.12jest TYLKO dla Ubuntu 12.04 LTS. Jeśli korzystasz z systemu Ubuntu 12.10, powinieneś zobaczyć przynajmniej wersję, 1.0.1c-3ubuntu2.7a jeśli masz wersję 13.10, powinna to być co najmniej wersja 1.0.1e-3ubuntu1.2, zgodnie ze źródłem: ubuntu.com/usn/usn-2165-1
Martijn
1
To jest niestety niewystarczające. Państwo musi również uaktualnić libssl1.0.0wyraźnie na ubuntu. Jeśli widzisz wersję wbudowaną przed 7 kwietnia 2014 r., Nawet jeśli openssl ma wersję wyglądającą poprawnie ( 1.0.1-4ubuntu5.12dla Ubuntu 12.04), prawdopodobnie nadal jesteś podatny na ataki.
danny
@ Danny Właśnie zapisałeś mi tak dużo pracy. Próbowałem dowiedzieć się, dlaczego data kompilacji była poprawna w niektórych systemach 12.04, a błędna w innych. Jesteś ratownikiem!
Schof
openssl version -amoże nie potrzebować daty kompilacji z 7 kwietnia, ponieważ poprawka jest importowana do starszych wersji.
Patrick James McDougle,
4

Spróbuj następujących. Wyodrębni wszystkie ciągi z biblioteki kryptograficznej, z którą łączy się ssh. Daje więcej niż jeden wiersz wyniku, ale w razie potrzeby można go przekonwertować na 1 wiersz.

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

produkuje

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

np. na Gentoo przed pojawieniem się

[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

powyższe polecenie powoduje

...
OpenSSL 1.0.1c 10 May 2012

po

...
OpenSSL 1.0.1f 6 Jan 2014

Ojej, nadal nie ma.

waTeim
źródło
3
Myślałem, że jesteś bardzo bliski dostarczenia dobrego rozwiązania, ale niestety nie działa to w przypadku biblioteki kryptograficznej na Ubuntu 12.04 LTS. Wyświetla wszystkie ciągi z wersją [...] part of OpenSSL 1.0.1 14 Mar 2012, w taki sam sposób jak openssl version -arobi. Jest to sztuczka, która może działać w innych przypadkach!
Martijn
@Martijn Cóż, to niefortunne, ale działa na Ubuntu 12.10. Dziwne, że źle się identyfikuje 12.04. Czy istnieje wiele bibliotek? Czy to możliwe, że ssh nie używa najnowszej wersji?
waTeim
Nie mogłem znaleźć żadnych innych plików binarnych openssl ani bibliotek kryptograficznych. Inni sugerują, że różnica polega na tym, że w 12.04 LTS Ubuntu dokonuje backportu zmian do wersji 1.0.1 bez aktualizacji wersji. Chociaż 12.10 nie jest LTS, więc Ubuntu używa tam najnowszej wersji zamiast backportu.
Martijn
2

Czy któryś z tych skryptów testuje wszystkie usługi, czy tylko testuje HTTPS ? AFAIK , PostgreSQL jest wrażliwy, ale to tylko plotka, dopóki nie pojawi się atak w terenie.

Dostępny jest skrypt metasploit .

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

Możesz wpisać to (testowane z GnuWin32 OpenSSL wersja binarna 1.0.1.6, z dnia 14.01.2014) lub po prostu użyć skryptu w komentarzu poniżej tego. Jest dokładniejszy i prostszy!

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

Po podłączeniu wpisz B, a zobaczysz na podatnym hoście i nie zostaniesz rozłączony:

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

Otrzymasz odpowiedź pulsu, która wygląda podobnie do tej.

Na załatanym hoście zobaczysz odpowiedź podobną do poniższej i zostaniesz rozłączony:

Wpisz 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   [email protected]...
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

Źródło:

Istnieją również następujące narzędzia:

Justin Goldberg
źródło
0

W systemie Ubuntu możesz użyć:

aptitude show libssl1.0.0 | grep Version

I porównaj z http://www.ubuntu.com/usn/usn-2165-1/ . Po ponownym uruchomieniu (!!!) możesz sprawdzić za pomocą http://possible.lv/tools/hb.

Rufinus
źródło
0

Znalazłem ten skrypt w devcentral :

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

Zamień example.comna nazwę lub adres IP serwera, który chcesz sprawdzić.

Zwróci, "safe"jeśli Twój serwer jest w porządku lub "server extension "heartbeat" (id=15)"jeśli nie.

Nie zależy to od numeru wersji, ale od umieszczenia na liście rozszerzenia serwera, które powoduje problem, więc powinno być odporne na shenanigany wersji biblioteki.

Maszyna jest uruchomiony openssl s_clientna musi być przy użyciu OpenSSL 1.0.1 lub nowszy, aby to zadziałało.

egarcia
źródło
4
Przydatne, ale nie mówi ci, czy masz wersję z rozszerzeniem i poprawką .
mattdm
1
Jest to rzeczywiście dobry sposób na sprawdzenie podatności i to właśnie robią niektóre skrypty. W rzeczywistości nie wymaga dostępu SSH.
Stefan Lasiewski
8
WIELKI SCARY WAŻNE OSTRZEŻENIE - Maszyna, na której pracujesz,openssl s_clientMUSI używać OpenSSL 1.0.1 lub nowszej, aby to działało. Jeśli uruchomisz to polecenie na komputerze z wersją 0.9.8 lub 1.0.0, ZAWSZE ZGŁASZA „Bezpieczne”, nawet dla serwerów wrażliwych .
voretaq7
Dziwny. Korzystam z wersji OpenSSL, na którą ten błąd prawdopodobnie ma wpływ, ale ten ciąg nie pojawia się na wyjściu ...
Michael
@StefanLasiewski Zaktualizowałem moją odpowiedź i usunąłem część „potrzebuję ssh”
egarcia,