TLSのダウングレード攻撃を防ぐSCSVとは

2018/01/09追記
TLS1.3の仕様ではダウングレード攻撃対策が異なっています。
TLS1.3もしくはTLS1.2に対応したサーバは、それ以下のTLSバージョンをねごシーエションする際はServerHelloのランダムの下位ビットに規定の文字列を挿入する決まりになりました。

クライアントはランダムの下位ビットを見てダウングレードしていないか確認します

2015/04/26追記
rfc7507としてTLSのSCSVはRFCとなりました。
draft-00よりIANA Considerationsの追加や、DTLSに関する記述が追加されています。

2015/08/04追記
中間者攻撃と言う表現は盗聴行為を含む攻撃であるが、今回は盗聴行為については必要が無いため表現を変更いたしました。

以上

ダウングレード攻撃

TLS通信を行う際、ハンドシェイクに失敗した場合にプロトコルのバージョンを下げて再接続を試みるクライアント実装もあります(レガシーなサーバとの接続性の問題があるため)。このようなクライアントは高いバージョンをサポートしていても、低いバージョンにフォールバックして接続することになります。


攻撃者はコレを利用し、中間者攻撃を行い通信経路上で(盗聴行為の有無は関係ありませんでした 8/4)ハンドシェイクを失敗させることでクライアントに低いバージョンでのネゴシエーションをさせることが出来ます。特にセキュアプロトコルなどでは、安全でないバージョンを強制されるため、特に問題となる。


IETFのuta wgがドキュメント化しているようにTLSの低いバージョンのプロトコルは使用すべきでありません(文書ではMUST NOT表記です)。
( Recommendations for Secure Use of TLS and DTLS )


このダウングレード攻撃を防ぐためにTLS Fallback Signaling Cipher Suite Value(TLS SCSV)という仕様が提案されています。

TLS SCSV

TLS_FALLBACK_SCSV

TLSではハンドシェイク時にClientHelloで対応している暗号スイートを送信しています。


SCSVでは暗号スイートとして「TLS_FALLBACK_SCSV」を新たに定義しています。これは実際にハンドシェイク中で選択されるものではありません。
TLS_FALLBACK_SCSV暗号スイートは、レガシーなサーバとの接続のためにダウングレードして再接続を行っていることを意味します。

サーバ動作

サーバは、ハンドシェイク中にClientHelloのcipher_suitesにTLS_FALLBACK_SCSVが含まれていて、ClientHelloで指定されるclient_versionより高いバージョンをサポートしていれば、inappropriate_fallback alertを送信しなければなりません(MUST)。これによりハンドシェイクは中断されます。

クライアント動作

クライアントは、サポートしているバージョンよりも低いclient_versionを使う場合は、TLS_FALLBACK_SCSVを付加すべきです(SHOULD)。
ただしセッション再開時や、ユーザにより意図的にバージョンが指定されている場合は例外になります。

実際に試す

SCSVを実際に試す