OpenSSL脆弱性 そもそもSSLとは?

この記事を書く3日前、とあるサイトの「https://」URLにアクセスしたところ「証明書がおかしい気がする」とchromeさんに言われてアクセスできず、なんか変だなと思っていたところ、こんな記事が・・・・

OpenSSLにまた重大な脆弱性、直ちにパッチ適用を

脆弱性はOpenSSL 0.9.8y以前の全てと1.0.0~1.0.0l、1.0.1~1.0.1gに存在する。OpenSSLのハンドシェーク中に、不適切な状態でChangeCipherSpecを受理してしまうことが原因となって、第三者が知ることのできる「弱い鍵」を使用させるよう仕向けることができる。この結果、本来ならば適切に暗号化されるはずの通信内容や認証情報など重要な情報を、攻撃者によって詐取/改ざんされる恐れがある。プロトコルや暗号アルゴリズムには依存せず、影響を受ける恐れがあるという。

OpenSSLとは

https://で始まるURLにアクセスした時は以下の通信が行われている。

OpenSSLに再び脆弱性、MITM攻撃につながる恐れ

インターネット上で標準的に利用される暗号通信プロトコルであるSSLおよびTLSの機能を実装した、オープンソースのライブラリ(プログラム部品)。

外部のソフトウェアから呼び出して利用するライブラリプログラムの一種で、自分の開発したソフトウェアにSSL/TLSによる暗号通信機能を組み込むことができる。オープンソースソフトウェアとして公開されているため、誰でも自由に入手・利用したり開発したプログラムと共に再配布したりすることができる。様々なプログラミング言語やOSに対応しており、プログラムに暗号通信機能を組み込む手段として様々な分野で幅広く利用されている。

なるほどわからん。

SSLとかTLSとか、実装とかオープンソースとか、ライブラリとか・・・。

そこで勉強した。
下記リンク先の記事が自分には一番わかりやすかった。
http://www005.upp.so-net.ne.jp/nakagami/Memo/SSL/

ここに上の記事を読んで理解したSSLというシステムがなんなのかをメモったときのメモ帳を公開する。

SSLとは、どんな仕組み?

20140607-060750-22070220.jpg
①しかるべき機関に「こいつは信頼でますよ」と書かれた証明書を持ったサーバー(絵でいうServer)とクライアント(絵でいうclient)が初めての(何度目かの)やり取りをする。そのとき、クライアントは証明書と公開鍵を得る。(秘密鍵はサーバーが作り、秘密鍵を使って作った公開鍵と証明書だけ皆に見えるようにしている。)

②公開鍵と証明書を持っているクライアントとサーバーの間で「共通鍵」(共有鍵ともいわれる)をお互いに持つ。お互いにその鍵を使うかどうかはサーバーの持つ「秘密鍵」によって作られた「公開鍵」をクライアントが持っているかどうかで決まる。
※サーバーに対してクライアントは無数にある。クライアントは個々に違うサーバーとの共有鍵を持つ。

③それ以後の通信は共通鍵で行う。クライアントは「共通鍵」をつかって送るデータ(手紙の内容)を暗号化する。この時点ではクライアントしかデータの中身(手紙の内容)を知らない。

④クライアントは暗号で自分しか知りえないデータ(暗号文の書かれた手紙)を、サーバーに送る(投げる)

⑤サーバーは、クライアントと自分が持っている鍵、すなわち「共有鍵」で、投げられたデータ(暗号文の書かれた手紙)を復号化する。

⑥サーバーがクライアントから送られてきたデータ(手紙の中身)を平文で読む

20140607-060750-22070569.jpg
⑦クライアントから送られてきたデータ「スキ」という告白に対してサーバーは返事を書く。その返事はやはりクライアントと共有している鍵を使って暗号化する。この共有鍵によって暗号化することでお互いのデータ(手紙)のやりとりがクライアントとサーバーにしかわからない。

⑧共通鍵によって暗号化したデータ(「スキ」という告白に対する返事)を送り返す。もし、途中で届かなくてどこかに落ちてしまったとしても、それを拾って読んだ第三者は、手紙の中身が暗号化されているので読んでも何が書いてあるのかわからない。

⑨クライアントは、サーバーが送り返してきた「スキ」という告白の返事を受け取る。暗号化されているのでクライアントとサーバーでしか知り得ない共有鍵を使って暗号文を復号化する。

⑩クライアントは復号化されて平文のデータを読んでみる

⑪クライアントは「ムリ」と書かれたサーバーからの返事を初めてここで見ることになる。告白失敗。サーバーはまた他の誰かからの通信を待って証明書と公開鍵をフリフリする。

以上が「SSL」通信の仕組みである。

ポイントは

  1. 公開鍵・証明書はサーバーが自分しか知らない秘密鍵を使って作る。
  2. 公開鍵・証明書はだれでも受け取れるようになっている。
  3. サーバー・クライアントのやりとりは共通の鍵を使って暗号化、他の人は何が書いてあるのかわからない。

OpenSSLというのはこのSSL通信の仕組みを実現するためのライブラリ(一種のソフトウェア)なのである。OpenSSLに何か不具合があるということはこの通信の秘密の保証ができなくなるということなのである。

2014年6月5日発表の脆弱性の内容

第三者がサーバーとクライアントの二者間のやりとりを見るのは難しい。
しかし、今回の脆弱性はサーバーとクライアント間でしか知り得ない「共通鍵」が第三者によって取得されて、
サーバーにも、クライアントにもなりすますことができる、というのがヤヴァイらしい。
つまり、サーバーとクライアントのやりとりを全部見ることができてしまうし、悪い人が正しいサーバーになりすましてクライアント(サービスを受ける側)からの通信内容を読み取れてしまう。

例えば、
見た目だけ銀行サイトになりすまして、暗号化されているはずのIDやパスワード、入金金額の情報を盗み見ることができる。

それができてしまうというのが今回の脆弱性の内容らしい。自分はコンピューターには疎いのでどうやってそれができるのかは謎だが、知識がある者がそれを試みる可能性がある。その可能性があるというだけで充分な脅威である。

2014年4月に発表された「Heart Bleed」ではメモリに残った秘密鍵と公開鍵を取得できてしまうため、秘密鍵自体の交換と、公開鍵・証明書の再発行が必要になったが、今回の脆弱性はOpenSSLをアップデートすること(またはセキュリティパッチを当てること)で防げるそうだ。

通信の仕組みに関して自分は全然わかっていないが、要はそういうことだったらしいということを今回改めて勉強したのでブログにのこしました。
間違っている内容がありましたらTwitterまたはfacebookでご指摘いただけると幸いです。

以上になります。
おやすみなさい。