前回の記事
脆弱性が見つかっても、影響を最小限に抑える機能の実装も進んでいる。その1つが「データ実行防止(DEP(デップ))」だ。危険な脆弱性の代表例であるバッファーオーバーフローを悪用する攻撃を防ぐ。例えばWindowsでは、Windows XP SP2から実装されている。
バッファーオーバーフロー攻撃では、データ領域に送り込んだウイルスを実行させる。本来、データ領域中のデータはプログラムに参照されるだけで、実行されることはない。だが、プログラムに脆弱性があると、データ領域に読み込ませたウイルスを、実行中のプログラムの一部だと誤解して実行してしまう。
そこでDEPでは、データ領域に「実行不能」マークを付ける(図6-1)。プログラムの処理がデータ領域に及んだ場合には、CPUは処理を中止する。このためデータ領域にウイルスを送り込まれても、実行を阻止できる。Visual Studio(ビジュアル スタジオ)などのプログラム開発ツールは、オプションを指定するだけで、プログラムにDEPを組み込めるようにしている。
DEP回避の新攻撃
バッファーオーバーフロー攻撃の特効薬と思われたDEPだが、攻撃者は回避する攻撃をすぐに見つけ出した。「Return-to-libc(リターン ツー リブシー)」と呼ばれる攻撃だ。この攻撃では、プログラムのジャンプ先を操作してDEPを無効にし、それからデータ領域中のウイルスを実行させる(図6-2)。
通常のバッファーオーバーフロー攻撃と同様に、不正なジャンプ先とウイルスをデータ領域に流し込み、脆弱性を突いて正規のジャンプ先などを上書きする。異なるのは、ジャンプ先に指定するアドレスだ。不正なジャンプ先として、プログラム領域に存在する、DEPを無効にするAPIのアドレスを指定する。このAPIは正当なAPIであり、OSが使用するので無効にはできない。
DEPで無効にされるのはデータ領域中のプログラム実行のみで、データの参照などは有効なままだ。つまり、DEPが有効な環境でも、ジャンプ先を上書きして、DEPを無効にするAPIに変更できる。
攻撃者は、このAPIを使ってDEPを無効にし、その後にプログラムの処理をデータ領域のウイルスにジャンプさせるのだ。