Written by WizLANSCOPE編集部
目 次
バッファオーバーフローとは、プログラムが確保しているメモリ領域(バッファ)の容量を超えるデータが書き込まれることで発生する脆弱性です。
この脆弱性を悪用した攻撃を「バッファオーバーフロー攻撃」と呼びます。
攻撃が成功すると、システムの異常終了やサービス停止が引き起こされるだけでなく、不正なプログラムを実行されたり、管理者権限を奪取されたりなど、深刻な被害につながる恐れがあります。
本記事では、バッファオーバーフロー攻撃の仕組みや発生原因、具体的な対策などを解説します。
▼本記事でわかること
- バッファオーバーフロー攻撃の概要
- バッファオーバーフロー攻撃による被害リスク
- バッファオーバーフローが発生する原因
- バッファオーバーフロー攻撃への対策
「バッファオーバーフロー攻撃の仕組みを知りたい」「バッファオーバーフロー攻撃への対策方法を知りたい」という方は、ぜひご一読ください。
Webアプリケーション診断で指摘される
脆弱性TOP5を解説!
Webアプリのセキュリティ対策は万全ですか?
実際に診断でよく指摘される脆弱性TOP5を
原因や対策方法も含め、分かりやすく説明します。
バッファオーバーフローとは

バッファオーバーフローとは、プログラムが確保しているメモリ領域(バッファ)の許容量を超えるデータが書き込まれることで発生する脆弱性(セキュリティ上の欠陥)です。
この脆弱性を悪用した攻撃を「バッファオーバーフロー攻撃」と呼びます。
ここでいう「バッファ」とは、データを一時的に保存するための領域です。
コンピューターでは、データを処理する速度に差があるため、一度バッファにデータを保存し、順番に処理することでスムーズな動作を実現しています。
しかし、バッファの容量を超えるデータが書き込まれると、データが本来の領域からあふれ、プログラムが正常に動作しなくなることがあります。
この状態を悪用されると、システムの異常終了やサービス停止、不正なプログラムの実行、管理者権限の奪取など、深刻な被害につながる恐れがあります。

出典:IPA(独立行政法人 情報処理推進機構)|安全なウェブサイトの作り方 – 1.10 バッファオーバーフロー
バッファオーバーフロー攻撃は古くから知られている攻撃手法ですが、現在でもソフトウェアの脆弱性を狙った攻撃として利用されることがあるため、適切な対策を講じることが重要です。
バッファオーバーフロー攻撃の種類
バッファオーバーフロー攻撃は、攻撃対象となるメモリ領域によって、主に以下の3種類に分類されます。
- スタック領域を狙った「スタック領域型」
- ヒープ領域を狙った「ヒープ領域型」
- 静的領域を狙った「静的領域型」
それぞれの特徴について見ていきましょう。
スタック領域型
スタック領域とは、ローカル変数やリターンアドレス(関数の戻り先の情報)など、プログラムの実行に必要な情報を一時的に保存する領域です。
スタック領域型は、この領域を狙ったバッファオーバーフロー攻撃です。
許容量を超えるデータを書き込むことで、リターンアドレスなどを書き換え、プログラムの実行フローを改ざんします。その結果、本来とは異なる処理が実行されたり、悪意のあるコードが実行されたりする恐れがあります。
ヒープ領域型
ヒープ領域とは、プログラムの実行中に必要に応じて動的にメモリを確保・解放するための領域です。
ヒープ領域型では、この領域に許容量を超えるデータを書き込むことで、メモリの破壊やプログラムの異常終了を引き起こします。
また、条件によっては、悪意のあるコードの実行につながる場合もあります。
静的領域型
静的領域とは、グローバル変数や静的変数、定数など、プログラムの実行中を通して保持されるデータを格納する領域です。
静的領域型では、この領域に保存されているデータやポインタなどを書き換えることで、プログラムの動作を改ざんしたり、悪意のあるコードを実行させたりすることがあります。
バッファオーバーフロー攻撃の仕組み

ここでは、代表的な「スタック領域型」のバッファオーバーフロー攻撃を例に、その仕組みを解説します。
スタック領域型のバッファオーバーフロー攻撃は、以下のような流れで実行されます。
| 手順 | 内容 |
|---|---|
| 1 | 攻撃者が、悪意のあるコードを含むデータをバッファへ送る |
| 2 | バッファの許容量を超えたデータが書き込まれることで、リターンアドレスが上書きされる |
| 3 | 関数の処理が終了すると、上書きされたリターンアドレスへ制御が移る |
| 4 | 攻撃者が意図した悪意のあるコードが実行される |
スタック領域型では、攻撃者はバッファの容量を超えるデータを書き込み、リターンアドレスの書き換えを狙います。
リターンアドレスとは、関数の処理が終了したあとに、どの位置からプログラムの実行を再開するかを示す情報のことです。
本来は、関数の処理が終わると、リターンアドレスを参照して元の処理へ戻りますが、このリターンアドレスが攻撃者によって上書きされてしまうと、本来の位置情報がわからなくなり、攻撃者が指定した場所へと処理が移ってしまいます。
その結果、悪意のあるコードが実行され、不正なプログラムの実行や権限の奪取につながります。
バッファオーバーフロー攻撃による被害

