SYNフラッド攻撃
TCPの接続要求(SYN)を大量に送り、接続が完了する前の状態を増やしてサーバの接続の準備のための資源を圧迫するDoS攻撃。正規の利用者が接続しにくくなる。
イマシルちゃんの解説
TCPで通信を始めるときは、接続要求とその返事、最後の確認を交換する3ウェイハンドシェイクという手順を踏むよ。
SYNフラッド攻撃は、この途中の待ち状態を大量に作り、正規の利用者を接続しにくくする攻撃なんだ。
攻撃者が接続要求のSYNを大量に送ると、サーバは返事をして最後の確認であるACKを待つよ。
その間は通常、接続相手の情報を保存するメモリなどを使っているんだ。
最後の確認が来ないまま待ち状態が増えると、新しい接続を受け付ける余裕がなくなってしまうの。
通信データを大量に送らなくても、接続を始める手順を悪用してサービスを妨げられるんだ。
この解説はわかりやすかったですか?
より深い解説
定義
SYNフラッド攻撃は、TCPの3ウェイハンドシェイクを悪用するDoS攻撃である。攻撃者は、SYNパケットを大量に送るが、サーバが返すSYN+ACKに対する最後のACKを送らない。
仕組み
- サーバは、SYNを受け取るたびに、コネクションの情報を保存するメモリを確保し、SYN+ACKを返す
- サーバは、最後のACKが届くまで、その接続を途中の状態(SYN-RECEIVED、ハーフオープン)のまま保持する
- 攻撃者はACKを送らず、送信元IPアドレスを偽ってSYNを送り続ける
- 途中の状態の接続が上限に達すると、正規の利用者からの接続要求を受け付けられなくなる
送信元アドレスを偽ることが多いため、送信元を特定して遮断するのが難しい。
対策
| 対策 | 内容 |
|---|---|
| SYN Cookie | SYN受信時には通常の接続状態を保存する領域を確保せず、検証用の値をシーケンス番号へ埋め込んでSYN+ACKを返す。正しい最終ACKを確認してから接続状態を作る |
| 待ち時間の短縮 | ハーフオープンの接続を保持する時間を短くする |
| 待ち行列の拡大 | 途中の状態の接続を保持できる数を増やす |
| ファイアウォール、IPS | 短時間に大量のSYNを送る送信元を検知して遮断する |
接続の状態を番号へ埋め込む対策
SYN Cookie(SYNクッキー)は、最終確認前の接続ごとの状態を保存する代わりに、検証可能な値をSYN/ACKへ埋め込む方式である。クッキーという名称でも、HTTPのCookieとは別の仕組みである。
- サーバは接続要求から送信元・宛先のIPアドレスとポート番号などを読み、時刻やサーバが持つ秘密情報も用いて値を計算する。
- 計算した値をTCPヘッダーのシーケンス番号へ設定してSYN/ACKを返す。この段階では通常のハーフオープン接続ごとの状態領域を確保しない。
- クライアントから最終ACKが届いたら、サーバは受信情報を基に値を検証する。
- ACKの確認応答番号が、検証対象の値に1を加えた値に対応すれば、必要な接続状態を作って通信を受け付ける。
SYNはTCPの番号空間を一つ消費するため、確認応答は受け取った初期シーケンス番号の次を示す。番号は32ビットで巡回するので、上限を越える場合は2³²を法として扱う。
この対策で抑えるのは主に、接続未完了の情報を大量に保存するメモリの消費である。パケットを受信し、値を計算する処理は必要であり、回線帯域を埋める攻撃まで解消するものではない。保持できるTCPオプションなどにも実装上の条件がある。
ほかのDoS攻撃との違い
| 攻撃 | 使い果たさせるもの |
|---|---|
| SYNフラッド攻撃 | TCPの接続の準備のための資源(メモリなど) |
| Slow HTTP DoS攻撃 | Webサーバの同時接続数(セッション) |
| DRDoS攻撃 | 回線の帯域 |