Explorer(IE)に関するいくつかの改善が確認されています。Free(解放後使用)」の脆弱性を利用した攻撃を軽減するように設計された改善策です。free」と呼びます。オブジェクトのヒープ領域を即時に解放しなくなります。ここでは、無作為にクラス「CDivElement」を選択しました。delete」が、オブジェクトのヒープ領域を即時に削除しました。最新のセキュリティ更新プログラム適用前のコードです。ように変更されました。図2:更新プログラム適用後の新コードこの新しいコードは、関数「MemoryProtection::CMemoryProtector::ProtectedFree」を呼び出します。この関数は、今回の更新で新しく導入されたものです。この関数で、「CMemoryProtector」を格納する配列にオブジェクトのアドレスと長さが保存されることが分かります。storage、TLS)」に記録されます。することで、このオブジェクトのヒープ領域は解放する必要がなくなり、同じスレッド内のコードはその後もオブジェクトのヒープ領域にアクセスできます。オブジェクトのヒープ領域は、いつ解放されるのでしょうか。「MSHTML!GlobalWndProc」の冒頭で、関数「CMemoryProtector::ProtectCurrentThread」を呼び出します。保存された配列にあるすべてのアイテムを実際に解放します。free」のオブジェクトサイズが、合計でしきい値を超えた場合に、解放のプロセスが開始されます。free」は、「解放後使用」の脆弱性利用の攻撃をどう軽減できるか「解放後使用」の脆弱性利用の一般的な攻撃は、オブジェクトのヒープ領域が解放された時に始まります。free」の改善策により、攻撃者は解放されたオブジェクトのヒープ領域を占拠するタイミングを見つけるのが難しくなります。上述したように、その時点のヒープ領域を解放するタイミングは、「MSHTML!GlobalWndProc」にあります。攻撃者が解放されたオブジェクトのヒープ領域を占拠したい場合は、「MSHTML!GlobalWndProc」の後に行う必要があります。この関数は、ウィンドウもしくはアプリケーションで定義したメッセージを受信した時に呼び出されます。「MSHTML!GlobalWndProc」を呼び出します。その後、攻撃者はオブジェクトのヒープ領域を占拠するため、ヒープスプレーのコードを書き込みます。起こりうる攻撃のシナリオについては、「隔離されたヒープ」に関する記事で考察しました。この攻撃は成功するでしょうか。「MSHTML!GlobalWndProc」の呼び出しによって、オブジェクトのヒープ領域がその都度解放されないため、この攻撃は失敗します。ヒープ領域を解放する前に、現時点のスタックの位置を確認していることがコードから分かります。実行完了後に、オブジェクトのヒープ領域が解放されるのを確認します。脆弱性利用の攻撃を緩和するためにメモリ保護を行っています。ヒープ領域をいくつかのパーティションに分けています。オブジェクトはそれに対応したパーティションに割り当てられます。文書オブジェクトモデル(DOM)のノードオブジェクトは、特定のパーティションに割り当てられ、配列バッファのオブジェクトは、別のパーティションに割り当てられます。この部分は、「隔離されたヒープ」に相当するものと考えられます。free」に相当する部分はないように見受けられます。「解放後使用」の脆弱性利用に対して引き続き取り組んでいることは喜ばしいことです。今回の新しい改善策と「解放されたヒープ」の併用により、「解放後使用」の脆弱性利用の攻撃は、いっそう困難となるでしょう。