TL

TCP シーケンス番号予測と接続乗っ取りの原理

なぜ初期シーケンス番号をランダム化するのかが腑に落ちる。ISN推測によるブラインド攻撃の成立条件から、RST・データ注入、ランダム化と帯域内検証による緩和の歴史までを原理から押さえます。

応用TCPセキュリティシーケンス番号スプーフィングISN最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.経路を盗聴できない攻撃者でも、ISNを推測できれば正しいシーケンス番号で偽装パケットを送り込み、コネクションを乗っ取れる(ブラインドインジェクション)。
  • 2.受信ウィンドウ内のseqを当てれば、RST注入で接続を切断したり、データ注入でストリームに任意バイトを混入できる。窓が広いほど推測は当てやすい。
  • 3.緩和の本筋はISNを予測困難にする乱数化(RFC 6528)。これに加え帯域内RST検証やTCP-AOで、推測・盲打ちのコストを引き上げる。

シーケンス番号が認証を兼ねている

TCP は IP の上に信頼性を載せるプロトコルですが、その信頼性の土台であるシーケンス番号が、意図せずゆるい認証としても機能しています。受信側は「期待するシーケンス番号の範囲(受信ウィンドウ)に入ったセグメントだけを受理する」ため、攻撃者が偽装パケットを差し込むには、宛先が今まさに待っている seq を当てなければなりません。逆に言えば、seq を当てられればパケットの送信元 IP を詐称しても受理されうる——ここが攻撃の入り口です。

攻撃者を 2 種類に分けると理解が整理できます。経路上でパケットを盗聴できる on-path 攻撃者は seq を読めるので話は単純です。問題は経路を見られない off-path(ブラインド)攻撃者で、彼らは seq を推測するしかありません。本稿が扱うのはこの盲打ちの成立条件と、それを潰してきた歴史です。コネクション確立で双方向の初期シーケンス番号(ISN)を同期する手続きは TCPの状態遷移とコネクション確立・切断の内部 を前提とします。

ISN 予測:3 ウェイハンドシェイクの盲点

3 ウェイハンドシェイクで、サーバーは自分の ISN y を SYN+ACK で返します。クライアント(の IP)になりすました off-path 攻撃者は、この SYN+ACK を受け取れません(応答は本物のクライアント IP へ飛ぶため)。にもかかわらず接続を成立させるには、最後の ACK で ack = y+1 を返す必要があります。つまり攻撃者は y を見ずに当てるしかありません。

攻撃者(Aの送信元IPを詐称)        サーバー        本物のクライアントA
    |-- SYN(src=A, seq=x) ------->|
    |                             |-- SYN+ACK(seq=y) -->|  ← 攻撃者には届かない
    |                             |                     |(Aは身に覚えがなくRSTを返しうる)
    |-- ACK(ack=y+1) 推測 ------->|  ← yを当てられれば ESTABLISHED

初期の実装では ISN が一定間隔で単調増加するだけでした(例:一定時間ごとに固定量を加算)。これだと攻撃者はまず自分の正規 IP でサーバーに 1 本接続して現在の ISN を観測し、そこに「経過時間ぶんの増分」を足すだけで、次に詐称接続で返ってくる y を高精度に予測できます。1985 年に Morris が記述し、1994 年の Mitnick 事件で実用化されたのがこの手口です。

なぜ予測できると乗っ取れるのか

ISN が当たれば、攻撃者は信頼関係(当時の rlogin など IP アドレスだけで認証する仕組み)を悪用し、サーバーから見て「信頼ホストAから来た正規接続」として任意コマンドを送り込めました。鍵は「seq/ack さえ整合していれば、TCP は送信元 IP の真正性を確かめない」という事実です。シーケンス番号が事実上の弱い共有秘密になっていたわけです。

確立済み接続への注入:RST と データ

ISN 予測は「新規接続のなりすまし」ですが、既に確立済みの接続に割り込む攻撃もあります。こちらは ISN ではなく、現在進行中の seq が受信ウィンドウのどこにあるかを当てる問題になります。受信側は「seq が受信ウィンドウ [RCV.NXT, RCV.NXT + RCV.WND) に重なる」セグメントを受理するため、窓のどこか 1 点に当たれば偽装パケットが通ります。注入には主に 2 系統あります。

