最終更新日 2024年9月29日
記事の概要
この記事では、情報セキュリティの脅威の1つである「DoS攻撃」について解説します。
DoS攻撃の概要や特徴、攻撃手法についてまとめています。
今回の記事での説明内容
今回の記事で説明する内容は以下です。
- DoS攻撃の概要
- DoS攻撃の特徴
- SYN Flood(SYNフラッド)
- UDP Flood(UDPフラッド)
- ICMP Flood(ICMPフラッド)
- HTTP Flood(HTTPフラッド)
- Ping of Death(ポインゴブデス)
- Smurf Attack(スマーフ攻撃)
- Slowloris(スローロリス)
- Amplification Attack(アンプ攻撃)
この記事はこんな人にオススメ!
● DoS攻撃とはどんなものか分かりやすく知りたい人!
● 不正アクセスの手口や対策を学び、システムのセキュリティを強化したい人!
● セキュリティリスクを理解する必要がある開発担当者!
● 不正アクセスに関する知識を深め、試験対策として活用したい人!
DoS攻撃
DoS攻撃の概要
分かりやすく一言でいうと
DoS攻撃とは、サーバーやネットワークにたくさんのデータを一気に送り付けて、他の人が使えないようする攻撃です。
もう少し詳しく言うと
もう少し詳しく言うと、DoS攻撃(Denaial of Service攻撃)は、特定のサーバーやネットワーク(インターネット上のデータをやり取りする仕組み)に、
大量のリクエスト(データを送って「これをやってください」とお願いすること)を送り付けることで、他の人がそのサービスを使えないようにする攻撃です。
この攻撃の目的は、サーバやネットワークのリソース(処理する力やインターネットの通信量など)をいっぱいにして、普通の人がサービスを利用できなくしてしまうことです。
言い換えると、たくさんの人が同時にお店に入ろうとして、正規のお客さんが入れなくなるイメージです。
身近なものに例えると!
DoS攻撃を身近なものに例えると、「エレベーター」を使う例が分かりやすいです。
例えば、大きなビルにエレベーターが一台しかないとします。普段はみんなが順番に乗れるのですが、誰かがエレベーターのボタンをひたすら押して、何もせずに乗り降りを繰り返すことで、他の人がエレベーターを使えなくしてしまうイメージです。エレベーターはずっと動いているのに、目的地に行きたい人が乗れず、利用できなくなってしまいます。
これが、サーバーやネットワークに大量の無駄なリクエストを送ることで、他の人がサービスを使えなくするDoS攻撃と同じような状況です。
DoS攻撃の特徴
リソースの枯渇(リソース不足)
サーバーやネットワーク(インターネット上でデータをやり取りする仕組み)の「リソース」(コンピュータの処理能力やメモリ、通信できるデータ量など)を大量に使い果たすことで、他の人がサービスを使えなくします。
例えば、みんなが同時に使おうとするとWi-Fiが遅くなったり、全く繋がらなくなったりすることがありますよね。
それと同じ状態を意図的に引き起こします。
単一の攻撃元(攻撃者が少数)
DoS攻撃は、通常少数のパソコンや端末(スマホなど)から行われます。
これは、複数のパソコンや端末を使う、DDos攻撃(Distributed Denail of Service攻撃)とは違い、攻撃者が少数で行われるということです。
例えると、友達が一人だけゲームを繰り返しリセットして、他の人が遊べないようにするような感じです。
容易な検出と防御(見つけやすく守りやすい)
攻撃が1つのパソコンから行われている場合、攻撃元のIPアドレス(インターネット上での住所のようなもの)をブロックしたり、特定のパターンのデータを遮断したりして対処できることが多いです。
しかし、もし攻撃が非常に短い時間で一気に行われたり、攻撃の量が非常に多い場合は防ぐのが難しいこともあります。
例えると、一人の迷惑客がいたら追い出しやすいけれど、急に大量の迷惑客が押し寄せたら対応が難しいという感じです。
よく使われるDoS攻撃の手法
SYN Flood(SYNフラッド)
分かりやすく説明すると
攻撃者がサーバーに「通信を始めたいよ!」という信号(SYNパケット)をたくさん送ります。
サーバーは「OK!待ってるよ」と返事をしますが、攻撃者はそれ以上返事をしません。
すると、サーバーは「いつ返事が来るんだろう?」とずっと待ち続けてしまい、他の人と通信する余裕がなくなってしまいます。
厳密に説明すると
攻撃者は、サーバーに大量の「SYNパケット」(TCP接続を開始する信号)を送り、
TCP接続(インターネットの通信を確立する手順)の途中で止めます。
すると、未完了の接続が発生します。この未完了の接続は、一定の時間(タイムアウトまで)その接続状態を保持します。
その間、リソース(メモリやCPU)を消費してしまいます。
この未完了の接続が大量に発生すると、サーバーリソース(計算能力やメモリなど)を使い果たし、
他の利器の利用者がアクセスできなくなります。
身近なものに例えると!
SYN Flood(SYNフラッド)は、「カスタマーサービスへの大量の無言電話」のようなものです。
あなたの会社のカスタマーサービスに、次々と「問い合わせたい」と電話がかかってきますが、誰も具体的な質問をしません。それでも、オペレーターは「もしもし?」と待ち続け、他の正規のお客様の電話に対応できなくなります。
これはSYNフラッド攻撃と同様で、サーバーに接続要求だけを送り続けて、処理が完了しない状態にさせるのです。
UDP Flood(UDPフラッド)
分かりやすく説明すると
攻撃者は「UDP」というプロトコルを使って、サーバーにデータをどんどん送り続けます。
UDPは「返事をしなくていい通信」のため、送り放題です。
攻撃者がUDPを大量にサーバーへ送信すると、この大量のデータで道(ネットワーク)が混雑し、
他の人の通信ができなくなってしまいます。
厳密に説明すると
「UDP」(ユーザ・データグラム・プロトコル)は、インターネット上でデータを高速に送るための手法ですが、
接続の確認を行わないため、攻撃者は大量のUDPパケットを送り付けます。
これにより、サーバーのネットワーク帯域(データを送受信できる容量)や計算リソースが圧迫されます。
特にDNS(ドメイン名をIPアドレスに変換するシステム)やNTP(時間を同期するプロトコル)などが狙われやすいです。
身近なものに例えると!
UDP Flood(UDPフラッド)は、「郵便局に大量のいたずらの手紙を送る」ようなものです。
郵便局に、いたずら用の手紙が大量に送られてくると、郵便局はこれを開けて確認するのに追われ、正規の郵便物の処理が遅れてしまいます。
同じように、UDPフラッドは無意味なデータを大量に送りつけて、サーバーのリソースを浪費させます。
ICMP Flood(ICMPフラッド)
分かりやすく説明すると
「Ping」という信号を使って「君、そこにいる?」とサーバーに何度も何度も聞く攻撃です。
サーバーは一生懸命「いるよ!」と答え続けてしまい、他の人からの質問には答えられなくなります。
厳密に説明すると
「ICMP」(インターネット制御メッセージプロトコル)は、Pingリクエスト(他のコンピュータに応答を確認するための通信)に使用されます。
攻撃者はサーバーに大量のPingリクエストを送り付け、応答処理にサーバーのリソースを消費させ、正規のユーザに対応できなくさせます。
身近なものに例えると!
ICMP Flood(ICMPフラッド)は、「サポートセンターへのひたすらの「確認」要求」ようなものです。
サポートセンターに何度も「今も対応してますか?」「まだ対応してますか?」と問い合わせを送り続けると、サポートセンターは「はい、対応してます」と毎回答えなければならず、本来のサポート業務に集中できません。
ICMPフラッドはこれと同じで、サーバーに「いる?」と無限にPingを送り続け、応答にリソースを使わせます。
HTTP Flood(HTTPフラッド)
分かりやすく説明すると
攻撃者はウェブサイトに「このページを見せて!」とたくさんのリクエストを送り続けます。
ウェブサイトは「忙しすぎてもう無理!」となり、正規の利用者にページを見せられなくなってしまいます。
厳密に説明すると
「HTTP」(ウェブページを表示されるためのプロトコル)を使った攻撃で、大量のウェブリクエストをお送り、サーバーに過負荷をかけます。
※大量のウェブリクエストとは、ウェブサイトのページを表示するためにサーバーに送られるHTTPリクエスト(「ページを見せて」という要求)を大量に送ることです。攻撃者はこれを短時間で何千、何万回も繰り返し行い、サーバーに過負荷をかけます。
これにより、ウェブサイトが応答しなくなります。
アプリケーションそう(ウェブサイトなどのソフトウェアが動作する部分)を狙った攻撃のため、検知が難しいです。
身近なものに例えると!
HTTP Flood(HTTPフラッド)は、「レストランでメニューをひたすら頼むお客」ようなものです。
レストランで、一人の客がウェイターに「メニューを見せて」と何度も何度も頼み続けます。するとウェイターはその客に対応し続けて、他のお客の注文を取れなくなります。
HTTPフラッドも同じく、大量のページリクエストをサーバーに送りつけ、正規のユーザーが利用できない状態にします。
Ping of Death(ポインゴブデス)
分かりやすく説明すると
攻撃者は「とても大きなデータを持ったPing信号」を送り、サーバーに「こんなの処理できないよ!」とパニックを起こさせます。
※昔はこれでサーバーを壊せたのですが、今はほとんどのサーバーが対策済みです。
厳密に説明すると
異常に大きなサイズの「ICMPパケット」を送信し、サーバーのネットワークスタック(データ送信の制御を行うシステムの部分)をクラッシュさせる攻撃です。
古いシステムではこの攻撃が効果的でしたが、現在は多くのシステムで対策されています。
標準的なICMPパケットのサイズは通常、最大65535バイト(IPv4のパケットサイズの上限)に制限されていますが、Ping of Death攻撃では、このサイズを超えるか、破片化されたパケットの総合サイズがこの上限を超える場合があります。
身近なものに例えると!
Ping of Death(ポインゴブデス)は、「極端に大きなファイルをプリント要求」ようなものです。
古いプリンターに対して、処理しきれないほど大きなファイルを印刷要求をすると、プリンターはそのファイルに対応できず、フリーズしてしまいます。
Ping of Deathでは、古いシステムに異常に大きなデータを送り、クラッシュさせます。
Smurf Attack(スマーフ攻撃)
分かりやすく説明すると
攻撃者は、ネットワーク全体に「君たち全員、そこにいるか?」というメッセージを送ります(ブロードキャスト)。
サーバーはそれに対して何百、何千もの「います!」という返事を受け取るので、すぐに疲れ果て、他のリクエストに対応できなくなってしまいます。
厳密に説明すると
攻撃者は、ネットワーク上の「ブロードキャストアドレス」(ネットワーク上のすべてのデバイスにメッセージを送るアドレス)を使用して、大量の「ICMPリクエスト」(Pingの一種)をターゲットのIPアドレスに送信します。
送信元IP:ターゲットのIPアドレス(偽装)
送信先IP:ブロードキャストアドレス(ネットワーク上のすべてのデバイスに送信されるアドレス)
すると、ネットワーク上のすべてのデバイスは、送信元であるIPアドレス(攻撃対象)に「ICMP応答」を送信します。
これにより、攻撃対象であるサーバーに大量のデータが送られ、サーバのリソースが枯渇してしまいます。
この仕組みによって、攻撃者は自らの正体を隠しつつ、ターゲットに大量のデータを送りつけることができるのです。
身近なものに例えると!
Smurf Attack(スマーフ攻撃)は、「同じメッセージを近所中に拡散して返信させる」ようなものです。
あなたが自分の近所中に「この人に連絡して!」と一斉にメッセージを送り、その全員がターゲットに返信するとします。そうするとターゲットは突然大量の返信を受け取って、スマホが通知で埋め尽くされる状態になります。
スマーフ攻撃も、ネットワーク全体にPingリクエストを送り、ターゲットに大量の応答を送りつけます。
Slowloris(スローロリス)
分かりやすく説明すると
攻撃者はサーバーに「ウェブページを見たいんだけど…少しずつ見せて…ゆっくり…」とリクエストを少しずつ送ります。
結果、サーバーはずっと「この人のリクエストが終わるのを待たないと…」と考えて他の人の対応ができなくなります。
厳密に説明すると
「HTTP」リクエストを不完全な形で長時間送り続けることで、サーバーが接続を完了できず、少しずつリソースを消耗させる攻撃です。
※不完全な形とは、HTTPリクエストを一度に送らず、断続的かつ非常にゆっくりと送ることです。
これにより、少量のデータで状時間にわたり、サーバーをダウンさせることができます。
身近なものに例えると!
Slowloris(スローロリス)は、「銀行窓口で延々と質問をする客」ようなものです。
銀行の窓口で、一人の客が質問を小出しにして、少しずつ対応を引き延ばされると、窓口はその客に対応し続けて、他の人の対応が遅れます。
Slowloris攻撃では、リクエストをゆっくり小出しに送ってサーバーを占有し、他のユーザーにサービスが提供できないようにします。
HTTPリクエストの分割送信
通常、HTTPリクエストは以下のようなフォーマットでサーバーに送られます。
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
[空行] ← これでリクエストが完了
Slowloris攻撃では、上記のようなリクエストを一度に送るのではなく、非常にゆっくりと少しずつ分割して送ります。例えば、1つのHTTPヘッダーを数秒ごとに送信する、といった具合です。
GET / HTTP/1.1
(ここで数秒間の遅延)
Host: example.com
(さらに遅延)
User-Agent: Mozilla/5.0
このように、リクエストが完全に終わらない状態を意図的に作り出し、サーバーは「このリクエストはまだ終わっていない。データがまだ来るかもしれない」と考えて接続を開いたままにします。
Amplification Attack(アンプ攻撃)
分かりやすく説明すると
攻撃者はサーバーに小さな質問を送るのですが、サーバーはその質問に対してとても大きな答えを返します。
これを繰り返すことで、サーバーは他の人に大きなデータを送り続けることになり、他の人の通信に対応できなくなります。
厳密に説明すると
攻撃者は少量のリクエストをサーバーに送信し、応答を増幅(Amplification)させます。
例えば「DNS」(ドメイン名をIPアドレスに変換するシステム)や「NTP」(時間を同期するプロトコル)など、少ないリクエストで大量のデータを返すプロトコルを悪用し、ターゲットに対して巨大なデータ量の攻撃を行います。
これらの手法はどれもサーバーやネットワークに大きな負荷をかけ、正規の利用者がサービスを利用できない状態を作り出します。
UDPフラッドとAmplification Attack(アンプ攻撃)の違い
アンプ攻撃
- アンプ攻撃では、攻撃者は少しのリクエストを、他のサーバー(第三者のサーバー)に送ります。このサーバーが、そのリクエストに対して大きなデータを返す仕組みを悪用します。
- 攻撃者は、ターゲットのIPアドレスを偽装してリクエストを送るため、サーバーはターゲットに対して大きなデータを送り返します。
結果として、ターゲットはたくさんの大きなデータを受け取ってしまい、サーバーやネットワークがパンクしてしまう状態になります。 - この攻撃は、少ない労力でターゲットに大きなダメージを与える「効率的な攻撃」です。
UDPフラッド
- UDPフラッドは、攻撃者が大量のデータ(UDPパケット)を直接ターゲットに送りつけます。
UDPは「やり取りの確認がいらない通信方法」なので、サーバーは次々と受け取ったデータを処理しようとして、負荷がかかります。 - 攻撃者はとにかくたくさんのデータを一気に送るため、ターゲットのネットワークやサーバーが処理できず、最終的にサービスが止まってしまいます。
- アンプ攻撃と違って、データの「増幅効果はありません」が、とてもシンプルな方法です。
違いを簡単にまとめると
- アンプ攻撃は、他のサーバーを使って少ないデータで大きな攻撃をする方法。
- UDPフラッドは、大量のデータを直接送って攻撃する方法。
ゴリタン
インフラエンジニアとして、ネットワークとサーバーの運用・保守・構築・設計に幅広く携わり、
現在は大規模政府公共データの移行プロジェクトを担当。
CCNPやLPICレベル3、AWSセキュリティスペシャリストなどの資格を保有しています。