Heartbleed:OpenSSLのバージョンを確実かつ移植可能にチェックする方法は?


88

私はGNU / Linuxおよび他のシステムでOpenSSLのバージョンをチェックする信頼性の高いポータブルな方法を探していたので、ユーザーはHeartbleedバグのためにSSLをアップグレードする必要があるかどうかを簡単に見つけることができます。

簡単だと思いましたが、すぐに最新のOpenSSL 1.0.1gを使用してUbuntu 12.04 LTSで問題に遭遇しました。

opensslバージョン-a

私はフルバージョンを見ることを期待していましたが、代わりにこれを手に入れました:

OpenSSL 1.0.1 2012年3月14日
構築日:火6月4日07:26:06 UTC 2013
プラットフォーム:[...]

不愉快なことに、バージョンレターが表示されません。そこにfもgもありません。「1.0.1」だけです。リストされた日付は、(非)脆弱性バージョンの検出にも役立ちません。

1.0.1(af)と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(Twitterの@znmebに感謝)およびyum info openssl-libs

古いバージョンのOpenSSLがまだ存在するかどうかの確認:

UbuntuおよびDebianでOpenSSLパッケージを更新するだけでは十分ではないことがわかりました。また、libssl1.0.0パッケージを更新し、-then-がopenssl version -a示す場合は確認する必要があります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
ジェイコブ14

1
@PatoSáinz確認したところapt-cache policy openssl、次のように応答しました。Installed: 1.0.1-4ubuntu5.12これは、Ubuntuが12.04 LTS用にリリースしたばかりの1.0.1gです。ログアウトしてから再度ログインします。確認するために他にできることはありますか?
マーティン14

1
それが役立つ場合に備えて、それがわからないことを指摘しておきます... Ubuntu 12.04 LTSはOpenSSL 1.0.1(バニラ)に同梱されています。
HopelessN00b 14

1
そのビルド日付が正確である場合、1.0.1fはOpenSSL 1.0.1リリースノートに従って2014年にリリースされたため、1.0.1eより新しい「リリースバージョン」コードを持つことはできません。もちろん、個々の行またはセクションは、公式のOpenSSL 1.0.1fリリースの前にUbuntuバージョンにバックポートされている場合があります。そして、ビルド日は完全に役に立たないかもしれません。
アンチ弱パスワード14

回答:


66

OpenSSLのバージョンによって表示された日付に基づいて、あなたが思わそこに表示されたフルバージョンを見て。

Open SSL 1.0.1は2012年3月14日にリリースされました。1.0.1aは2012年4月19日にリリースされました。

そこで、openssl version -aシステムにインストールされているフルバージョンのOpenSSLを表示するための適切なクロスディストリビューションの方法であると断言します。これは、私がアクセスできるすべてのLinuxディストリビューションで機能するようです。また、help.ubuntu.com OpenSSLドキュメントでも推奨されている方法です。Ubuntu LTS 12.04には、バニラOpenSSL v1.0.1が同梱されています。これは、その後に文字がないため、短縮バージョンのように見えるバージョンです。

とはいえ、Ubuntu には大きなバグ(またはOpenSSLのパッケージ方法)があり、openssl version -aOpenSSLがアップグレードされているかどうかに関係なく、2012年3月14日から元の1.0.1バージョンを返し続けているようです。新しいバージョンの。そして、雨が降るときのほとんどのものと同様に、それは注ぎます。

Ubuntuは、アップデートをOpenSSL(または他のパッケージ)にバックポートする習慣の唯一の主要なディストリビューションではなく、誰もが認識しているアップストリームアップデートとバージョン番号に依存している評価者です。OpenSSLの場合、文字のバージョン番号はバグ修正とセキュリティ更新のみを表しますが、これはほとんど理解できないように見えますが、これはOpenSSLにパッケージ化された主要なLinuxディストリビューションのFIPS検証プラグインが原因である可能性があることを知りました。変更によって引き起こされる再検証に関する要件、さらにはセキュリティホールを塞ぐような変更のために、バージョンロックされています。