観点RST 注入(接続リセット)データ注入(ストリーム汚染)
狙い確立済み接続を強制切断する受信ストリームに任意バイトを混入する
当てる対象ウィンドウ内に入る seq を1つRCV.NXT に正確に一致する seq
許容のゆるさ窓内ならどこでもよい(緩い)左端ぴったりが必要(厳しい)
成立後の効果片方が即CLOSEDへ落ちるアプリ層に攻撃者のデータが渡る
代表的悪用BGPセッション切断・通信妨害HTTPレスポンス改ざん等

要点は許容のゆるさの差です。RFC 793 当時の RST 処理は「ウィンドウ内に入る seq なら受理」だったため、攻撃者は窓の幅ぶんだけ当たりやすくなります。受信ウィンドウが W バイトなら、2^32 通りの seq 空間のうち約 W 点が当たりで、推測の試行回数の期待値は概ね 2^32 / W です。広帯域回線では W が大きく(数十万〜数百万バイト)、現実的な試行数で当たってしまいます。

seq 空間(0 .. 2^32-1)を一周のリングとみなす
                RCV.NXT          RCV.NXT+RCV.WND
                  |                    |
  ────────────────[####受信ウィンドウ####]──────────────
                  └ この帯に入る seq の RST/データは受理されうる
  W が広い ⇒ 帯が太い ⇒ 盲打ちの命中率が上がる
BGP セッションへの RST 攻撃

ルータ間の BGP セッション(長寿命の TCP)に RST を当てて切ると、経路情報が引き直され広域に影響します。off-path でも、宛先ポート179・既知の対向IPからseqを総当たりすればよく、2004 年に現実的脅威として広く認知されました。緩和として TTL を 255 に固定して受信側で 255 以外を捨てる GTSM(RFC 5082)や、後述の TCP-AO による認証が使われます。経路への影響は BGP の経路選択(パス属性と最適経路決定) と合わせて捉えると深刻さが分かります。

緩和の本筋:ISN ランダム化(RFC 6528)

最も根本的な対策は ISN を予測困難にすることです。素朴には「ISN を完全な乱数にすればよい」と思えますが、それでは TIME_WAIT 中の古い重複セグメントが新接続に紛れ込むのを防げません。TCP は元々、ISN を約 4 マイクロ秒ごとに +1 するグローバルクロックで進める設計で、これが「同一 4 タプルの古いセグメント排除」を担っていたからです(ここを壊すと別の不具合が出ます)。

RFC 6528 が標準化した解は、クロックは残しつつ接続ごとに秘密値で味付けする方式です。

ISN = M + F(localIP, localPort, remoteIP, remotePort, secretKey)

  M : 4マイクロ秒粒度で進む従来のグローバルクロック(古い重複対策を維持)
  F : 4タプルと秘密鍵を入力とする暗号学的ハッシュ(例 MD5/SHA系)

ここで M が時間軸の単調増加を保ち、古い重複の排除という本来の役割を維持します。一方 F は 4 タプルごとに観測不能なオフセットを与えるので、攻撃者が自分の接続(別の 4 タプル)で ISN を観測しても、詐称したい接続の F 値は推定できません。secretKey がプロセス生存中は固定なので、同一 4 タプルでは ISN がきちんと単調増加し、整合性も保たれます。

やってはいけない緩和:完全乱数化と recycle

ISN を毎回まったくの乱数にすると、同一 4 タプルでの単調増加が崩れ、古い重複セグメントの受理や接続確立失敗を招きます。RFC 6528 がクロック項 M をわざわざ残すのはこのためです。また Linux の tcp_tw_recycle のように TIME_WAIT を強引に縮める旧機能は、NAT 配下の複数クライアントで誤切断を起こし既に廃止されました。安全側の挙動は TIME_WAIT が必要な理由とポート枯渇 を参照してください。

帯域内検証と認証:盲打ちのコストを上げる

ISN ランダム化は新規接続のなりすましを潰しますが、確立済み接続への RST/データ注入には「窓内のどこかに当てればよい」ぶんの余地が残ります。これを補うのが帯域内(in-band)の追加検証です。

  • RST のシーケンス検証強化(RFC 5961):RST の seq が RCV.NXT完全一致しなければ即リセットせず、代わりに Challenge ACK(現在の RCV.NXT を載せた ACK)を返す。攻撃者は窓内に当てるだけでは切れず、左端ぴったりを当てる必要が生じ、命中確率が窓幅ぶんから 1 点ぶんへ激減する。
  • SYN・データの整合チェック強化:確立中接続に届く SYN や、窓外データに対しても Challenge ACK で正当性を問い返す。
Challenge ACK がもたらした皮肉な副作用

RFC 5961 はレート制限つきで Challenge ACK を送りますが、この「グローバルなレートカウンタ」が 2016 年にサイドチャネルとして悪用されました(CVE-2016-5696)。攻撃者が観測用の接続で Challenge ACK を消費させ、カウンタの枯渇有無から「自分の盲打ちが窓に当たったか」を間接的に判定でき、off-path でも seq を効率的に絞り込めたのです。教訓は、共有状態のレート制限がそのまま観測可能な情報漏れになりうること。後に per-connection 化などで修正されました。

より強い保証が要る経路では、TCP セグメントそのものを暗号学的に認証します。古い **TCP MD5 署名(RFC 2385)**は BGP 保護に広く使われましたが鍵更新やアルゴリズムが固定で弱く、後継の TCP-AO(Authentication Option, RFC 5925)が鍵交換・アルゴリズム選択・鍵ロールオーバを備えた標準として整理されました。これらが入ると、seq を当てても正しい MAC を付けられない限り注入は弾かれ、推測攻撃は原理的に無効化されます。

攻撃面の総まとめ

シーケンス番号予測は「TCP が送信元 IP を検証せず、seq の整合だけを頼りにセグメントを受理する」という構造的弱点に根ざします。攻撃と緩和を一段ずつ対応づけると整理できます。

攻撃成立に必要な推測主な緩和
ISN予測によるなりすましサーバーのISN y を当てるISNランダム化(RFC 6528)
RST注入受信ウィンドウ内のseqを当てるRST完全一致+Challenge ACK(RFC 5961)
データ注入RCV.NXT にぴったり当てるRFC 5961+TCP-AO(RFC 5925)
off-pathのseq絞り込み副作用からの当たり判定Challenge ACKのper-connection化

防御の全体像はこう要約できます。第一にISNを乱数化して新規なりすましを断つ第二に帯域内検証で確立済み接続の窓内注入を1点当てに引き上げる第三に暗号認証(TCP-AO)で推測そのものを無意味化する。送信元詐称を最終的に減らすのはネットワーク側の 入口フィルタリング(BCP 38) であり、リフレクション系の悪用も含めた送信元偽装の脅威は DDoS の増幅攻撃:DNS/NTP リフレクションの原理 と地続きです。TCP がなぜここまで防御を重ねるのかは、その信頼性モデルの全体像を TCP と UDP の違い で押さえると一段深く理解できます。

試験・面接で問われる急所

「ISN予測がなぜ成立するか」→ 旧実装のISNが単調増加で観測・外挿できたから。「RST注入が当てやすい理由」→ ウィンドウ内ならどのseqでも受理されたため、命中確率が窓幅に比例。「RFC 6528 の眼目」→ クロック項Mで古い重複対策を保ちつつ、4タプル+秘密鍵のハッシュFで予測を封じる。「RFC 5961 の効果と副作用」→ RST完全一致化で命中を1点へ、ただしChallenge ACKのレート制限がサイドチャネル化した。この4点を押さえれば上級。

ネットワーク Article

TCP シーケンス番号予測と接続乗っ取りの原理を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

TCP

比較で見る軸

難易度: advanced / カテゴリ: ネットワーク / タグ数: 5

導入後に効く点

受信ウィンドウ内のseqを当てれば、RST注入で接続を切断したり、データ注入でストリームに任意バイトを混入できる。窓が広いほど推測は当てやすい。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
ネットワーク
タグ数
5

判断チェックリスト

  • 自社の用途が「TCP / セキュリティ」に近いか確認する。
  • 強みである「経路を盗聴できない攻撃者でも、ISNを推測できれば正しいシーケンス番号で偽装パケットを送り込み、コネクションを乗っ取れる(ブラインドインジェクション)。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

TCPセキュリティシーケンス番号スプーフィングISNTCPセキュリティシーケンス番号
参考: 公式情報