企業・組織で利用しているプログラムがバッファオーバーフロー攻撃を受けた場合、以下のような被害が発生する恐れがあります。
- サービスの停止
- 管理者権限の奪取
- 情報漏洩
- 他のサイバー攻撃への踏み台化
バッファオーバーフロー攻撃によって、バッファの許容量を超えるデータが書き込まれると、プログラムが異常終了し、システムやWebサービスが停止する可能性があります。
また、リターンアドレスなどが書き換えられ、攻撃者が意図したコードが実行されると、管理者権限を奪われる恐れがあります。
その結果、本来は管理者しかアクセスできない機密情報や顧客情報が窃取されたり、アカウント情報が盗まれたりする可能性があります。
万が一、情報漏洩が発生すると、企業・組織の社会的信用が失われるだけでなく、場合によっては損害賠償責任や復旧対応などによる大きな経済的損失につながることも懸念されます。
さらに、攻撃者にサーバーを乗っ取られると、DDoS攻撃の踏み台として悪用されたり、不正メールの送信元として利用されたりするなど、他のサイバー攻撃に悪用される危険性もあります。
バッファオーバーフローの被害事例

ここでは、バッファオーバーフローの脆弱性に関する事例を紹介します。
Webサーバーのバッファオーバーフロー脆弱性が悪用された事例
2000年、公的機関が運営する複数のWebサイトにおいて、Webサーバーのバッファオーバーフロー脆弱性を悪用した攻撃により、管理者権限が奪取され、Webサイトが改ざんされる事案が発生しました。
攻撃者は、Webサーバーの脆弱性を悪用して任意のコードを実行し、管理者権限を取得したうえで、Webサイトを改ざんしました。
この事案は、Webサーバーで利用していたソフトウェアが古いバージョンのままで運用されており、既知の脆弱性が修正されていなかったことが原因とされています。
このような被害を防ぐためには、ソフトウェアやOSを常に最新の状態へ更新し、セキュリティパッチを適用するなど、脆弱性管理を継続的に実施することが重要です。
グループウェア製品でバッファオーバーフロー脆弱性が発見された事例
大手ソフトウェア開発企業が提供する複数のグループウェア製品で、バッファオーバーフローの脆弱性が発見された事例があります。
この脆弱性は、特定の画面から送信されるリクエストのパラメータを不正に改ざんすることで、メールの送受信時にバッファオーバーフローが発生する可能性があるというものでした。
仮にこの脆弱性を悪用された場合、サーバー上でサービス停止(DoS)を引き起こされたり、任意のコードを実行されたりする恐れがありました。
脆弱性の発見後は、オンラインサービスでは速やかにプログラムの修正が実施され、パッケージ製品についても、脆弱性を解消するためのアップデートが提供されました。
バッファオーバーフロー攻撃とDoS攻撃の違い

バッファオーバーフロー攻撃と混同されやすいサイバー攻撃として、「DoS攻撃」があります。
DoS攻撃とは、攻撃対象のサーバーやWebサイトに対して大量のリクエストやパケットを送りつけ、サーバーやネットワークに過大な負荷をかけることで、サービス停止や応答遅延を引き起こす攻撃です。
バッファオーバーフロー攻撃とDoS攻撃は、いずれも大量のデータやリクエストによってシステムへ影響を与える点では共通していますが、攻撃の仕組みや目的は大きく異なります。
バッファオーバーフロー攻撃は、プログラムの脆弱性を悪用してメモリ領域(バッファ)に許容量を超えるデータを書き込み、不正なコードの実行や権限の奪取などを狙う攻撃です。
一方、DoS攻撃は、サーバーやネットワークの処理能力を超える大量のリクエストを送りつけることで、サービスを利用できない状態にし、業務妨害を行うことを目的としています。
| バッファオーバーフロー攻撃 | DoS攻撃 | |
|---|---|---|
| 攻撃対象 | プログラムの脆弱性(メモリ領域) | サーバーやネットワークの処理能力 |
| 攻撃手法 | バッファに許容量を超えるデータを書き込み、脆弱性を悪用する | 大量のリクエストやパケットを送りつけ、過大な負荷をかける |
| 主な目的 | 不正なコードの実行、権限奪取、情報窃取 | サービス停止や業務妨害 |
| 主な被害 | システムの乗っ取り、情報漏洩、サービス停止 | サービス停止、業務停止 |
バッファオーバーフローが発生する原因
バッファオーバーフローが発生する主な原因として、プログラムの設計・実装時における入力値の検証不足や、安全性を考慮していない実装が挙げられます。
例えば、ユーザーが入力したデータのサイズをチェックする仕組みがない場合、バッファの許容量を超えるデータがそのまま書き込まれ、バッファオーバーフローが発生する可能性があります。
また、入力されるデータの最大サイズを適切に想定できていない場合も、想定以上のデータが入力されることでバッファオーバーフローを引き起こす原因となります。
さらに、バッファのサイズを考慮せずにデータを書き込めるような実装も注意が必要です。
例えば、C言語の「strcpy」や「sprintf」などの関数は、コピーするデータのサイズを自動で制限しないため、適切なサイズチェックを行わずに使用すると、バッファサイズを超えてデータが書き込まれ、バッファオーバーフローが発生する恐れがあります。
バッファオーバーフロー攻撃への対策

