あどけない話

Internet technologies

Channel Bindings 備忘録

RFC 5056RFC 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セッション名が入っており、(改竄されようがされまいが)不一致が分かる。