バッファーオーバーフローとは?「仕組み」や「対策」をわかりやすく解説!

コンピュータセキュリティの世界で長年悪用されてきた代表的な脆弱性の一つが「バッファーオーバーフロー」です。

「バッファーオーバーフローが原因でシステムが乗っ取られた」というニュースを耳にしたことがある方もいると思います。

この記事では『バッファーオーバーフロー』について、以下の内容を図を用いてわかりやすく解説します。

  • バッファーオーバーフローとは?
  • バッファーオーバーフローの例
  • バッファーオーバーフローが起こる仕組み
  • バッファーオーバーフローの対策

バッファーオーバーフローとは?

バッファーオーバーフローとは?

バッファーオーバーフロー(Buffer Overflow)とは、プログラムが用意したメモリ領域(バッファー)を超えてデータを書き込んでしまう状態のことです。これはコンピュータセキュリティの分野で非常に有名な脆弱性で、昔から多くの攻撃で悪用されてきました。

例えば、10文字分のメモリ領域(バッファー)しか確保していないのに、ユーザーが20文字を入力すると、余分な10文字がバッファーからはみ出して、隣のメモリ領域にデータが上書きされてしまうことがあります。その結果、プログラムが誤動作をすることがあります。

具体的には、バッファーオーバーフローが発生すると、次のような問題が起こる可能性があります。

  • プログラムのクラッシュ
    • メモリが破壊されて不正な動作が発生し、プログラムが異常終了します。
  • 不正なコードが実行される
    • 攻撃者は、オーバーフローを利用して悪意のあるコード(シェルコード)を挿入し、任意のプログラムを動かすことができます。
  • 権限昇格され、本来のユーザー権限以上の操作ができてしまう
    • システム権限を持つプロセスでオーバーフローが発生すると、攻撃者が管理者権限を奪う可能性があります。

バッファーオーバーフローの例

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などのオプションがあり、オーバーフローを検出すると異常終了させる機能があります。
  • OSの保護機能(ASLR)
    • ASLR(Address Space Layout Randomization)を有効にすると、実行時にメモリアドレスがランダム化され、攻撃者が狙うアドレスを特定するのが難しくなります。
  • メモリ安全な言語を使用する
    • C言語はメモリ管理を手動で行うためリスクが高いです。Python、Java、Rustなどのメモリ安全性が高い言語を利用すれば、バッファーオーバーフローの脆弱性はほとんど発生しません。

本記事のまとめ

この記事では『バッファーオーバーフロー』について、以下の内容を説明しました。

  • バッファーオーバーフローとは?
  • バッファーオーバーフローの例
  • バッファーオーバーフローが起こる仕組み
  • バッファーオーバーフローの対策

バッファーオーバーフローは、非常に古くから存在する脆弱性でありながら、今なお多くの攻撃に悪用されています。しかし、適切な入力チェックや安全な関数の使用、さらにコンパイラやOSの保護機能を組み合わせることで、リスクを大幅に減らすことが可能です。

お読み頂きありがとうございました。

スポンサーリンク