|
1. DDoS攻撃の基本 DDoS(分散型サービス拒否)攻撃は、最も強力で防御が難しい攻撃の一つです。なぜなら、DDoS攻撃の主な目的は、指定された標的が通常のサービス提供を妨げたり、インターネットから消滅させたりすることだからです。 DDoSは、発生方法によって簡単に3つのカテゴリーに分けられます。 第一のカテゴリーは力で勝つ大量のデータパケットがインターネットのあらゆる隅から押し寄せ、IDCへの入口を塞ぎ、強力なハードウェア防御システムや迅速かつ効率的な緊急処理を無力化しています。 この種の攻撃の典型例としては、現在ではあまり一般的ではありませんが、ICMPフラッドやUDPフラッドがあります。 第二のカテゴリーは賢さで勝つスマートで気づかれないほど、数分ごとに、あるいは荷物1つだけで十分に送信すると、豪華な設定サーバーが応答しなくなることがあります。 このタイプの攻撃は主に、Slowloris攻撃やハッシュ衝突攻撃など、プロトコルやソフトウェアの脆弱性を悪用して行われ、特定の環境的偶然が必要です。 第三のカテゴリーは、上記の二つの要素の混合ですプロトコルやシステムの欠陥を利用するだけでなく、SYNフラッド攻撃やDNSクエリフラッド攻撃など、現在の主流攻撃手法である大量のトラフィックも含んでいます。 この記事では、これらの最も一般的で代表的な攻撃手法を一つずつ説明し、その防御手段を紹介します。 1.1. SYNフラッドSYN Floodはインターネット上で最も典型的なDDoS攻撃の一つで、1999年頃に初めて登場し、当時最も有名な被害者としてYahooが挙げられました。 SYNフラッド攻撃はTCPのトリプルハンドシェイクの脆弱性を悪用し、ターゲットサーバーを応答不能にし追跡を困難にしますが、コストは少なくなります。 標準的なTCPの3者ハンドシェイクプロセスは以下の通りです。 - クライアントはSYNフラグを含むTCPパケットを送信し、SYNは同期され、同期パケットはクライアントが使用するポートとTCP接続の初期シリアル番号を示します。
- クライアントからSYNパケットを受け取ると、サーバーはSYN+ACK(確認確認)パケットを返し、クライアントのリクエストが受理されたことを示すとともに、TCPの初期シリアル番号が自動的に1分ずつ加算されます。
- クライアントはまた、サーバーに確認応答メッセージACKを返し、TCPシリアル番号も1分ずつ加算されます。
これら3つのステップを経て、TCP接続が確立されます。 信頼性の高い伝送を実現するために、TCPプロトコルは3回のハンドシェイク中に例外処理機構を設定しています。 第3段階では、サーバーがクライアントから最終的なACK確認パケットを受け取らなければ、サーバーはSYN_RECV状態のまま、クライアントのIPアドレスを待機リストに追加し、2番目のステップでSYN+ACKパケットを再送信します。 再投稿は通常3〜5回行われ、ウェイトリストは約30秒ごとに1回投票してすべてのクライアントを再試行します。 一方、サーバーがSYN+ACKパケットを送信した後、次のTCP接続のための情報を保存するためのリソースを事前に割り当て、再試行を待つ間も保持します。 さらに重要なのは、サーバーリソースが制限されている場合、維持可能なSYN_RECV状態は制限を超えると新しいSYNパケットを受け付けなくなり、新しいTCP接続は拒否されるということです。 SYN Floodは上記のTCPプロトコル設定を使って攻撃の目的を達成します。 攻撃者は多数のIPアドレスを偽装してSYNパケットをサーバーに送信しますが、偽造されたIPアドレスはほぼ存在不可能であるため、ほとんどのデバイスがサーバーに応答を返しません。 その結果、サーバーは膨大な待機リストを維持し、SYN+ACKパケットの送信を繰り返し試みることになり、多くのリソースを消費し、リリースできません。 さらに重要なのは、攻撃されたサーバーのSYN_RECVキューが悪意あるパケットで満たされ、新規SYNリクエストは受け付けられなくなり、正当なユーザーはTCP接続を確立するために3回のハンドシェイクを完了できないことです。 つまり、サーバーはSYN Floodによってサービスを拒否されたのです。 SYN Floodに興味がある方は、私が2006年に書いた http://www.icylife.net/yunshu/show.php?id=367 をご覧ください。その後、いくつかの変更を加え、バグ修正や攻撃性を下げ、純粋にテスト用に使われました。 1.2. DNSクエリフラッドインターネットの最も基本的かつ中核的なサービスとして、DNSは当然ながらDDoS攻撃の重要な標的の一つです。 DNSサービスを停止させることは、間接的に企業全体の事業や地域のネットワークサービスをダウンさせることがあります。 以前、人気のハッカーグループ「匿名」も世界中のインターネット上の13のDNSサーバーを攻撃すると発表しましたが、最終的には成功しませんでした。 UDP攻撃は大量トラフィックを開始する最も簡単な攻撃手法であり、ランダムなIP偽造の追跡も困難です。 しかし、ほとんどのIPはUDPサービスを提供していないため、フィルタリングは簡単です。なぜなら、UDPトラフィックを単純に破棄できるからです。 したがって、純粋なUDPトラフィック攻撃は現在比較的稀であり、UDPプロトコルが搭載するDNSクエリフラッド攻撃に置き換えられています。 簡単に言えば、DDoS攻撃はプロトコルの上位に上がるほど防御が難しくなります。なぜなら、プロトコルが高いほどビジネス関連性が高く、防御システムがより複雑になるからです。 DNSクエリフラッドとは、攻撃者が多数のソックパペットマシンを操作し、多数のドメイン名クエリリクエストを対象に送信することです。 ACLベースのフィルタリングを防ぐためには、パケットのランダム性を改善する必要があります。 一般的な手法として、UDP層でソースIPアドレス、ソースポート、その他のパラメータをランダムに偽造します。 DNSプロトコル層では、クエリIDと解決するドメイン名がランダムに偽造されます。 フィルタリングを防ぐだけでなく、解析すべきランダムな偽造ドメイン名はDNSキャッシュに到達する可能性を減らし、DNSサーバーのCPUリソースをできるだけ多く消費することにもつながります。 DNS Query Floodのコードについては、2011年7月にサーバー性能をテストするためにコードを書き、リンクは http://www.icylife.net/yunshu/show.php?id=832 です。 同様に、このコードは人工的に攻撃的でなく、テスト目的のみです。 1.3. HTTPフラッド上記のSYNフラッドおよびDNSクエリフラッドはこの段階で効果的に防御でき、大手メーカーやインターネット企業にとっての真の頭痛の種はHTTPフラッド攻撃です。 HTTPフラッドは、第7層プロトコル上のウェブサービスに対する攻撃です。 その大きな害は主に三つの側面に現れます:便利な開始、難易度のフィルタリング、そして広範な影響です。 SYNフラッドもDNSクエリフラッドも、攻撃者がルート権限を持つ多数のボットを制御する必要があります。 大量のルート権限を収集するには時間と労力がかかり、攻撃中は管理者が異常なトラフィックを発見して攻撃者が急速にリソースを失うため、パペットマシンの補充が遅れ、攻撃強度が大幅に低下し、長期間持続できません。 HTTPフラッド攻撃は異なります。攻撃者は多数のボットを制御する必要がなく、ポートスキャナーを使ってインターネット上の匿名HTTPプロキシやSOCKSプロキシを見つけ、攻撃者が攻撃対象にHTTPリクエストを開始します。 匿名プロキシは比較的豊富な資源であり、数日でプロキシを入手するのは難しくないため、攻撃は簡単に開始でき、長期間続くこともあります。 一方で、HTTPフラッド攻撃はHTTP層で開始され、これはウェブサイトビジネスと密接に関連する通常のウェブページのリクエスト動作を強く模倣するため、セキュリティベンダーがユーザー体験に影響を与えない共通ソリューションを提供するのが困難です。 一箇所でうまく機能するルールでも、状況が変わると過失致死が多数につながることがあります。 最後に、HTTPフラッド攻撃は深刻な連鎖反応を引き起こす可能性があり、攻撃対象のウェブフロントエンドの応答を直接遅らせるだけでなく、間接的にJavaやその他のビジネス層のロジックやバックエンドのデータベースサービスを攻撃し、その圧力を増大させ、ログストレージサーバーにも影響を及ぼします。 興味深いことに、HTTP Floodには「CC攻撃」という歴史的なニックネームもあります。 CCはChallenge Collapsarの略称で、中国の有名なセキュリティ企業によるDDoS防御装置です。 現状から判断すると、Collapsarだけでなく、すべてのハードウェア防衛機器も依然として挑戦を受けており、そのリスクは解消されていません。 1.4. 遅い接続攻撃攻撃に関しては、最初の反応は大量のトラフィックと大量のパケットです。 しかし、逆の動きをする攻撃があり、遅いことで知られており、死ぬ方法を知らずに攻撃対象を倒すものもあります。それが遅い接続攻撃で、最も代表的なのはrsnakeが考案したスローロリスです。 HTTPプロトコルでは、HTTPリクエストが\r\n\r\nで終わることを規定しており、これはクライアントが送信を完了し、サーバーが処理を開始したことを示します。 じゃあ、もし\r\n\r\nを送らなかったらどうなるの? スローロリスはこれをDDoS攻撃で活用しています。 攻撃者はHTTPリクエストヘッダーでConnectionをKeep-Aliveに設定し、ウェブサーバーにTCP接続を切断しないよう求め、数分ごとにa:b\r\nのようなキー・バリュー形式をゆっくりとサーバーに送信し、サーバーにHTTPヘッダーが受信されていないと誤認させて待機させます。 もし攻撃者がマルチスレッドやパペットを使って同じことをすると、サーバーのウェブコンテナはすぐに攻撃者に圧倒され、新しいリクエストを受け付けなくなります。 やがて、さまざまなスロウロリスのバリエーションが現れ始めました。 例えば、POSTメソッドはWebサーバーにデータを提出し、大きなコンテンツ長ですがバイトごとに遅いPOSTの実際のデータコンテンツを埋めるなどを行います。 スロロリスの攻撃については、rsnakeもテストコードを提供しています。詳細は http://ha.ckers.org/slowloris/slowloris.pl を参照してください。 2. DDoS攻撃の進行2.1. ハイブリッド攻撃上記では、ネットワークを攻撃したり、アリババ、百度、テンセントなどの巨大ウェブサイトを攻撃したりするために使える基本的な攻撃手法をいくつか紹介しています。 しかしそれだけではありません。攻撃者のレベルによってまったく異なるDDoS攻撃を仕掛けることができ、その使い方も同じです。 高度な攻撃者は単一の攻撃手段を使わず、対象環境に応じて柔軟に組み合わせます。 通常のSYNフラッドは、逆検出やSYNクッキーなどの技術的手段でトラフィッククリーニング装置によって簡単にフィルタリングできますが、SYN+ACKパケットがSYNフラッドに混ざり合い、各偽造されたSYNパケットに対応する偽造クライアント確認パケットを持つ場合、対応するものは送信元IPアドレス、送信元ポート、宛先IP、宛先ポート、TCPウィンドウサイズ、TTLなどが同じホストおよび同じTCPフローの特徴に一致します。 逆検出やフロー清掃機器のSYNクッキーのパフォーマンスへの圧力は大幅に高まるでしょう。 実際、SYNのデータパケットや他のフラグビットには特別な攻撃効果があり、ここでは紹介されていません。 DNSクエリフラッドには独自の技術もあります。 まず、DNSは通常のDNSと認可ドメインDNSに分けられます。通常のDNSは攻撃的で、IPアドレスはランダムに偽造される必要があり、サーバーは再帰的解決を必要とします。 しかし、認可ドメインDNSを攻撃する際、偽造された発信元のIPアドレスは純粋にランダムではなく、事前に世界中のISPのDNSアドレスを収集して最大限の攻撃効果を発揮し、トラフィッククリーニング装置がIPブラックリストを追加するか否かという厄介な状況に陥らせるべきです。 それを追加すると過失致死が多数発生し、ブラックリストを付けなければ各パケットを逆プローブしなければならず、パフォーマンスへの負担が増します。 一方で、前述の通り、デバイスのクリーニング圧力を高めるためには、キャッシュに当たらずに要求されたドメイン名をランダム化する必要がありますが、解決対象のドメイン名は偽造において一定の規則性を持つ必要があり、例えばドメイン名の一部だけを偽造し、クリーニングデバイスが設定したホワイトリストを突破するために一部を固めることなどです。 理由は単純で、テンセントのサーバーはテンセントのドメイン名しか解決できず、完全にランダムなドメイン名が直接破棄され、確定化が必要になる可能性があるからです。 しかし完全に固定されていれば、簡単に破棄されてしまうので、偽造が必要です。 次に、DNS攻撃はUDPポートだけに限定すべきではありません。UDPポートもDNSプロトコルに基づき標準サービスです。 攻撃が発生した場合、UDP攻撃とTCP攻撃の両方が同時に実行されることがあります。 HTTP Floodの焦点は、フロントエンドのキャッシュを突破し、HTTPヘッダーのフィールド設定を通じてウェブサーバー自体に直接アクセスすることです。 さらに、HTTP Floodはターゲットの選択にも非常に重要であり、通常の攻撃者は検索など多くのデータクエリを必要とするページを攻撃対象として選びます。これは非常に正確で、サーバーのリソースをできるだけ多く消費する可能性があります。 しかし、この攻撃は機器の清掃で人間と機械の識別によって簡単に特定できるので、どうやってこの問題を解決すればよいのでしょうか? とても簡単です。一般ユーザーもアプリ、つまり様々なWeb APIを通じてアクセスできるページを選ぶようにしましょう。 通常のユーザーや悪意のあるトラフィックはAPPから来ており、人間と機械の差は非常に小さく、基本的な統合の区別が難しいです。 各TCP接続はサーバー側と自身に存在し、TCP状態を維持するためにリソースを消費するため、接続を過度に維持することはできません。 これを解決できれば攻撃性が大幅に高まります。つまり、Slowlorisはステートレスで攻撃を開始し、TCPシリアル番号を取得し、クライアント側のTCP接続の維持をスニッフィングで確認でき、システムカーネルはTCPの状態の変化に注意を払う必要がなくなり、ノートブックは最大65,535回のTCP接続を生成できます。 前述はすべて技術的な攻撃強化です。 人間側には他の手段もあります。 SYN Floodが大量のパケットを送信し、Slowlorisの遅い接続を伴った場合、何人がその秘密を発見するのでしょうか? サーバーがダウンしても、TCP層のクリーンニングを強化し、アプリケーション層の挙動を無視しようとするSYN攻撃のみが見つかる可能性があります。 あらゆる種類の攻撃が連携して最大の効果を発揮できます。 攻撃時間の選択も重要なポイントで、昼食中のメンテナンス担当者、仕事帰りの道路で立ち往生している時、地下鉄の無線ネットワークカードに電波が届かない時、ターゲット企業が大規模なイベントを開催して交通量が急増する時などです。 これは純粋な攻撃であり、コードや詳細な説明は提供されません。 2.2. P2Pネットワークからの攻撃以前の攻撃手法はほぼボットを必要とし、HTTP Floodでさえ大量の匿名プロキシを探す必要があります。 攻撃があった場合、いくつかの命令を出すだけで機械が自動的に実行に向かうので、これが完璧な解決策です。 この攻撃はすでに発生しており、それはP2Pネットワークからのものです。 ご存知の通り、インターネット上のP2Pユーザーとトラフィックは非常に多いです。 もしすべてが指定された場所にデータをダウンロードし、何千もの実際のIPアドレスを接続すると、どのデバイスも対応できません。 BTダウンロードを例に挙げると、人気動画のトレントを偽造して検索エンジンに投稿するだけで多くのユーザーやトラフィックを欺くことができますが、これは基本的な攻撃に過ぎません。 高度なP2P攻撃は、リソース管理サーバーの直接的なスプーフィングです。 例えば、Thunderクライアントは見つけたリソースをリソース管理サーバーにアップロードし、同じリソースをダウンロードする必要がある他のユーザーにプッシュしてリンクを公開します。 プロトコルの逆行を通じて、攻撃者は大量の人気リソース情報を偽造し、リソース管理センターを通じて配布し、P2Pネットワーク全体に瞬時に広がることができます。 さらに恐ろしいのは、この攻撃は攻撃者自身でさえ止められず、P2Pの担当者が問題を発見しサーバーを更新し、ダウンロードユーザーがダウンロードしたソフトウェアを再起動するまで攻撃が続いていることです。 3. 概要DDoS攻撃の導入は以上で、これ以上は進みません。これだけの防御力があれば十分だと理解すれば十分です。 一般的に、DDoS攻撃は器用で優雅なものがあります。 応用の美しさは心の統一にあります。 |