【DoS攻撃とは?】仕組み・種類を初心者向けにわかりやすく解説!

最終更新日 2024年9月29日

DoS攻撃について分かりやすく解説!

記事の概要

この記事では、情報セキュリティの脅威の1つである「DoS攻撃」について解説します。
DoS攻撃の概要や特徴、攻撃手法についてまとめています。

今回の記事での説明内容

今回の記事で説明する内容は以下です。

  1. DoS攻撃の概要
  2. DoS攻撃の特徴
  3. SYN Flood(SYNフラッド)
  4. UDP Flood(UDPフラッド)
  5. ICMP Flood(ICMPフラッド)
  6. HTTP Flood(HTTPフラッド)
  7. Ping of Death(ポインゴブデス)
  8. Smurf Attack(スマーフ攻撃)
  9. Slowloris(スローロリス)
  10. Amplification Attack(アンプ攻撃)

この記事はこんな人にオススメ!

● DoS攻撃とはどんなものか分かりやすく知りたい人!

● 不正アクセスの手口や対策を学び、システムのセキュリティを強化したい人!

● セキュリティリスクを理解する必要がある開発担当者!

● 不正アクセスに関する知識を深め、試験対策として活用したい人!

DoS攻撃

DoS攻撃の概要

分かりやすく一言でいうと

DoS攻撃とは、サーバーやネットワークにたくさんのデータを一気に送り付けて、他の人が使えないようする攻撃です。

もう少し詳しく言うと

もう少し詳しく言うと、DoS攻撃(Denaial of Service攻撃)は、特定のサーバーやネットワーク(インターネット上のデータをやり取りする仕組み)に、
大量のリクエスト(データを送って「これをやってください」とお願いすること)を送り付けることで、他の人がそのサービスを使えないようにする攻撃
です。

この攻撃の目的は、サーバやネットワークのリソース(処理する力やインターネットの通信量など)をいっぱいにして、普通の人がサービスを利用できなくしてしまうことです。

言い換えると、たくさんの人が同時にお店に入ろうとして、正規のお客さんが入れなくなるイメージです。

DoS攻撃のイメージ図

身近なものに例えると!
DoS攻撃を身近なものに例えると、「エレベーター」を使う例が分かりやすいです。

例えば、大きなビルにエレベーターが一台しかないとします。普段はみんなが順番に乗れるのですが、誰かがエレベーターのボタンをひたすら押して、何もせずに乗り降りを繰り返すことで、他の人がエレベーターを使えなくしてしまうイメージです。エレベーターはずっと動いているのに、目的地に行きたい人が乗れず、利用できなくなってしまいます。

これが、サーバーやネットワークに大量の無駄なリクエストを送ることで、他の人がサービスを使えなくするDoS攻撃と同じような状況です。

DoS攻撃の特徴

リソースの枯渇(リソース不足)

サーバーやネットワーク(インターネット上でデータをやり取りする仕組み)の「リソース」(コンピュータの処理能力やメモリ、通信できるデータ量など)を大量に使い果たすことで、他の人がサービスを使えなくします。

例えば、みんなが同時に使おうとするとWi-Fiが遅くなったり、全く繋がらなくなったりすることがありますよね。
それと同じ状態を意図的に引き起こします。

単一の攻撃元(攻撃者が少数)

DoS攻撃は、通常少数のパソコンや端末(スマホなど)から行われます。

これは、複数のパソコンや端末を使う、DDos攻撃(Distributed Denail of Service攻撃)とは違い、攻撃者が少数で行われるということです。

例えると、友達が一人だけゲームを繰り返しリセットして、他の人が遊べないようにするような感じです。

容易な検出と防御(見つけやすく守りやすい)

攻撃が1つのパソコンから行われている場合、攻撃元のIPアドレス(インターネット上での住所のようなもの)をブロックしたり、特定のパターンのデータを遮断したりして対処できることが多いです。

しかし、もし攻撃が非常に短い時間で一気に行われたり、攻撃の量が非常に多い場合は防ぐのが難しいこともあります。

例えると、一人の迷惑客がいたら追い出しやすいけれど、急に大量の迷惑客が押し寄せたら対応が難しいという感じです。

よく使われるDoS攻撃の手法

SYN Flood(SYNフラッド)

分かりやすく説明すると

攻撃者がサーバーに「通信を始めたいよ!」という信号(SYNパケット)をたくさん送ります。

サーバーは「OK!待ってるよ」と返事をしますが、攻撃者はそれ以上返事をしません。

すると、サーバーは「いつ返事が来るんだろう?」とずっと待ち続けてしまい、他の人と通信する余裕がなくなってしまいます。

厳密に説明すると

攻撃者は、サーバーに大量の「SYNパケット」(TCP接続を開始する信号)を送り、
TCP接続(インターネットの通信を確立する手順)の途中で止めます。


