前回のヒープ破壊で紹介をした対策は、Use After Freeとヒープスプレーを使った攻撃に対しても、有効性があると考えられています。
例えば、Use After Freeで解放済みのヒープを上書きする際には、ガードページ(図6)によるアクセスエラーで、攻撃を防ぐことが期待できます。
また、このサンプルでは、ヒープ領域が常に一定の順番で割り当てられることが前提となっているため、LFHブロックのランダムアロケーション(図7)により、解放されたヒープ領域への上書きを防ぐことが期待できます。
C++では、Use After Freeで書き換えられる仮想テーブルの改ざんを検知する仕組みが利用できるようになっています。
EMET(Enhanced Mitigation Experience Toolkit)では、ヒープスプレーで悪用されることの多いメモリ領域を事前にEMETが取得することで、ヒープスプレーの展開を防ぎます。
これまでに紹介したスタックオーバーフローやヒープオーバーフローは、何らかのデータを処理するプログラムであれば、データを操作することによって攻撃の対象とすることができます。これに対して、User After Freeは、通常は安全な実行環境と考えられているスクリプト言語(インタプリター)を利用して攻撃を行うことが可能です。
Java、Flash, PDF、Internet Explorerなどが攻撃のターゲットとなっていますが、いずれもスクリプトを走らせることが可能でUse After Freeとヒープスプレーの組み合わせが利用できる環境です。これらの実行環境は、そもそもヒープを中心として動作すると言っても過言ではない環境であるため、攻撃者が意図したメモリの状態を作りやすく、根本的な対策が難しいのが実情です。
一方で、ここまで紹介をしてきた攻撃手法は、攻撃コードをスタックまたはヒープに展開したものです。一般的に、プログラムがスタックやヒープに展開されることはないので、スタックやヒープでのプログラムの実行を止めることができれば、脆弱性があったとしても、その悪用を防ぐことができます。この対策を実現するのがDEP(Data Execution Prevention)と呼ばれるハードウェア機構です。
次回は、DEPとDEPの回避手法についてご紹介します。
高橋 正和(たかはし まさかず)
チーフ セキュリティ アドバイザー
1980年代初頭からミニコン、PC-98、8085、4ビットマイコンなどを使った制御システムの開発などを経験。
1980年代中頃から、日本デジタル研究所株式会社で標準ライブラリの開発保守、開発環境の開発保守、独自OSからWindows NT/Windows XPへの移植、品質管理、新入社員向けのC言語の新人教育などを担当した。
標準ライブラリでは、ファイルシステムやSocketライブラリの開発・実装・保守、開発環境では、68K系のCPUにWhite Sims’s Cによるリロケータブルな実行ファイル形式という特性を使って、オーバーレイリンカー・ローダー等も開発した。
1999年にISS(現在はIBM)セキュリティに関わり、2006年から現職(日本マイクロソフト株式会社 チーフセキュリティアドバイザー)を務める。
Copyright © ITmedia, Inc. All Rights Reserved.