バッファオーバーフロー攻撃を防ぐためには、開発段階で脆弱性を作り込まないことに加え、運用・保守の段階でも適切なセキュリティ対策を継続的に実施することが重要です。
ここでは、企業・組織が実施したい主なバッファオーバーフロー攻撃への対策を5つ紹介します。
- 入力値の検証を徹底する
- メモリ安全性の高いプログラミング言語やライブラリを利用する
- コンパイラやOSの保護機能を有効にする
- ソフトウェアやライブラリを最新の状態に保つ
- 脆弱性診断を実施する
それぞれ詳しく見ていきましょう。
入力値の検証を徹底する
バッファオーバーフローは、バッファの許容量を超えるデータが書き込まれることで発生します。
そのため、入力データを受け取る際は、データサイズや形式を適切に検証する仕組みを実装することが重要です。
また、バッファの許容量を超えるデータは受け付けない、もしくは許容範囲内のデータだけを処理することで、バッファオーバーフローの発生を防ぐことができます。
メモリ安全性の高いプログラミング言語やライブラリを利用する
バッファオーバーフローは、メモリを直接操作できるプログラミング言語で開発されたソフトウェアにおいて発生しやすい脆弱性です。
例えば、「C言語」や「C++」はメモリ管理を開発者が行うため、入力値の検証やメモリ管理が適切に実装されていない場合、バッファオーバーフローが発生する可能性があります。
そのため、開発時には、「Java」や「C#」「Go」「Rust」など、メモリ安全性の高いプログラミング言語を採用することも有効な対策のひとつです。
これらの言語は、メモリ管理を言語やランタイムが担う仕組みを備えており、バッファオーバーフローが発生しにくい設計となっています。
ただし、「PHP」や「Java」「Python」などのメモリ安全性が高い言語を使用している場合でも、内部で利用しているライブラリや拡張モジュールがC言語などで実装されているケースがあります。
つまり、それらにバッファオーバーフローの脆弱性が存在すると、攻撃の影響を受ける可能性があります。
このようなリスクを低減するためにも、メモリ安全性の高い言語を採用するとともに、利用するライブラリやフレームワークを最新の状態に保つことが重要です。
コンパイラやOSの保護機能を有効にする
コンパイラやOSには、バッファオーバーフロー攻撃による被害を軽減するための保護機能が備わっています。
コンパイラとは、人間が書いたプログラム(ソースコード)を、コンピューターが実行できる機械語へ変換するソフトウェアのことです。
例えば、コンパイラのセキュリティ機能である「スタックカナリア」を有効にすると、プログラムを変換する際に、バッファとリターンアドレスの間へ「カナリア値」と呼ばれる値が挿入されます。
バッファオーバーフローが発生すると、バッファからあふれたデータによって、リターンアドレスだけでなく、カナリア値も書き換えられます。
プログラムは、処理の終了時にカナリア値が変更されていないかを確認し、書き換えられていた場合は、バッファオーバーフローが発生したと判断して処理を停止します。
これにより、不正なコードが実行される前にプログラムを終了させ、攻撃の成功を防ぎやすくなります。
また、OSには、メモリ上の配置をランダム化する「ASLR(Address Space Layout Randomization)」や、データ領域でのコード実行を防ぐ「DEP(Data Execution Prevention)」といった保護機能も備わっています。
これらの保護機能を有効にすることで、バッファオーバーフロー攻撃が成功する可能性を低減できます。
ただし、これらの機能だけで攻撃を完全に防げるわけではないため、入力値の検証やソフトウェアの更新など、ほかの対策と組み合わせて運用することが重要です。
ソフトウェアやライブラリを最新の状態に保つ
事例でも紹介した通り、ソフトウェアやライブラリが最新の状態に保たれていないと、既知の脆弱性が残り、それを悪用されるリスクがあります。
ライブラリとは、プログラムでよく利用される機能やコードを再利用しやすいようにまとめたものです。
既存のライブラリを活用することで、開発効率を向上させることができます。
一方で、利用しているライブラリに脆弱性が発見された場合、修正プログラムや新しいバージョンが提供されることがあります。
古いバージョンを使い続けると、バッファオーバーフローをはじめとする既知の脆弱性を悪用される恐れがあります。
そのため、OSやソフトウェアだけでなく、ライブラリについても定期的にアップデートを実施し、脆弱性が修正された最新の状態を維持することが重要です。
脆弱性診断を実施する
バッファオーバーフローに限らず、さまざまな脆弱性を早期に発見・改善するためには、脆弱性診断を定期的に実施することが重要です。
あらゆるソフトウェアには、開発段階で見落とされた不具合や脆弱性が潜んでいる可能性があります。また、運用を続ける中で、新たな脆弱性が発見されることも少なくありません。
この脆弱性を修正せずに放置してしまうと、そこが入口となり、不正アクセスや情報漏洩など、さまざまなリスクにつながる恐れがあります。
そこで、定期的に専門家による脆弱性診断を実施し、自社の環境に脆弱性が存在しないかを確認することが重要です。
専門家による脆弱性診断では、バッファオーバーフローをはじめ、システムやアプリケーションに潜む脆弱性を総合的に調査できます。
診断によって発見された脆弱性を速やかに修正することで、サイバー攻撃のリスク低減につながります。
専門家による高精度の脆弱性診断「LANSCOPEプロフェッショナルサービス」

