Heartbleed(2014-10-09)
(まぁ、今さらですが。忘れないように)
血を吹く心臓こと、Heartbleedのお話です。
これはOpenSSL*1の古いバージョンに見つかった脆弱性です。
この脆弱性を利用するとOpenSSLを使用したシステムにおいて(httpsが多いと思いますが)
攻撃対象が管理する、他人のIDやパスワードを盗んだり、暗号化通信用の鍵を盗んだりすることができます。
攻撃イメージは
- OpenSSLを使用したサーバに「Hello」というHeratbeatリクエストを投げる
- OpenSSLサーバはこれに対し「Hello」という貰った文字列をそのままHeartbeatレスポンスとして返す
これでOpenSSLが無事機能している(正常に通信ができること)が確認できます。
- ところがHeartbeatリクエストには、
- 上記の「Hello」のサイズ(=5文字、5byteですね)を指定する箇所があり
- かつ、このサイズには嘘のサイズを書くことも可能で、
- OpenSSLサーバ側ではサイズの正当性をチェックしていないというプログラミング上のバグがありました*2
- 攻撃側は、Heartbeatリクエストに本来より大きなサイズを(例えば65535byte)を指定して投げます
- OpenSSL側では、通常のレスポンス(例えば5byteの「Hello」)に加えて余計なデータ(65530byte)を返します
この「余計なデータ」はメモリ上にある、OpenSSLが作業用に保持しているあらゆるデータになります
そのデータは処理中のユーザIDだったり、暗号化用の秘密鍵データだったり、あらゆるデータです
- 攻撃側はこの大きなサイズを指定したリクエストをひたすら投げ続けて、
OpenSSLサーバのメモリ上のデータを吸い尽くした後、解析します。
まぁ、詳細はさておき。
この攻撃の特徴は「攻撃を受けてもログに残らない」点で、被害にあっていてもそれに気がつくことができません。
対象となるのは以下のバージョン
- 1.0.1 ~ 1.0.1f
- 1.0.2-beta ~ 1.0.2-beta1
対策は、OpenSSLのバージョンアップ。
ですが、やむを得ず暫定策を施すならば、Heartbeat機能を無効化して再コンパイルになります。