著者:田中麻維
大手電機メーカー系のSierに入社後、インフラエンジニアとしてLinuxサーバーの構築や保守・運用、ソフトウェアの開発業務を経験。アイティベル入社後は、IT領域の執筆などを行う。
バッファオーバーフロー攻撃とは、プログラムがデータを格納する際、意図的にバッファのサイズを超える大量のデータを送り込む攻撃です。古典的なサイバー攻撃手法の一つですが、いまだに多くの被害が出ています。
本記事では、バッファオーバーフロー攻撃の基本についてわかりやすく解説し、具体的なリスクや被害事例、対策方法まで紹介します。
1. バッファオーバーフロー攻撃とは
バッファオーバーフロー攻撃とは、プログラムがメモリ上に確保した自身が使用する領域(バッファ)のサイズを超えるほどの大量のデータを送りつける攻撃です。
プログラムが予定していたバッファサイズを超えてデータが書き込まれると、本来データが格納されるべきでないメモリ領域にも書き込みが行われます。この状態は「バッファオーバーフローの脆弱性」と呼ばれ、これを悪用します。
バッファオーバーフロー攻撃の被害を受けると、不正なコードの実行やプログラムの強制停止、ほかのサイバー攻撃の踏み台にされるといったトラブルを引き起こすおそれがあります。
DoS攻撃との違い
DoS攻撃とは、1台のPCから特定のサーバーやWebサイトに対して許容量を超える大量のリクエストやデータを送りつけ、システムダウンやサービスの停止を誘発するサイバー攻撃です。
バッファオーバーフロー攻撃とDoS攻撃は、どちらも過剰な量のデータを送りつける手法ですが、目的と攻撃を行う領域が異なります。バッファオーバーフロー攻撃は不正なコードを実行するために、脆弱性を利用してサーバー内のメモリに対して過剰なデータを送る手法です。一方DoS攻撃はシステムダウンやサービス停止を引き起こすために、外部からWeb上に公開されているサーバーに対して過剰なリクエストを送ります。
また、1台のPCからではなく、第三者のPCを乗っ取って複数のPCから大量のデータを送りつけるDDoS攻撃も存在します。バッファオーバーフロー攻撃を通じてシステムにマルウェアをインストールされ、端末がDoS攻撃やDDoS攻撃に利用されるケースもあります。
DoS攻撃・DDoS攻撃について、詳しくは下記記事で紹介しています。ぜひご覧ください。
2. バッファオーバーフロー攻撃の仕組み
バッファオーバーフロー攻撃は、先述したように攻撃者がバッファの許容サイズを超えるデータを送り込み、リターンアドレス(戻りアドレス)が書き換えられることで不具合が発生する仕組みです。
バッファとは
バッファとは、プログラムがデータを一時的に保管するためのメモリ領域です。たとえば、ユーザーからの入力を保存したり、ファイルからデータを読み込んだりする際に使用されます。バッファは通常、プログラムによって事前にサイズが定められ、その範囲内でデータを操作します。
リターンアドレスとは
リターンアドレスとは、プログラムが関数を呼び出すとき、その関数が終了したあとにプログラムのどの部分に戻るかを指示するアドレスです。関数の実行が終了すると、プログラムはリターンアドレスに記載されている位置に戻り、次の命令を実行します。
しかし、バッファオーバーフロー攻撃によりバッファからデータが溢れてバッファ以外のメモリ領域にあるリターンアドレスが書き換えられると、プログラムはそれに従い不正なコードや命令を実行してしまいます。
3. バッファオーバーフロー攻撃の種類
バッファオーバーフロー攻撃は、攻撃対象となる領域によって次の3種類に分けられます。
スタック領域を狙う攻撃
スタック領域は、プログラムの実行中に関数の呼び出しと戻りに関連するデータを一時的に保存するための領域です。具体的には、関数が呼び出されるときにその関数のローカル変数、引数、リターンアドレスなどを記憶します。
スタック領域を狙うバッファオーバーフロー攻撃は、前章で紹介したようにバッファに隣接するメモリ領域にまでデータが溢れ、リターンアドレスを書き換えられることが一般的です。
ヒープ領域を狙う攻撃
ヒープ領域は、プログラムの実行中に動的にメモリを確保、または解放するために使用される領域です。ヒープ領域はスタック領域とは異なり、プログラムの要求に応じてメモリを割り当てたり解放したりするため、そのサイズや使用方法はより柔軟となります。比較的大きなデータがヒープ領域に格納されることが多いです。
ヒープ領域を狙うバッファオーバーフロー攻撃は、ヒープ領域の許容サイズを超えるメモリ領域を確保させます。これにより実行しているプログラムの強制停止や、メモリの破壊などを行うことが目的です。
静的領域を狙う攻撃
静的領域は、プログラムの実行中に変更されないデータ(グローバル変数や定数など)を格納するための領域です。
静的領域を狙うバッファオーバーフロー攻撃は、静的領域の許容量を超えるデータを送り込み、オーバーフローにより次に実行するコードの場所が記載された「ジャンプアドレス」を書き換えます。これによりマルウェアなどの不正なコードを実行させることが目的です。
4. バッファオーバーフロー攻撃によるリスク
バッファオーバーフロー攻撃を受けると、次のようなリスクが発生する可能性があります。
プログラムが強制的に停止される
バッファオーバーフロー攻撃によってプログラムが想定外のデータを処理する際に、メモリが破損することがあります。これにより、プログラムの正常な動作が妨げられ、最終的には強制的に停止されるおそれがあります。プログラムが停止すると、意図せずサービス提供が中断されてしまい、業務や利益に多大な影響を及ぼしかねません。
悪意のあるコードを実行される
リターンアドレスやジャンプアドレスが書き換えられ、攻撃者による任意のコードが実行されるおそれがあります。たとえばウイルスやワーム、ボットなどへの感染、バックドアの設置などです。さらに不正な活動が可能となるため、被害も拡大してしまいます。
管理者権限を奪われる
不正なコードの実行により、管理者権限を奪われる危険性もあります。これにより懸念されるのが、管理者しかアクセスできない機密情報やアカウント情報が盗まれる被害です。情報流出は顧客や関係者からの信頼を失うほか、補償などの金銭的なダメージを受ける可能性もあります。
サイバー攻撃の踏み台にされる
バッファオーバーフロー攻撃によって一度侵害されたシステムは、さらなる攻撃の起点として使用されることがあります。攻撃者は侵害したシステムを利用して、ほかの内部または外部のシステムに対して身元を隠しながら攻撃を行います。
たとえば、ボットネット(攻撃者が制御する複数のデバイス群)の一部として、ほかのネットワークにDDoS攻撃を行うケースなどです。これにより攻撃の範囲が拡大するうえ、攻撃者の身元検出が困難となります。
5. バッファオーバーフロー攻撃の事例
次に、バッファオーバーフロー攻撃により実際に発生した被害事例と、バッファオーバーフローの脆弱性を悪用した攻撃を紹介します。
官公庁Webサイトの改ざん
2000年、科学技術庁や総務庁などの官公庁関連のWebサイトに不正にアクセスされ、内容が改ざんされる被害が相次ぎました。
官公庁への攻撃を捜査する警視庁ハイテク犯罪対策総合センターによると、被害にあったサーバー15件のうち、6件がバッファオーバーフロー攻撃による侵入であると確認されました。原因はWebサーバーに対するセキュリティパッチの適用などの作業を怠ったこととされています。
参考:官公庁のWeb改ざん相次ぐ | 日経クロステック(xTECH、官公庁、Yahoo!、Amazon.comを襲った手口 | 日経クロステック(xTECH)
Stack Clash
Stack Clashは、2017年に確認されたLinux・OpenBSD・NetBSD・FreeBSDなどの複数のOSに影響を与える脆弱性です。この脆弱性はバッファオーバーフローの一種で、スタック領域を別のメモリ領域と干渉させることで発生します。
Stack Clashを悪用すると、データ構造を書き換えることができ、攻撃者は完全な管理者権限を取得できます。これによりシステム全体の制御を可能としました。
参考:Linuxなどに「Stack Clash」脆弱性、権限昇格の恐れ – ZDNET Japan
Code Red
Code Redは、2001年に確認されたワームです。ワームとは、ほかのプログラムを必要としないことや、自己増殖できることが特徴のマルウェアの一種です。
Code RedはMicrosoftが提供するIIS Webサーバーに対して、ワームのコードを含んだHTTPコマンドを送り付け、バッファオーバーフロー攻撃をしかけます。活動を開始してから1日で30万台程度が感染する被害が確認されました。
参考:Insider’s Eye:緊急リポート:Code Redワームの正体とその対策[改訂版] – @IT
6. バッファオーバーフローが発生しやすいプログラミング言語
プログラミング言語のなかには、バッファオーバーフローが発生しやすい・発生しにくいものがあります。バッファオーバーフローが発生しやすいプログラミング言語の特徴について解説します。
メモリ管理を行う必要がある言語
バッファオーバーフローが発生しやすいのは、開発者がメモリの管理を行う必要があるプログラミング言語です。たとえば、C言語やC++は開発者によるメモリ管理が必要で、メモリ内のデータへのアクセスや上書きに対する保護機能が備わっていません。そのため、バッファオーバーフロー攻撃の標的となる傾向があります。
ほかの言語でも注意が必要
一方でPHPやJava、Python、Rubyなどの近年Webアプリ開発によく用いられる言語では、バッファオーバーフローの発生を抑える対策が備わっています。そのため、メモリの適切な管理を特に意識する必要がありません。
ただし、これらの言語でも内部でC言語やC++が使われていることがあるため注意が必要です。PHPでも過去にバッファオーバーフローの脆弱性の修正対応が行われています。またNode.js(JavaScriptの実行環境)でも、内部でC言語が使用されており、バッファオーバーフローの脆弱性が確認されることがあります。
PythonやRubyでも本体や周辺モジュールにC言語が使われている部分があります。どのプログラミング言語を利用する場合でも、常に脆弱性が修正された最新のバージョンにアップデートすることが重要です。
7. 【開発段階】バッファオーバーフロー攻撃への対策方法
バッファオーバーフロー攻撃への対策方法は、主にプログラムの開発段階と運用段階に分けられます。まずは開発段階で必要な対策について解説します。
メモリを直接操作できないプログラミング言語を選択する
前章で紹介したように、バッファオーバーフロー攻撃はメモリ管理を開発者が行う必要がある言語で発生しやすくなります。そのため、まずはプログラム作成時にPHPやJava、Python、Rubyなどのメモリ管理を自動で行う言語を選択しましょう。もしくは、メモリを直接操作できる言語の記述を最小限にすることで、バッファオーバーフローのリスクを大幅に低減できます。
パッチ管理を徹底する
使用している言語の最新情報を日々チェックし、セキュリティパッチが公開されたら迅速に適用するなど、パッチ管理を徹底することも重要です。
また、一般に公開されているライブラリでも、古いバージョンのものにはバッファオーバーフローの脆弱性が潜んでいるケースがあります。必ず最新バージョンであるか、脆弱性が修正されているかを確認してから使用しましょう。
データの長さをチェックする
バッファオーバーフロー攻撃は、送られてくるデータによりバッファの許容量を超えることでトラブルが発生します。そのため、書き込まれるデータの長さに上限を設ける対策も効果的です。上限を超えるものは拒否したり、サイズ指定のない関数の使用を禁止したりすることでリスクを最小限に抑えられます。
入力データをフィルタリングする
プログラムが受け取るデータは、ユーザーからの入力・ほかのプログラムからの入力に関わらず、すべてフィルタリングされるように設定しましょう。
想定された範囲内の入力のみを受け付けることで、攻撃のリスクを低減できます。意図しない命令を与えるおそれがあるため「’(アポストロフィ)」や「”(クォーテーションマーク)」などの予約記号はフィルタリングで除外しておくことがおすすめです。
脆弱性診断を行う
プログラムの開発中に潜在的なセキュリティリスクを発見できるよう、定期的な脆弱性診断を行いましょう。
プログラムを実行せずにソースコードの構造や構文を解析して不具合を検知する静的コード解析ツールや、プログラムの実行中にその挙動を分析する動的解析ツールなどの使用がおすすめです。実際に攻撃を仕掛けて侵入を試みるペネトレーションテスト(侵入テスト)を実施することも脆弱性の発見に役立ちます。
8. 【運用段階】バッファオーバーフロー攻撃への対策方法
次に、運用段階でのバッファオーバーフロー攻撃への対策方法について解説します。
OSやソフトウェアを最新の状態に保つ
運用するなかで、OSを最新バージョンにアップデートする、使用しているソフトウェアのパッチが公開されたら迅速に適用するといった基本的なメンテナンスをきちんと行うことが重要です。
最新バージョンは既知のバッファオーバーフローの脆弱性が修正されるため、攻撃者に悪用されるリスクが低減します。自動更新機能を有効にしたり、定期的にベンダーの公式サイトなどをチェックして情報を収集したりする方法が効果的です。
セキュリティツールを利用する
セキュリティツールを利用すれば、早期にバッファオーバーフロー攻撃を検知できます。たとえば次のようなツールの導入が効果的です。
- アンチウイルス:マルウェアの検出と除去を行います。バッファオーバーフローを利用してシステムに侵入したマルウェアを検出し、安全に排除するために役立ちます。
- ファイアウォール:外部ネットワークと内部ネットワークの境界に設置し、外部からの不正なアクセスをブロックして内部ネットワークを脅威から保護します。バッファオーバーフロー攻撃の通信を遮断するために効果的です。
- IDS(不正侵入検知システム):ネットワークトラフィックを監視し、異常を検知したら管理者へ通知します。バッファオーバーフロー攻撃の試みを迅速に検知するために役立ちます。
- IPS(不正侵入防御システム):IDSの機能に加えて、攻撃が確認された場合には自動的にその通信のブロックまで行います。
- EDR:PCやサーバーなどのエンドポイントデバイスをリアルタイムで監視します。バッファオーバーフロー攻撃を通じて侵入したあとの悪意ある行動・異常な行動を検出し、対応します。
- UTM(統合脅威管理ツール):上記のようなセキュリティ機能を1つのプラットフォームに統合したものです。個々のセキュリティツールを管理する手間を減らし、より広範囲をカバーします。
9. 近年のバッファオーバーフロー攻撃の傾向
最後に、近年の技術進化に伴うバッファオーバーフロー攻撃の傾向について解説します。
IoTデバイスへの攻撃
IoTデバイスが増加するにつれて、これらのデバイスを標的としたバッファオーバーフロー攻撃が増加しています。これは、IoTデバイスのセキュリティ対策が、PCなどのデバイスと比較して不十分であることに起因しています。数が増えると攻撃の機会も増えるため、IoTデバイスを多く扱う企業はとくに注意が必要です。
クラウドサービスへの攻撃
クラウドサービスの利用が拡大しているなか、クラウドベースのアプリケーションやサービスもバッファオーバーフロー攻撃の標的となっています。システムの大部分をクラウドへ移行している企業も多いため、管理者権限を奪われてクラウド上の機密情報が流出する危険性もあるでしょう。
複合的な攻撃戦略
攻撃者は単一の攻撃を仕掛けるだけではなく、バッファオーバーフローを含む複数の攻撃を組み合わせる傾向があります。これは複雑かつ巧妙な手口であり、攻撃の検出・防御が一層困難となります。
高度なセキュリティ対策が求められますが、複数の対策を行うことはコスト面・リソース面で負担になります。コストを抑えて効率化するために、UTMのような包括的なセキュリティソリューションを取り入れる、自動化ツールで作業を効率化する、クラウド環境で一元管理するといった工夫が必要です。
まとめ
バッファオーバーフロー攻撃の被害を受けると、意図せずサービス提供を中断させられたり、ウイルスに感染したりと、業務や利益に多大な影響を及ぼします。管理者権限を奪われて機密情報が流出するおそれもあるため、対策は必須です。
バッファオーバーフロー攻撃への対策は、主に開発段階・運用段階に分けられます。それぞれの段階で適切な対策が実施できているか、改めて見直してみてください。セキュリティツールの導入も効果的なため、検討してみてはいかがでしょうか。