「CVE-2014-0160 OpenSSL Heartbleed」の版間の差分

提供: セキュリティ
移動: 案内検索
 
(同じ利用者による、間の2版が非表示)
行3: 行3:
 
'''読み方'''
 
'''読み方'''
 
;Heartbleed:はーとぶりーど
 
;Heartbleed:はーとぶりーど
 +
;Heartbeat: はーとびーと
 
__TOC__
 
__TOC__
  
行8: 行9:
 
CVE-2014-0160 OpenSSL Heartbleed では、「最大64KBのメモリが接続されたクライアントやサーバに露呈する恐れ」があります。
 
CVE-2014-0160 OpenSSL Heartbleed では、「最大64KBのメモリが接続されたクライアントやサーバに露呈する恐れ」があります。
 
この[[脆弱性]]により、[[秘密鍵]]や[[暗号化]]によって保護される[[個人情報]]やコンテンツが閲覧される可能性があります。
 
この[[脆弱性]]により、[[秘密鍵]]や[[暗号化]]によって保護される[[個人情報]]やコンテンツが閲覧される可能性があります。
この問題は、[[OpenSSL]]の Heartbeat の機能によるため、 Heartbleed と名付けられました。
+
この問題は、[[OpenSSL]]の Heartbeat (ハートビート)の機能によるため、 Heartbleed と名付けられました。
  
 
TLS heartbeat 機能のバウンドチェック処理の欠如が原因です。
 
TLS heartbeat 機能のバウンドチェック処理の欠如が原因です。
 
* 接続したクライアントもしくはサーバから 64KB 単位でメモリの内容を取得できます。
 
* 接続したクライアントもしくはサーバから 64KB 単位でメモリの内容を取得できます。
 +
* 参照できるメモリは、同じプロセス内に限ります。
 
* 攻撃は繰り返し、実行可能です。
 
* 攻撃は繰り返し、実行可能です。
 
* ログには痕跡が残りません。
 
* ログには痕跡が残りません。
  
 
このバグは、2011年以来から存在していました。2014/04/08 に公開されました。
 
このバグは、2011年以来から存在していました。2014/04/08 に公開されました。
 +
 +
SSL 3.0 より新しい TLS 1.0 - 2.0(プロコトル上は3.1-3.3)があります。
 +
この脆弱性は、TLS 1.2で追加されたハートビート拡張の実装の不具合が原因です。
 +
 +
SSL通信のハンドシェイクの段階で、この脆弱性が利用できます。
 +
SSLのハンドシェイク中にSSL証明書の検証が行われますが、この脆弱性では、正しいSSL証明書を持っていなくても攻撃が成立します。
 +
 +
== 盗聴の例 ==
 +
* 別のユーザの情報を漏えいする
 +
** ユーザが入力したもの。
 +
** ブラウザが送信した[[HTTP Cookie]]
 +
** ユーザに表示された情報
 +
* ユーザのセッション([[HTTP Cookie]])を入手し、なりすましアクセスを行う
 +
 +
[[Webサーバ]]にアクセスした際に、[[HTTP Cookie]]やHTTPリクエストパラメータがメモリ内に残っています。この脆弱性を利用して、それらの情報を抜き出すことができます。
  
 
== 何が起きるのか ==
 
== 何が起きるのか ==
行34: 行51:
 
* CentOS 6.5 openssl-1.0.1e-16.el6_5.7
 
* CentOS 6.5 openssl-1.0.1e-16.el6_5.7
 
* FreeBSD ports/openssl 1.0.1_10
 
* FreeBSD ports/openssl 1.0.1_10
 +
* EC2 Amazon Linux AMI openssl-1.0.1e-37.66.amzn1.x86_64
 +
* Cygwin openssl-1.0.1g-1
 
== 影響のないOpenSSL ==
 
== 影響のないOpenSSL ==
 
* OpenSSL 1.0.0 ブランチ
 
* OpenSSL 1.0.0 ブランチ
行41: 行60:
 
* 証明書の[[秘密鍵]]を再作成した上でSSL証明書を再発行し、古いSSL証明書を失効させます。
 
* 証明書の[[秘密鍵]]を再作成した上でSSL証明書を再発行し、古いSSL証明書を失効させます。
 
* [[OpenSSL]]を修正します。以下のどちらかの手順を実施します。
 
* [[OpenSSL]]を修正します。以下のどちらかの手順を実施します。
** OPENSSL_NO_HEARTBEATS(-DOPENSSL_NO_HEARTBEATS) を有効にして、再コンパイルを行う
+
** OPENSSL_NO_HEARTBEATS(-DOPENSSL_NO_HEARTBEATS) を有効にして、再コンパイルを行う。システムを再起動する。
** [[OpenSSL]] を脆弱性のないバージョンに上げる
+
** [[OpenSSL]] を脆弱性のないバージョンに上げる。システムを再起動する。
 +
 
 +
