CVE-2014-0160 OpenSSL Heartbleed
脆弱性 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で通信するクライアントのメモリ内の情報が漏えいする
- DNSキャッシュポイズニング等を使用し、攻撃者のSSLサーバに接続された場合に漏えいします。
影響を受ける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
備考
- ssh / OpenSSH とは無関係です。
- GNU Privacy Guard (GnuPG) とは無関係です。
関連項目
ツイート