目次

TLS renegotiation

以前の TLS renegotiation に存在した脆弱性

CVE-2009-3555 関係参照

CVE-2011-1473 関係参照

問題点 (CVE-2009-3555)

   Client                        Attacker                        Server
   ------                        -------                         ------
   ----------- Handshake -----------> (Attacker hold)
                                     <----------- Handshake ---------->
                                     <======= Initial Traffic ========>
                                     (Renegotiation is triggerd)
   <--------------------------  Handshake ============================>
   <======================== Client Traffic ==========================>

(RFC5746の図を改変)

  1. Client は Server と TLS 通信を確立しようとするが Attacker が Hold する
  2. Attacker はサーバとハンドシェイクを行う
  3. Attacker は暗号通信を開始し,(例えば) http の一部のデータを送る.ここで http 的には中途半端な状態まで送出しておく (最後の行を X-ignore: で終わらせておくとか)
  4. Attacker は再ネゴシエーションを開始する
  5. Attacker は Hold していた Client からの Handshake を再開し,Client と Server に Handshake の内容を送る.この時,Attacker 〜 Server 間は 3 で使っていた暗号化された通信路を通る.
  6. Client と Server は暗号通信を開始する.この内容は Client 〜 Server 間でネゴシエーションされているので Attacker は内容を知ることはできない.(この攻撃が成り立つのが図のような MITM 攻撃のみである理由)
  7. Client は http のリクエストを Server に投げるが,先に Attacker が送出済みの X-ignore: ヘッダの後に連結されるので,Client が送出したリクエストの一行目は無視される.
    X-ignore: GET /path/
    Cookie: hogehoge

問題点 (CVE-2011-1473)

RFC5746 (メモ)

メモ

(理解の過程のメモなので読む必要なし)

Client certificate authentication

クライアント認証機能を設定できる HTTPS サーバは一般的にディレクトリ毎の設定が可能である.これは,クライアントからのリクエストを受けとるまでは,クライアントが有効な証明書を提出するということを断言できず,サーバが持つ認証ルールでフィルタすることもできない.

クライアント認証が必要である事が分かったリクエストについては,HTTPS サーバはクライアントからクライアント証明書を受け取り,確認を行うために,その時点で TLS チャンネルの再ネゴシエーションを行わなければならない.サーバで有効な証明書が見つかれば,サーバはその時点でリクエストを処理するように強制できる.

不幸なことに,HTTP には新たに認証されたチャンネルないでリクエストを再送信するようにクライアントに求めるための具体的なレスポンスコードが欠如しているため,サーバはオリジナルのリクエストにさかのぼって認証 (authentication) を適用する必要がある.暗号的にはギャップが存在しないにも関わらず(新しい鍵のネゴシエーションは古い鍵の保護の下で行われる),サーバとクライアントの認証の連続性は失われる.(<color gray>ここで言っている「認証 (autentication)」が何の認証なのかがイマイチわからない.例えば HTTP 的にやりとりされている何らかの認証情報 (Cookie でやりとりされているアプリのセッションの情報とか) の事か?</color>)

セッションの回復 (resumption) (<color gray>← SSL/TLS プロトコル上での resumption を指す.Hello メッセージで session_id を指定する</color>) がない限り,最初のクライアントのコネクションから再ネゴシエートしたセッションへ繰り越される重要な暗号の状態は存在しない.テストした HTTPs サーバやクライアントで,再ネゴシエーションの間にセッションの回復の指示が観察できたものはなかった (プロトコルのオプショナル機能なのでそれほど必要とされていない).事実,再ネゴシエーションは新しい暗号化コンテキストを始めるためにデザインされているのに対して,回復 (resumption) は純粋に前の暗号化コンテキストを resume するための最適化のためにデザインされている.その意味では,これらの二つの操作は直行する目的のためにデザインされている.