Time Flies

fckey's Tech Blog

OpenSSLの致命的なバグ"HeartBleed"を解説した動画を訳してみた

TechCrunchにOpenSSLのバグであるHeartBleedの解説動画が挙がっていたので訳してみた。 動画はクラウドのセキュリティサービスを提供しているElasticaのCTOであるZulfikar Ramzanによるものである。

[ビデオ]OpenSSLのバグ“Heartbleed”ってどんなの?

一応動画を追いつつ読めるよう多少意訳しつつもあえて発言通りの順序で文を構成してみた。

---以下訳---

SSL/TLSの実装であるOpenSSLに脆弱性が見つかった。

TLSを知らない人のために説明しておくと、Web上で安全な通信を実現するために一般的に使用されるプロトコルである。 TLSSSLの後継であり、今回の文脈でははほぼ同じと考えてもらって良い。

例えば”https”をWebブラウザで見たことがあるだろうがこの状態ではデータが暗号化されて送信されることを期待されており、Webサイトに与えるパスワードや秘匿情報は容易に誰かに盗聴されることはない。ここで、httpsのsはSSLによって暗号化することを意味している。

OpenSSLはTLSプロトコルを実装したものの1つであり最も広く使用されているため、Webを使用する全ての人がその頻度・使い方に関わらず気づかないうちに利用しているだろう。

現在、OpenSSLのバージョン1.0.1とβリリースである1.0.2の実装に脆弱性が有るため攻撃者が容易に情報を解読できてしまう。

このビデオではその攻撃について説明する。

まず、heartbeatとしてというTLSの拡張実装があり、この機能はたとえデータが送られていない場合でもTLSセッションを閉じてしまわないために使用される。 実際の所この機能は有用であり、heartbeatが出来る前はサーバクライアント間でギャップがあり、TLSセッションが意図せず途切れる事があった。また、heartbeatは接続先マシンがまだ利用中であるかの確認にも有用である。

このheartbeatはあるマシンから他のマシンにリクエストを送る時、payloadとそのサイズを送信する。 heartbeatリクエストに対する返信では、リクエスト時に送られたものと同じ内容のpayloadとちょっとしたpaddingが返される。

ここで、攻撃者は1byte程度しかないpayloadと嘘で大きめのサイズ(e.g. 65,636byte)をheartbeatリクエストとして送る。 するとOpenSSLのバグにより、heartbeatリクエストを受けたマシンは実際に受け取ったpayloadの大きさではなく、サイズで示された大きさのpayloadを返信してしまう。

つまり、リクエスト時点では1byteしかないpayloadが返信時には65kbyte以上になってしまうのである。大きくなったpayloadには、OpenSSLが使用しているメモリ上にあるリクエスト時のpayloadの1byteとそれに続く64kbyteが含まれる。 この64kbyteは決して他人に見られるべきではないデータであり、パスワードや秘匿情報、ひどい時には暗号を作成解読する鍵すら含んでいる。

もし攻撃者がこの鍵を保持した場合、彼らは通信を傍受して暗号を解読し、いとも簡単に秘匿情報を得ることが可能である。 さらに、攻撃者が過去の通信を記録していた場合にはそれすら解読可能であり、攻撃者は暗号化されるべき重要な情報を利用して更なる悪事を働くことが可能になる。

また、攻撃者は異なるサイズでのheartbeatに対する攻撃を何度も行うことも可能であり,悪いことに現在の実装ではそれをトレースすることが出来ない。

http://heartbleed.com/ に更に詳しい情報があるので気になる人は確認して欲しい。

---訳終わり---

心配な人はOpenSSL 1.0.1g を使うか、-DOPENSSL_NO_HEARTBEATS オプションを付けて再コンパイルするといいみたいですよ。

いじょ。

マスタリングTCP/IP SSL/TLS編

マスタリングTCP/IP SSL/TLS編