Pertanyaan Heartbleed: bagaimana dengan andal dan mudah memeriksa versi OpenSSL?


Saya sedang mencari cara yang andal dan portabel untuk memeriksa versi OpenSSL di GNU / Linux dan sistem lain, sehingga pengguna dapat dengan mudah menemukan apakah mereka harus meningkatkan SSL mereka karena bug Heartbleed.

Saya pikir itu akan mudah, tapi saya dengan cepat mengalami masalah pada Ubuntu 12.04 LTS dengan OpenSSL terbaru 1.0.1g:

versi opensl -a

Saya mengharapkan untuk melihat versi lengkap, tetapi saya mendapatkan ini:

OpenSSL 1.0.1 14 Mar 2012
dibangun pada: Tue Jun 4 07:26:06 UTC 2013
peron: [...]

Untuk kejutan yang tidak menyenangkan saya, surat versi tidak muncul. Tidak f, no g di sana, hanya "1.0.1" dan hanya itu. Tanggal-tanggal yang tercantum tidak membantu dalam menemukan versi (yang tidak rentan) juga.

Perbedaan antara 1.0.1 (a-f) dan 1.0.1g sangat penting.

Pertanyaan:

  • Apa cara yang dapat diandalkan untuk memeriksa versi, sebaiknya menyeberang distro?
  • Mengapa surat versi tidak muncul di tempat pertama? Saya tidak dapat menguji ini pada hal lain kecuali Ubuntu 12.04 LTS.

Orang lain melaporkan perilaku ini juga. Beberapa contoh:

Beberapa saran (distro-specific) bergulir di:

  • Ubuntu dan Debian: apt-cache policy openssl dan apt-cache policy libssl1.0.0. Bandingkan nomor versi ke paket di sini: http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl (Terima kasih @znmeb di twitter) dan yum info openssl-libs

Memeriksa apakah versi OpenSSL yang lebih lama masih digunakan:

Ternyata memperbarui paket OpenSSL di Ubuntu dan Debian tidak selalu cukup. Anda juga harus memperbarui paket libssl1.0.0, dan -tolong- periksa apakah openssl version -a menunjukkan built on: Mon Apr 7 20:33:29 UTC 2014.


86
2018-04-07 23:51




