IT用語/Heartbleed

Heartbleed(2014-10-09)


(まぁ、今さらですが。忘れないように)
血を吹く心臓こと、Heartbleedのお話です。

これはOpenSSL*1の古いバージョンに見つかった脆弱性です。
この脆弱性を利用するとOpenSSLを使用したシステムにおいて(httpsが多いと思いますが)
攻撃対象が管理する、他人のIDやパスワードを盗んだり、暗号化通信用の鍵を盗んだりすることができます。

攻撃イメージは

  1. OpenSSLを使用したサーバに「Hello」というHeratbeatリクエストを投げる
  2. OpenSSLサーバはこれに対し「Hello」という貰った文字列をそのままHeartbeatレスポンスとして返す
    これでOpenSSLが無事機能している(正常に通信ができること)が確認できます。
  3. ところがHeartbeatリクエストには、
    1. 上記の「Hello」のサイズ(=5文字、5byteですね)を指定する箇所があり
    2. かつ、このサイズには嘘のサイズを書くことも可能で、
    3. OpenSSLサーバ側ではサイズの正当性をチェックしていないというプログラミング上のバグがありました*2
  4. 攻撃側は、Heartbeatリクエストに本来より大きなサイズを(例えば65535byte)を指定して投げます
  5. OpenSSL側では、通常のレスポンス(例えば5byteの「Hello」)に加えて余計なデータ(65530byte)を返します
    この「余計なデータ」はメモリ上にある、OpenSSLが作業用に保持しているあらゆるデータになります
    そのデータは処理中のユーザIDだったり、暗号化用の秘密鍵データだったり、あらゆるデータです
  6. 攻撃側はこの大きなサイズを指定したリクエストをひたすら投げ続けて、
    OpenSSLサーバのメモリ上のデータを吸い尽くした後、解析します。

まぁ、詳細はさておき。
この攻撃の特徴は「攻撃を受けてもログに残らない」点で、被害にあっていてもそれに気がつくことができません。

対象となるのは以下のバージョン

  • 1.0.1 ~ 1.0.1f
  • 1.0.2-beta ~ 1.0.2-beta1

対策は、OpenSSLのバージョンアップ。
ですが、やむを得ず暫定策を施すならば、Heartbeat機能を無効化して再コンパイルになります。


*1 SSLという暗号化通信に使う為のソフトウェア。オープンソースで、ほぼデファクトスタンダード。だから当時大騒ぎになりました。。
*2 C言語で、mallocで取得した初期化していない(メモリ内容が残ったままの)領域をレスポンスとして返してしまうようです。malloc領域(上の例だと65535byte)とそれに入れるはずのmemcpyサイズ(5byte)の不一致が検証できていなかった模様。

  最終更新のRSS