たとえば、Debianでは、修正バージョン1.0.1e-2+deb7u5は、アップストリームバージョンの代わりにのバージョン番号を表示します1.0.1g

その結果、現時点では、Linuxディストリビューション全体でSSLバージョンを確認するための信頼できる移植可能な方法はありません。それらはすべて、異なるバージョン番号付けスキームを使用した独自のバックポートパッチおよび更新を使用するためです。実行するLinuxの異なるディストリビューションごとに固定バージョン番号を検索し、インストールされているOpenSSLバージョンをそのディストリビューション固有のバージョン番号と照合して、サーバーが脆弱なバージョンを実行しているかどうかを判断する必要があります。


3
私のインストールは単純なUbuntu 12.04 LTSであり、自分でコンパイルしたものやUbuntuリポジトリ以外のソースからダウンロードしたものは何もありません。Ubuntuがバージョン番号を短縮したOpenSSLを配布している場合、それopenssl version -aは移植可能な方法ではありません(少なくともUbuntuに移植できません)。私は確認apt-cache policy opensslしましInstalled: 1.0.1-4ubuntu5.12たが、12.04 LTS用にUbuntuからリリースされたばかりの1.0.1gです。チェックアウトする前にログアウトしてからログインし直しました。
マーティン14

19
HopelessN00b、バージョンをバンプするのではなく、修正をバックポートするポリシーについて疑いの余地はありません。プラットフォームの安定性を確保する非常に良い方法であり、サーバー環境では非常に望ましい方法です。他の決定と同様に、結果があります。ユーザーはこの点に注意する必要があります。しかし、それは「foo xyzを実行しているため、最新のエクスプロイトに対して脆弱ではない」という推論を破るからです。それは悪いことではありません。
MadHatter 14

10
@towoのバージョン番号には理由があります。"enterprisey"またはその他の理由で、アップストリームバージョン番号をウィンドウの外に追い出すだけの場合、なぜバージョン番号に煩わされるのでしょうか。同様に、すべてのものに同名を付けて名前を付け始めてもよいでしょう。脆弱なOpenSSLバージョンのHoly Heartbleedと修正されたバージョンをCunning Coagulantと呼ぶことができます。
HopelessN00b 14

7
@ HopelessN00b「これはバージョンXYZで修正されました」トラップに巻き込まれていると思います。最新バージョンにインポートされているものはすべてバグとセキュリティ修正であるため、バージョン番号に従いません。彼らがバージョン番号にぶつかった場合、追加機能も期待するでしょう。「OpenSSL v XYZがあります。なぜECDHAがないのですか???? ..etc」。バグ修正にすぎないことを理解すると意味があります。
NickW 14

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.したがって、アップストリームのバージョン管理スキームを放棄しても何も得られません。アップデートにはセキュリティとバグ修正のみが含まれているため、アップデートのバックポートは基本的にアップデートバージョンの使用と同じです。それが行うことは物事を混乱させ、Linuxディストリビューション全体でOpenSSLバージョンを移植可能にチェックする方法を残さないことです。
HopelessN00b 14

18

本当にクロスプラットフォームなものが必要な場合は、バージョン番号に頼るのではなく、脆弱性自体を確認してください。

脆弱性があると知られているバージョン番号を報告するコードがあるかもしれませんが、実際のコードは脆弱ではありません。そして、その逆-静かに脆弱なコード-はさらに悪化する可能性があります!

OpenSSLやOpenSSHのようなオープンソース製品をバンドルする多くのベンダーは、APIの安定性と予測可能性を維持するために、緊急修正を古いバージョンのコードに選択的に後付けします。これは、特に「長期リリース」およびアプライアンスプラットフォームに当てはまります。

