バッファオーバフロー(BOF)攻撃【情報処理安全確保支援士講座】

2024年5月4日

情報処理安全確保支援士 バッファオーバーフロー攻撃

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

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

本記事のまとめ!

  1. バッファオーバフロー攻撃の概要
  2. バッファオーバフロー攻撃の仕組み
  3. バッファオーバフロー攻撃の対策

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

情報処理安全確保支援士 バッファオーバフロー攻撃

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

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

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

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

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

キュー
キュー
参考までに、ヒープ領域は必要に応じて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共有ライブラリ内の特定の関数を呼び出すようになっており、データ実行防止機能によっても防げません。

Use-After-FreeによるビープBOF

解放済みメモリであるUse-After-Freeを悪用される脆弱性も確認されています。

Use-After-FreeはASLR(Address Space Layout Randomization)が有効な場合でも、共有ライブラリ内のメモリアドレスを特定されるなどで攻撃が成立する可能性があります。

また、スクリプト言語による攻撃が可能なため、スクリプトの実行機能を有する多くのソフトウェアが悪用される可能性もあります。

キュー
キュー
ASLRはアドレス空間配置ランダム化と呼ばれる技術で、最近のOSにはほぼ採用されてるで

整数オーバフロー

整数オーバフローは、整数の演算結果が格納先の上限を超え、毛があふれが発生することです。

整数オーバフローを悪用した攻撃はそのまま、整数オーバフロー攻撃と呼ばれます。

トモル
トモル
CやC++だと整数オーバフローが発生してもエラー検出されないから、別途検出したり回避したりする処理を組み込む必要があるよ

setuid/setgid属性を悪用したBOF攻撃

setuid/Setgid属性を持ったコマンドに大きなサイズのデータを貼り付けBOFを引き起こす攻撃手法についても確認しましょう。

setuid/setgidとは

すべてのファイルやディレクトリには、ユーザやグループ単位で読み・書き・実行などの権限が設定されています。setuid(set userID)は、読み・書きなどと同様に実行属性を持つファイルに設定する属性の一つで、実行されたプログラムのユーザ権限にそのプログラムの所有者の権限を一時的に付与します。

キュー
キュー
一時的な付与で、一般ユーザが使用するコマンドの中で、管理者の権限が必要な処理も実行可能にするんや

通常は実行中のプロセルにおいて、そのプログラムを実行したユーザの権限が設定されます。しかし、setuid属性を持つプログラムでは、プログラム所有者がrootの場合、そのプロセスにもroot権限が与えられます。

また、setgidもファイルやディレクトリに設定する属性です。setgid属性が設定されたファイルを実行すると、生成されるプロセスのグループIDはそのファイル所有者のグループIDになります。

setuid属性を狙った攻撃例

setuid属性を持つ代表的なプログラムとして、UNIX系のパスワードファイルの内容変更に使用されるpasswdコマンドが該当します。

パスワードファイルは重要なので、一般権限で起動されたテキストエディタでは直接修正できません。しかし、passwdコマンドを用いれば、一般ユーザでも修正できてしまいます。

トモル
トモル
passwdコマンドにsetuid属性が設定されているからだね

侵入者は、所有者がrootでsetuid/setgid属性を持つプログラムを実行し、非常にサイズの大きい入力データを与えることでBOFを引き起こし、root権限を手に入れます。

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

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

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

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

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

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

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

予防・防止策

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

検知・追跡策

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

回復方法

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

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

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

問題

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

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

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

問の正解を表示

問の解説を表示

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

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

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

本記事のまとめ!

  1. バッファオーバフロー攻撃の概要
  2. バッファオーバフロー攻撃の仕組み
  3. バッファオーバフロー攻撃の対策

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

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

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

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


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

スポンサーリンク