RFC 5056 や RFC 9266で定められている TLS Channel Bindings の備忘録。
Channel bindings とは何か
Channel bindingsは、本質的に TLS の Finished の値である。Finishedは、一連のハンドシェイク・メッセージに対するハッシュ値である。この値は、TLSセッションの名前(ID)だと考え得る。
目的
Channel bindingsの目的は、MITM(Man in the Middle)攻撃を検知すること。
クライアントとサーバは、事前にユーザのパスワードを加工した形で共有する。Channel bindingsに対応したパスワード認証 SCRAM(Salted Challenge Response Authentication Mechanism)では、パスワードによるユーザ認証に加えて、channel bindingsを使って同じTLSセッションを使っているか確認できる。
同じTLSセッションを使っていれば、中間の攻撃者は存在しない。異なるTLSセッションを使っていれば、中間の攻撃者が存在することになる。
前提
中間の攻撃者が、TLSのサーバ認証をかいくぐる方法を持っているとする。中間の攻撃者は、クライアントを偽のサーバに対してTLSセッションを張るように誘導する。クライアントのTLSセッションが確立されたら、本物のサーバに対して別のTLSセッションを張る。
この状態では、中間の攻撃者は、暗号文を平文に戻せる。平文をそのまま再暗号化してリレーしたり、改竄してから暗号化し送信できる。
動作原理
MITM攻撃を検知するために、アプリケーションでSCRAMを使って、ユーザとTLSコネクションを認証する。
認証のやりとりに対する改竄は検知できる。なぜなら、認証のやり取り全体は、事前に共有した鍵(パスワード)を使った形でチェックサムが取られる。中間の攻撃者は、事前共有した鍵を知らないので、チェックサムが作れない。
リレーも検知できる。サーバが使うTLSセッション名とクライアントが使うTLSセッション名は異なる。ClientHelloには乱数が入っていることを思い出そう。クライアントから見ると、TLSの確立時に偽サーバとのTLSセッション名を得ている。リレーされた認証データには、本物のサーバが利用しているTLSセッション名が入っており、(改竄されようがされまいが)不一致が分かる。