SYNフラッド攻撃

SYNフラッドはTCP/IPのハンドシェイクにある脆弱性を悪用し、Webサービスを破壊しようとします。

Share facebook icon linkedin icon twitter icon email icon

SYNフラッド

学習目的

この記事を読み終えると、以下のことができます。

  • SYNフラッドDDoS攻撃の定義
  • SYNフラッド攻撃の仕組みに関する説明
  • さまざまな種類のSYN攻撃における違い
  • SYNフラッドの軽減技術の理解

SYNフラッド攻撃とは

SYNフラッド(ハーフオープン攻撃)は、利用可能なサーバーリソースをすべて消費することで正当トラフィックがサーバーを利用できないようにするサービス妨害(DDoS)攻撃の一種です。初回接続要求(SYN)パケットを繰り返し送信することで攻撃者はターゲットのサーバーマシンにある利用可能な全ポートを制圧し、ターゲットのデバイスの正当トラフィックへの応答が遅くなったり応答できなくなったりすることとなります。

SYNフラッド攻撃の仕組みとは?

SYNフラッド攻撃はTCP接続におけるハンドシェイクプロセスを悪用することで動作します。通常状態では、TCP接続は接続を確立するために3つのプロセスを実行します。

  1. まず、接続を開始するためクライアントがSYNパケットをサーバーに送信します。
  2. その後、通信を認識するために、初回パケットにSYN/ACKパケットでサーバーが応答します。
  3. 最後に、サーバーからのパケットを受信したことを知らせるため、クライアントがACKパケットを返します。パケットの送受信シーケンスが完了したら、TCP接続が開いてデータの送受信が可能になります。
TCPの3ウェイハンドシェイクの図

サービス妨害を作成するため、攻撃者は初回のSYNパケット受信後にサーバーが1つ以上のSYN/ACKパケットで応答を返し、ハンドシェイクの最終ステップを待機するという事実を悪用します。下記はその仕組みです。

  1. 多くの場合なりすましのIPアドレスを利用して、攻撃者が大量のSYNパケットをターゲットのサーバーに送信します。
  2. サーバーが各接続リクエストに応答し、応答を受け取れるようポートを開いた状態にします。
  3. サーバーが到着することのない最後のACKパケットを待機する一方で、攻撃者はより多くのSYNパケットを送り続けます。新たなSYNパケットが届くとサーバーは一時的に一定時間新たにポート接続を開いておくことになり、利用可能なポートがすべて利用されるとサーバーは通常の動作ができなくなります。
SYNフラッドDDoS攻撃のアニメーション

ネットワーク上、サーバーは接続を開始しましたが接続のもう一方であるマシンは開始していないため、この接続はハーフオープン状態と考えられます。この種のDDoS攻撃では、ターゲットのサーバーが開いている接続を継続的に残し、ポートが再び使用可能になる前に各接続がタイムアウトするのを待機します。そのため、このような攻撃は「ハーフオープン攻撃」とみなされます。

SYNフラッドは3つの方法で発生します。

  1. 直接攻撃: IPアドレスが偽装されていないSYNフラッドのことを直接攻撃と呼びます。この攻撃では攻撃者はそのIPアドレスを全くマスキングしません。攻撃作成に実際のIPアドレスで単一のソースデバイスを利用した結果、攻撃者は検出や対策に対して非常に脆弱です。ターゲットのマシンでハーフオープン状態を作り出すため、ハッカーは自分のマシンがサーバーのSYN/ACKパケットに応答しないようにします。これはSYNパケット以外の発信パケットを止めるファイアウォールのルールや、悪意のあるユーザーのマシンに到達する前にSYN/ACKパケットの受信を除外することで実現されることが多くあります。対策が非常に容易(各悪意のあるシステムのIPアドレスをブロックするだけ)であるため、実際にこの方法が用いられることは(皆無ではないにせよ)めったにありません。攻撃者がMiraiボットネットなどのボットネットを利用している場合、感染デバイスのIPをマスキングすることには気を使いません。
  2. 偽装攻撃: 悪意のあるユーザーは、対策を回避して自分のIDの検出をより困難にするため、送信する各SYNパケットのIPアドレスを偽装することもあります。パケットは偽装できますが、潜在的にソースまで追跡することもできます。この種の検出作業は難しいものでえすが、特にインターネットサービスプロバイダー(ISP)がサポートしてくれる場合は不可能ではありません。
  3. 分散型攻撃(DDoS): ボットネットを利用した攻撃の場合、攻撃の発生源を追跡できる可能性は低くなります。難読化のレベルを高めるため、攻撃者が各分散デバイスにパケットを送信するIPアドレスを偽装させることもあります。攻撃者がMiraiボットネットなどのボットネットを利用している場合、感染デバイスのIPをマスキングすることには気を使いません。

