SSLダウングレード攻撃に備える

以前SSL証明書を取得してnginxの設定を入れたのだけど、 そのままだとセキュリティ的によろしくなさそうなので更新を。

SSLの通信は、ざっくり捉えると下図のようなシーケンスをたどる。

暗号化といっても色々なアルゴリズムがあるので、 サーバとクライアント間で同じアルゴリズムを利用しなければ正しく復号できない。 従って、最初にどのアルゴリズムを利用するかのネゴシエーションがある。 当然ながらこの段階では平文で通信しなければならない。

まず、Client Helloで端末側で対応している暗号スイーツを送る。 (実際のパケットはこんな感じ) 暗号スイーツとは、暗号化のアルゴリズムのことと捉えて貰って問題ない。 サーバ側は、送られてきた暗号スイーツの中から一つを選び、 Server Helloでクライアントに伝える。 この段階でようやく暗号化アルゴリズムが決定するので、 ここから暗号通信が開始される。

つまり、Client HelloやServer Helloを傍受すれば、 内容を読み取ることも、改ざんすることも可能ということだ。 この点を利用した、SSLダウングレード攻撃というものがある。

まず、Client Helloを改ざんし、強力な暗号アルゴリズムの対応情報を削除する。 サーバは、Client Helloの中にあるアルゴリズムから選択しなければならないので、 弱い暗号アルゴリズムを選ばざるを得ない。 従って、開始された暗号通信も、暗号強度としては弱いものになる。 弱い暗号であれば解読は容易になってきているので、 通信内容を盗聴することができる。 要するに、Client Helloを改ざんして、しょぼい暗号を利用させる攻撃である。

平文通信の改ざんは防ぐことも改ざんされたことを検知することもできないため、 これに対して行える防御はサーバ側で行うしかない。 サーバ側で、弱い暗号は選択しないように予め設定しておく。 もしクライアントから弱い暗号の対応情報しか送られてこなかった場合、 非対応としてセッションを切ってしまう。 通信は開始できなくなるが、通信を盗聴されるよりはマシだという考え方だ。

実際の設定は簡単で、nginxの場合は、sites-enabled内のSSL設定を入れているファイルを以下の設定を加える。

ssl_protocols  SSLv3 TLSv1; #SSLv2以下は利用しない
ssl_ciphers     RC4-SHA:HIGH:!ADH; #強力な暗号スイートのみを利用する
ssl_prefer_server_ciphers   on; #暗号の選択をサーバ側で決定する

Apacheならこう

SSLCipherSuite RC4-SHA:HIGH:!ADH
SSLHonorCipherOrder ON

追記: 設定完了後は、Qualys SSL Labsのサイトからチェックが行える。 安全性を点数で表示してくれるので、一度試してみるといいかもしれない。

Written on August 23, 2012