ヒープに対する攻撃とその対策:Beyond Zero-day Attacks(3)(3/3 ページ)
攻撃手法を技術的に理解するための連載、今回はスタックと並んでよく耳にする「ヒープ破壊」を取り上げます。
ヒープオーバーフローの対策(Windows 8)
Windows Vistaで実施されたヒープ保護は大きな効果がありました。しかし、実際の攻撃では確認されていないものの、対策を回避する新たな攻撃手法が提案されています。加えて、JavaScriptなどで、アプリケーションデータとして割り当てられるヒープ領域の取得・解放のタイミングを意図的に操作することで、ヒープ破壊を悪用する攻撃が確認されています。Windows Vistaで導入されたヒープ破壊の対策では、残念ながら、このような攻撃に対する対策は実装されていませんでした。
Windows 8では、既に提案されている攻撃手法と、アプリケーションデータを使った攻撃の対策として、LFHのアーキテクチャを変更するともに、ヒープ破壊の防止や検出を目的とした対策を導入しました(表2)。
Windows 8での変更点 | 効果 | |
---|---|---|
LFHをビットマップベースの割り当てに変更 | LinkOffset 破壊を防止 | |
catch-all 例外処理ブロックを削除 | Catch-all例外処理の上書きを防止 | |
ヒープハンドラーの解放を禁止 | ヒープハンドラーの状態を操作する攻撃の防止 | |
ヒープ構造中のCommitRoutine を構造外の値でエンコード | CommitRoutine に対する攻撃の防止 | |
拡張ブロックヘッダーの検証を追加 | ヒープブロックの意図しない解放を防止 | |
使用中ブロック再割当ての防止 | 使用中ブロックの再利用にアタックの防止 | |
カーネルモードでのヒープエンコーディングを有効化 | ヒープエントリーヘッダーの保護 | |
表2 Windows 8で追加されたLFHとヒープ破壊の検出機能 |
加えて、ヒープ領域そのものについても対策を導入しています。ここでは、ガードページとLFHブロックアロケーションのランダマイズについて紹介します。
ガードページは、ヒープブロック間にガードページと呼ばれるアクセスを禁止した領域を置くことで、ヒープ領域を超えて書き込みが行われた場合、プログラムを異常終了させるものです。ヒープオーバーフローなどのヒープ破壊は、そもそもアプリケーションに割り当てられた領域を超えて書き込みを行うため、ガードページにアクセスする可能性が高いと考えられます(図8)。
LFHブロックアロケーションのランダマイズは、これまで予測可能な順番で割り当てられていたLFHブロックを、ランダムに割り当てるように変更したものです。これにより、ヒープ領域の連続性を前提とした攻撃の実行を防ぐことが可能となります(図9)。
ヒープの尽きない話
今回は、ヒープオーバーフローの話をしてきました。heapはもともと、a lot ofと同じように、たくさんといった意味で a heap ofと使われる単語なだけに、ヒープの話はつきません。
今回で紹介をした内容は、直接コードを書けるレベルの話ではなく、あくまでも概念をまとめたものです。実際には、ヒープの管理はとても複雑で、正確に理解するためには、ヒープ管理の実装に関するコードレベルでの理解が不可欠だと思います。
また、ヒープを使った攻撃は、ヒープオーバーフローから、ヒープスプレーとUse After Freeの組み合わせに推移しています。この連載のどこかで、ヒープスプレーと、Use After Freeについては、次回に取り上げる予定です。
著者プロフィール
高橋 正和(たかはし まさかず)
チーフ セキュリティ アドバイザー
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.