今日、暗号化トンネルを記録し、来年サーバーの長期秘密鍵を盗み、その記録の復号を試す。前方秘匿性とは、盗まれた鍵だけでは足りないという性質である。これは記録済みセッションと特定の秘密についての主張であり、トンネルが安全だったという一般的な約束ではない。範囲を正しく押さえることが、この用語を有用にする。

問いは記録についてであり、稼働中のセッションについてではない

長期鍵は端点を識別し、ハンドシェイクに署名する。セッション鍵は実際の通信を暗号化し、前方秘匿性のある設計では、双方が生成して後で破棄する新しい鍵交換材料から導出される。長期鍵だけを持つ攻撃者は、破棄された値を再構成できない。稼働中のセッション状態を持つ攻撃者なら依然として可能であり、だからこそ保証は現在ではなく過去についてのものになる。

この主張は条件付きであり、一時的な秘密が実際に破棄され、プロトコルが想定どおりの場合にのみ成り立つ。混在した配備では、一方のトンネルで満たし、他方で満たさないことがある。

一つの秘密が他を再構成してはならない

マーケティングページではなく、ネゴシエートされたモードを確認する。ハンドシェイクの出力には鍵交換とプロトコル版が示される。

openssl s_client -connect vpn.example.com:443 -tls1_3 -brief
swanctl --list-sas

s_client の要約は TLS の版と鍵交換グループを示し、一時的なグループが前方秘匿性のある鍵合意の目に見える印である。swanctl の一覧は IKE と CHILD の関連を鍵更新タイマーとともに示すので、配備が予定どおりに鍵を更新するか分かる。静的な RSA 鍵交換や古い互換モードは、暗号名に関係なくこの性質を失う。ベンダーが宣伝したモードではなく、実際に観測したモードを記録する。

鍵の更新は自動的に前方秘匿性ではない

トンネルがどれだけ頻繁に鍵を更新するかは、各鍵がどう導出されるかとは別の問いである。長期秘密から鍵を再生成する設計は、後からの侵害がそれらすべてを再構成するため、毎分更新してもなお試験に落ちる。逆に、更新がまれなプロトコルでも、各交換が独立していれば前方秘匿性を保てる。導出を読み、間隔を読まず、短い再接続タイマーを暗号学的保証と混同しないこと。

同じ混同は暗号名にも現れ、現代の暗号がその鍵の届き方を語ることはない。

保証の後も見えているもの

前方秘匿性は記録済みセッションの平文を将来の鍵侵害から守るが、侵害された端点で稼働中の通信を読む攻撃者には何もしない。記録から宛先アドレス、時刻、量を取り除くことも、事業者が接続ログをどれだけ保持するかを制限することもしない。侵害されたクライアントを信頼できるものに変えることもない、なぜなら攻撃者はすでに、内容が平文で存在する場所に座っているからだ。

事業者が前方秘匿性をうたうときは、どの長期秘密が盗まれたと想定され、どのセッション秘密が利用不能のままかを尋ねる。この二つの問いに明確な答えがあれば、その主張は意味を持つ。

関連記事