Windows XP SP2以降では、ヒープ破壊に対してさまざまな対策を実施しています。Windows XP SP2、Windows Server 2003では、「Safe Unlinking」と、「Heap entry header cookie」の二つの手法が導入されています。
Safe Unlinkingは、ヒープの解放時に、解放するヒープのflink、blinkに矛盾がないことを確認する手法です。例えば、解放するヒープをEとすると、 Eがヒープ領域の中にあり、E->flink->blink == E->blink->flink == E であることを確認します。
Heap entry header cookieは、ヒープ管理情報(chunk)にCookieとしてランダムな値を書き込み、解放時に値に変更がないことを確認するものです。これにより、ヒープ管理情報の書き換えを検出します。
Windows XP SP2, Windows Server 2003で実装された対策に対して、ヒープ領域の管理方法の一つで、単方向リストで管理されるLookaside Listを使った攻撃、Cookieを予測した書き換え、SafeUnlinkの操作などの回避策が公表され、実際の攻撃でも悪用されました。このため、Windows Vista以降のシステムでは、これを防ぐために以下の対策が追加されています。
ここまで記載した、ヒープに関する対策とその回避策を、マイクロソフトのブログに掲載された「Preventing the exploitation of user mode heap corruption vulnerabilities」からご紹介します(表1)。具体的な攻撃手法については、ブログ中にリファレンスとして記載されていますので、ご興味のある方はそちらをご覧ください。
Exploitation technique | Targeting Windows Vista, Windows Server 2008, or Windows 7 | |||
---|---|---|---|---|
Feasible | Difficulty | Applicable exploit mitigations | ||
Coalesce unlink overwrite | No | N/A | ・Safe unlinking | |
Critical section unlink overwrite | No | N/A | ・Safe unlinking | |
Lookaside list overwrites | No | N/A | ・Lookaside lists were removed, replaced by LFH | |
FreeLists[] attacks Heap cache attacks |
No | N/A | ・Array-based FreeLists were removed ・Invalidates most techniques as stated ・Safe unlinking ・Heap entry metadata randomization ・Heap entry cookie check ・DEP & ASLR |
|
LFH bucket overwrite | Yes | High | ・DEP & ASLR | |
HEAP data structure overwrite | Yes | High | ・DEP & ASLR | |
App-specific data corruption[10,13] | Yes | Variable | ・If heap entry header corruption is required ・Heap entry metadata randomization ・Heap entry cookie check ・DEP & ASLR |
|
表1 Heap exploitation techniques |
Copyright © ITmedia, Inc. All Rights Reserved.