すると、未完了の接続が発生します。この未完了の接続は、一定の時間(タイムアウトまで)その接続状態を保持します。
その間、リソース(メモリやCPU)を消費してしまいます。

この未完了の接続が大量に発生すると、サーバーリソース(計算能力やメモリなど)を使い果たし、
他の利器の利用者がアクセスできなくなります。

参考

未完了の接続が発生した際に、メモリ、CPUに保持しておく情報は以下です。

メモリ:
サーバーは未完了の接続ごとに、その接続に関する情報(IPアドレスやポート番号など)を保存しておきます。
そのため、大量の未完了の接続が発生するとメモリを使い果たしてしまします。

CPU(計算リソース):
サーバーは、各接続を追跡し、応答が来るかどうかを確認するために定期的に計算を行います。 大量の未完了の接続を管理することで、CPUが過剰に消費されます。

身近なものに例えると!

SYN Flood(SYNフラッド)は、「カスタマーサービスへの大量の無言電話」のようなものです。

あなたの会社のカスタマーサービスに、次々と「問い合わせたい」と電話がかかってきますが、誰も具体的な質問をしません。それでも、オペレーターは「もしもし?」と待ち続け、他の正規のお客様の電話に対応できなくなります。

これはSYNフラッド攻撃と同様で、サーバーに接続要求だけを送り続けて、処理が完了しない状態にさせるのです。

UDP Flood(UDPフラッド)

分かりやすく説明すると

攻撃者は「UDP」というプロトコルを使って、サーバーにデータをどんどん送り続けます。

UDPは「返事をしなくていい通信」のため、送り放題です。

攻撃者がUDPを大量にサーバーへ送信すると、この大量のデータで道(ネットワーク)が混雑し、
他の人の通信ができなくなってしまいます。

厳密に説明すると

「UDP」(ユーザ・データグラム・プロトコル)は、インターネット上でデータを高速に送るための手法ですが、
接続の確認を行わないため、攻撃者は大量のUDPパケットを送り付けます。


これにより、サーバーのネットワーク帯域(データを送受信できる容量)や計算リソースが圧迫されます。

特にDNS(ドメイン名をIPアドレスに変換するシステム)やNTP(時間を同期するプロトコル)などが狙われやすいです。

参考

DNSやNTPが攻撃者から狙われやすいのは以下の理由があります。

①UDPはデータが軽量でかつ、高速で送信できるため、大量データの送信に向いていること
DNSやNTPは「UDP」(ユーザー・データグラム・プロトコル)を使ってデータをやり取りすることが一般的です。

UDPはTCPと違い、接続の確認やデータの受け渡しの確認を行わないため、軽量で高速に通信できます。

しかし、接続確認がないため、攻撃者が大量のパケットを送り込んでも、サーバーはそのパケットが正規のものかどうかを確認しません。これが攻撃者にとって都合が良い点です。

小さなリクエストで大きな応答を返すことができること
DNSやNTPには「リクエストに対して応答が大きくなる」という特徴があります。

攻撃者は非常に小さなリクエストを送ることで、サーバーから大きな応答を得ることができます。
この仕組みを悪用し、少ないリクエストで大量のデータをターゲットに送り返す「アンプ攻撃」(増幅攻撃)が可能です。

例えば、DNSでは小さな質問(例: ドメイン名のIPアドレスを教えてほしい)に対して、サーバーは大量の情報(IPアドレスに加えて他のデータも含む)を返すことがあります。

攻撃者は偽のIPアドレス(ターゲットのIPアドレス)を使って質問を送り、DNSサーバーがターゲットに大量の応答を送りつけるように仕向けます。

NTPにも類似の仕組みがあり、特定のリクエスト(例: “monlist” コマンド)を送ると、NTPサーバーが多くの情報を返す仕組みを利用して、大量のデータをターゲットに送ることができます。

③広く利用されているためアクセスしやすいこと
DNSはインターネット全体で使われる必須のシステムであり、ほとんどすべてのインターネット通信において、ドメイン名をIPアドレスに変換するために必要です。


そのため、多くのサーバーがDNSサービスを提供しており、攻撃対象にしやすいプロトコルです。
NTPも同様に、インターネット上の多くのサーバーやデバイスが時間の同期を行うために使っており、広く使われているため攻撃対象にしやすいです。

④アクセス制御が難しいこと
DNSやNTPは、正規のユーザーにサービスを提供するために開かれているサービスであり、インターネット上の誰でも簡単にアクセスできるように設計されています。

このため、攻撃者がサーバーにリクエストを送ることが比較的容易です。

身近なものに例えると!

UDP Flood(UDPフラッド)は、「郵便局に大量のいたずらの手紙を送る」ようなものです。

郵便局に、いたずら用の手紙が大量に送られてくると、郵便局はこれを開けて確認するのに追われ、正規の郵便物の処理が遅れてしまいます。

同じように、UDPフラッドは無意味なデータを大量に送りつけて、サーバーのリソースを浪費させます。

ICMP Flood(ICMPフラッド)