前述の通り、バッファオーバーフローをはじめとする脆弱性を早期に発見・改善するためには、定期的な脆弱性診断が重要です。
「LANSCOPE プロフェッショナルサービス」では、自社で開発したWebアプリケーションや運営中のWebサイトを対象に、潜在的な脆弱性を洗い出し、必要な対策をご提案する「Webアプリケーション診断」を提供しています。
国家資格を保有する経験豊富な診断士が、PCサイトやモバイルサイト、Web APIなどを対象に診断を実施し、脆弱性を可視化するとともに、優先度を踏まえた改善策をご提案します。
「Webサイトを安全に運用したい」「脆弱性を早期に発見し、インシデントを未然に防ぎたい」とお考えの開発担当者やWebサイト運営担当者の方におすすめです。
また、診断項目を重要なポイントに絞ることで、より手頃な価格で利用できる「セキュリティ健康診断パッケージ」もご用意しています。
お客様の予算やご要望に合わせて、経験豊富な診断士が最適な診断プランをご提案します。
まとめ
本記事では、「バッファオーバーフロー」をテーマに、攻撃の仕組みや発生原因、具体的な対策について解説しました。
本記事のまとめ
- バッファオーバーフローとは、バッファの許容量を超えるデータが書き込まれることで発生する脆弱性
- バッファオーバーフロー攻撃を受けると、サービス停止や管理者権限の奪取、情報漏えい、他のサイバー攻撃への踏み台化などの被害につながる恐れがある
- バッファオーバーフローは、入力値の検証不足や安全でない実装など、開発段階の不備が主な原因で発生する
- バッファオーバーフロー攻撃を防ぐためには、入力値の検証やメモリ安全性の高いプログラミング言語・ライブラリの利用など、脆弱性を作り込まないための対策に加え、コンパイラやOSの保護機能の活用、ソフトウェアの更新、脆弱性診断などを組み合わせて実施することが重要
バッファオーバーフロー攻撃は古くから知られている攻撃手法ですが、現在でもソフトウェアの脆弱性を狙う攻撃として悪用されることがあります。
そのため、開発段階で脆弱性を作り込まないことはもちろん、ソフトウェアを最新の状態に保ち、保護機能や脆弱性診断も活用しながら、多層的なセキュリティ対策を継続的に実施することが重要です。
本記事で紹介した「LANSCOPE プロフェッショナルサービス」では、専門家によるWebアプリケーション脆弱性診断を提供しています。
バッファオーバーフローをはじめとする脆弱性を早期に発見し、サイバー攻撃のリスクを低減したいとお考えの企業・組織の方は、ぜひご検討ください。
Webアプリケーション診断で指摘される
脆弱性TOP5を解説!
Webアプリのセキュリティ対策は万全ですか?
実際に診断でよく指摘される脆弱性TOP5を
原因や対策方法も含め、分かりやすく説明します。
おすすめ記事

