[情報処理安全確保支援士への道]BOF攻撃についてまとめた

Submitted by UltraBirdTech on Sun, 09/10/2017 - 00:31

BOF攻撃に圧敗 (圧倒的敗北)しました・・・

試験対策にまとめます。


BOF攻撃とは?

CやC++で開発されたOSやアプリケーションプログラムの入力データの処理に関するバグを突いてコンピュータのメモリに不正なデータを書き込む攻撃。

最終的にはシステムへの侵入や管理者権限の取得を試みます。

BOFの種類としては、下記3点があります。

  • スタック領域で行われるスタックBOF
  • ヒープ領域で行われるヒープBOF
  • 静的メモリ領域を対象したもの

 

今回は、スタックBOFをまとめました。(攻撃される確率も多いし、試験として出される問題もスタックが多い)


スタック

BOF攻撃を理解するために理解が必要なのがスタックの知識。

詳しい説明は割愛しますが、データの記憶構造の一種であり、後入れ、先出し(Last in First Out : LIFO)の記憶領域です。

スタックは、プログラム内で処理を呼び出す際に、その戻り位置を格納するほか、一時的にデータを格納するために使用されます。

今回のBOF攻撃の解説では、この戻り位置を格納している部分が悪用されます。


具体例

ソースコード

source

正常処理の場合

1. (1)の処理でスタックの処理が始まる。

stack01

2. (2)戻り先がスタックに格納される

stack02

3. (3)変数a、変数bufの格納領域が確保される

stack03

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

stack04

5. スタックに格納された戻り先を参照して処理がmain()に戻る。スタックに格納されていたデータは自動的に削除される。

BOF攻撃の場合

1. 〜3. までは処理は同じ。

スタックの状態。

stack03

4. (4)で入力されるdataが確保されていたデータ長よりもはるかに大きい値を格納する

この時、変数bufへ格納される入力データ(data)が確保されているデータ長よりも大きい場合、C / C ++言語のstrcpy関数では、サイズの制限なしに入力データをメモリ内の変数領域(開始位置から)にコピーしてしまう。

その結果、スタック領域内のデータ全てが入力データで上書きされてしまう(オーバーフロー状態)

こうなてしまうと、戻り先として保持していたアドレスを失ってしまい本来の戻り先に戻れなくなる。

bof01

それで、攻撃者が入力するデータの中にはAddressとCodeが組み込まれている。

スタックが戻り先として認識する場所にAddressを仕込むと、そこを戻り先だと誤認し、data内の悪意あるCodeを実行します。

bof02

このCode部分にShellとかにして、Shellを実行させて色々やるみたいです。


対策

1. データ長のチェック

コードにあるdataのデータ長をチェックする。

dataを限られた大きさ以上許容しないようなチェックを入れて、エラーにして処理を終了させるなどの場合は、スタックまで処理が進まないためスタックが壊されることはないでしょう。

イメージはこんな感じ?

code

2. ASLR(Address Space Layout Randomization: アドレス空間配置ランダム化)

最近のOSには組み込まれている機能。

アドレス空間における実行ファイル、ライブラリ、スタック、ヒープ等の配置をランダムにする技術。

これにより、スタックBOF攻撃を成功されるための戻り先(リターンアドレス)が特定されることを抑制します。

3. DEP(Data Exection Prevention: データ実行防止機能)

DEPとは近年のWindows OSで実装されている、指定されたメモリ領域でのコードの実行を禁止する機能のことです。

Windows XP SP2のデータ実行防止機能「DEP」を調べた

参考: IT Pro

DEP機能を調べていたら、2004年のWIndows XPの記事がヒットした・・・・

この機能があることで、BOFでコードを実行させられる状態に陥ったとしても、コードの実行自体を禁止しているので、管理者権限の乗っ取りなどを行うコードの実行を防げますよということでしょうか。

 

しかし、DEPを回避する方法で、「return-to-libc」と呼ばれるBOF攻撃もあるようです。

return-to-libcは、攻撃者のメモリ上にロードされたlibc共有ライブラリ内の特定の関数( system() など)を呼び出すことでBOF攻撃を成立させます。

この攻撃はスタック領域のコードを実行するわけではないので、DEPでは防ぐことはできないそうです。


まとめ

C言語は大学時代に少し触った程度・・・

会社の新人研修はJava、仕事ではPHPを少しかじったあと、Ruby、Javascript(実際はCoffeeScript)を使用しているので、C言語に関する知識は皆無。

このメモリ関連は、JavaやRuby触っているだけだとあまり意識しない部分なのでイマイチ感覚が掴みきれない・・・

もっと精進していきます。


過去問

平成26年度の秋期、午後Iなどで出題されています。

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_2/2014h26a_sc_pm1_qs.pdf


参考資料

情報処理教科書 情報処理安全確保支援士 2017年版

Windows XP SP2のデータ実行防止機能「DEP」を調べた

バッファオーバーフローとは? その被害と対策