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

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


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

バッファオーバフロー攻撃は、アプリケーションプログラムの入力データ処理に関するバグを突いて、コンピュータのメモリに不正なデータを書き込み、システム侵入や管理者権限の剥奪を試みる攻撃手法です。
バッファオーバフロー攻撃の仕組み
バッファオーバフロー攻撃は、メモリのスタック領域で行われるもの、ヒープ領域で行われるもの、静的メモリ領域で行われるものがあります。
なかでも、特にスタックを対象とした攻撃が多く、試験でもよく問われます。
スタック領域とは、サブルーチンの呼び出しによって自動的に確保され、プログラムが一時的に使用するために用いられる領域です。

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


このようなデータ構造をスタック領域と呼びます。また、スタックにデータを格納することをPUSH、取り出すことをPOPと呼びます。
正常なプログラムの実行パターン
まずは、正常なプログラムが実装されるパターンの様子を確認しておきましょう。
- STEP1メインルーチンのプログラムが実行

- STEP2サブルーチンが実行され、戻り先がスタックに格納

- STEP3サブルーチンの中で使用する変数(a,buf)の格納領域がスタックに確保

- STEP4変数(buf)に入力データ(data)が格納される

- STEP5メインルーチンに処理が戻り、スタック内のデータは削除される

バッファオーバフローの実行パターン
次に、バッファオーバフローが実行される流れを見てみましょう。
- STEP1メインルーチンからサブルーチンが呼び出され、使用する変数の格納領域がスタックに確保される

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

※結果として、確保されていたbufの領域を超えてスタック内の他の領域まで上書きしてしまいます。 - STEP3サブルーチン処理が終わっても、スタックに格納されていた戻り値が上書きされ戻れなくなる

- STEP4入力データ(data)に不正な機械語のコードと偽りの戻り値が書かれていて不正なプログラムを実行する

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

しかし、DEPを回避する手法としてreturn-to-libcと呼ばれるバッファオーバフロー攻撃も存在します。
return-to-libcはメモリ上にロードされたlibc共有ライブラリ内の特定の関数を呼び出すようになっており、データ実行防止機能によっても防げません。
Use-After-FreeによるビープBOF
解放済みメモリであるUse-After-Freeを悪用される脆弱性も確認されています。
Use-After-FreeはASLR(Address Space Layout Randomization)が有効な場合でも、共有ライブラリ内のメモリアドレスを特定されるなどで攻撃が成立する可能性があります。
また、スクリプト言語による攻撃が可能なため、スクリプトの実行機能を有する多くのソフトウェアが悪用される可能性もあります。

整数オーバフロー
整数オーバフローは、整数の演算結果が格納先の上限を超え、毛があふれが発生することです。
整数オーバフローを悪用した攻撃はそのまま、整数オーバフロー攻撃と呼ばれます。

setuid/setgid属性を悪用したBOF攻撃
setuid/Setgid属性を持ったコマンドに大きなサイズのデータを貼り付けBOFを引き起こす攻撃手法についても確認しましょう。
setuid/setgidとは
すべてのファイルやディレクトリには、ユーザやグループ単位で読み・書き・実行などの権限が設定されています。setuid(set userID)は、読み・書きなどと同様に実行属性を持つファイルに設定する属性の一つで、実行されたプログラムのユーザ権限にそのプログラムの所有者の権限を一時的に付与します。

通常は実行中のプロセルにおいて、そのプログラムを実行したユーザの権限が設定されます。しかし、setuid属性を持つプログラムでは、プログラム所有者がrootの場合、そのプロセスにもroot権限が与えられます。
また、setgidもファイルやディレクトリに設定する属性です。setgid属性が設定されたファイルを実行すると、生成されるプロセスのグループIDはそのファイル所有者のグループIDになります。
setuid属性を狙った攻撃例
setuid属性を持つ代表的なプログラムとして、UNIX系のパスワードファイルの内容変更に使用されるpasswdコマンドが該当します。
パスワードファイルは重要なので、一般権限で起動されたテキストエディタでは直接修正できません。しかし、passwdコマンドを用いれば、一般ユーザでも修正できてしまいます。

侵入者は、所有者がrootでsetuid/setgid属性を持つプログラムを実行し、非常にサイズの大きい入力データを与えることでBOFを引き起こし、root権限を手に入れます。
バッファオーバフロー攻撃による影響
バッファオーバフロー攻撃によって不正なプログラムが実行された場合、そのプログラムは攻撃の対象と同じ権限で実行されます。
したがって、管理者権限で実行されているサービスに対してバッファオーバフロー攻撃が行われると、シェルの置き換えにより管理者権限でホストの操作も可能となります。
結果として、機密情報のコピー・不正プログラムの埋め込み・設定変更・ログの消去なども実行できてしまいます。

バッファオーバフロー攻撃の対策
バッファオーバフローの対策方法についても確認しておきましょう。
予防・防止策
- OS・ソフトウェアのバージョンを最新化し、パッチを適用する
- 脆弱性検査を実施し、セキュリティホールが存在しないことを確認する
- ファイアウォールによって不要なポートへのアクセスを遮断する
- IPSによってバッファオーバフロー攻撃を遮断する
- DEPが利用できるOSを使用する
- アドレス空間は位置ランダム化(ASLR)が実施されたOSを使用する
検知・追跡策
- ネットワーク監視型IDS、ホスト監視型IDS・IPSを用いて検知する
- ホストのログを確認する
回復方法
- サーバログ・IDSログから原因を調べ、ベンダが後悔する対策手順に従って復旧する
- 不正アクセスを受けたホストを対象に、データの改ざん・不正プログラムの埋め込み・設定変更などの有無を検証し、修復する
- 脆弱性検査を実施し、問題があれば対処する
バッファオーバフロー攻撃・例題
実際に例題を解いて問題に慣れていきましょう。
問題
ア:スタックに最後に入った要素を示す添字の変数
イ:スタックに最初に入った要素と最後に入った要素を示す添字の変数
ウ:スタックに一つ前に入った要素を示す添字の変数を格納する配列
エ:スタックの途中に入っている要素を示す添字の変数
(ログイン後回答すると、ここに前回の正誤情報が表示されます)
バッファオーバフロー攻撃・まとめ
バッファオーバフロー攻撃は、C言語やC++言語のデータ構造を悪用した攻撃方法です。
午後試験で問われるケースもあるので、具体的な対策方法を含めて押さえておきましょう。

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
















ディスカッション
コメント一覧
まだ、コメントがありません