Heartbleed: OpenSSL versiyonunu nasıl güvenilir ve kolay bir şekilde kontrol edebilirsiniz?


88

GNU / Linux ve diğer sistemlerde OpenSSL sürümünü kontrol etmenin güvenilir ve taşınabilir bir yolunu araştırıyordum. Böylece kullanıcılar, Heartbleed hatalarından dolayı SSL’lerini yükseltmeleri gerekip gerekmediğini kolayca bulabiliyorlardı.

Kolay olacağını düşündüm, ancak en son OpenSSL 1.0.1g ile Ubuntu 12.04 LTS'de bir sorunla karşılaştım:

openssl versiyonu -a

Tam sürümünü görmeyi bekliyordum ama bunun yerine şunu aldım:

OpenSSL 1.0.1 14 Mar 2012
yerleşik: Tue Haz 4 07:26:06 UTC 2013
platform: [...]

Hoş olmayan bir sürpriz için, sürüm mektubu görünmüyor. Hayır f, hayır g yok, sadece "1.0.1" ve hepsi bu. Listelenen tarihler de (savunmasız) hassas bir sürümü keşfetmeye yardımcı olmaz.

1.0.1 (af) ve 1.0.1g arasındaki fark çok önemlidir.

Sorular:

  • Versiyonu kontrol etmek için güvenilir bir yol nedir, tercihen çapraz dağıtımı?
  • Neden sürüm mektubu ilk sırada gösterilmiyor? Bunu Ubuntu 12.04 LTS'den başka bir şey üzerinde test edemedim.

Diğerleri de bu davranışı rapor ediyor. Birkaç örnek:

Yayınlanan bazı dağıtım önerileri:

  • Ubuntu ve Debian: apt-cache policy opensslve apt-cache policy libssl1.0.0. Sürüm numaralarını buradaki paketlerle karşılaştırın: http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(Twitter'da @znmeb'e teşekkürler) veyum info openssl-libs

OpenSSL’nin daha eski bir sürümünün hala yerleşik olup olmadığını kontrol etme:

OpenSSL paketini Ubuntu ve Debian'da güncellemenin her zaman yeterli olmadığı ortaya çıktı. Ayrıca libssl1.0.0 paketini güncellemeli ve -den sonra- gösterip openssl version -agöstermediğini kontrol etmelisiniz built on: Mon Apr 7 20:33:29 UTC 2014.


2
en azından sahip olduğunuz OpenSSL sürümünün , gösterdiği tarih nedeniyle g olmadığından emin olun
Pato Sáinz

3
Bu CentOS üzerinde çalışır[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Jacob

1
@ PatoSáinz Kontrol ettik apt-cache policy opensslve cevap Installed: 1.0.1-4ubuntu5.12verdim: Ubuntu tarafından 12.04 LTS için piyasaya sürülen 1.0.1g. Çıkış yaptım ve tekrar giriş yaptım. Doğrulamak için yapabileceğim başka bir şey var mı?
Martijn

1
İşe yaramadı, bilmediğim için, yararlı olması durumunda ... Ubuntu 12.04 LTS, OpenSSL 1.0.1 (vanilya) ile birlikte gönderilir.
UmutsuzN00b

1
Bu oluşturma tarihi doğruysa, OpenSSL 1.0.1 sürüm notlarına göre 2014 yılında 1.0.1f çıktığından, 1.0.1e sürümünden daha yeni "sürüm sürüm" kodunu kullanamazsınız . Elbette, resmi OpenSSL 1.0.1f sürümünden önce Ubuntu sürümünüz için ayrı ayrı satırlar veya bölümler desteklenmiş olabilir. Ve inşa tarihi tamamen yardımcı olmaktan daha az olabilir.
Anti-zayıf şifreler,

Yanıtlar:


66

OpenSSL sürümü tarafından görüntülenen tarih dayanarak, sen görünüyor edilir burada görüntülenen tam sürümünü görmeye.

Açık SSL 1.0.1, 14 Mart 2012 tarihinde yayınlandı . 1.0.1a, 19 Nisan 2012 tarihinde serbest bırakılmıştır.

Bu yüzden, devam edeceğim openssl version -ave sistemde kurulu olan OpenSSL'nin tam sürümünü göstermenin uygun, çapraz dağıtım yolu olduğunu iddia edeceğim . Erişebildiğim tüm Linux dağıtımları için çalışıyor gibi görünüyor ve help.ubuntu.com OpenSSL belgelerinde de önerilen yöntem . Ubuntu LTS 12.04, kısaltılmış bir versiyona benzeyen versiyon olan vanilya OpenSSL v1.0.1 ile birlikte gönderilir.

Bunu söyledikten sonra , Ubuntu'da (veya OpenSSL'i nasıl paketlediklerinde) büyük bir hata olduğu anlaşılıyor; openssl version -aOpenSSL’nin herhangi bir sürümüne yükseltilip yükseltilmediğine bakılmaksızın 14.01.2012 tarihinden itibaren orijinal 1.0.1 sürümünü döndürmeye devam ediyor daha yeni sürümlerin. Ve yağmur yağdığında çoğu şeyde olduğu gibi yağmur yağıyor.