「システムを再起動する」というのは、 [[OpenSSL]]のライブラリを再ロードしなおすためです。[[OpenSSL]]のパッケージをインストールしただけでは、「新しい[[OpenSSL]]のパッケージを入れる前にロードされた[[OpenSSL]]のライブラリ」がメモリ空間に残っているため、「脆弱な状態」を解消出来ていません。メモリにロードされた古い[[OpenSSL]]を確実に消す方法として、OSを再起動することが確実な手段です。
 
== 対策 ==
 
== 対策 ==
 
=== バージョンの確認方法 ===
 
=== バージョンの確認方法 ===
行52: 行73:
 
$ sudo yum update
 
$ sudo yum update
 
$ sudo yum update openssl
 
$ sudo yum update openssl
 +
$ sudo reboot
 
</syntaxhighlight>
 
</syntaxhighlight>
 
=== バージョンアップ Ubuntu ===
 
=== バージョンアップ Ubuntu ===
 +
パッケージを確認できます。
 +
<syntaxhighlight lang="bash">
 +
$ dpkg -l | grep openssl
 +
</syntaxhighlight>
 +
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$ sudo apt-get update
 
$ sudo apt-get update
 
$ sudo apt-get upgrade
 
$ sudo apt-get upgrade
 +
$ sudo reboot
 
</syntaxhighlight>
 
</syntaxhighlight>
 
=== バージョンアップ FreeBSD ===
 
=== バージョンアップ FreeBSD ===
行63: 行91:
 
$ cd /usr/ports/security/openssl
 
$ cd /usr/ports/security/openssl
 
$ sudo make install clean
 
$ sudo make install clean
 +
$ sudo reboot
 +
</syntaxhighlight>
 +
=== バージョンアップ MacOS X ===
 +
<syntaxhighlight lang="bash">
 +
$ brew update
 +
$ brew install openssl
 +
$ brew link --force openssl
 +
$ openssl version -a
 +
</syntaxhighlight>
 +
=== OpenSSLをビルドする ===
 +
<syntaxhighlight lang="bash">
 +
$ curl https://www.openssl.org/source/openssl-1.0.1g.tar.gz \
 +
| tar xz && cd openssl-1.0.1g \
 +
&& ./config && make && sudo make install
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== 確認方法 ==
 
== 確認方法 ==
行115: 行157:
 
* [[OpenSSL]]
 
* [[OpenSSL]]
 
* [[脆弱性]]
 
* [[脆弱性]]
 +
