今年最も世界に衝撃を与えたのはHeartBleedだろう。 オープンソース実装としては最もメジャーで、 世界中で非常に多く使われているSSL実装であるOpenSSLに、 重大な脆弱性が存在することが発覚した。
OpenSSLのハートビートという機能のバグで、 メモリ内の任意のバイト列が閲覧できる脆弱性があった。 ハートビートは死活監視のための機能で、 パケットを送るとメモリの一部が見れるようになっている。 この時、リクエストされたメモリサイズのチェックがされなかったため、 任意の長さのメモリを覗き見ることができたようだ。
修正コミットも本質的な部分はたった一行で、
if (write_length > SSL3_RT_MAX_PLAIN_LENGTH)
return 0;
返却バイト数が定数値より大きかったら処理を止める条件が追加されただけだった。
メモリ内のバイト列を覗かれることで、サーバの秘密鍵が盗まれる可能性があった。 ランダムなバイト列が返されるので実際には簡単には盗まれないが、 可能性があるというのは盗まれていると同義と考えるべきである。
SSLによる通信は、クライアントごとに別々の共通鍵を使って暗号化される。 そのため秘密鍵が漏れても直接通信の内容が復号できるわけではない。 しかし、共通鍵のやりとりをするのに公開鍵暗号が使われるので、 共通鍵のやりとりまで覗かれた場合、すべての通信が復号される。 その秘密鍵を使っていた時点の通信ログをすべて保存していた場合それが可能になる。 悪意のあるプロバイダ、WiFi管理者、社内ネットワーク管理者などが容易に実行できる。
バグが混入してから3年間知られずに放置されてきたが、誰も知らなかったとは限らない。 脆弱性に気づきながらそれを利用して攻撃をおこなっていた者がいたかもしれない。 インターネットの自由を脅かす最大の敵であるNSAが脆弱性を利用していたという話もある。 最長で3年間すべての通信が覗き見られていた可能性がある。
サーバ管理者はまずOpenSSLを最新に更新し、脆弱性を潰さなくてはならない。 さらに、証明書が漏れていると考えるべきなので証明書を再発行しないといけない。 自分のサーバがOpenSSLを使っていないとしても、無関係と言い切れないかもしれない。 認証局がOpenSSLを使っていて、その通信が安全でない場合、発行された証明書は最初から漏れているかもしれない。 再発行のプロセスで使う通信経路は本当に安全なのだろうか・・・
さらに、サーバ管理者は現在のユーザのセッションを無効化しなければならない。
漏れたユーザの通信内容から、セッションキーを復元し、なりすましアクセスが可能だからである。
KVSを使っている場合はキーを全削除する。
セッション情報をすべてCookieに持っている場合、例えばRailsなら、
config/secrets.yml
が参照する ENV['SECRET_KEY_BASE']
を新しいものに変更する。
ユーザは、サーバの安全が確保されるまで、そのサービスを利用するべきではない。 すべての通信が覗かれているとみなすべきだからである。
サーバ管理者が上記のセッション無効化をしていない場合を考慮し、ログアウトするほうが良いかもしれない。 KVSを使っている場合、ログアウトによりそのセッションキーが削除されるかもしれない。 キーが削除された場合、以前に漏れたキーではアクセスできなくなる効果が期待できる。 しかし、Cookieセッションの場合これは全く意味がない。 このように効果に確実性が薄く、ログアウトのためのアクセスも危険であることには変わりないので、 危険を冒すくらいならやらないほうがいいかもしれない。
サーバの安全性が確保され、管理者から安全宣言などが確認されたら、 ユーザはすぐさまパスワードを変更しなくてはいけない。 過去の通信内容が漏れているなら、ログインIDとパスワードも、もちろん復元されていると考えられるからだ。 過去の通信内容の漏洩に関してはもう諦めるしか無い。 例えばFacebookのメッセージで重要な情報をやりとりしていたのなら、漏れたものとして対処しないといけない。 リアルセキュリティに心配があるのなら引っ越しなども視野に入れるべきだ。
インターネットの安全性を担保する基本的な部分に見つかったバグは、一瞬で全世界を大混乱に陥れた。 人類は初めてインターネットの何もかもが信頼できないという経験をしたのではないだろうか。 一応の対処が行われ世界は安全を取り戻したように見えるが、本当にその対処の全ては安全なチャネルで行われたのか。 すでに新しい証明書は漏れているのではないか・・・
杜撰な管理が明らかになったOpenSSLは、 その後次々と脆弱性が見つかり、大規模なリファクタリングが継続して行われている。 この事件を教訓に、Googleなどの大手が重要なオープンソースに対して資金を投入するプロジェクトを立ち上げたのは人類の大きな進歩である。