要約

  • RFC 6528 は TCP のシーケンス空間を前進させつつ、ローカルとリモートのアドレス・ポートを鍵付き関数に入れ、接続間の数値関係を見えなくする。
  • これは経路外からの盲目的予測を減らすが認証ではない。鍵の更新、TIME-WAIT、NAT の情報漏えい、エフェメラルポート選択は同じ制御面に残る。

初期シーケンス番号には反対方向の二つの仕事がある。新しい接続の再生成が古いセグメントを受け入れないよう前進しなければならない。一方で、次の接続がどこから始まるかを明かしてはならない。誰にでも読める一つの時計は、前者を満たしながら後者を損なう。

RFC 793 は、約4マイクロ秒ごとに1増える32ビットの全体生成器を提案した。RFC 6528 は、古いセグメントの排除の多くを TIME-WAIT と TCP の quiet time が担うと指摘する。ただし BSD 系の一部スタックは、ISN の単調増加を同じ接続の素早い再生成を認める判断に使った。時計は互換性の慣行であると同時に、予測の入口になった。

経路外の攻撃者は応答を見る必要さえない場合があった。以前の正規接続からサーバーの次の ISN を推測できれば、三者間ハンドシェイク最後の ACK を偽造し、送信元アドレスを信頼するサービスを利用できる。歴史的なリモートログインは多くが SSH に置き換わったが、IP アドレスによる信頼は残る。トランスポートの予測可能性が、アプリケーションの誤った境界を増幅した。

ISN を毎回完全にランダムにすれば予測は難しくなるが、単調な前進を期待する再生成ヒューリスティックを壊し得る。閉じた全接続の状態を保管すれば安全性を戻せるが、メモリを消費する。RFC 6528 は、同じ接続識別子の中では前進し、異なる識別子同士には明らかな関係を持たせない第三の方法を選んだ。

会話ごとに異なる秘密のオフセット

推奨式は ISN = M + F(localip, localport, remoteip, remoteport, secretkey) である。M は4マイクロ秒タイマー、F は接続の四つ組と秘密を入力にする擬似乱数関数だ。タイマーが進行を保ち、鍵付きオフセットがローカルとリモートのアドレス・ポートの組み合わせごとに別の見かけの空間を作る。

重要なのは複雑に見えることではない。F は外部から計算できてはならない。できれば、一つの接続で見た ISN が別の接続を予測する材料になる。四つ組自体は秘密ではないため、保護は鍵と、鍵なしで出力を復元できない関数に依存する。

この分離なら、終了した全接続の履歴を保存しなくてよい。同じ四つ組を再利用しても M が空間を前へ進め、別の四つ組には別のオフセットが与えられる。TCP に乱数を貼り付けるのではなく、連続性と接続間の不透明性を両立させる仕組みである。

秘密にもライフサイクルがある

RFC 6528 は、この脅威モデルでは128ビットの鍵で十分だろうとし、真の乱数またはホストごとの秘密を認める。更新契機として起動時、一定またはランダムな時間経過、十分な使用回数を挙げる。どれも無償の保守ではない。

鍵を変えると、再生成された接続の ISN 空間も変わる。終了状態を保持しないなら、最大セグメント寿命の2倍だけ通信を静める必要がある。TIME-WAIT を無視した安全対策は、守るはずだった時間的な性質を壊し得る。

RFC は限定された経路外予測モデルで MD5 を許容しつつ、より強い関数との比較を求める。この判断は2012年の境界に限られ、MD5 を認証に推奨するものでも、現在の OS 実装を示すものでもない。

良い ISN は緩和策にすぎない。接続開始を盗聴できる者はシーケンス状態を知り、経路上の攻撃者はさらに大きな力を持つ。RFC は IPsec と TCP-AO を暗号学的な認証境界として挙げる。また、異なる ISN 空間が NAT 内部のホスト数を推定させる可能性と、エフェメラルポートのランダム化が四つ組の推測を難しくする効果も記す。

唯一の情報源は、2012年2月に Standards Track として公開された RFC 6528 である。RFC 1948 を廃止し RFC 793 を更新する。盲目的予測を減らす設計を定めるが、現在の既定値、鍵更新や攻撃頻度を報告してはいない。