対象試験と出題頻度

詳細をクリックして確認
対象試験:
ITパスポート
情報セキュリティマネジメント
基本情報技術者
応用情報技術者
出題頻度:
★★★☆☆
ランクB(標準)

用語の定義

バッファオーバーフローとは、一言で言うと「プログラムが用意したメモリ領域(バッファ)の容量を超えるデータを送り込み、メモリを破壊して不正な動作を引き起こす攻撃」のことです。

イメージとしては、「コップに入りきらない量の水を注ぎ続けて、あふれた水が隣のコップや机の上の書類を濡らしてしまう」ようなものです。
あふれたデータが隣接するメモリ領域を上書きすることで、プログラムの動作を乗っ取ったり、システムをクラッシュさせたりする非常に危険な攻撃です。

解説

バッファオーバーフロー(Buffer Overflow)は、プログラムがデータを格納するために確保したメモリ領域(バッファ)に、その容量を超えるデータが書き込まれることで発生する脆弱性です。C言語やC++など、メモリ管理を開発者が行う言語で書かれたプログラムで特に発生しやすい問題です。

  • スタック領域への攻撃(スタックバッファオーバーフロー):関数の戻りアドレスなどが格納されるスタック領域を上書きし、攻撃者が用意した不正なコードを実行させます。最も一般的な攻撃手法です。
  • ヒープ領域への攻撃(ヒープバッファオーバーフロー):動的に確保されるヒープ領域を上書きし、プログラムの動作を改ざんします。

バッファオーバーフロー攻撃が成功すると、攻撃者はプログラムの実行権限で任意のコード(シェルコード)を実行できます。これにより、システムの管理者権限の奪取、マルウェアのインストール、機密情報の窃取、システムのクラッシュなど、深刻な被害が発生します。歴史的にも「Code Red」「Slammer」など多くのワームがバッファオーバーフローの脆弱性を悪用して大規模な被害をもたらしました。

具体的な活用例・対策

バッファオーバーフロー対策は、プログラム開発時の対策と、OS・コンパイラレベルでの対策の両面から行われます。

  • 安全な関数の使用: C言語では、バッファサイズを指定しない危険な関数(gets、strcpyなど)の代わりに、サイズを指定できる安全な関数(fgets、strncpyなど)を使用します。
  • 入力値の長さチェック: ユーザーからの入力データがバッファサイズを超えていないか、必ず確認してから処理します。
  • メモリ安全な言語の使用: Java、Python、Rustなど、メモリ管理を言語が自動で行う言語を使用することで、バッファオーバーフローを根本的に防ぎます。
  • ASLR(Address Space Layout Randomization): OSがメモリ配置をランダム化することで、攻撃者が戻りアドレスを予測しにくくします。
  • DEP/NXビット(Data Execution Prevention): データ領域でのコード実行を禁止し、注入された不正コードの実行を防ぎます。
  • スタックカナリア(Stack Canary): スタック上に特殊な値を配置し、バッファオーバーフローによる上書きを検知します。

試験ではこう出る!

ITパスポート、情報セキュリティマネジメント、基本情報技術者、応用情報技術者で出題されます。以下のキーワードとセットで覚えましょう。

【重要キーワード】

  • バッファ(メモリ上のデータ格納領域)
  • スタック領域・ヒープ領域
  • 戻りアドレスの上書き
  • ASLR(アドレス空間配置のランダム化)
  • DEP(データ実行防止)

試験問題で「メモリ領域に想定以上のデータを書き込み、隣接する領域を上書きして不正なコードを実行させる攻撃」「入力データの長さをチェックしないプログラムの脆弱性を突く攻撃」といった記述があれば、それは「バッファオーバーフロー」に関する記述です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。

Q. バッファオーバーフローに関する説明として、最も適切なものはどれでしょうか?

  • A. Webアプリの入力欄に不正なSQL文を挿入し、データベースを不正に操作する攻撃
  • B. 大量のリクエストを送りつけてサーバーを過負荷状態にし、サービスを停止させる攻撃
  • C. プログラムのメモリ領域に想定以上のデータを送り込み、隣接領域を上書きして不正なコードを実行させる攻撃

正解と解説を見る

正解:C

解説:
バッファオーバーフローは、プログラムが確保したメモリ領域(バッファ)の容量を超えるデータを書き込むことで、隣接するメモリ領域を上書きし、プログラムの動作を乗っ取る攻撃です。特にC言語などメモリ管理を開発者が行う言語で発生しやすく、対策としては安全な関数の使用、入力値の長さチェック、ASLR、DEPなどがあります。
選択肢Aは「SQLインジェクション」の説明です。選択肢Bは「DoS攻撃/DDoS攻撃」の説明であり、いずれもバッファオーバーフローとは異なる攻撃手法です。