setidaknya pastikan bahwa versi OpenSSL yang Anda miliki tidak g karena tanggal yang ditunjukkannya - Pato Sáinz
Ini berfungsi di CentOS [root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013 - Jacob
@ PatoSáinz Saya sudah memeriksanya apt-cache policy openssl dan itu ditanggapi dengan: Installed: 1.0.1-4ubuntu5.12 yang merupakan 1.0.1g yang baru saja dirilis oleh Ubuntu untuk 12.04 LTS. Saya keluar dan masuk kembali. Apakah ada hal lain yang bisa saya lakukan untuk memverifikasi? - Martijn
Saya akan tunjukkan, untuk itu yang tidak tahu, kalau-kalau itu membantu ... Ubuntu 12.04 LTS dikirim dengan OpenSSL 1.0.1 (vanilla). - HopelessN00b
Jika tanggal pembuatan itu akurat, Anda tidak dapat memiliki kode "rilis berversi" lebih baru daripada 1.0.1e, karena 1.0.1f keluar pada tahun 2014 per catatan rilis OpenSSL 1.0.1. Garis atau bagian individual mungkin telah di-backport ke versi Ubuntu Anda sebelum rilis resmi OpenSSL 1.0.1f, tentu saja. Dan tanggal pembuatan mungkin kurang yang sepenuhnya membantu. - Anti-weakpasswords


Jawaban:


Berdasarkan tanggal yang ditampilkan oleh versi OpenSSL Anda, tampaknya Anda adalah melihat versi lengkap yang ditampilkan di sana.

Open SSL 1.0.1 dirilis pada 14 Maret 2012. 1.0.1a dirilis pada 19 April 2012.

Jadi, saya akan melanjutkan dan menegaskan itu openssl version -a adalah cara lintas-distro yang tepat untuk menampilkan versi lengkap OpenSSL yang diinstal pada sistem. Tampaknya bekerja untuk semua distro Linux yang saya miliki aksesnya, dan adalah metode yang disarankan dalam dokumentasi help.ubuntu.com OpenSSL, juga. Ubuntu LTS 12.04 dikirim dengan vanilla OpenSSL v1.0.1, yang merupakan versi yang terlihat seperti versi yang disingkat, karena tidak memiliki surat yang mengikutinya.

Karena itu, tampaknya ada utama bug di Ubuntu (atau bagaimana mereka mengemas OpenSSL), dalam hal itu openssl version -a terus mengembalikan versi asli 1.0.1 dari 14 Maret 2012, terlepas dari apakah OpenSSL telah ditingkatkan ke versi yang lebih baru atau tidak. Dan, seperti kebanyakan hal ketika hujan turun, itu mengalir.

Ubuntu bukan satu-satunya distro utama dalam kebiasaan backporting pembaruan ke OpenSSL (atau paket lain), penilai daripada mengandalkan pembaruan hulu dan penomoran versi yang semua orang kenali. Dalam kasus OpenSSL, di mana nomor versi surat hanya mewakili perbaikan bug dan pembaruan keamanan, ini tampaknya hampir tidak dapat dimengerti, tetapi saya telah diberitahu bahwa ini mungkin karena FIPS-divalidasi plugin distro Linux utama yang dikemas dengan OpenSSL. Karena persyaratan seputar revalidasi yang memicu karena perubahan apa pun, bahkan perubahan yang menyumbat lubang keamanan, itu terkunci versi.

Misalnya, pada Debian, versi tetap menampilkan nomor versi 1.0.1e-2+deb7u5 bukan versi upstream dari 1.0.1g.

Akibatnya, saat ini, tidak ada cara yang dapat diandalkan dan portabel untuk memeriksa versi SSL di distribusi Linux, karena mereka semua menggunakan patch dan pembaruan backport mereka sendiri dengan skema penomoran versi yang berbeda. Anda harus mencari nomor versi tetap untuk setiap distribusi Linux yang berbeda yang Anda jalankan, dan memeriksa versi OpenSSL yang diinstal terhadap penomoran versi distribusi spesifik untuk menentukan apakah server Anda menjalankan versi rentan atau tidak.


67
2018-04-08 00:05



Instalasi saya adalah Ubuntu 12.04 LTS sederhana tanpa apa pun yang telah saya kompilasi sendiri atau diunduh dari sumber lain selain dari repositori Ubuntu. Jika Ubuntu mendistribusikan OpenSSL dengan nomor versi yang disingkat, lalu openssl version -a bukan metode portabel (setidaknya tidak portabel untuk Ubuntu). Saya sudah memeriksanya apt-cache policy openssl dan itu ditanggapi dengan: Installed: 1.0.1-4ubuntu5.12 yang merupakan 1.0.1g yang baru saja dirilis oleh Ubuntu untuk 12.04 LTS. Saya keluar dan masuk kembali sebelum memeriksa. - Martijn
HopelessN00b, tidak ada yang meragukan kebijakan perbaikan backporting alih-alih menabrak versi; ini adalah cara yang sangat baik untuk memastikan stabilitas platform, yang sangat diinginkan dalam lingkungan server. Seperti keputusan apa pun, ia memiliki konsekuensi, yang perlu disadari oleh pengguna; tetapi hanya karena merusak "Saya menjalankan foo x.y.z karena itu saya tidak rentan terhadap eksploitasi terbaru"Garis penalaran, itu tidak membuatnya menjadi hal yang buruk. - MadHatter
@towo Nomor versi ada karena suatu alasan. Jika kita hanya akan membuang nomor versi hulu ke luar jendela karena "enterprisey," atau apa pun, mengapa repot-repot dengan nomor versi sama sekali? Mungkin juga mulai menamai semua barang kami dengan aliterasi. Kami dapat memanggil versi OpenSSL yang rentan Holy Heartbleed dan yang tetap Cunning Coagulant. - HopelessN00b
@ HopelessN00b Saya pikir Anda terjebak pada perangkap "ini diperbaiki dalam versi X.Y.Z", mereka tidak mengikuti nomor versi karena semua yang diimpor ke versi terbaru adalah perbaikan bug dan keamanan. Jika mereka menabrak nomor versi, Anda juga akan mengharapkan fungsi tambahan .. "Saya memiliki OpenSSL v X.Y.Z, mengapa saya tidak memiliki ECDHA ???? ..etc". Masuk akal ketika Anda memahami bahwa itu hanya perbaikan bug. - NickW
@NickW @Jubal @MadHatter hal dengan OpenSSL, adalah bahwa: 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. Jadi, tidak ada hasil yang ditinggalkan dari skema versi hulu; backporting pembaruan pada dasarnya sama dengan menggunakan versi yang diperbarui, karena pembaruan hanya mencakup perbaikan keamanan dan bug. Apa yang dilakukannya adalah membingungkan hal-hal dan meninggalkan kita dengan tidak ada cara untuk memeriksa versi OpenSSL di distro Linux. - HopelessN00b


Jika Anda menginginkan sesuatu yang benar-benar lintas platform, periksa kerentanan itu sendiri daripada mengandalkan nomor versi. 

Anda mungkin memiliki kode yang melaporkan nomor versi yang diketahui rentan, tetapi kode sebenarnya tidak rentan. Dan sebaliknya - kode rentan secara diam-diam - bisa menjadi lebih buruk!

Banyak vendor yang menggabungkan produk open-source seperti OpenSSL dan OpenSSH akan secara selektif retrofit perbaikan mendesak ke versi kode yang lebih lama, untuk menjaga stabilitas dan prediktabilitas API. Ini terutama berlaku untuk "perilisan jangka panjang" dan platform alat.

Tetapi vendor yang melakukan hal ini secara diam-diam (tanpa menambahkan akhiran string versi mereka sendiri) menjalankan risiko memicu false positive dalam pemindai kerentanan (dan membingungkan pengguna). Jadi untuk membuat ini transparan dan dapat diverifikasi, beberapa vendor menambahkan string mereka sendiri ke versi paket utama. Baik Debian (OpenSSL) dan FreeBSD (di OpenSSH, melalui VersionAddendum direktif sshd_config) terkadang melakukan ini.

Vendor yang tidak melakukan hal ini mungkin melakukan hal itu untuk meminimalkan kemungkinan kerusakan karena banyak cara langsung dan tidak langsung yang digunakan program lain untuk memeriksa nomor versi.

Jadi dapat terlihat seperti ini:

$ 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

... meskipun sudah ditambal:

$ 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

Dengan hal-hal seperti ini, Anda lebih baik jika Anda jangan percaya nomor versi.


18
2018-04-08 20:52



Sudah jelas bahwa memeriksa versi tidak semudah dan transparan seperti yang saya harapkan. Memeriksa kerentanan adalah cross-platform, tetapi juga lebih sulit untuk dilakukan: Anda harus memiliki PoC yang andal atau tes yang berguna untuk layanan perangkat lunak rentan tertentu yang Anda jalankan. Dalam hal ini semuanya dimulai dengan PoC untuk Apache dan nginx. Bagaimana jika saya hanya menggunakan SMTP dengan SSL pada saat itu, dan saya ingin memeriksa apakah saya rentan? Akhirnya kami akan melakukan tes untuk sebagian besar layanan, tetapi mungkin perlu waktu beberapa saat. - Martijn
Martijn, itu poin yang adil. Ketika tes tidak tersedia, metode sekunder (seperti melacak checksum untuk binari yang terkena dampak pada sistem target Anda) kurang optimal, tetapi mungkin cukup baik untuk menyelesaikan pekerjaan ... dan kemudian beralih ke api berikutnya. :-) - Royce Williams


