コンピュータセキュリティの世界で長年悪用されてきた代表的な脆弱性の一つが「バッファオーバーフロー」です。
「バッファオーバーフローが原因でシステムが乗っ取られた」というニュースを耳にしたことがある方もいると思います。
この記事では『バッファオーバーフロー』について、以下の内容を図を用いてわかりやすく解説します。
- バッファオーバーフローとは?
- バッファオーバーフローの例
- バッファオーバーフローが起こる仕組み
- バッファオーバーフローの対策
バッファオーバーフローとは?

バッファオーバーフロー(Buffer Overflow)とは、プログラムが用意したメモリ領域(バッファ)を超えてデータを書き込んでしまう状態のことです。バッファオーバーランとも呼ばれています。これはコンピュータセキュリティの分野で非常に有名な脆弱性で、昔から多くの攻撃で悪用されてきました。
例えば、10文字分のメモリ領域(バッファ)しか確保していないのに、ユーザーが20文字を入力すると、余分な10文字がバッファからはみ出して、隣のメモリ領域にデータが上書きされてしまうことがあります。その結果、プログラムが誤動作をすることがあります。
具体的には、バッファオーバーフローが発生すると、次のような問題が起こる可能性があります。
- プログラムのクラッシュ
- メモリが破壊されて不正な動作が発生し、プログラムが異常終了します。
- 不正なコードが実行される
- 攻撃者は、オーバーフローを利用して悪意のあるコード(シェルコード)を挿入し、任意のプログラムを動かすことができます。
- 権限昇格され、本来のユーザー権限以上の操作ができてしまう
- システム権限を持つプロセスでオーバーフローが発生すると、攻撃者が管理者権限を奪う可能性があります。
補足
「バッファーオーバーフロー」と書かれている資料もありますが、一般的には「バッファオーバーフロー」と表記します。「バッファー」も「バッファ」も辞書に載っていて、どちらも正しい言葉です。ただし、IT業界では短い方の「バッファ」を使うことが多く、そのため「バッファオーバーフロー」が主流になっています。
バッファオーバーフローの例
C言語はメモリ管理をプログラマが直接行うため、バッファオーバーフローが発生しやすい言語の代表です。以下のコードを見てみましょう。
#include <stdio.h>
#include <string.h>
int main() {
char buffer[10]; // 10バイト分のメモリ
strcpy(buffer, "ABCDEFGHIJK"); // 11文字を書き込む
printf("Buffer: %s\n", buffer);
return 0;
}
このコードでは、bufferに10バイトしか確保していないにも関わらず、strcpy()で11文字をコピーしてしまいます。その結果、bufferの領域を超えて書き込まれ、バッファオーバーフローが発生します。
バッファオーバーフローが起こる仕組み

CやC++などの低レベル言語では、配列や文字列の範囲外アクセスを自動で防ぐ機能がないため、オーバーフローが発生しやすいです。たとえば、以下のようなケースでオーバーフローが起こります。
- ユーザーからの入力をサイズチェックせずにコピーする
strcpy()やgets()のようなサイズ指定ができない関数を使う- ループ処理で、バッファサイズを超えてデータを書き込む
特に、スタック上にあるメモリ領域を上書きすると、関数の戻り先(リターンアドレス)が書き換えられることがあります。攻撃者はこの仕組みを悪用して、任意のコードを実行できるようにします。
バッファオーバーフローの対策
バッファオーバーフローを防ぐためには、以下の方法が有効です。
- 入力サイズをしっかり制限する
- 入力データがバッファサイズを超えないように、必ずチェックを行いましょう。
- 安全な関数を使う
gets()やstrcpy()のようなサイズ制御ができない関数は使わず、fgets()やstrncpy()のようにバッファサイズを指定できる関数を使いましょう。
- コンパイラの保護機能を有効化
- GCCやClangには
-fstack-protectorなどのオプションがあり、オーバーフローを検出すると異常終了させる機能があります。
- GCCやClangには
- OSの保護機能(ASLR)
- ASLR(Address Space Layout Randomization)を有効にすると、実行時にメモリアドレスがランダム化され、攻撃者が狙うアドレスを特定するのが難しくなります。
- メモリ安全な言語を使用する
- C言語はメモリ管理を手動で行うためリスクが高いです。Python、Java、Rustなどのメモリ安全性が高い言語を利用すれば、バッファオーバーフローの脆弱性はほとんど発生しません。
本記事のまとめ
この記事では『バッファオーバーフロー』について、以下の内容を説明しました。
- バッファオーバフローとは?
- バッファオーバフローの例
- バッファオーバフローが起こる仕組み
- バッファオーバフローの対策
バッファオーバーフローは、非常に古くから存在する脆弱性でありながら、今なお多くの攻撃に悪用されています。しかし、適切な入力チェックや安全な関数の使用、さらにコンパイラやOSの保護機能を組み合わせることで、リスクを大幅に減らすことが可能です。
お読み頂きありがとうございました。