OpenSSLにメモリを自由に参照できるhearbleedと呼ばれるバグ(CVE-2014-0160)がありました。概要はTechCruchで解説されています。昨日は対応に追われたエンジニアも多いのではないでしょうか?OpenSSLを利用したシステムの場合、影響がある可能性があります。詳しくは
http://heartbleed.com/(英語サイト)
で解説されています。
脆弱性の概要
Heartbleed脆弱性とはリモートから接続先のシステム(HTTPSのWebサーバーなど)のメモリ内容を盗みとられるセキュリティ問題です。SSLを利用したシステムはプログラム中(メモリ中)にSSLの秘密鍵を保存しています。メモリ内容を盗み取る事によりSSL秘密鍵を盗み、HTTPSなどの暗号を解読できるようになります。
接続先のシステムがWebアプリケーションも実行している場合、Webアプリケーションのメモリ内容も盗む事が可能です。この場合、SSL秘密鍵に加えてメモリ内に保存してあるパスワードなどの認証情報も盗む事が可能になります。
影響があったWebサイトの利用者は念の為にパスワードを更新すると良いです。パスワードを更新する場合、他のサービスと同じパスワードは使わないでください。忘れない強固なパスワードを作るには”自分”で作った川柳をパスワードにすると良いでしょう。十分に長く安全なパスワードが作れます。大文字も混ぜ、「は」を8、「し」を4などに変換、区切り文字に%、&、+などの記号を使うとかなり強固なパスワードになります。
ブラウザにパスワードを記憶できるサービスの場合、 パスワードジェネレータやパスワード管理拡張を使うと良いと思います。
影響があるシステム
- OpenSSL 1.0.1 through 1.0.1f (inclusive) are vulnerable
- OpenSSL 1.0.1g is NOT vulnerable
- OpenSSL 1.0.0 branch is NOT vulnerable
- OpenSSL 0.9.8 branch is NOT vulnerable
RHEL5/CentOS5系は影響がないOpenSSLを利用しています。RHEL6/CentOS6系は影響を受けるOpenSSLが利用されており、修正版がリリースされています。
- Heartbleed脆弱性をテストできるサイト(英語ですがドメイン名を入れるだけです)
RPMの修正履歴
* 月 4月 07 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.7
– fix CVE-2014-0160 – information disclosure in TLS heartbeat extension
この修正履歴から分かるように1.0.1e-16.7(openssl-1.0.1e-16.el6_5.7)は脆弱性に対応したパッケージです。通常、RPMパッケージのリリース番号は1ずつ上がるのですがこの脆弱性の修正は0.1だけ上がっています。ご注意ください。
RPMの修正履歴は以下のコマンドで確認できます。
rpm -q --changelog openssl
影響を受けた場合の対策
影響範囲はシステム構成によって変わります。まずSSL(OpenSSL)を使っていないシステムは全く影響がありません。
- SSLがリバースプロキシ構成、またはCGI/FPMなどでスクリプトなどプログラムが別プロセスで動作している場合
- スクリプトなどがSSLを処理しているプロセスと同一の場合(Apache+mod_*など)
前者の場合、SSL鍵が盗まれた事を想定するだけで十分です。普通は新しい証明書をインストールすれば、サーバー側の対応は完了です。ただし、SSL通信で送信、ページに記載された秘密情報でも漏洩した可能性があります。
後者の場合はさらに厄介です。Heartbleed攻撃はサーバーのメモリ内にあった全ての情報が盗まれている事を想定しなければなりません。例えば、プログラム中で改ざん防止を目的とするメッセージダイジェスト作成を行う為の秘密情報を保存している場合、他のシステムにアクセスする為の認証情報を保存している場合は多いです。SSL秘密鍵と同様、これらの情報も盗まれていることを前提にしなければなりません。
The (1) TLS and (2) DTLS implementations in OpenSSL 1.0.1 before 1.0.1g do not properly handle Heartbeat Extension packets, which allows remote attackers to obtain sensitive information from process memory via crafted packets that trigger a buffer over-read, as demonstrated by reading private keys, related to d1_both.c and t1_lib.c, aka the Heartbleed bug.
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160
CVEの情報、hartbleedサイトの情報によるとサーバープロセスのメモリに保存されている情報は全て盗まれた可能性がある事を想定する必要があります。(1リクエストにつき64KBの任意メモリ内容を取得できる)
完全に問題を解決するにはOpenSSL 1.0.1gへのアップグレードが必要だとしています。
Even though the actual code fix may appear trivial, OpenSSL team is the expert in fixing it properly so latest fixed version 1.0.1g or newer should be used.If this is not possible software developers can recompile OpenSSL with the handshake removed from the code by compile time option
-DOPENSSL_NO_HEARTBEATS
.
独自にビルドしている場合、-DOPENSSL_NO_HEARTBEATSを利用し、長期的には1.0.1g以降にアップグレードする事を検討すると良いでしょう。
システム利用者の対策
システム利用者も対策を行う必要があります。リバースプロキシ構成(SSL処理がプロキシ側)、CGI/FPM構成の場合、JavaScriptを利用してダイジェスト認証のような形でハッシュ化したパスワードを送信していれば、SSL通信が解読される事でパスワードが漏洩してしまう事はありません。しかし、このような仕組みになっているサイトはほとんど無いと思います。つまり、影響を受けたシステムの利用者はパスワードが漏洩してしまった事を想定しなければなりません。
利用しているシステムが対応を完了したら、念の為にパスワードを更新した方が良いでしょう。
攻撃の検出
HeartbeatはSSL通信ですが専用のレコードタイプを持っているので、Heartbleed攻撃の検出に利用できます。
Although the content of the heartbeat request is encrypted it has its own record type in the protocol. This should allow intrusion detection and prevention systems (IDS/IPS) to be trained to detect use of the heartbeat request. Due to encryption differentiating between legitimate use and attack can not be based on the content of the request, but the attack may be detected by comparing the size of the request against the size of the reply. This seems to imply that IDS/IPS can be programmed to detect the attack but not to block it unless heartbeat requests are blocked altogether.
正当な利用と攻撃を検出するにはレコードタイプを判別するだけでは不可能で、リクエストとレスポンスのサイズで識別する事は可能でしょう。しかし、攻撃を防ぐにはHeartbeatリクエスト全てを排除しなければなりません。
まとめ
同類のバグは多くのプログラムであります。例えば、PHPにもありました。Stefan Esser氏によるMOPB(Month Of PHP Bugs)(リンク先はStefan氏に許可を得て訳した日本語版です。全部で30ほどあるのですが、検索機能の制限で表示されないようです)でもSSL証明書を盗むPoCが公開されていました。攻撃には攻撃用のPHPスクリプトをWebサーバー上で実行する必要がありました。
Heartbleed攻撃はOpenSSLの脆弱性であり、OpenSSLを利用したWebサーバー全てに影響があり、リモートから攻撃できます。この問題の影響を受けるシステムを運用されている方はできる限り早く対応する事をお勧めします。
- OpenSSL 1.0.1 から 1.0.1f は脆弱
- 1.0.1g以上への更新が望ましい
- ディストリビューションは脆弱性に対応した更新パッケージを提供
- システム構成により影響範囲が異なる
- SSL接続を処理するWebサーバーと同じプロセスがプログラムを実行している場合、プログラム中の機密情報も盗める(例:Apache+mod_ssl+mod_php/ruby/python/perl)
- 漏れたかも知れないセキュリティ情報(SSL秘密鍵、パスワード、セキュリティトークンなど)は新しい物に更新する(マルチスレッドサーバーの場合は接続中ユーザーのメモリ領域、マルチプロセスサーバーの場合もプロセスを再生成していない場合は、前のセッションのメモリ残骸から別ユーザーのセンシティブなデータを盗まれる可能性があります。Webアプリが利用するWebサービスの認証情報、メッセージ認証コードなども盗まれている可能性がある)
- Webサーバー以外でもOpenSSLを利用していると影響を受ける(SMTP+TLS、POPS、IMAPSなど)
Webサーバーに限らず、脆弱性のあるOpenSSLを使ったソフトウェア全てに影響があります。HTTPSを使っていなくても脆弱性の無いOpenSSLにアップグレードをすべきです。