Sayangnya, saya tidak yakin di sana aku s cara lintas-platform untuk melakukan ini. Seperti yang saya bahas dalam posting blog, versi OpenSSL yang ditampilkan pada Ubuntu 12.04 REMAINS 1.0.1 setelah memutakhirkan ke versi tetap.

Untuk Ubuntu 12.04 SAJA, Anda dapat mengetahui apakah Anda telah diperbarui jika semua yang di bawah ini benar:

  1. dpkg -s openssl | grep Versionmenampilkan versi 1.0.1-4ubuntu5.12 atau yang lebih baru.
  2. dpkg -s libssl1.0.0 | grep Versionmenampilkan versi 1.0.1-4ubuntu5.12 atau yang lebih baru.
  3. openssl version -a menunjukkan tanggal "dibangun pada" 7 April 2014 atau lebih baru.

Terima kasih kepada @danny untuk info tambahan.


14
2018-04-08 03:15



Ok, kalau begitu saya harus menambahkan versi paket itu 1.0.1-4ubuntu5.12 HANYA untuk Ubuntu 12.04 LTS. Jika Anda menggunakan Ubuntu 12.10 Anda harus melihat setidaknya versi 1.0.1c-3ubuntu2.7dan jika Anda berada pada 13.10 maka setidaknya harus versi 1.0.1e-3ubuntu1.2, menurut sumber: ubuntu.com/usn/usn-2165-1 - Martijn
Sayangnya ini tidak cukup. Kamu harus juga upgrade libssl1.0.0 secara eksplisit di ubuntu. Jika Anda melihat tanggal dibangun sebelum 7 April 2014 bahkan jika openssl adalah versi yang terlihat benar (1.0.1-4ubuntu5.12 untuk Ubuntu 12.04) Anda mungkin masih rentan. - danny
@danny Anda baru saja menyelamatkan saya begitu banyak pekerjaan. Saya mencoba mencari tahu mengapa tanggal pembuatannya tepat pada beberapa sistem 12.04 dan salah pada yang lain. Anda seorang penyelamat! - Schof
openssl version -a mungkin tidak perlu tanggal pembuatan 7 April, karena perbaikan sedang dicadangkan ke rilis yang lebih lama. - Patrick James McDougle


