ニコニコニュースを見ていたらネット史上最大級のバグ発見という記事が。
記事を読んでみるとOpenSSLにHeartbleedというバグがあり、ネット決済のクレジットカード情報が筒抜けになるかもしれない、という内容でした。 煽り記事か、とげんなりしていると、ニコニコニュース以外の多くのニュースサイトでも取り上げられて、Heartbleedが大盛況になっていました。 気になったのでHeartbleedが何者かを調べてみました。
1. 脆弱性の内容
CVE(脆弱性リストをデータベース化しているサイト)でもIDが割り振られており、Heartbleedと呼ばれる脆弱性はCVE-2014-0160というIDで管理されています。
CVE-2014-0160の概要は以下の通りです。
OpenSSL 1.0.1g以前の1.0.1系はHeartbeat拡張パケットの制御が不正で、バッ ファオーバフローを引き起こすパケットにより機密情報を含むプロセスのメモ リが読み込まれる可能性がある。
この機密情報にサーバ側の秘密鍵のデータが含まれる可能性があるようです。 秘密鍵を読まれた結果、クライアントとサーバの通信内容が解読されてしまう可能性も生まれてきます。
筆者は以前CVEを見る機会が多くあり、Base Score 5.0というのはそこまで高いインパクトの脆弱性ではない印象です。
2. Heartbeat拡張
Heartbeatという概念はよく使われているものです。例えばサーバで考えると、通常時に稼働するサーバと、それにエラーがあった際に切り替わって稼働するサーバの2台の冗長化したサーバ群があるとします。通常サーバと切り替わるサーバの間では定期的にHeartbeatと呼ばれる生存確認用プロトコルでエラーが起きていないことを確認します。
RFC6520によれば、TLS/DTLSにおけるHeartbeat拡張とは、TLS/DTLS通信において、長時間通信がない場合にTLS/DTLSセッションが切断されてしまうのを防ぐ為に、定期的にHeartbeat RequestとHeartbeat Respondというパケットを送受信し、互いにまだ通信していることを確認する為のもののようです。
https通信でメールを確認する場合に、メールの確認に時間を掛けてセッションが途切れてしまうのを防ぐことができます。
Heartbeat拡張の実装に関する脆弱性である為、Heartbleedという名称なのでしょう。
3. 脆弱性をついたコード
ニュースサイトをいろいろと見てみると、どうやら脆弱性を証明するコードが公開されてしまっているようです。中にはウェブサービス化しているものもあります。TLS/DTLSを使うネットワークセッションを確率した後、バッファオーバフローを引き起こすHeartbeat Requestを送信し、通常のHeartbeat
Respondとは異なった大きいサイズとなる、機密情報を含んだパケットを受信するというもののようです。
脆弱性で大騒ぎになる場合は、だいたいこういったexploit codeが公開されていることが多いと思います。
4. 対策
すでに修正されているのでOpenSSLのバージョンをアップグレードする一手です。Ubuntuならばsudo apt-get update && sudo apt-get upgradeで。サーバ側では公開鍵と秘密鍵を生成し直す必要があるかと思います。 CAに登録される証明書の内容がそこそこ変わるのかもしれません(証明書の内容に公開鍵が含まれる為)。
5. 感想
ネットワークの基盤で使われるOpenSSLやBIND(DNSサーバのオープンソース)は槍玉に挙げられがちですが、ソースコードの品質の問題とは別問題であると思ってます。オープンソースであろうがなかろうが、セキュリティを突いた攻撃は存在します(攻撃者の多くはランダムなデータを自動生成して攻撃を試みるツールを用いるようです)。 脆弱性はイタチごっこなので、問題が判明した際に即座に対応できることが重要です。