バッファオーバーフロー (BOF)

主にC言語C++での話。別名:バッファオーバーラン

基本的にはソフトウェアのバグが原因。

種類

・スタックBOF  ⇒スタック領域に対してのBOF

・ヒープBOF   ⇒ヒープ領域に対してのBOF

スタックBOF

スタックBOFを理解するための前提知識が3つある。

(1)

プログラムはサブルーチンを呼び出す際に、以下をスタック領域に格納する。

・サブルーチンからの戻り位置

・サブルーチン内で定義されたローカル変数

(2)

通常、ヒープや初期データやプログラム自体のデータはメモリの低位から格納される。

しかし、スタック領域はメモリの高位のアドレスから格納される。

⇒スタックにPUSHするデータが増えて、メモリに格納されたデータを破壊しないようにするため

(3)

strcpyなどの関数は、バッファ領域を超える量をコピーする事ができる。

 

これらを踏まえ、スタックBOFとは…

サブルーチン中でstrcpyなどの関数を使用している時 (3)、

バッファ領域を遥かに超える量の領域をコピーすることで本来のメモリを破壊し(2)、

戻り位置を悪意あるプログラムなどへ呼び出しに差し替える(1)

事で成立する。

ここで悪意あるプログラムでは、権限の乗っ取り、権限昇格を行う。

 権限を得た悪意あるプログラムは

・ログの消去 ・不正プログラムの埋め込み ・機密情報のコピー

・シェルへの置き換え

などを行う。シェルへ置き換える事ができれば管理者権限を持ち、好き放題できる。

ヒープBOF

ヒープ領域に大量のデータを送りつけ、データをあふれさせ隣接したメモリ領域へデータが書き込み、破壊/権限取得を行う。

 

 ヒープ・スタックという区別は概念上の話なので、ヒープが大幅に大きくなればスタック領域を破壊する事もできる。

攻撃が成功した場合は、スタックBOFと同じである。

Unix系)setuid属性をもつプログラムへの攻撃

 setuid[setgid]属性とは、

Unixにおけるアクセス権のフラグ。ユーザが実行ファイルを実行するとき、そのファイルの所有者権限(主にroot権限)で実行できるようになるフラグ。

setuidが設定されたプログラムの代表例はpasswdコマンドなど。

chmodコマンドの最上位ビットを2または4(あるいは両方の6)に設定する事でsetuid属性を付与できる。 [chmod 6711]など。

 

つまりsetuid属性をもつプログラムへの攻撃とは、

所有者がrootでsetuid/setgid属性をもつプログラムを実行し、非常に大きいデータを入力しBOFを引き起こし、root権限を手に入れる事。

対策

・予防・防止

- OS、ソフトウェアを最新の状態にする。

- 脆弱性検査を実施し、BOFセキュリティホールがあれば対処する

- ファイアウォールで不要ポートへのアクセスを遮断する。

- サービスを提供しているポートに対するBOF攻撃をIPSで遮断する。

 ※サービスを提供しているポートに対して、ファイアウォールでは防げない。

  理由:ファイアウォールではパケットのペイロードを詳細にチェックしないため、

     BOF攻撃を検知・遮断できない。

- setuid/setgid属性をもつプログラムに対しては、

 [1] findコマンドで所有者rootでsetuid.setgid属性のプログラムを列挙する。

 [2] その中で不要なプログラムを削除する。

   [3] setuid/setgid属性が不要なプログラムはその属性を解除する。

・検知・追跡

ネットワーク監視型IDS、ホスト監視型IDS、IPSを用いて検知する。

ホストのログが改ざんなどされずに残っていれば、そこから追跡する、

・回復

- サーバログ、IDSのログから攻撃された原因(脆弱性)を特定し、対策を行う。

- 攻撃を受けたホストとそのホストからアクセス可能なホストにデータの改ざん、不正プログラムの埋め込み、設定変更などがないか確認する。問題があれば修復する。

- 脆弱性検査を実施する。