Ubuntu, güncellemeleri OpenSSL'de (veya diğer paketlerde) destekleme alışkanlığındaki tek önemli dağıtım değil, yukarı akış güncellemelerine ve herkesin tanıdığı sürüm numaralarına dayanmaktan ziyade puanlayıcıdır. Mektup sürüm numaralarının yalnızca hata düzeltme ve güvenlik güncellemelerini temsil ettiği OpenSSL durumunda, bu neredeyse anlaşılmaz görünüyor, ancak bunun OpenSSL ile birlikte gelen FIPS onaylı eklenti ana Linux dağıtımları nedeniyle olabileceği konusunda bilgilendirildim . Herhangi bir değişiklik nedeniyle tetikleyen yeniden doğrulama ile ilgili gereklilikler nedeniyle, güvenlik deliklerini bile tıkayan değişiklikler olsa bile, sürüm kilitlidir.

Örneğin, Debian'da, sabit sürüm 1.0.1e-2+deb7u5, akış yukarı sürümü yerine sürüm numarasını görüntüler 1.0.1g.

Sonuç olarak, şu anda, Linux dağıtımlarında SSL sürümlerini kontrol etmenin güvenilir, taşınabilir bir yolu yoktur , çünkü hepsi kendi desteklenen yamaları ve farklı sürüm numaralandırma şemalarıyla güncellemeleri kullanırlar. Çalıştırdığınız her Linux dağıtımı için sabit sürüm numarasını aramanız ve sunucularınızın savunmasız bir sürüm çalıştırıp çalıştırmadığını belirlemek için kurulu OpenSSL sürümünü bu dağıtımın belirli sürüm numaralarına göre kontrol etmeniz gerekir.


3
Yüklemem, kendimi derlediğim veya Ubuntu depoları dışındaki kaynaklardan indirdiğim hiçbir şey olmadan basit bir Ubuntu 12.04 LTS. Ubuntu, OpenSSL'yi kısaltılmış sürüm numaraları ile dağıtıyorsa, openssl version -ataşınabilir bir yöntem değildir (en azından Ubuntu'ya taşınabilir değildir). Ben kontrol ettim apt-cache policy opensslve cevap verdi: Installed: 1.0.1-4ubuntu5.1212.04 LTS için Ubuntu tarafından henüz piyasaya sürülen 1.0.1g. Kontrol etmeden önce oturumu kapattım ve tekrar giriş yaptım.
Martijn

19
UmutsuzN00b, çarpma versiyonları yerine destekleme politikaları konusunda şüpheli bir şey yok; Bir sunucu ortamında çok istenen bir platform istikrarı sağlamak için çok iyi bir yoldur. Herhangi bir karar gibi, kullanıcıların bilmesi gereken sonuçları vardır; ancak “kırıldığım için foo xyz kullanıyorum, bu yüzden son sömürüye karşı savunmasızım ” akıl yürütme çizgisini, bu kötü bir şey yapmaz.
MadHatter

10
@towo Sürüm numaraları bir nedenle var. Eğer sadece upstream versiyonunu pencereden çıkaracaksak, "enterprisey" ya da her neyse, neden sürüm numaralarıyla uğraşalım ki? Sadece tüm eşyalarımızı isimlendirmelerle adlandırmaya başlayabilir. Korunmasız OpenSSL versiyonları Holy Heartbleed ve sabit olanları Kurnaz Pıhtılaştırıcı olarak adlandırabiliriz .
UmutsuzN00b

7
@ HopelessN00b "Bu, XYZ sürümünde düzeltildi" tuzağına yakalandığınızı düşünüyorum, sürüm numaralarını izlemiyorlar çünkü en son sürüme aktarılan her şey hata ve güvenlik düzeltmeleri. Sürüm numarasını çarptırırlarsa, ek işlevselliği de beklersiniz .. "OpenSSL v XYZ'im var, neden ECDHA'ya sahip değilim ???? ..etc". Bunun sadece hata düzeltmeleri olduğunu anladığınızda anlamlıdır.
NickW

13
@NickW @Jubal @MadHatSSL ile olan şeyi, ancak şu şekilde yapar: 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.Öyleyse, yukarı akış versiyonlama planını terk eden hiçbir şey kazanılmaz; güncellemeleri geri almak temelde güncellenmiş sürümü kullanmakla aynıdır, çünkü güncelleme yine de sadece güvenlik ve hata düzeltmeleri içermektedir. Yaptığı şey, işleri şaşırtmak ve Linux dağıtımlarında OpenSSL sürümünü rahatça kontrol etmemize izin vermemektir.
UmutsuzN00b