SYNフラッド攻撃を用いることで、悪者は他のDDoS攻撃と比較してかなり少量のトラフィックでターゲットのデバイスやサービスにサービス妨害を仕掛けることができます。ターゲットの周辺にあるネットワークインフラストラクチャを飽和させる帯域幅消費型攻撃の代わりに、SYN攻撃が必要とするのはターゲットのOSの利用可能なバックログよりも大きいということだけです。攻撃者がバックログのサイズや各接続がタイムアウトまでどれだけ長く開かれたままであるかを判断することができれば、システムを利用不可にするために必要な正確なパラメーターを狙うことができ、サービス妨害の作成に必要な合計トラフィックを最小限に抑えられます。

SYNフラッド攻撃の対策とは?

SYNフラッドの脆弱性は長い間知られており、多くの緩和経路が利用されています。以下は一部のアプローチです。

バックログキューの増加

ターゲットデバイスの各オペレーティングシステムには許容できる一定数のハーフオープン接続があります。大量のSYNパケットへの対応の1つは、OSが許容するハーフオープン接続の数を最大化することです。最大バックログ数を正常に増やすためには、システムはすべての新規リクエストを処理するためのさらなるメモリリソースを予約しなければなりません。システムに増加したバックログキューサイズを処理するだけの容量がない場合はシステムパフォーマンスにネガティブな影響がありますが、サービス妨害を受けるよりは良いでしょう。

最も古いハーフオープンのTCP接続を再利用

別の緩和策として、バックログが埋まったら最も古いハーフオープン接続を上書きするというものがあります。この方法では、悪意のあるSYNパケットでバックログが満たされるよりも短い時間で正当な接続が確立される必要があります。攻撃規模が大きくなったり、バックログサイズが小さすぎたりするとこの防御は失敗します。

SYN cookies

この方法はサーバーでクッキーを作成するものです。バックログが満たされた場合に接続を中断するリスクを回避するため、サーバーは各接続リクエストにSYN/ACKパケットで応答しますがその後でSYNリクエストをバックログから削除します。そしてメモリからリクエストを削除してポートを開いたままにし、新たな接続の準備をします。接続が正当なリクエストの場合、最後のACKパケットがクライアントマシンからサーバーへ送信され、サーバーはSYNバックログキューのエントリーを(制限付きで)再構築します。この対策ではTCP接続に関する一部の情報が失われますが、攻撃の結果として正当なユーザーにサービス妨害が起こるよりは良いでしょう。

CloudflareのSYNフラッド攻撃対策とは?

Cloudflareは、ターゲットとなるサーバーとSYNフラッドの間に立つことでこの種の攻撃を一部軽減しています。初回のSYNリクエストが作成されると、Cloudflareがクラウド内でハンドシェイクプロセスを処理し、TCPハンドシェイクが完了するまでターゲットのサーバーとの接続を保留します。この方法ではターゲットのサーバーから偽装SYNパケットとの接続を維持するためのリソースコストを取り除き、CloudflareのAnycast Networkに配置します。CloudflareのDDoS対策について詳しくご確認ください。

CloudflareがSYNフラッド攻撃を阻止する図