バッファオーバーフロー攻撃とは[情報処理安全確保支援士講座]

2024年5月4日

今回は情報処理安全確保支援士試験で問われる、バッファオーバーフロー攻撃について解説します。

アカリ
アカリ
バッファオーバーフロー攻撃ってよく耳にするけど、どんな攻撃?
トモル
トモル
C言語やらC++言語で開発されたアプリに不正な入力をしてシステムに侵入する攻撃だよ!

バッファオーバーフロー攻撃

バッファオーバーフロー攻撃は、アプリケーションプログラムの入力データ処理に関するバグを突いて、コンピュータのメモリに不正なデータを書き込み、システム侵入や管理者権限の剥奪を試みる攻撃手法です。

バッファオーバーフロー攻撃の仕組み

バッファオーバーフロー攻撃は、メモリのスタック領域で行われるもの、ヒープ領域で行われるもの、静的メモリ領域で行われるものがあります。

なかでも、特にスタックを対象とした攻撃が多く、試験でもよく問われます。

スタック領域とは、サブルーチンの呼び出しによって自動的に確保され、プログラムが一時的に使用するために用いられる領域です。

キュー
キュー
参考までに、ヒープ領域は必要に応じてmalloc関数・new演算子を用いて動的に確保する領域やで

スタックについて

バッファオーバーフロー攻撃を理解するために、まずはスタックの概要を押さえておきましょう。スタックとは、データを記憶する構造の一種で、最後に書き込んだデータを最初に読みだす後入れ先出し(LIFO)形式です。

トモル
トモル
後入れ先出法は箱の中にカードを積み重ねて入れて、上から順番に取り出すイメージだよ。

スタック

このようなデータ構造をスタック領域と呼びます。また、スタックにデータを格納することをPUSH、取り出すことをPOPと呼びます。

正常なプログラムの実行パターン

まずは、正常なプログラムが実装されるパターンの様子を確認しておきましょう。

正常なプログラムの実行パターン
  • STEP1
    メインルーチンのプログラムが実行
  • STEP2
    サブルーチンが実行され、戻り先がスタックに格納
  • STEP3
    サブルーチンの中で使用する変数(a,buf)の格納領域がスタックに確保
  • STEP4
    変数(buf)に入力データ(data)が格納される
  • STEP5
    メインルーチンに処理が戻り、スタック内のデータは削除される

バッファオーバーフローの実行パターン

次に、バッファオーバーフローが実行される流れを見てみましょう。

バッファオーバーフローの実行パターン
  • STEP1
    メインルーチンからサブルーチンが呼び出され、使用する変数の格納領域がスタックに確保される

    ※ここまでは正常なプログラムのSTEP1~3と同じです。
  • STEP2
    bufの入力データを大きくし、制限なしに入力データをメモリの変数領域にコピーする

    ※結果として、確保されていたbufの領域を超えてスタック内の他の領域まで上書きしてしまいます。
  • STEP3
    サブルーチン処理が終わっても、スタックに格納されていた戻り値が上書きされ戻れなくなる
  • STEP4
    入力データ(data)に不正な機械語のコードと偽りの戻り値が書かれていて不正なプログラムを実行する

バッファオーバーフロー攻撃を防止するためにも、近年はWindowsOSに指定されたメモリ領域でのコード実行を禁止する機能が実施されています。

キュー
キュー
この機能をDEPと呼ぶで

しかし、DEPを回避する手法としてreturn-to-libcと呼ばれるバッファオーバーフロー攻撃も存在します。

return-to-libcはメモリ上にロードされたlibc共有ライブラリ内の特定の関数を呼び出すようになっており、データ実行防止機能によっても防げません。

バッファオーバーフロー攻撃による影響

バッファオーバーフロー攻撃によって不正なプログラムが実行された場合、そのプログラムは攻撃の対象と同じ権限で実行されます。

したがって、管理者権限で実行されているサービスに対してバッファオーバーフロー攻撃が行われると、シェルの置き換えにより管理者権限でホストの操作も可能となります。

結果として、機密情報のコピー・不正プログラムの埋め込み・設定変更・ログの消去なども実行できてしまいます。

キュー
キュー
管理者権限を奪って自由勝手にすることを、権限の乗っ取り権限昇格と呼ぶで
Attention!!
バッファオーバーフローの実行パターンのSTEP4が失敗しても、STEP3まで実行されていればサービスが異常終了しDoS攻撃を受けるのと同義となります。

バッファオーバーフロー攻撃の対策

バッファオーバーフローの対策方法についても確認しておきましょう。

予防・防止策

バッファオーバーフローの予防・防止策
  • OS・ソフトウェアのバージョンを最新化し、パッチを適用する
  • 脆弱性検査を実施し、セキュリティホールが存在しないことを確認する
  • ファイアウォールによって不要なポートへのアクセスを遮断する
  • IPSによってバッファオーバーフロー攻撃を遮断する
  • DEPが利用できるOSを使用する
  • アドレス空間は位置ランダム化(ASLR)が実施されたOSを使用する

検知・追跡策

バッファオーバーフローの検知・追跡策
  • ネットワーク監視型IDS、ホスト監視型IDS・IPSを用いて検知する
  • ホストのログを確認する

回復方法

バッファオーバーフローの回復方法
  • サーバログ・IDSログから原因を調べ、ベンダが後悔する対策手順に従って復旧する
  • 不正アクセスを受けたホストを対象に、データの改ざん・不正プログラムの埋め込み・設定変更などの有無を検証し、修復する
  • 脆弱性検査を実施し、問題があれば対処する
スポンサーリンク

バッファオーバーフロー攻撃・例題

実際に例題を解いて問題に慣れていきましょう。

問題

配列を用いてスタックを実現する場合の構成要素として,最低限必要なものはどれか。(AP H.24/秋)

ア スタックに最後に入った要素を示す添字の変数
イ スタックに最初に入った要素と最後に入った要素を示す添字の変数
ウ スタックに一つ前に入った要素を示す添字の変数を格納する配列
エ スタックの途中に入っている要素を示す添字の変数

(ログイン後回答すると、ここに前回の正誤情報が表示されます)

問の正解を表示

問の解説を表示

スタックは、データ記憶構造の一種で最後に入った要素が最初に読みだされる後入れ先出し構成です。したがって、最後に入った要素を示す展示の変数が最低限必要です。

これより、アが正解です。

バッファオーバーフロー攻撃・まとめ

バッファオーバーフロー攻撃は、C言語やC++言語のデータ構造を悪用した攻撃方法です。

午後試験で問われるケースもあるので、具体的な対策方法を含めて押さえておきましょう。

アカリ
アカリ
スタックそのもののデータ構造も復習しておこう!

次回はパスワードクラックについて学習します。


本気で支援士を狙うなら・・・
支援士ゼミがおすすめです!
  • ベテラン講師による手厚いサポート
  • モチベーションを保てるセキュリティコラムが満載!
  • マンツーマン形式で個別相談もできる!

スポンサーリンク