18

Gerçekten platformlar arası bir şey istiyorsanız , sürüm numaralarına güvenmek yerine bu güvenlik açığını kontrol edin.

Güvenlik açığı olduğu bilinen bir sürüm numarası bildiren bir kodunuz olabilir, ancak gerçek kod güvenlik açığı değildir . Ve tersine - sessizce savunmasız kod - daha da kötü olabilirdi!

OpenSSL ve OpenSSH gibi açık kaynaklı ürünleri bir araya getiren pek çok satıcı, API kararlılığını ve öngörülebilirliğini korumak için acil düzeltmeleri daha eski bir kod sürümüne uyarlayacaktır. Bu, özellikle "uzun süreli sürüm" ve cihaz platformları için geçerlidir.

Ancak bunu sessizce yapan (kendi sürüm dizgelerinin son eklerini eklemeden) satıcılar, güvenlik açığı tarayıcılarında (ve kafa karıştırıcı kullanıcıları) yanlış pozitifleri tetikleme riskini taşır. Bu sayede şeffaf ve doğrulanabilir kılmak için, bazı satıcılar ana dizini kendi versiyonlarına eklerler. Hem Debian (OpenSSL) hem de FreeBSD (OpenSSH'de, VersionAddendumsshd_config yönergesi ile) bazen bunu yapar.

Bunu yapmayan satıcılar muhtemelen, diğer programların sürüm numaralarını kontrol ettiği doğrudan ve dolaylı yollardan dolayı kırılma riskini en aza indirmek için yapıyorlar.

Böylece şöyle görünebilir:

$ 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

... yamalı olmasına rağmen :

$ 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

Oyunda böyle şeyler varken, sürüm numarasına güvenmiyorsanız daha iyi olursunuz .


Sürümleri kontrol etmenin umduğum kadar kolay ve şeffaf olmadığı açık. Güvenlik açığının kontrol edilmesi çapraz platformdur, ancak yapılması daha zordur: Çalıştığınız güvenlik açığı bulunan belirli yazılım hizmetleri için güvenilir bir PoC'niz veya test cihazınız olmalıdır. Bu durumda hepsi Apache ve nginx için PoC ile başladı. Ya şu anda yalnızca SMTP ile SSL kullanıyordum ve savunmasız olup olmadığımı kontrol etmek istersem? Sonunda çoğu hizmet için testler yapacağız, ancak biraz zaman alabilir.
Martijn

Martijn, bu adil bir nokta. Bir test bulunmadığında, ikincil yöntemler (hedef sistemlerinizdeki etkilenen ikili dosyalar için sağlama toplamının izlenmesi gibi) daha az optimaldir, ancak işin yapılması için yeterince iyi olabilir ... ve sonra bir sonraki ateşe geçilir. :-)
Royce Williams

14

Ne yazık ki, orada emin değilim olup bunu yapmanın bir çapraz platform yolu. Bir blog yazısında tartışırken , OpenSSL sürümü sabit bir sürüme yükselttikten sonra Ubuntu 12.04 REMAINS 1.0.1'de görüntülendi.

SADECE Ubuntu 12.04 için, aşağıdakilerin tümü doğruysa, güncellendiğinizi söyleyebilirsiniz:

  1. dpkg -s openssl | grep Version sürüm 1.0.1-4ubuntu5.12 veya üstünü gösterir.
  2. dpkg -s libssl1.0.0 | grep Version sürüm 1.0.1-4ubuntu5.12 veya üstünü gösterir.
  3. openssl version -a 7 Nisan 2014 veya sonrasında "yerleşik" bir tarih gösterir.

Ek bilgi için @ danny teşekkürler.


2
Tamam, bu durumda eklemeliyim ki 1.0.1-4ubuntu5.12SADECE Ubuntu 12.04 LTS. Eğer Ubuntu 12.10'daysanız1.0.1c-3ubuntu2.7 en azından versiyonunu görmelisiniz ve 13.10'daysanız1.0.1e-3ubuntu1.2 , kaynağa göre en azından versiyon olmalıdır : ubuntu.com/usn/usn-2165-1
Martijn

1
Bu maalesef yetersiz. Sen gerekir sürüme libssl1.0.0ubuntu üzerinde açıkça. 7 Nisan 2014 tarihinden önce bir tarih görüyorsanız, openssl sürümü doğru görünse bile ( 1.0.1-4ubuntu5.12Ubuntu 12.04 için) muhtemelen savunmasızsınız.
danny,

