Transcription
[音楽] 皆さん、こんにちは。ITヒーローです。
今回はサイバー攻撃の手口とその対策について、代表的なものを20種類厳選し、完全イラスト解説していきます。最近、ニュースなどで有名企業から個人情報が流出、SNSや証券口座のアカウントが乗っ取られた、といった事件を本当に頻繁に耳にしますよね。
ただ、このような事件を聞いても正直「自分には関係ないかな」とどこか他人事だと思っていませんか?でも、実はこれらの危険は私たちのすぐそばに潜んでいます。そして、攻撃者は大企業だけでなく、私たち一人一人を狙っています。
では、自分が被害に合わないためにはどうすればいいでしょうか?その答えは、まず敵の手口を知ること、そして正しい対策を学ぶことです。今回は、ウェブサイトなどを使うユーザーとしての視点と、サイトを運営するサービスを提供する側の視点、その両方から対策を説明していきます。この動画1本で、皆さんの大切な情報を狙う代表的なサイバー攻撃の種類とその基本的な対策を、誰にでも分かるようにスッキリ解説します。
また、ITパスポートや基本情報、応用情報で品質の攻撃手法に絞って解説をするので、動画を見終わる頃には試験対策もバッチリです。
ただ、サイバー攻撃の勉強をしようと思っても、正直こんな悩みはありませんか?文字だけの説明じゃどう攻撃をされるのかイメージがわかない。なぜその対策が効果的なのか、理屈がどうも繋がらない。そして何より、DNSキャッシュポイズニングを理解したいのに、そもそもDNSが分からない、みたいに前提知識でつまずいて調べるのが面倒になってしまうこと。こんなことありませんか?
ご安心ください。この動画は、そんな皆さんの悩みを全て解決できるように作られています。まず、ITヒーローチャンネルのいつもの特徴である、全てイラスト解説と身近な例え話で、難しい攻撃の仕組みも直感的に「なるほど」と理解できます。専門用語も身近な出来事に例えながら説明するのでご安心ください。
さらに、解説の途中でDNSやハッシュ化のような少し専門的な用語が出てきても心配いりません。そういった攻撃を理解するための前提知識についても、その場で簡単に解説しますし、より詳しい解説動画のリンクを概要欄にも用意しているので、寄り道してから戻ってくるという使い方もできます。
今回は代表的なサイバー攻撃を20種類も紹介するので、少し長めの動画になります。ただ、チャプター機能も設定しているので、気になるところだけ見たり、後から特定の攻撃についても復習したりするのも簡単です。是非、今回の内容も役立ちそうと思っていただけたら、今のうちにチャンネル登録と高評価ボタンを押していただけると、動画作成の大きな励みになります。
それでは、始めていきましょう。
さて、この動画では、様々な攻撃手法を分かりやすく整理するために、攻撃の目的別に大きく6つのカテゴリーに分けて解説を進めていきます。これにより、この攻撃は一体何がしたいのかが明確になり、それぞれの違いが頭の中でスッキリ整理できるはずです。カテゴリーは、まずは皆さんのIDとパスワードを狙う「パスワードを盗む・破る攻撃」。次に、ウェブサイトのプログラムの穴をつく「ウェブサイトの弱点をつく攻撃」。そして、通信そのものをターゲットにする「通信を盗み聞き・偽装する攻撃」。技術だけでなく、人の心を操る「人間を騙す・利用する攻撃」。ウェブサイトを使えなくする「サービスを停止させる攻撃」。最後に、少し高度な「その他の攻撃」です。この中でも特に資格試験で狙われやすかったり、実際の被害が多かったりする、特に重要な攻撃手法を赤文字にしています。
それでは早速、最初のカテゴリー「パスワードを盗む・破る攻撃」から見ていきましょう。まず最初に、皆さんのアカウントを守る最後の砦であるIDやパスワードを盗んだり、破ろうとしたりする攻撃です。
最初に紹介するのは、最もシンプルで力任せな「パスワード解読手法」、ブルートフォース攻撃です。ブルートフォースとは「力づく」という意味で、日本語では「総当たり攻撃」とも呼ばれます。これは、その名の通り、パスワードとして考えられる全ての文字の組み合わせを手当たり次第試していく、非常に原始的ですが強力な手法です。
もちろん、攻撃者がキーボードで一つ一つ手入力しているわけではありません。コンピューターは単純な繰り返し処理が非常に得意なので、専用のツールを使えば1秒間に何万、何百万通りものパスワードの組み合わせを自動で試すことができます。そのため、短くて単純なパスワードはあっという間に破られてしまう危険性があります。
このブルートフォース攻撃の対策として、試行回数を増やすこと、そして試す機会をなくさせることが有効です。まず、ユーザー側の対策としては、パスワードの文字数を長くし、大文字・小文字・数字・記号を組み合わせた複雑なパスワードを設定することが重要です。これにより、解読に必要な組み合わせの数が指数関数的に増えるため、ブルートフォース攻撃で破ることが非常に困難になります。
サービス提供者側の対策としては、ログインを数回連続で失敗したら、そのアカウントを一時的に利用できなくする「アカウントロック機能」や、「私はロボットではありません」のような認証でお馴染みの「キャプチャ」を導入して、機械的な連続試行を防ぎます。
次は「リバースブルートフォース攻撃」です。これは、先ほどのブルートフォース攻撃とはまさにリバース、逆の発想で行われる攻撃です。ブルートフォース攻撃が1つのアカウントに対して色々なパスワードを試すのに対し、リバースブルートフォース攻撃は、1つのよく使われるパスワードを使って、色々なアカウントに対してログインを試みる攻撃です。
例えば、攻撃者は「password」という非常によく使われるパスワードを用意し、それを固定します。そして、user001, user002, user003といった大量のユーザーIDに対して順番に、このパスワードでログインを試みます。まさか、そんな簡単なパスワードを使ってる人なんていないだろうと思うかもしれませんが、実際にはセキュリティ意識の低いユーザーは、推測されやすいパスワードを使い続けている可能性が多いです。その結果、スライドの例のように、user003というユーザーがたまたまパスワードに「password」という簡単なパスワードを設定していたために、攻撃者にログインされてしまうというわけです。このように、攻撃者はたくさんのアカウントの中には、きっとこの簡単なパスワードを使ってる人がいるだろう、という低い確率に賭ける形で攻撃を仕掛けてきます。
リバースブルートフォース攻撃への対策としては、ユーザー側としては何よりもまず、「password」であったり、生年月日、電話番号など、一般でよく使われるパスワードを避けることが非常に重要です。私たちがそのような推測されやすいパスワードを使っていなければ、この攻撃のターゲットになることはありません。
サービス提供者側としては、攻撃特有のパターンを検知して、それをブロックする仕組みを導入します。具体的には、特定のIPアドレスから短時間に多数のアカウントへのログインが失敗するといった異常な動きを検知し、そのIPアドレスからのアクセスを一時的にブロックするという仕組みが有効です。IPアドレスとは、インターネットに接続された機器、例えばあなたのスマホやパソコンに割り当てられる、インターネット上の住所のようなものです。普通の人がログインする際に、1つのIPアドレスから何百、何千もの別々のアカウントに短時間でログインを試みるなんて、まずありえませんよね。そういった異常な動きを検知したら、「リバースブルートフォース攻撃に違いない」と判断して、そのIPアドレスからのアクセスをシャットアウトするという対策です。
次は「辞書攻撃」について説明します。皆さんもパスワードを設定する時に、こんな風に思ったことはありませんか?「いろんなサイトで別々のパスワードを作るのって本当に大変」「かといって、忘れたら再設定が面倒だから、覚えやすい単語にしちゃおう」。例えば、「apple」とか「baseball」とか「summer」とか、つい辞書に載っているような身近な単語をパスワードにしてしまっている人、多いのではないでしょうか。辞書攻撃は、まさにそういった心理を狙った攻撃です。
攻撃者はあらかじめ、辞書に載っている単語や、「123456789」といったよく使われるパスワードのリストを用意しておきます。そして、そのリストにある単語を片っ端から試して、ログインを試みる攻撃です。闇雲に全ての組み合わせを試すブルートフォース攻撃と違って、ありそうなものから効率的に試していくので、単純な単語のパスワードはあっという間に破られてしまう可能性があります。
辞書攻撃への対策はシンプルです。辞書に載っているような単純な単語をパスワードにしないこと。そして、複数の単語を組み合わせたり、記号や数字を混ぜたりして、推測されにくいパスワードにすることが非常に重要です。
次は、現代において非常に被害が多く、私たちにとって最も身近な脅威の一つと言える「パスワードリスト攻撃」について説明します。パスワードリスト攻撃は、どこかのサービスから流出したIDとパスワードのリストを使い、別のサービスでログインを試みる攻撃です。多くの人が複数のサービスで同じIDとパスワードを使い回している心理をついています。
攻撃のステップは次のようになります。まず、攻撃者は何らかの方法で、とあるサービスAから流出した大量のIDとパスワードのリストを不正に入手します。次に、攻撃者はそのリストを使って、全く別のサービスB、C、Dといった他のサイトで片っ端からログインを試みます。もしあなたがサービスAと同じIDとパスワードをサービスBでも使い回していたら、どうなるでしょうか?攻撃者はサービスBでもあなたのパスワードを知っていることになるので、いつも簡単に不正ログインに成功してしまいます。これがパスワードリスト攻撃の恐ろしさです。例えあなたが使っているサービスが非常に安全でも、全く関係ない別のサービスから情報が流出するだけで、あなたのアカウントが危険にさらされてしまいます。
では、パスワードリスト攻撃から身を守るにはどうすればいいでしょうか?1つ目は、パスワードを使い回さないことです。これが最も重要で、最も基本的な対策です。管理が面倒でも、サービスごとに異なるユニークなパスワードを設定しましょう。パスワード管理ツールなどを使うのも一つの手です。
2つ目が、「多要素認証」を設定することです。パスワードが突破されたとしても、最後の砦となるのが多要素認証です。スマートフォンへの通知やSMSコードなど、パスワード以外の認証要素を組み合わせることで、不正ログインを防ぐことができます。
3つ目は、流出情報をチェックすることです。自分のメールアドレスなどが過去に流出したことがあるかどうかをチェックできるサービスもあります。もし流出したリストに含まれていたら、関連するサービスのパスワードをすぐに変更しましょう。
ここで少し「多要素認証」について説明します。多要素認証とは、ログイン時に複数の異なる証拠を組み合わせて本人確認を行う、より厳重な認証の仕組みのことです。MFAや2段階認証とも呼ばれます。この証拠、つまり認証の種類には、大きく分けて3つの種類があります。
1つ目が「知識情報」です。これは本人だけが知っているはずの情報です。皆さんが普段使っているパスワードや、スマートフォンのPINコード、母親の旧姓といった秘密の質問の答えなどがこれにあたります。
2つ目が「所持情報」です。これは本人だけが持っているはずのものです。例えば、スマートフォンに届くSMS認証コードや、Google Authenticatorのような認証アプリ、USBポートに挿して使う物理的なセキュリティキー、あるいはICカードなどがこれに当てはまります。ログインしようとすると、スマホに認証してくださいと通知が来て、それをタップする。あれがまさに所持情報を使った認証です。
3つ目が「生体情報」です。これは本人自身の身体的な特徴で、他人には真似できない情報です。スマホのロック解除などでお馴染みの指紋認証や顔認証が代表的ですね。
そして、多要素認証では、これら知識、所持、生体という3種類のうち、2つ以上の異なる種類の要素を組み合わせて本人確認を行います。例えば、パスワードでログインをした後に、さらにスマートフォンで届くワンタイムコードの入力を求められるというのが、最も一般的な多要素認証です。攻撃者はあなたのスマートフォンそのものを持っていたり、あなたの指紋を持っていたりするわけではありません。そのため、この2つ目の認証の壁を突破することができず、不正ログインを諦めざるを得ないというわけです。皆さんが利用している重要なサービスで多要素認証が提供されていたら、必ず設定しておくことを強くお勧めします。
次は「レインボー攻撃」について説明します。これを理解するために、まずWebサービスにパスワードを登録する際の仕組みを理解する必要があります。私たちが使用している多くの安全なサービスでは、入力されたパスワードそのものをデータベースに保存するわけではありません。パスワードをハッシュ関数という特殊な計算にかけ、ハッシュ値という元に戻せない文字列に変換してからデータベースに保存します。レインボー攻撃はこのハッシュ化されたパスワードに対する攻撃です。
攻撃者は、よく使われるパスワードとそれに対応するハッシュ値をあらかじめ大量に計算しておき、巨大な対応表を作成しておきます。これを「レインボーテーブル」と呼びます。そして、何らかの方法でデータベースからハッシュ値を盗み出した後、その値とレインボーテーブルを照らし合わせることで、元のパスワードを高速に探し出します。
レインボー攻撃の対策としては、サービス提供者側の対応が非常に重要になります。パスワードをハッシュ化する際に、2つの重要な一手間を加える必要があります。1つ目は「ソルトを付与する方法」、2つ目は「ストレッチングという方法」です。それぞれ順番に説明します。
まず「ソルト」です。料理で使う塩と同じ言葉ですね。ソルトとは、パスワードをハッシュ化する前に付け加える、ユーザーごとに異なるランダムな文字列のことです。レインボー攻撃は、よく使われるパスワード、例えばローマ字で「password」というハッシュが、誰が使っても同じハッシュ値になるという前提で成り立っていました。そこで、このソルトの出番です。パスワードをハッシュ化する際に、元のパスワードにユーザー固有のソルトを足してからハッシュをします。こうすることで、例えAさんとBさんが同じパスワードを使っていても、ソルトが違うのでデータベースに保存されるハッシュ値は全く異なるものになります。これにより、仮に攻撃者がAさんやBさんのソルトが付与されてハッシュ化されたパスワードを取得しても、攻撃者が持っているソルトなしで計算されたレインボーテーブルは全く役に立たなくなるというわけです。
次に「ストレッチング」です。ストレッチとは英語で「引き延ばす」という意味ですね。ストレッチングとは、ハッシュの計算を意図的に何千回、何万回と繰り返し行うことです。そんなに計算を繰り返し たら、ログインが遅くならないのかと心配になるかもしれませんが、大丈夫です。コンピューターにとってこの計算にかかる時間は一瞬なので、普通のユーザーがログインする際にはほとんど気づきません。しかし、攻撃者にとってはこれが致命的になります。攻撃者が総当たり攻撃を仕掛けてきたり、レインボーテーブルを作る際には、何億、何十億というパスワードのハッシュを事前に計算しておく必要があります。この計算1回1回に、このストレッチングによる時間稼ぎが加わることで、レインボーテーブルを作成するのに指数関数的な時間がかかるようになります。これにより、攻撃者はレインボーテーブルを作ること自体を諦めざるを得なくなるんです。
このように、サービス提供者側はソルトでハッシュ値をユニークにし、ストレッチングで計算を遅くするという2段構えの対策で、私たちのパスワードをレインボー攻撃から守ってくれています。
ここからは、ウェブサイトやWebアプリケーションの弱点をつく攻撃です。まずは「SQLインジェクション」について説明します。これはWebアプリケーションの脆弱性をつく攻撃の中でも特に有名で、非常に危険な攻撃です。
SQLインジェクションは、入力フォームなどに、データベースを不正に操作する悪意ある命令文(SQL)を注入する攻撃です。普通のユーザーだと、IDやパスワードの入力欄には自分のIDとパスワードしか入れないですよね。しかし、攻撃者はこの入力欄にSQLのクエリを入れます。しかも、アプリケーションの全ユーザー情報 を削除するというような悪意のあるSQLです。そうすると、脆弱性のあるアプリケーションだと、そのSQLを実行してしまい、全ユーザー情報を削除してしまうというようなことが起こり得ます。これがSQLインジェクションです。
SQLインジェクション攻撃に対しては、主にサービス提供者側の対策が重要です。代表的なものを3つ紹介します。1つ目は、以前のネットワークセキュリティの動画でも登場した「WAF」を導入することです。WAFは通信の中身をチェックしてくれる専門警備員です。SQLインジェクション特有の攻撃パターンを検知して、データベースに届く前にブロックしてくれます。
2つ目は、アプリケーションのプログラムで行う対策、「サニタイジング」です。詳細はこの後説明します。
そして3つ目が、現在最も安全で推奨されている対策、「プレースホルダの使用」です。これは、あらかじめSQL文の型枠を用意しておき、後からユーザーの入力値を安全なデータとして、その型枠にはめ込む仕組みです。
SQLインジェクションへの対策として、アプリケーション側で行う非常に重要な処理が「サニタイジング」です。サニタイジングとは、英語で「消毒する」「無害化する」という意味です。では、具体的にどのようにして悪意のある入力を無害化するのでしょうか?SQLインジェクション攻撃で、入力フォームに「DELETE FROM users;」という文字列が注入された場合を例に、サニタイジングがどのように機能するのか、その流れを説明します。
まず、この攻撃で最も危険なのは、実は先頭にあるシングルクォートです。この1文字があるせいで、Webアプリケーションが意図していたSQL文の構造が破壊され、それに続くDELETE文が不正な命令として実行されてしまいます。そこで、サニタイジングの出番です。アプリケーションは、攻撃者が入力した「DELETE FROM users;」という文字列を受け取ると、危険な文字列である先頭のシングルクォートを無害化します。具体的には、シングルクォートをシングルクォート2つに置き換えます。SQLの世界では、シングルクォート2つは「文字としてのシングルクォート1つ」という意味になります。命令文の区切りとしての特殊な意味を失わせるんです。これがサニタイジング処理です。
無害化された文字列を使ってSQL文を組み立てると、データベースに渡される命令は、ユーザーIDの値が「DELETE FROM users;」という、ただの検索処理として正しく解釈されます。もちろん、そんなユーザーIDのユーザーはいません。なので、何も起こりません。危険なDELETE文は、ただの検索キーワードの一部として扱われるため、実行されることはありません。このように、例え悪意のある文字列が入力されても、サニタイジングによってそれがデータベースへの命令文として実行されるのを防ぐことができます。このサニタイジングは、SQLインジェクションだけでなく、この後説明するクロスサイトスクリプティングなど、多くのWebアプリケーションへの攻撃を防ぐ上で非常に重要で基本的な対策です。
次に解説するのは「OSコマンドインジェクション」です。これは先ほど学んだSQLインジェクションと名前も手口もよく似ていますが、攻撃のターゲットが異なります。SQLインジェクションがデータベースを狙う攻撃だったのに対し、OSコマンドインジェクションは、Webアプリケーションが動いているサーバー自体、その土台となっているOS(オペレーティングシステム)を直接狙う攻撃です。
ウェブサイトの入力フォームなどを悪用し、サーバーのOSに対する不正なコマンドを注入し実行させてしまいます。スライドの例では、フォームに本来入力すべき値の後ろに、セミコロンで区切って「パスワードファイルを表示しろ」というOSのコマンドを注入しています。もしこの攻撃が成功すると、サーバー内のファイルを不正に閲覧されたり、改ざん・削除されたり、最悪の場合、サーバーを完全に乗っ取られてしまう可能性があります。
OSコマンドインジェクションの対策は、基本的な考え方はSQLインジェクションの対策とよく似ています。1つ目は、WAFを導入することです。WAFは、コマンドインジェクション特有の攻撃パターンを検知し、サーバーに届く前にブロックしてくれます。
2つ目は、サニタイジングすることです。セミコロンやパイプといった、コマンドを区切るために使われる特殊な記号を、プログラム側で無害化します。
3つ目は、外部からの入力をOSのコマンドとして実行させないことです。そもそも、ユーザーからの入力値をOSのコマンドとして直接実行できるようなプログラムの作り方を避けるべきです。やむを得ず外部のプログラムを呼び出す場合は、安全な関数を使用するなど、慎重な実装が求められます。
次に解説するのは「クロスサイトスクリプティング」、略してXSSと呼ばれる攻撃です。クロスサイトスクリプティングは、脆弱性のあるウェブサイトの掲示板などに悪意のあるスクリプトを書き込み、ページを訪れた他のユーザーを攻撃します。この攻撃の最大の С特徴は、Webサーバー自体を直接狙うのではなく、そのウェブサイトを訪れた一般のユーザーをターゲットにするという点です。
主に次のような流れで実行されます。まず、攻撃者が脆弱性のあるウェブサイト、例えば誰でも書き込みできる掲示板やブログのコメント欄などに、悪意のあるスクリプト、つまりプログラムを書き込み、罠を仕掛けます。このスクリプトは、一見すると普通のコメントのように見えたり、あるいは全く目に見えなかったりします。
次に、何も知らない一般のユーザーが、その罠が仕掛けられたページを閲覧します。ユーザーはいつも利用している信頼できるサイトだと思っているので、何の疑いもなくページを開きます。すると、ユーザーのWebブラウザはその悪意のあるスクリプトを、サイトの正規のプログラムの一部だと信じ込んでしまい、何の疑いもなく実行してしまいます。
このスクリプトが実行されると、一体どんな恐ろしいことが起きるのでしょうか?代表的なものを2つ紹介します。1つ目は「アカウントの乗っ取り」です。スクリプトはブラウザに保存されているあなたのクッキー情報を盗み出し、攻撃者に送信します。これにより、攻撃者はあなたになりすましてサイトにログインし、アカウントを乗っ取ってしまいます。
2つ目は「マルウェア感染」です。スクリプトはあなたを、マルウェアが仕掛けられた別の危険なサイトに強制的に移動させることも可能です。このように、クロスサイトスクリプティングは、ウェブサイトの信頼性を逆手に取り、サイトを訪れたユーザー自身を攻撃する、非常に巧妙で危険な手口です。
クロスサイトスクリプティングの対策としては、主にサービス提供者側の対応が重要です。1つ目が、WAFを導入することです。WAFは、クロスサイトスクリプティング特有の攻撃パターンを検知してブロックしてくれます。
2つ目が、ユーザーからの入力に含まれるスクリプトタグのような、スクリプトとして特別な意味を持つ危険な文字や記号をサニタイジングすることが、最も基本的な対策となります。これらを徹底することで、例え悪意のあるスクリプトが書き込まれても、それがプログラムとして実行されるのを防ぎます。
次に解説するのは「クロスサイトリクエストフォージェリ」、略してCSRFと呼ばれる攻撃です。これを理解するためには、まず皆さんがウェブサイトにログインした後に、裏側でどのようなやり取りが行われ、ログイン状態が保持されるのかという「セッション管理」について知る必要があります。
まずはセッション管理について簡単に説明します。皆さんが一度ログインしたサイトでは、ページを移動するたびにパスワードを再入力しなくても、ログイン状態が保持されていますよね。これは、ログインに成功した証として、ウェブサーバーがあなたのブラウザに対して「セッションID」という一時的な許可証のようなものを発行しているからです。ブラウザはそのサイトにアクセスするたびに、リクエストと共にこのセッションIDを自動的に送信します。サーバーはそれを見て、「さっきログインしたユーザー本人だな」と判断し、ログインが必要なページの表示を許可してくれています。
CSRFはこの便利なセッション管理の仕組みを悪用します。CSRFは、ログイン中のユーザーを巧みに操り、本人が意図しないリクエストを偽のウェブサイトから強制的に実行させる攻撃です。フォージェリとは英語で「偽造」といった意味です。
CSRFの流れを説明します。まず、攻撃者は悪意のあるサイト、例えば罠が仕掛けられた掲示板などを用意し、罠を仕掛けます。そして、あなたがあるECサイトにログインしている状態で、その罠サイトを閲覧してしまいます。すると、罠サイトに仕込まれたプログラムがあなたのブラウザを操り、あなたがログイン中のECサイトに対して、商品の購入やパスワードの変更といったリクエストを、あなたになりすまして勝手に送信してしまいます。あなたのブラウザはECサイトへの正規のセッションIDを持っているため、この不正なリクエストと一緒にセッションIDも送ってしまいます。そのため、ECサイト側は正規のユーザーからのリクエストだと信じ込んでしまい、意図しない購入やパスワードの設定変更がされてしまいます。
このクロスサイトリクエストフォージェリへの対策としては、サービス提供者側の対応が重要です。正規のページからのリクエストであることを証明するための、推測困難な秘密の文字列である「トークン」をフォームに埋め込むことが有効です。攻撃者が用意した偽のサイトからのリクエストには、この正しいトークンが含まれていないため、サーバー側で不正なリクエストとして拒否することができます。
次は「ディレクトリトラバーサル攻撃」について説明します。まずこの攻撃を理解するために、言葉の意味から整理しましょう。ディレクトリとは、皆さんが普段使っているパソコンのフォルダーと全く同じだと思ってください。ウェブサイトのファイルも、サーバーの中では様々なディレクトリに整理されて格納されています。次に、トラバーサルとは英語で「横断する」「生きする」といった意味です。つまり、ディレクトリトラバーサル攻撃は、ウェブサーバーのディレクトリを不正に生きして、本来は公開されていないはずのファイルに不正にアクセスしようとする攻撃です。
もう少し深掘りしていきましょう。Webサーバーは通常、「このフォルダーの中のファイルだけを外部に公開していいですよ」と設定されています。これを「ドキュメントルート」と呼びます。つまり、それ以外のディレクトリやファイルは基本的に非公開です。しかし、攻撃者はURLを巧みに操作して、この制限を乗り越え、上の階層のフォルダーに不正にアクセスしようと試みます。その際によく使われるのが「../」という文字列です。これは、コンピューターに「1つ上の階層のフォルダーに移動しろ」と命令する特殊な記号です。
例えば、攻撃者はウェブサイトのURLの末尾に「../../../../etc/passwd」のように、「../」を何度も繋げた文字列を入力します。これは、Webサーバーに対して「フォルダーを1つ上がって、また1つ上がって」という命令を繰り返し、最終的にサーバーの非常に重要な設定ファイル、今回だと「etc/passwd」というパスワードが書かれたディレクトリ内のファイルを盗み見ようとしています。なぜそんなフォルダーの中身を見たいのか、と思いますよね。もしこの攻撃が成功すると、攻撃者はパスワードファイルやシステムの設定ファイル、ウェブアプリケーションのプログラムコードそのものといった、絶対に外部に見せてはいけない機密情報を盗み出すことができてしまいます。そして、その情報を元に、さらに深刻な攻撃を仕掛けてくるわけです。
ディレクトリトラバーサル攻撃への対策としては、サービス提供者側が、リクエストされたファイルパスが、公開を許可されたディレクトリの範囲内にちゃんと収まっているかを厳しくチェックすることが重要です。そして、外部からの入力に含まれる「../」のような危険な文字列をサニタイジングすることが基本的な対策となります。
次は「ディレクトリリスティング」について説明します。ディレクトリリスティングは、Webサーバーの設定ミスが原因で、ディレクトリの中身が丸見えになってしまう状態のことです。通常、フォルダーのURLにアクセスすると、index.htmlのようなデフォルトのページが表示されます。しかし、そのページがなく、かつ設定が間違っていると、サーバーが親切にフォルダーの中にあるファイルやサブフォルダーの一覧を全て表示してしまいます。普段は隠されている設定ファイルやバックアップファイルの名前が知られてしまい、より深刻な攻撃のヒントを与えてしまうことになります。
ここで少し、先ほど説明したディレクトリトラバーサルとの違いを簡単にまとめると、ディレクトリトラバーサルはプログラムの脆弱性をつき、非公開のフォルダーへ不正に侵入し、特定のファイルの中身を盗むことを目的とした、より積極的な攻撃です。例えるなら、警備員を騙して立ち入り禁止の役員室に忍び込むような行為です。一方、ディレクトリリスティングは、サーバーの設定ミスをつき、公開されているフォルダーの中身の一覧を見ることを目的とした情報収集の段階です。例えるなら、鍵の開いた部屋に入ったら、壁に設計図が張ってあったというような状況です。
ディレクトリリスティングの対策は非常にシンプルです。サーバー提供者側が、Webサーバーの設定でこのディレクトリの一覧表示機能を無効にすることが基本的な対策となります。
次は「バッファーオーバーフロー」について説明します。バッファーオーバーフローは、プログラムが用意したメモリ領域、これをバッファと呼びますが、それに対してその容量を意図的に超える巨大なデータを送り付けることで、システムを誤作動させる、古典的ですが非常に強力な攻撃です。例えば、プログラムが32バイトまで入るバッファーを用意しているのに、攻撃者がそこに1000バイトもの大量のデータを無理やり注ぎ込むようなものです。当然、コップから水が溢れて周りに影響を与えるように、メモリから溢れ出したデータが、意図しない場所に悪意のあるプログラムコードを書き込んでしまいます。これにより、システムがダウンしたり、最悪の場合、攻撃者にシステムを乗っ取られたりする可能性があります。
バッファーオーバーフローの対策は、主にプログラム開発者側の対策が重要です。入力されるデータのサイズを必ずチェックし、用意したバッファーを超えるデータは受け付けないように、プログラムを安全に実装することが基本となります。ちなみに、最近のプログラミング言語の多くは、このようなバッファーオーバーフローを防ぐための仕組みが言語レベルで備わっているため、昔に比べてこの脆弱性を作り込んでしまうことは少なくなっています。
ここからは、ネットワーク上の通信そのものをターゲットにする攻撃です。ネットワーク上の通信そのものをターゲットにする攻撃の代表例が「スニッフィング」です。スニッフィングとは、ネットワーク上を流れるデータを特殊なツールを使って盗み聞きする、古典的ですが今なお有効な攻撃です。スニフとは英語で「くんくん匂いを嗅ぐ」という意味です。その名の通り、攻撃者はネットワークを流れる情報、つまりパケットを特殊なツールを使って盗み聞きします。皆さんがログイン画面などで入力したIDとパスワードが、暗号化されずにネットワークを流れていると、その通信を防がれて内容が丸裸にされてしまいます。例えるなら、電話回線を盗聴器で盗み聞きしているようなイメージですね。
スニッフィングの危険がある行為を2つ紹介します。1つ目は「信頼できないフリーWi-Fiの利用」です。カフェやホテルなどの公共のフリーWi-Fiの中には、通信が暗号化されていない、セキュリティが非常に甘いものがあります。このようなネットワークでは、同じWi-Fiに接続している攻撃者に盗み取られてしまう可能性があります。
2つ目は「HTTPで始まる暗号化されていない通信」です。URLがHTTPで始まるウェブサイトとの通信は、暗号化されていません。つまり、IDやパスワードは平文、誰でも読める向き出しのテキストデータのままネットワークを流れます。これでは、攻撃者に「どうぞ盗んでください」と言っているようなものです。
スニッフィングへの対策は非常にシンプルですが、とても重要です。通信を暗号化すること。これにつきます。まずは、ウェブサイトを閲覧する際は、URLがhttpsで始まっているかを必ず確認しましょう。https通信が暗号化されていることを示します。2つ目は、信頼できないフリーWi-Fiの利用は避けることです。どうしても利用する必要がある場合は、個人情報やパスワードの入力は避けましょう。最後3つ目は、VPNを利用して通信を保護することです。もし信頼できないネットワークを使う場合は、VPNという仮想的な暗号化されたトンネルを作る技術を使って、通信を保護することが非常に有効です。
次に解説するのは「IPスプーフィング」です。スプーフィングとは「成りすまし」「偽装」という意味です。つまり、IPアドレスをスプーフィング、成りすましする行為です。IPスプーフィングは、ネットワーク上の通信データである通信パケットについている送信元IPアドレス、つまり差し出し人の住所を偽装することです。ドラマや映画でハッカーが自分の正体を隠すために、全く関係ない場所からアクセスしてるように見せかけるシーンってありますよね。まさにあれがIPスプーフィングのイメージです。
このIPスプーフィングには、主に2つの狙い目的があります。1つ目は「自分の正体を隠すこと」です。攻撃者は攻撃パケットの送信元IPアドレスを、全く無関係な第三者のものにします。これにより、攻撃を受けた側は誰が本当の攻撃者なのか特定することが非常に困難になります。
2つ目は「相手を信用させて防御を突破すること」です。こちらの方がより深刻です。例えば、ある会社のファイアウォールが「A社からの通信は安全だから通してよし」というルールを持っていたとします。攻撃者はそれを知ると、悪意なるパケットを送り付ける際に、送信IPアドレスを信頼されているA社のものに偽装します。ファイアウォールはパケットの宛先書き、つまりIPアドレスしか見ていないため、偽装された差し出し住所を見て、「これは信頼できるA社からの通信だな」と勘違いし、本来ブロックすべき危険な通信を社内ネットワークに通してしまいます。
IPスプーフィングへの対策としては、サービス提供者側がファイアウォールの設定を強化することが主な対策になります。例えば、社内ネットワークに属するはずのIPアドレスが、なぜか外部から送られてくるのはおかしい、といった矛盾した通信を検知してブロックするフィルタリング。これを「イングレスフィルタリング」と呼びますが、これらが有効です。
次に解説するのは「DNSキャッシュポイズニング」です。これを理解するために、まずDNSとは何かを簡単に説明します。DNSとは「ドメインネームシステム」の略で、私たちが普段使っているwww.example.comのような人間が読みやすいドメイン名を、コンピューターが通信に使う192.0.2.1のようなIPアドレスに変換してくれる、インターネット上の電話帳のような仕組みです。
DNSがどのようにドメイン名をIPアドレスに変換しているのか、流れを見てみましょう。私たちがウェブサイトを見る時、PCはまず近くの「キャッシュDNSサーバー」と呼ばれる、一時的にIPアドレスの情報を記憶しておくサーバーに、「www.example.comさんのIPアドレスは?」と問い合わせます。キャッシュDNSサーバーがそのIPアドレスを知らなければ、大元の「権威DNSサーバー」に聞きに行き、その答えをPCに教えてくれます。
DNSキャッシュポイズニングはこの便利なキャッシュDNSサーバーに、偽のDNS応答をキャッシュさせ、利用者のアクセスを攻撃者が用意したサーバーに誘導する攻撃です。スライドで流れを見てみましょう。先ほどの通常の流れのうち、攻撃者はキャッシュDNSサーバーが権威DNSサーバーに問い合わせているわずかな隙を狙って、本物の答えが返ってくるよりも先に、偽のIPアドレス情報を送り付けます。すると、キャッシュDNSサーバーは先に届いた偽の情報を本物だと信じてしまい、その偽のIPアドレスをキャッシュしてユーザーに送信してしまいます。その後、一般ユーザーが同じサイトにアクセスすると、キャッシュDNSサーバーは汚染された偽の情報を返してしまうため、ユーザーは知らず知らずのうちに、攻撃者が用意したフィッシングサイトなどに誘導されてしまうというわけです。
この巧妙なDNSキャッシュポイズニング攻撃には、主にサービス提供者側で対策を行います。1つ目は「DNSSEC」という仕組みを導入することです。DNSの応答にデジタル署名をつけ、その応答が本当に正しい管理者から来たか、改ざんされていないものであることを検証できるようにする、より安全な仕組みです。
2つ目は、キャッシュDNSサーバーのソフトウェアを常に最新に保つことです。サーバーのソフトウェアの脆弱性を突かれることもあるため、常に最新のバージョンにアップデートしておくことが重要です。
ここからは、人間を騙す・利用する攻撃について見ていきましょう。技術だけでなく、人間の心理的な隙をつく攻撃もたくさんあります。まずは「フィッシング」について解説します。
フィッシングは、銀行や有名なECサイト、宅配業者などを装ったメールやSMS、ショートメッセージを送り付けてきます。その後、本物そっくりに作られた偽のウェブサイトに誘導し、IDやパスワード、クレジットカード情報などを入力させて盗み取る、まさに釣りのような詐欺です。最近では、非常に巧妙な手口が多発しています。例えば、宅配便の不在通知を装うパターンがあります。「お荷物のお届けに上がりましたが、ご不在のため持ち帰りました。詳細をご確認ください」といったSMSを送り付け、偽の再配達依頼サイトへ誘導します。また、アカウントのセキュリティ警告を装うパターンもあります。「Amazonアカウントに異常なログインがありました」「Apple IDがロックされました」といった緊急性を煽る件名でメールを送り、パスワードなどを再設定させようと偽サイトへ誘導します。
なぜ多くの人がフィッシングにかかってしまうんでしょうか?フィッシング詐欺は、非常に引っかかりやすい攻撃と言えます。その理由の1つ目は、緊急性と恐怖心を煽ってくるからです。「重要アカウント停止」といった言葉でユーザーを焦らせ、冷静な判断をさせないように仕向けてきます。2つ目は、本物と見分けがつかないからです。店のメールやウェブサイトの見た目が、デザインを含めて本物と見分けがつかないように作られており、一見しただけでは偽物だと見破ることが非常に困難です。
フィッシングへの対策の基本は、送られてきたメッセージを疑うことです。まずは、メールやSMS内のリンクは絶対にクリックしないことです。心当たりがある内容でも、必ずブックマークや公式アプリなど、普段使っている方法で公式サイトにアクセスし、本当にそのような通知が来ているかを確認する癖をつけましょう。そして、万が一IDとパスワードが盗まれてしまっても、不正ログインを防ぐための最後の砦が出、先ほど説明した多要素認証です。重要なサービスでは必ず設定しておきましょう。
次は、数あるサイバー攻撃の中でも、ユーザー側が最も気づきにくく、防ぎにくい攻撃の一つ、「ドライブバイダウンロード」です。この攻撃の最も恐ろしい点は、悪意のあるウェブサイトをただ閲覧しただけで、ユーザーが何もクリックしなくても、自動的にマルウェアがダウンロードされ実行されてしまうところです。説明を聞くだけでも怖いですよね。
では、攻撃者はどうやって私たちにそんな危険なサイトを閲覧させるんでしょうか?そこでよく悪用されるのが、「水飲み場攻撃」という手法です。これは、ライオンがオアシス、つまり水場で獲物を待ち伏せする様子に例えられて、この名前がついています。まず、攻撃者は特定の企業や組織の社員がよく閲覧するウェブサイト、例えば業界ニュースサイトや関連企業のブログなどを事前に調査し、そのサイトをハッキングしてドライブバイダウンロードの罠を仕掛けます。そして、ターゲットとなる社員がいつも通りそのサイトを訪れた瞬間に、ドライブバイダウンロードによってマルウェアに感染させてしまいます。
この攻撃は、特定の企業を狙った標的型攻撃の入り口として使われることが多いです。また、最近では、この後説明するDDoS攻撃のための準備段階として、ドライブバイダウンロードが利用されるケースも増えています。つまり、たくさんのPCをマルウェアに感染させて、ボットネットと呼ばれる、遠隔操作できるゾンビPC軍団を作り上げるために、この手口が使われるのです。
ドライブバイダウンロードは、OSやブラウザ、プラグインの脆弱性を悪用します。そのため、私たちユーザーにできる最も重要で効果的な対策は、OSやブラウザ、ウイルス対策ソフトを常に最新の状態にアップデートし、脆弱性を放置しないことです。
次は「SEOポイズニング」について説明します。これを理解するために、まずSEOという言葉から説明します。皆さんも何かを調べる時、検索結果の1ページ目や、より上の方に表示されたサイトを信頼できる情報だと思ってクリックしますよね。わざわざ10ページ目まで見に行く人は少ないと思います。そのため、企業などのサイト運営者は、自分のサイトが検索の上位に表示されるように日々努力しています。SEOとは「Search Engine Optimization」、検索エンジン最適化の略で、特定のウェブサイトをGoogleなどの検索結果の上位に表示させるための技術のことです。
SEOポイズニングはこのSEO技術を悪用し、ウイルスを仕込んだり、偽情報を掲載したりする悪意のあるサイトを検索結果の上位に表示させる手口です。ポイズニングとは「汚染する」「毒を入れる」という意味ですね。攻撃者は、皆さんが検索結果の上位サイトを信頼してクリックする、その心理を巧みに利用します。話題のニュースや人気のキーワードで検索したユーザーを、巧妙に偽サイトやマルウェア配布サイトへ誘導し、ウイルスに感染させたり、個人情報を盗んだりします。
SEOポイズニングの対策として、もちろんGoogleなどの検索エンジン側も、このような悪質なサイトを検索結果から排除するために、日々アルゴリズムを改善し、24時間体制でパトロールを行っています。しかし、攻撃者とのいたちごっこになっているのが現状です。そのため、最終的には私たちユーザー自身の注意深さが重要になります。検索結果からサイトにアクセスする際は、特に緊急性の高い情報を探している時ほど、一呼吸置いて、表示されたURLやサイト名が本当に信頼できるものか、少し意識して確認することが大切です。
次に解説するのは「セッションハイジャック」です。これはWebサービスにログインしているユーザーに完全になりすます、非常に危険な攻撃です。セッションハイジャックを理解するために、CSRFの時にも少し触れたセッション管理の仕組みをもう一度簡単に復習しましょう。皆さんがウェブサイトにログインすると、サーバーはログイン成功の証として、セッションIDという一時的な許可証のようなものを発行します。ブラウザはそのサイトにアクセスするたびに、このセッションIDを自動的に提示することで、私たちは何度もパスワードを入力することなくサービスを使い続けることができたんでしたね。
セッションハイジャックはこの非常に便利な許可証であるセッションIDそのものを、攻撃者が横から盗み出す行為です。攻撃者はスニッフィングや、先ほど説明したクロスサイトスクリプティングといった他の攻撃手法を使い、ワーク上流れているあなたのセッションIDを盗み取ります。そして、その盗んだセッションIDを使ってWebサーバーにアクセスします。サーバー側は正しいセッションIDを提示されたため、本物のユーザーだなと勘違いし、攻撃者をあなたとして扱ってしまいます。これにより、攻撃者はあなたに完全に成りすまし、アカウント内の個人情報を閲覧したり、不正な投稿をしたり、勝手に商品を 購入したりすることが可能になってしまいます。
セッションハイジャックへのまずサービス提供者側の対策としては、httpsによる通信の暗号化は必須です。これにより、通信途中でセッションIDが盗み取られるのを防ぎます。また、ユーザーのブラウザに保存される情報、つまりクッキーを、暗号化通信の時だけ送信するように指示する「セキュア属性」を付与するなど、が対策として有効です。
一方、私たちユーザー側の対策は、カフェやホテルなどの公共のフリーWi-Fiは通信が暗号化されていない場合があり、セッションIDを盗み取られるリスクが高まります。信頼できないネットワークの利用は避けることが重要です。また、サービスを使い終わったら、こまめにログアウトする癖をつけましょう。これにより、セッションIDが無効になり、ハイジャックのリスクを減らすことができます。
ここからは、企業のサービスそのものを停止させる攻撃について説明します。まず説明するのは、サーバーに大きな負荷をかけてサービスを停止に追い込む「DoS攻撃」です。DoSとは「Denial of Service Attack」、日本語で「サービス妨害攻撃」という意味です。この攻撃は、特定のサーバーに対して1台のコンピューターから大量の処理要求やデータを送り付け、サーバーをダウン状態にしてサービスを停止させる攻撃です。例えるなら、人気のお店の電話に、1人が一気通話でいたずら電話をかけ続けて、他の本当のお客さんが電話をかけられない状態にするようなものです。
そして、このDoS攻撃をさらに強力に悪質にしたのが「DDoS攻撃」です。DDoSとは「Distributed Denial of Service」、分散型サービス攻撃です。マルウェアに感染させた多数のコンピューターを「ボットネット」と言います。これを利用して、たくさんの場所から一斉に特定のサーバーに対して攻撃を仕掛ける方法です。先ほどの例えで言うなら、ずら電話を何千万人の人たちが一斉にかけるようなものです。これでは電話回線は完全にパンクしてしまいますよね。このように、攻撃が1台なのがDoS。多数のコンピューターから分散して一斉に行うのがDDoSです。攻撃が分散しているため、DDoS攻撃は防御が非常に困難です。
では、DoS・DDoS攻撃のような大量のアクセスによる攻撃にどう対応するんでしょうか?これは主にサービス提供者側での対応が中心となります。まずはファイアウォールや、不正侵入防止システムであるIPSで、異常な量のトラフィックを検知し遮断します。例えば、「普段はこのサイト1分間に100人くらいしか来ないのに、急に10万リクエストが飛んできたぞ。これはDDoS攻撃に違いない」といった動きを検知し、その通信をブロックします。また、より高度な攻撃に対応するために、専門のDDoS攻撃対策サービスを導入することもあります。
最後に「その他の攻撃」について説明します。次は攻撃の中でも特に防御が難しい「ゼロデイ攻撃」について説明します。ゼロデイ攻撃は、OSやソフトウェアに未知の脆弱性が発見されてから、その開発元が対策となる修正プログラムを提供するまでの、わずかな時間差を狙って行われる攻撃です。開発元が脆弱性に気づき、急いで修正プログラムを作り始めたとしても、それが完成し、私たちユーザーに提供されるまでにはどうしても時間がかかります。その期間は、攻撃に対して無防備です。攻撃者はまさに、その対策が存在しない無防備な期間を狙って攻撃を仕掛けてきます。修正プログラムが提供された日を「1日目」とすると、それより前、つまり対策が存在しない「0日目」の段階で行われる攻撃なので、ゼロデイ攻撃と呼ばれています。
では、まだ修正プログラムが存在しないこの攻撃に、私たちはどう立ち向かえばいいんでしょうか?完全な防御は困難ですが、被害を軽減するために有効な対策がいくつかあります。1つ目が、IPSやWAFで不審な通信を検知・ブロックすることです。脆弱性をつく攻撃であっても、その通信のパターンが明らかに異常な場合があります。不正侵入防止システムであるIPSやWAFは、そのような不審な通信の振る舞いを検知してブロックすることで、攻撃を防げる可能性があります。
2つ目は、ウイルス対策ソフトの「振る舞い検知」です。パターンマッチングでは検知できなくても、マルウェアの怪しい動きを検知する振る舞い検知が、ゼロデイ攻撃によって送り込まれた未知のマルウェアの活動を食い止めてくれる場合があります。このように、特定の弱点をピンポイントで防ぐハッチだけに頼るのではなく、多層的な防御の仕組みを整えておくことが、ゼロデイ攻撃への備えとなります。
お疲れ様でした。今回は様々な種類のサイバー攻撃について、その目的別に手口と対策を解説しました。今回解説した内容は、基本情報や応用情報のセキュリティ分野で品質の知識ばかりです。それぞれの攻撃が何をするものか、そして基本的な対策は何かをセットで覚えておくだけで、試験の得点力アップに直結しますので、是非この動画を何度も見返して学習に活用してください。敵の手口を知ることは、自分の組織の情報を守るための第一歩です。まずはどんな危険があるのかを知り、基本的な対策を実践することが大切です。
今回も最後までご覧いただき、本当にありがとうございました。もしこの動画が少しでも役立ったと思っていただけたら、是非コメントや高評価、そしてチャンネル登録をしていただけると、今後の動画制作の大きな励みになります。また次回の動画でお会いしましょう。