バッファオーバーフロー (BOF)
主にC言語やC++での話。別名:バッファオーバーラン。
基本的にはソフトウェアのバグが原因。
種類
スタック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のログから攻撃された原因(脆弱性)を特定し、対策を行う。
- 攻撃を受けたホストとそのホストからアクセス可能なホストにデータの改ざん、不正プログラムの埋め込み、設定変更などがないか確認する。問題があれば修復する。
- 脆弱性検査を実施する。