Berikan yang berikut ini untuk dicoba. Ini akan mengekstrak semua string dari crypto perpustakaan yang ssh terkait dengan. Ini menghasilkan lebih dari satu baris output, tetapi jika perlu dapat dikonversi menjadi 1 baris.

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

menghasilkan

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

misalnya di Gentoo sebelum muncul

[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

perintah di atas menghasilkan

...
OpenSSL 1.0.1c 10 May 2012

setelah

...
OpenSSL 1.0.1f 6 Jan 2014

Aduh, masih tidak ada g.


4
2018-04-08 14:45



Saya pikir Anda sangat dekat untuk memberikan solusi yang baik, tetapi sayangnya ini tidak berfungsi untuk perpustakaan crypto di Ubuntu 12.04 LTS. Ini menampilkan semua string dengan versi [...] part of OpenSSL 1.0.1 14 Mar 2012, dengan cara yang sama openssl version -a tidak. Ini adalah trik yang bisa berhasil dalam kasus lain! - Martijn
@Martijn Yah, itu sangat disayangkan, tetapi berhasil di ubuntu 12.10. Aneh bahwa itu akan salah mengidentifikasi dirinya pada 12.04. Apakah ada beberapa lib? Apakah mungkin ssh tidak menggunakan yang paling up-to-date? - waTeim
Saya tidak dapat menemukan binari openssl lain atau pustaka kripto. Disarankan oleh orang lain bahwa perbedaannya adalah bahwa, pada 12.04 LTS, Ubuntu adalah backporting perubahan ke 1.0.1 tanpa menaikkan versi. Sementara 12,10 bukan merupakan LTS dan Ubuntu menggunakan versi terbaru di sana bukannya backport. - Martijn


Apakah salah satu dari skrip ini menguji semua layanan, atau apakah mereka hanya menguji HTTPS? AFAIK, PostgreSQL rentan, tapi itu hanya rumor sampai permukaan serangan di-alam-liar.

Ada sebuah metasploit skrip tersedia untuk digunakan.

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

Anda dapat mengetik ini (diuji dengan GnuWin32 OpenSSL binary version 1.0.1.6, tanggal 2014-01-14), atau cukup gunakan skrip di komentar di bawah ini. Lebih akurat dan sederhana!

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

Setelah terhubung dengan tipe B dan Anda akan melihat pada host yang rentan dan Anda tidak akan terputus:

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

Anda akan mendapatkan respons detak jantung yang terlihat mirip dengan yang satu ini.

Pada host yang ditambal, Anda akan melihat respons serupa di bawah ini dan Anda akan terputus:

Masukkan 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

Sumber:

Ada juga alat-alat ini:


2
2018-04-09 11:43





Untuk Ubuntu Anda dapat menggunakan:

aptitude show libssl1.0.0 | grep Version

Dan bandingkan dengan http://www.ubuntu.com/usn/usn-2165-1/. Setelah reboot (!!!) Anda bisa memeriksanya http://possible.lv/tools/hb.


0
2018-04-08 11:14





Anda sebaiknya meng-upgrade ke OpenSSL OpenSSL terbaru 1.0.1j.

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


0
2017-10-19 01:57





saya menemukan skrip ini di devcentral:

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

Menggantikan example.com dengan nama atau alamat IP dari server yang ingin Anda periksa.

Akan kembali "safe" jika server Anda baik-baik saja atau "server extension "heartbeat" (id=15)" jika tidak.

Ini tidak bergantung pada nomor versi, tetapi pada daftar ekstensi server yang menyebabkan masalah, jadi harus kebal terhadap shenanigans versi perpustakaan.

Mesin yang Anda jalankan openssl s_client di harus menggunakan OpenSSL 1.0.1 atau yang lebih baru agar ini berfungsi.


0
2018-04-08 09:12



Berguna, tetapi tidak memberi tahu Anda jika Anda memiliki versi dengan ekstensi dan perbaikannya. - mattdm
Ini memang cara yang baik untuk memeriksa kerentanan dan apa yang dilakukan beberapa skrip. Itu sebenarnya tidak membutuhkan akses SSH. - Stefan Lasiewski
PERINGATAN PENTING YANG MENARIK - Mesin yang Anda jalankan openssl s_client HARUS menggunakan OpenSSL 1.0.1 atau yang lebih baru agar ini berfungsi. Jika Anda menjalankan perintah ini pada mesin dengan 0.9.8 atau 1.0.0 TI AKAN SELALU LAPORAN "Aman", bahkan untuk server yang rentan. - voretaq7
Aneh. Saya menjalankan versi OpenSSL yang diduga terkena bug ini, namun string itu tidak muncul di output ... - Michael
@StefanLasiewski Saya memperbarui jawaban saya dan menghapus bagian "butuh ssh" - egarcia