分かりやすく説明すると

「Ping」という信号を使って「君、そこにいる?」とサーバーに何度も何度も聞く攻撃です。
サーバーは一生懸命「いるよ!」と答え続けてしまい、他の人からの質問には答えられなくなります。

厳密に説明すると

「ICMP」(インターネット制御メッセージプロトコル)は、Pingリクエスト(他のコンピュータに応答を確認するための通信)に使用されます。

攻撃者はサーバーに大量のPingリクエストを送り付け、応答処理にサーバーのリソースを消費させ、正規のユーザに対応できなくさせます。

身近なものに例えると!

ICMP Flood(ICMPフラッド)は、「サポートセンターへのひたすらの「確認」要求」ようなものです。

サポートセンターに何度も「今も対応してますか?」「まだ対応してますか?」と問い合わせを送り続けると、サポートセンターは「はい、対応してます」と毎回答えなければならず、本来のサポート業務に集中できません。

ICMPフラッドはこれと同じで、サーバーに「いる?」と無限にPingを送り続け、応答にリソースを使わせます。

HTTP Flood(HTTPフラッド)

分かりやすく説明すると

攻撃者はウェブサイトに「このページを見せて!」とたくさんのリクエストを送り続けます。
ウェブサイトは「忙しすぎてもう無理!」となり、正規の利用者にページを見せられなくなってしまいます。

厳密に説明すると

「HTTP」(ウェブページを表示されるためのプロトコル)を使った攻撃で、大量のウェブリクエストをお送り、サーバーに過負荷をかけます。
※大量のウェブリクエストとは、ウェブサイトのページを表示するためにサーバーに送られるHTTPリクエスト(「ページを見せて」という要求)を大量に送ることです。攻撃者はこれを短時間で何千、何万回も繰り返し行い、サーバーに過負荷をかけます。

これにより、ウェブサイトが応答しなくなります。

アプリケーションそう(ウェブサイトなどのソフトウェアが動作する部分)を狙った攻撃のため、検知が難しいです。

参考

なぜアプリケーション層を狙った攻撃だと検知が難しいのか?

アプリケーション層を狙った攻撃だと検知が難しいのは、攻撃者のリクエストが、正規のウェブページアクセスと同様の形式で送られるからです。(攻撃者が送るリクエストが、一般の利用者がウェブページを見るときに送る通常のHTTPリクエストと技術的に同じという意味です。)

具体的には、通常ユーザがブラウザでウェブサイトを開くと、ブラウザはサーバーに「このページを見せて」というリクエスト(GETリクエストなど)を送ります。

攻撃者も同様に「GETリクエスト」などの正規のHTTPプロトコルに従って、サーバーにページを要求します。

形式としては、攻撃者が送るリクエストと正規のユーザーが送るリクエストは同じであり、区別がつきません。


そのため、サーバー側から見ると、攻撃者が送ってくるリクエストも、ヘッダーやパラメータが正常に設定されており、攻撃を受けても、ただアクセス量が急激に増えているだけに見えます。

このため、アプリケーション層の攻撃(HTTP Floodなど)は、通常のトラフィックの増加と攻撃を区別するのが難しいのです。

身近なものに例えると!

HTTP Flood(HTTPフラッド)は、「レストランでメニューをひたすら頼むお客」ようなものです。

レストランで、一人の客がウェイターに「メニューを見せて」と何度も何度も頼み続けます。するとウェイターはその客に対応し続けて、他のお客の注文を取れなくなります。

HTTPフラッドも同じく、大量のページリクエストをサーバーに送りつけ、正規のユーザーが利用できない状態にします。

Ping of Death(ポインゴブデス)

分かりやすく説明すると

攻撃者は「とても大きなデータを持ったPing信号」を送り、サーバーに「こんなの処理できないよ!」とパニックを起こさせます。
※昔はこれでサーバーを壊せたのですが、今はほとんどのサーバーが対策済みです。

厳密に説明すると

異常に大きなサイズの「ICMPパケット」を送信し、サーバーのネットワークスタック(データ送信の制御を行うシステムの部分)をクラッシュさせる攻撃です。

古いシステムではこの攻撃が効果的でしたが、現在は多くのシステムで対策されています。

標準的なICMPパケットのサイズは通常、最大65535バイト(IPv4のパケットサイズの上限)に制限されていますが、Ping of Death攻撃では、このサイズを超えるか、破片化されたパケットの総合サイズがこの上限を超える場合があります。

参考

なぜ大きなサイズが問題になるのか?

多くのシステムでは、ICMPパケットを適切に再構築する必要があります。

しかし、Ping of Death攻撃では、サイズが65535バイトを超えるような破片化されたICMPパケットが送られ、システムがこれを再構築しようとするとバッファオーバーフローを引き起こし、システムがクラッシュしたり異常動作をしたりします。

身近なものに例えると!

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セキュリティスペシャリストなどの資格を保有しています。