検索
特集/連載

いまさら聞けない「バッファオーバーフロー攻撃」とは? 仕組みと対策を解説「バッファオーバーフロー攻撃」を知る【後編】

「バッファオーバーフロー攻撃」はシステムの一時的な記憶領域を狙った攻撃だ。その具体的な攻撃手法と対策を紹介する。

Share
Tweet
LINE
Hatena
画像

 前編「知っておきたい『バッファオーバーフロー攻撃』とは? 主要な4種を紹介」は、一時的な記憶領域の「バッファ」を溢れさせて、プログラムの制御やクラッシュ、変更を可能にする「バッファオーバーフロー攻撃」の主要な4種類を解説した。後編は、バッファオーバーフロー攻撃の概要と、その対策方法を紹介する。

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

 バッファオーバーフロー攻撃で最も一般的なのは、関数呼び出しに利用する記憶領域「スタック」を狙った攻撃だ。通常、関数の集合体であるプログラムがユーザー名やパスワードなどの入力をユーザーに要求するまで、スタックは空の状態になっている。入力を受け付けた時点で、プログラムは戻り先のアドレスをスタックに書き込み、ユーザーの入力をその上に格納する。スタック内に格納されたコマンドを実行すると、プログラムが指定した戻り先のアドレスにユーザーの入力を送る。

 スタックのサイズは有限だ。開発者は、具体的な大きさを指定してスタック用の領域を確保しなければならない。ユーザーの入力が、入力用に確保したスタック領域の大きさを上回った場合、その入力が適切かどうかをプログラムが確認しなければ、スタックはオーバーフローする。それ自体はそれほど大きな問題ではないが、悪意のある入力と組み合わさると非常に大きなセキュリティホールになる。

 続いて攻撃者は、悪意のあるプログラム内の関数が出すコマンドを格納するアドレスを、戻り先のアドレスとして指定する。スタックがオーバーフローして部分的に破壊されたプログラムは、戻り先のアドレスに帰ってプログラムを回復しようと試みる。このとき意図したコマンドをシステムに実行させるよう、攻撃者は戻り先のアドレスを変更する。そのために攻撃者は悪意のあるコマンドが配置されるアドレスを把握しなければならない。実アドレスを特定しなくていいようにするために、攻撃者は「NOP」(何もしない)コマンドを悪意のあるコマンドの前後に挿入する。これは正確なメモリ範囲が分からないときに使われる手法だ。そうすることで、攻撃者が指定したアドレスがNOPコマンドで埋めた範囲のどこかにあれば、その悪意のあるコマンドが実行されるようになる。

 最後は、実行可能なプログラムの権限を回避する。たいていのOSには、現在ログインしているユーザーのアクセスレベルを制御する仕組みがある。通常、プログラムの実行には高度な権限が必要なため、これらのプログラムは上位の権限を持つ「カーネルモード」で実行されることが一般的だ。

 スタックベースのバッファオーバーフロー攻撃により、新たな戻り先のアドレスにあるコマンドが実行されると、プログラムは自身の実行が続いていると誤認識する。攻撃者がコマンドによってシステムを不正に操作するため、標的のアプリケーションを通じて立ち上げたコマンド実行ウィンドウは、侵害されたアプリケーションと同じ権限を持ったまま実行される。一般に、この状態は「攻撃者がOSを完全に制御した」ことを意味する場合が多い。

バッファオーバーフロー攻撃からの防御方法

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る