前回の記事

 脆弱性が見つかっても、影響を最小限に抑える機能の実装も進んでいる。その1つが「データ実行防止(DEP(デップ))」だ。危険な脆弱性の代表例であるバッファーオーバーフローを悪用する攻撃を防ぐ。例えばWindowsでは、Windows XP SP2から実装されている。

 バッファーオーバーフロー攻撃では、データ領域に送り込んだウイルスを実行させる。本来、データ領域中のデータはプログラムに参照されるだけで、実行されることはない。だが、プログラムに脆弱性があると、データ領域に読み込ませたウイルスを、実行中のプログラムの一部だと誤解して実行してしまう。

 そこでDEPでは、データ領域に「実行不能」マークを付ける(図6-1)。プログラムの処理がデータ領域に及んだ場合には、CPUは処理を中止する。このためデータ領域にウイルスを送り込まれても、実行を阻止できる。Visual Studio(ビジュアル スタジオ)などのプログラム開発ツールは、オプションを指定するだけで、プログラムにDEPを組み込めるようにしている。

図6-1●バッファーオーバーフロー攻撃を防ぐ「データ実行防止(DEP)」の仕組み
図6-1●バッファーオーバーフロー攻撃を防ぐ「データ実行防止(DEP)」の仕組み
Windowsなどが備えるデータ実行防止(DEP)というセキュリティ機能では、OSとCPUが連携して、データ領域に注入されたウイルスの実行を阻止する。これにより、バッファーオーバーフロー脆弱性などを悪用する攻撃を防ぐ。
[画像のクリックで拡大表示]

DEP回避の新攻撃

 バッファーオーバーフロー攻撃の特効薬と思われたDEPだが、攻撃者は回避する攻撃をすぐに見つけ出した。「Return-to-libc(リターン ツー リブシー)」と呼ばれる攻撃だ。この攻撃では、プログラムのジャンプ先を操作してDEPを無効にし、それからデータ領域中のウイルスを実行させる(図6-2)。

図6-2●DEPを回避する「Return-to-libc」攻撃の仕組み
図6-2●DEPを回避する「Return-to-libc」攻撃の仕組み
DEPが有効だと、データ領域中のウイルスは実行できない。そこでReturn-to-libc攻撃では、データ領域に不正なジャンプ先を注入して、DEPを無効にするAPIを実行させる。これにより、データ領域中のプログラムを実行可能にしてから、ウイルスにジャンプする。
[画像のクリックで拡大表示]

 通常のバッファーオーバーフロー攻撃と同様に、不正なジャンプ先とウイルスをデータ領域に流し込み、脆弱性を突いて正規のジャンプ先などを上書きする。異なるのは、ジャンプ先に指定するアドレスだ。不正なジャンプ先として、プログラム領域に存在する、DEPを無効にするAPIのアドレスを指定する。このAPIは正当なAPIであり、OSが使用するので無効にはできない。

 DEPで無効にされるのはデータ領域中のプログラム実行のみで、データの参照などは有効なままだ。つまり、DEPが有効な環境でも、ジャンプ先を上書きして、DEPを無効にするAPIに変更できる。

 攻撃者は、このAPIを使ってDEPを無効にし、その後にプログラムの処理をデータ領域のウイルスにジャンプさせるのだ。