* [http://www.jpcert.or.jp/at/2014/at140013.html JPCERT OpenSSL の脆弱性に関する注意喚起]
 +
* [http://filippo.io/Heartbleed/ テストツール]
 +
* [http://heartbleed.com/ The Heartbleed Bug]
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

2014年4月10日 (木) 23:38時点における最新版

脆弱性 CVE-2014-0160 OpenSSL Heartbleed では、「最大64KBのメモリが接続されたクライアントやサーバに露呈する恐れ」があります。OpenSSLのTLS heartbeat 機能のバウンドチェック処理の欠如が原因のバグで、2011年から存在していたバグです。

読み方

Heartbleed
はーとぶりーど
Heartbeat
はーとびーと

概要

CVE-2014-0160 OpenSSL Heartbleed では、「最大64KBのメモリが接続されたクライアントやサーバに露呈する恐れ」があります。 この脆弱性により、秘密鍵暗号化によって保護される個人情報やコンテンツが閲覧される可能性があります。 この問題は、OpenSSLの Heartbeat (ハートビート)の機能によるため、 Heartbleed と名付けられました。

TLS heartbeat 機能のバウンドチェック処理の欠如が原因です。

  • 接続したクライアントもしくはサーバから 64KB 単位でメモリの内容を取得できます。
  • 参照できるメモリは、同じプロセス内に限ります。
  • 攻撃は繰り返し、実行可能です。
  • ログには痕跡が残りません。

このバグは、2011年以来から存在していました。2014/04/08 に公開されました。

SSL 3.0 より新しい TLS 1.0 - 2.0(プロコトル上は3.1-3.3)があります。 この脆弱性は、TLS 1.2で追加されたハートビート拡張の実装の不具合が原因です。

SSL通信のハンドシェイクの段階で、この脆弱性が利用できます。 SSLのハンドシェイク中にSSL証明書の検証が行われますが、この脆弱性では、正しいSSL証明書を持っていなくても攻撃が成立します。

盗聴の例

  • 別のユーザの情報を漏えいする
    • ユーザが入力したもの。
    • ブラウザが送信したHTTP Cookie
    • ユーザに表示された情報
  • ユーザのセッション(HTTP Cookie)を入手し、なりすましアクセスを行う

Webサーバにアクセスした際に、HTTP CookieやHTTPリクエストパラメータがメモリ内に残っています。この脆弱性を利用して、それらの情報を抜き出すことができます。

何が起きるのか

  • HTTPSサーバのSSL証明書の秘密鍵が漏えいする
  • HTTPSサーバのプロセス内の情報が漏えいする
  • 乗っ取られたサーバに接続するとき、HTTPSで通信するクライアントのメモリ内の情報が漏えいする

影響を受けるOpenSSL

  • OpenSSL 1.0.1 - 1.0.1f
  • OpenSSL 1.0.2-beta - 1.0.2-beta1

ただし、 OPENSSL_NO_HEARTBEATS(-DOPENSSL_NO_HEARTBEATS) でコンパイルされた場合、影響がありません。

対応済のOpenSSL

脆弱性修正済のOpenSSLは、以下の通りです。OSによって対応バージョンが異なるため、注意が必要です。

  • OpenSSL 1.0.1g
  • OpenSSL 1.0.2-beta2
  • RHEL 6.5 openssl-1.0.1e-16.el6_5.7
  • CentOS 6.5 openssl-1.0.1e-16.el6_5.7
  • FreeBSD ports/openssl 1.0.1_10
  • EC2 Amazon Linux AMI openssl-1.0.1e-37.66.amzn1.x86_64
  • Cygwin openssl-1.0.1g-1

影響のないOpenSSL

  • OpenSSL 1.0.0 ブランチ
  • OpenSSL 0.9.8 ブランチ

対応方法

対策には、以下の方法があります。

  • 証明書の秘密鍵を再作成した上でSSL証明書を再発行し、古いSSL証明書を失効させます。
  • OpenSSLを修正します。以下のどちらかの手順を実施します。
    • OPENSSL_NO_HEARTBEATS(-DOPENSSL_NO_HEARTBEATS) を有効にして、再コンパイルを行う。システムを再起動する。
    • OpenSSL を脆弱性のないバージョンに上げる。システムを再起動する。

「システムを再起動する」というのは、 OpenSSLのライブラリを再ロードしなおすためです。OpenSSLのパッケージをインストールしただけでは、「新しいOpenSSLのパッケージを入れる前にロードされたOpenSSLのライブラリ」がメモリ空間に残っているため、「脆弱な状態」を解消出来ていません。メモリにロードされた古いOpenSSLを確実に消す方法として、OSを再起動することが確実な手段です。

対策

バージョンの確認方法

$ openssl version -a

バージョンアップ Linux

$ sudo yum update
$ sudo yum update openssl
$ sudo reboot

バージョンアップ Ubuntu

パッケージを確認できます。

$ dpkg -l | grep openssl
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot

バージョンアップ FreeBSD

$ sudo portsnap fetch update
$ cd /usr/ports/security/openssl
$ sudo make install clean
$ sudo reboot

バージョンアップ MacOS X

$ brew update
$ brew install openssl
$ brew link --force openssl
$ openssl version -a

OpenSSLをビルドする

$ curl https://www.openssl.org/source/openssl-1.0.1g.tar.gz \
| tar xz && cd openssl-1.0.1g \
&& ./config && make && sudo make install

確認方法

Heartbleed

Web 版のチェックツールです。 http://filippo.io/Heartbleed/

Unix版のプログラムは、GitHubで公開されいます。 https://github.com/FiloSottile/Heartbleed

このプログラムを使用するには、Goが必要です。

$ sudo pkg install go
$ export GOPATH=$PWD
$ go get github.com/FiloSottile/Heartbleed
$ go install github.com/FiloSottile/Heartbleed

OK な場合です。

$ ./bin/Heartbleed login.yahoo.co.jp:443
2014/04/08 23:27:49 login.yahoo.co.jp:443 - SAFE
$ ./bin/Heartbleed accounts.google.com:443
2014/04/08 23:28:54 accounts.google.com:443 - SAFE

この例は、脆弱性がある場合です。

$ ./bin/Heartbleed login.yahoo.com:443
2014/04/08 23:27:59 ([]uint8) {
 00000000  02 00 79 68 65 61 72 74  62 6c 65 65 64 2e 66 69  |..yheartbleed.fi|
 00000010  6c 69 70 70 6f 2e 69 6f  59 45 4c 4c 4f 57 20 53  |lippo.ioYELLOW S|
 00000020  55 42 4d 41 52 49 4e 45  4a 9c 8a 57 1e 1b 76 93  |UBMARINEJ..W..v.|
 00000030  f3 2f 1b af 9f b8 21 de  6a 4a 67 c9 23 7c f9 55  |./....!.jJg.#|.U|
 00000040  fe 89 d6 4b 7a a5 21 13  6a d1 c4 ea f1 ac db 52  |...Kz.!.j......R|
 00000050  cb 46 be 73 ee 4c 16 c3  86 fd 25 70 96 87 2a 5e  |.F.s.L....%p..*^|
 00000060  43 85 cf 29 12 69 96 01  68 46 e8 0c ba b3 0f 0d  |C..).i..hF......|
 00000070  bb 78 37 69 4b 6c 24 74  c4 8b a2 2a 17 ed 9c f7  |.x7iKl$t...*....|
 00000080  b4 46 f6 26 33 55 43 fd  48 14 b1 6d              |.F.&3UC.H..m|
}
 
2014/04/08 23:27:59 login.yahoo.com:443 - VULNERABLE
[2]    53447 exit 1     ./bin/Heartbleed login.yahoo.com:443

備考

関連項目