@ danny Beni çok iş kurtardın. Yapım tarihinin neden bazı 12.04 sistemlerinde doğru, diğerlerinde ise yanlış olduğunu anlamaya çalışıyordum. Sen bir hayat kurtarıcısın!
Schof

openssl version -aDüzeltme eski sürümlerde desteklendiğinden, 7 Nisan tarihine ihtiyaç duymayabilir.
Patrick James McDougle,

4

Aşağıdakileri deneyin. Tüm dizeleri ssh'nin bağlı olduğu kripto kütüphanesinden çıkaracak . Birden fazla çıktı satırı üretir, ancak gerekirse 1 satıra dönüştürülebilir.

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

üretir

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

örneğin ortaya çıkmadan önce Gentoo’da

[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

yukarıdaki komut sonuçlanır

...
OpenSSL 1.0.1c 10 May 2012

sonra

...
OpenSSL 1.0.1f 6 Jan 2014

Ah, hala yok g.


3
İyi bir çözüm sunmaya çok yakın olduğunuzu düşündüm, fakat ne yazık ki bu, Ubuntu 12.04 LTS'deki kripto kütüphanesi için işe yaramaz. Tüm dizeleri, sürümleriyle [...] part of OpenSSL 1.0.1 14 Mar 2012aynı şekilde görüntüler openssl version -a. Bu, başka durumlarda da işe yarayabilecek bir numara!
Martijn

@Martijn Bu talihsiz bir durum, ancak ubuntu 12.10'da çalışıyor. 12.04'te kendini yanlış tanımlaması garip. Birden fazla lib var mı? Ssh en güncelleri kullanmaz mı?
waTeim

Başka bir openssl ikili dosyası veya kripto kütüphanesi bulamadım. Aradaki farkın, 12.04 LTS'de Ubuntu’nun, sürümü yükseltmeden, 1.0.1’e yaptığı değişiklikleri desteklediğini belirtiyor. 12.10 LTS olmasa da Ubuntu backport yerine en son sürümü kullanıyor.
Martijn

2

Bu komut dosyalarından herhangi biri tüm hizmetleri test ediyor mu, yoksa yalnızca HTTPS'yi mi test ediyor ? AFAIK , PostgreSQL açıktır, ancak bu vahşi doğada bir saldırı yüzeye çıkana kadar sadece bir söylentidir.

Kullanılabilir bir metasploit betiği var.

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

Bunu yazabilirsiniz ( 2014-01-14 tarihli GnuWin32 OpenSSL ikili sürüm 1.0.1.6 ile test edilmiştir ) veya sadece aşağıdaki yorumdaki komut dosyasını kullanabilirsiniz. Daha doğru ve basit!

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

B tipi bağlandıktan sonra savunmasız bir ana bilgisayarda göreceksiniz ve bağlantınız kopmayacak:

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

Buna benzeyen bir kalp atışı yanıtı alacaksınız.

Yamalı bir ana bilgisayarda, aşağıdakine benzer bir yanıt göreceksiniz ve bağlantınız kesilecek:

B girin

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

Kaynak:

Bu araçlar da var:




0

Bulduğum devcentral Bu komut dosyasını :

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

example.comKontrol etmek istediğiniz sunucunun adı veya IP adresi ile değiştirin .

"safe"Sunucunuz iyi ise ya da "server extension "heartbeat" (id=15)"değilse geri dönecektir .

Bu sürüm numarasına bağlı değildir, ancak soruna neden olan sunucu uzantısının listelenmesine dayanır, bu nedenle kitaplık sürümü shenanigans'a karşı bağışıklık kazanmalıdır.

Çalıştırdığınız makine, çalışması openssl s_clientiçin OpenSSL 1.0.1 veya üstünü kullanıyor olmalıdır .


4
Faydalı, ancak uzantı ve düzeltme ile bir sürümü olup olmadığını söylemez .
mattdm

1
Bu gerçekten güvenlik açığını kontrol etmenin iyi bir yoludur ve bazı komut dosyalarının yaptığı budur. Aslında SSH erişimi gerektirmez.
Stefan Lasiewski

8
BÜYÜK SCARY ÖNEMLİ UYARI - Çalıştırdığınız makine, çalışmasıopenssl s_clientiçin OpenSSL 1.0.1 veya üstünü kullanmalıdır. Bu komutu 0.9.8 veya 1.0.0 olan bir makinede çalıştırırsanız , savunmasız sunucular için bile HER ZAMAN RAPOR "Güvenli" olur .
voretaq7

Garip. Bu hatadan etkilendiği iddia edilen bir OpenSSL sürümünü çalıştırıyorum, ancak bu dizgenin çıktısında görünmüyor ...
Michael

@StefanLasiewski Cevabımı güncelledim ve "ssh gerek" bölümünü kaldırdım
egarcia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.