DoS/DDoS の増幅原理と緩和アーキテクチャ
なぜ小さな攻撃が回線を飲み込むのか。反射増幅の増幅率、SYN フラッドと SYN cookie、L7 攻撃、Anycast やスクラビングによる緩和を原理から理解し、自分の構成の弱点を見抜けるようになります。
- 1.反射増幅攻撃は送信元 IP を被害者に詐称した小さな要求を公開サーバーへ送り、応答/要求のバイト比(増幅率)で攻撃量を膨らませる。DNS は約 28〜54 倍、NTP の monlist は約 200〜560 倍、memcached は数千〜5万倍に達する。
- 2.SYN フラッドは TCP の3ウェイハンドシェイク途中(SYN-RECV)の接続を埋め尽くしてバックログを枯渇させる。SYN cookie は状態を持たずに初期シーケンス番号へ情報を符号化することで、サーバー側の状態を持たないまま正規接続だけを成立させる。
- 3.緩和は Anycast による地理的分散吸収、スクラビングによる洗浄、エッジでのレート制御と L7 検査を重ねる多層構成が基本。容量と非対称性を物量で打ち消す。
増幅攻撃の核心:非対称性を作る
DoS/DDoS 攻撃の威力は、攻撃者が投じたリソースに対して被害者が受ける負荷がどれだけ大きいかという非対称性で決まります。反射増幅攻撃(reflection/amplification)は、この非対称性を2段階で作り出します。
- 反射(reflection):攻撃者は送信元 IP アドレスを被害者のものに詐称したパケットを、第三者の公開サーバー(リフレクタ)へ送ります。サーバーは応答を「送信元」すなわち被害者へ返すため、攻撃者の素性が隠れ、トラフィックが被害者へ集中します。
- 増幅(amplification):要求は小さく、応答は大きいプロトコルを選びます。増幅率は次の比で定義されます。
増幅率 (BAF: Bandwidth Amplification Factor)
= リフレクタが返す応答のバイト数 / 攻撃者が送る要求のバイト数
成立条件は2つです。第一に、送信元 IP の詐称が可能であること。これはネットワーク側で送信元検証(BCP 38 / uRPF)が行われていない経路で成立します。第二に、コネクションレスである UDP を使うこと。TCP はハンドシェイクで往復するため送信元詐称が事実上困難ですが、UDP は1パケットで応答を引き出せるため反射に向きます。
TCP は接続確立に SYN→SYN/ACK→ACK の往復を要し、SYN/ACK は詐称した送信元(被害者)へ返ってしまうため、攻撃者は ACK を返せずセッションが成立しません。UDP は要求1発で応答が返るため、送信元さえ詐称できれば往復を待たずに反射できます。反射増幅の代表例がすべて UDP ベースなのはこのためです。
代表的リフレクタと増幅率
どのプロトコルを選ぶかで増幅率が大きく変わります。小さな要求で巨大な応答を引き出せるものほど凶悪です。
| プロトコル/手口 | 代表的な増幅率(BAF) | 増幅の原理 |
|---|---|---|
| DNS (ANY/大きなゾーン) | 約 28〜54 倍 | 短い問い合わせに対し、DNSSEC 署名や多数のレコードを含む大きな応答が返る |
| NTP (monlist) | 約 200〜560 倍 | monlist コマンドが直近通信した最大600アドレスを1要求で返す(US-CERT 計測値は約 556 倍) |
| memcached (UDP) | 約 1万〜5万倍 | 数バイトの get で、事前に仕込んだ巨大な値(最大MB級)を引き出せる |
| SSDP / CLDAP | 約 30〜70 倍 | デバイス情報やディレクトリ応答が要求より大幅に大きい |
memcached が突出するのは、攻撃者が事前に巨大な値をキャッシュへ書き込み、それを数バイトの get 要求で繰り返し引き出せるためです。要求と応答のバイト比が構造的に跳ね上がり、増幅率が4桁〜5桁に達します。2018年に観測された 1.3 Tbps 級の攻撃はこの手口でした。
帯域の増幅率(BAF)とは別に、パケット数の増幅率(PAF: Packet Amplification Factor) も重要です。1つの要求が複数パケットの応答を生むと、被害者側のルータやファイアウォールは pps(パケット毎秒)で処理限界に達します。bps が空いていても pps で先に落ちることがあり、帯域とパケット処理は別の枯渇軸として監視する必要があります。
SYN フラッドと SYN cookie
増幅とは異なる枯渇軸を突くのが SYN フラッドです。これは帯域ではなく接続状態テーブルを枯渇させるプロトコル型攻撃です。
TCP の3ウェイハンドシェイクでは、サーバーは SYN を受け取ると SYN/ACK を返し、最後の ACK が来るまでその接続を SYN-RECV(半開き) 状態で保持します。この半開き接続は バックログキューという有限の領域を占有します。攻撃者は送信元を詐称した SYN を大量に送り、最後の ACK を返さないことで、キューを半開き接続で埋め尽くします。キューが満杯になると、正規ユーザーの SYN が捨てられ、新規接続ができなくなります。
正常: SYN ------> (state: SYN-RECV をメモリ確保)
<------ SYN/ACK
ACK ------> (state: ESTABLISHED へ昇格)
攻撃: SYN(詐称) ---> (state: SYN-RECV を確保したまま)
<------ SYN/ACK (詐称先へ飛び、ACK は永遠に来ない)
... これを大量に繰り返しバックログを枯渇させる
ここで効くのが SYN cookie です。発想は「半開き接続の状態をサーバー側に持たない」こと。サーバーは SYN-RECV のメモリを確保する代わりに、接続情報を SYN/ACK の初期シーケンス番号(ISN)そのものへ符号化して返し、状態を破棄します。
SYN cookie の ISN 構成(概念):
ISN = (t) : 一定周期で進む時刻カウンタ(数ビット)
| (mss_idx) : MSS をテーブル番号に圧縮(数ビット)
| hash(secret, src_ip, src_port, dst_ip, dst_port, t)
: 4タプルと秘密鍵から計算した暗号学的ハッシュ
正規クライアントの ACK が返ると、その ack番号 = ISN+1 を検証。
ハッシュが再計算と一致すれば、状態を持たずに接続を復元して ESTABLISHED 化。
詐称された SYN には ACK が返らないので状態を確保せず、キューは枯渇しません。正規クライアントだけが正しい ACK(ISN+1)を返すため、ハッシュ検証を通って接続が成立します。
SYN cookie は状態を持たない代償として、TCP オプション(ウィンドウスケール、SACK 等)の一部を符号化しきれず、性能が落ちる場合があります。このため Linux 等では通常はバックログに余裕があり、満杯に近づいたときだけ SYN cookie を有効化する設計(net.ipv4.tcp_syncookies=1)が一般的です。常時オンではなく「枯渇時のフェイルセーフ」として働く点が出題されやすいポイントです。
L7(アプリ層)攻撃:少量で刺す
帯域も接続テーブルも飽和させず、アプリケーションの重い処理を正規リクエストの形で突くのが L7 攻撃です。検索、ログイン、全文集計、動的レンダリングなど、1リクエストあたりのサーバー処理コストが高いエンドポイントを連打します。
L7 攻撃が厄介なのは、個々のリクエストが正規のものと区別できない点です。HTTP として完全に正しく、TLS ハンドシェイクも正規に完了し、レート自体も穏当に見えることがあります。回線(bps)もパケット(pps)も余裕があるのに、アプリの CPU やデータベース接続プールが先に枯渇する――「サーバー負荷は高いのに回線は空いている」状態が典型的なサインです。Slowloris のように、HTTP リクエストをわざと小出しに送り続けて接続を長時間占有し、ワーカースレッドを枯渇させる低速攻撃もこの系統です。
帯域飽和型は bps の異常で気づけますが、L7 攻撃は量的指標が正常範囲に収まることがあります。検知にはリクエストの中身(URL パターン、User-Agent、リクエスト間隔の規則性、JA3/JA4 のような TLS フィンガープリント)や、エンドポイント別のエラー率・レイテンシといったアプリ層のシグナルが必要です。L3/L4 の監視だけでは構造的に見逃します。
緩和アーキテクチャ:容量・洗浄・選別を重ねる
容量で殴ってくる攻撃には、より大きな容量で受け止めるしかないという非対称性があります。緩和は単一の魔法ではなく、層の異なる仕組みを重ねます。
| 緩和層 | 主な対象 | 原理 |
|---|---|---|
| Anycast | 帯域飽和型 | 同一 IP を世界中の拠点に広告し、攻撃トラフィックを最寄り拠点へ分散させ総容量で吸収する |
| スクラビング | 帯域飽和型・プロトコル型 | BGP/DNS でトラフィックを洗浄設備へ迂回させ、悪性分を除去して正常分だけ返す |
| SYN cookie / プロキシ | SYN フラッド | 状態を持たずにハンドシェイクを代行し、3ウェイ完了した接続だけを背後へ渡す |
| レート制御・WAF・ボット選別 | L7 | 頻度・指紋・チャレンジで正規ユーザーと自動化トラフィックを選別する |
Anycast は緩和の土台です。同じ IP アドレスを複数拠点から BGP で広告すると、各拠点はインターネットの経路上「最も近い」発信元からのトラフィックだけを受けます。これにより、世界中から集まる攻撃トラフィックが自動的に各拠点へ分割吸収され、被害者の単一拠点に全量が集中する事態を避けられます。総容量が攻撃量を上回れば、各拠点は自分の取り分だけを捌けばよくなります。
スクラビングは、攻撃検知時にトラフィックを専用の洗浄設備へ BGP 再経路や DNS 切替で迂回させ、シグネチャや振る舞い解析で悪性パケットを除去し、正常分だけをサーバーへ返します。レート制御はレート制限の原理で単位時間あたりの量を抑え、L7 ではボット選別(JavaScript チャレンジ、Proof-of-Work、CAPTCHA)で自動化トラフィックをふるい落とします。
緩和は被害者側だけの話ではありません。自組織がリフレクタにされないことも重要です。NTP の monlist を無効化し、DNS は再帰を内部に限定し、memcached の UDP を外部へ晒さない。さらに ISP/データセンタが送信元検証(BCP 38)を実施すれば、そもそも IP 詐称が経路上で弾かれ、反射攻撃の前提が崩れます。署名応答で増幅源になりうる DNSSEC を運用する場合も、RRL(Response Rate Limiting)で反射の踏み台化を抑えられます。
まとめ
反射増幅攻撃は、UDP と送信元 IP 詐称を前提に、応答/要求のバイト比すなわち**増幅率(BAF)**で攻撃量を膨らませます。DNS で数十倍、NTP の monlist で200倍超、memcached で数千〜数万倍に達し、少ない元手で巨大なトラフィックを被害者へ集中させます。SYN フラッドは帯域ではなく半開き接続のバックログを枯渇させる攻撃で、SYN cookie が状態を初期シーケンス番号へ符号化することで「状態を持たずに正規接続だけ通す」フェイルセーフを実現します。L7 攻撃は正規リクエストの形で重い処理を突き、量的監視では検知できません。
緩和は Anycast による分散吸収、スクラビングによる洗浄、SYN プロキシによる状態代行、レート制御とボット選別による L7 の選別を重ねる多層構成が基本です。L3/L4 の物量は容量で、L7 の異常は指紋とチャレンジで――守る層ごとに手段を変えるのが要点です。全体像は DDoS 攻撃と対策 で、頻度ベースの防御は レート制限、TCP の下位層の挙動は TLS レコード層 と併せて押さえると、攻撃と防御の対応関係が原理から立体的に見えてきます。
セキュリティ Article
DoS/DDoS の増幅原理と緩和アーキテクチャを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
DDoS
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 5
導入後に効く点
SYN フラッドは TCP の3ウェイハンドシェイク途中(SYN-RECV)の接続を埋め尽くしてバックログを枯渇させる。SYN cookie は状態を持たずに初期シーケンス番号へ情報を符号化することで、サーバー側の状態を持たないまま正規接続だけを成立させる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 5
判断チェックリスト
- 自社の用途が「DDoS / 増幅攻撃」に近いか確認する。
- 強みである「反射増幅攻撃は送信元 IP を被害者に詐称した小さな要求を公開サーバーへ送り、応答/要求のバイト比(増幅率)で攻撃量を膨らませる。DNS は約 28〜54 倍、NTP の monlist は約 200〜560 倍、memcached は数千〜5万倍に達する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。