しかし、これを黙って(独自のバージョン文字列の接尾辞を追加せずに)行うベンダーは、脆弱性スキャナー(およびユーザーの混乱)で誤検知を引き起こすリスクを抱えています。したがって、これを透明で検証可能にするために、一部のベンダーは、メジャーパッケージバージョンに独自の文字列を追加します。Debian(OpenSSL)とFreeBSD(OpenSSHでは、VersionAddendumsshd_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を用意するか、手軽にテストする必要があります。この場合、すべてはApacheとnginxのPoCから始まりました。その時点でSSLを使用したSMTPのみを使用していて、脆弱かどうかを確認したい場合はどうなりますか?最終的には、ほとんどのサービスのテストが行​​われますが、しばらく時間がかかる場合があります。
マーティン14

Martijn、それは公正な点です。テストが利用できない場合、セカンダリシステム(ターゲットシステム上の影響を受けるバイナリのチェックサムを追跡するなど)は最適ではありませんが、ジョブを完了して次の攻撃に進むには十分かもしれません。:-)
ロイスウィリアムズ14

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 2014年4月7日以降の「構築日」を示しています。

追加情報を提供してくれた@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
これは残念ながら不十分です。また、ubuntuで明示的にアップグレードする必要がありますlibssl1.0.0。opensslのバージョンが正しいように見えても(1.0.1-4ubuntu5.12Ubuntu 12.04の場合)、2014年4月7日より前にビルド日付が表示されている場合、おそらく脆弱です。
ダニー14

@dannyあなたはちょうど私に多くの仕事を救った。ビルド日付が一部の12.04システムでは正しく、他のシステムでは間違っている理由を把握しようとしていました。あなたは命の恩人です!
ショーフ14

openssl version -a修正は古いリリースにバックポートされているため、4月7日のビルド日は必要ないかもしれません。
パトリックジェームズマクドゥーグル14

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でemergeする前

[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

痛い、まだg。


3
私はあなたが良い解決策を提供することに非常に近いと思ったが、残念ながらこれはUbuntu 12.04 LTSの暗号ライブラリでは機能しません。これは、バージョン[...] part of OpenSSL 1.0.1 14 Mar 2012と同じ方法ですべての文字列を表示openssl version -aします。これは、他の場合でも機能するかもしれないトリックです!
マーティン

@Martijnまあそれは残念ですが、ubuntu 12.10で動作します。12.04で自分自身を誤認するのは奇妙です。複数のライブラリがありますか?sshが最新のものを使用しない可能性はありますか?
waTeim 14

他のopensslバイナリまたは暗号ライブラリを見つけることができませんでした。違いは、12.04 LTSでは、Ubuntuがバージョンを更新せずに変更を1.0.1にバックポートしているということです。12.10はLTSではないため、Ubuntuはバックポートではなく最新バージョンを使用します。
マーティン

2

これらのスクリプトはすべてのサービスをテストしますか、それともHTTPSのみをテストしますか?AFAIKPostgreSQLは脆弱ですが、インザワイルド攻撃が表面化するまでそれはうわさだけです。

ある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

ソース:

これらのツールもあります。




0

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)"ないか、そうでない場合に戻ります。

これはバージョン番号に依存していませんが、問題の原因となっているサーバーエクステンションのリストに依存しているため、ライブラリバージョンの影響を受けません。

これを機能させるopenssl s_clientには、実行しているマシンでOpenSSL 1.0.1以降を使用している必要あります。


4
便利ですが、拡張子と修正が含まれているバージョンがあるかどうかはわかりません。
mattdm

1
これは確かに脆弱性をチェックする良い方法であり、いくつかのスクリプトが行うことです。実際にはSSHアクセスは必要ありません。
ステファンLasiewski 14

8
大きな怖い重要な警告 -openssl s_clientこれが機能するためには、実行中のマシンはOpenSSL 1.0.1以降を使用している必要があります。0.9.8または1.0.0のマシンでこのコマンドを実行すると、脆弱なサーバーであっても常に「安全」と報告されます
voretaq7

奇数。...私はおそらくこのバグの影響を受けているのOpenSSLのバージョンを実行している、まだその文字列が出力に表示されない
マイケル・

@StefanLasiewski私は私の答えを更新し、「必要なssh」部分を削除しました
エガルシア14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.