検索
連載

Use After FreeとヒープスプレーBeyond Zero-day Attacks(4)(1/3 ページ)

ヒープオーバーフローと別の手法でヒープ破壊を行うUser After Freeと呼ばれる攻撃と、Use After Freeと一緒に使われることが多い、ヒープスプレーについて紹介します

Share
Tweet
LINE
Hatena
「Beyond Zero-day Attacks」のインデックス

連載目次

ヒープ破壊を行う「User After Free」とは

 前回は、ヒープオーバーフローを中心とした、ヒープ破壊の脆弱性と、その対策について紹介しました。今回は、ヒープオーバーフローと別の手法でヒープ破壊を行う「User After Free」と呼ばれる攻撃と、Use After Freeと一緒に使われることが多い「ヒープスプレー」について紹介します。

 図1に見るように、Use After Freeは、2011年から悪用される割合が増えており、2013年のデータでは、最も悪用された割合が多い脆弱性タイプになっています。


図 1 攻撃に悪用される脆弱性タイプの推移(出典:Security Intelligence Report Vol. 16)

 Use After Freeは、前回も紹介をしたヒープオーバーフローと同じくヒープ領域に対する攻撃で、ヒープ管理とヒープ領域のアドレスを記録する変数(ポインター)の不整合を使います。通常はこのような不整合が生じることはないのですが、例えばエラー処理やリトライ処理、マルチスレッドのプログラムで不整合が発生することがあります。

 一般的なプログラムで発生する不整合については、コンパイラーレベルでの対処も進んでいるのですが、JavaScriptなどのスクリプト言語(インタープリター)を使い、意図的に不整合が生じやすい状況を作り出す攻撃については、対策が進んでいません。

 このため、現在悪用されている User After Freeの攻撃の大半は、JavaScriptのようなスクリプト言語を使ったもので、JavaScriptが実装されたブラウザの他、pdfやflashに対する攻撃も行われています。考えてみれば、スクリプト言語は、ヒープで動いているようなものなので、ヒープを使った攻撃の対象となるのは、ある意味、当然なのかもしれません。

 Use After Freeについては、あまり文献が見つからないのですが 「主に言語とシステム開発に関して」というブログで記載されている「Windows XP等の,IE脆弱性の攻撃方法“ヒープスプレー”と“Use After Free”」(文献1)と、このブログで紹介されているリファレンスが、今回の内容をまとめる上で、とても参考になりました。

文献1

Windows XP等の,IE脆弱性の攻撃方法「ヒープ・スプレー」と「Use After Free」を,HTMLサンプルコードで理解しよう(ブログ:主に言語とシステム開発に関して)

http://d.hatena.ne.jp/language_and_engineering/20140508/


 User After Freeを簡単に表現すると、解放済みのヒープ領域を利用して、任意のコードを走らせる手法です。以下の攻撃のポイントを理解する必要があります。

  • どのように解放(Free)された領域にアクセスをするのか
  • どうやってコードを実行するのか

 この点について、文献1で取り上げているStephen Bradshawの「Heap Spray Exploit Tutorial: Internet Explorer Use After Free Aurora Vulnerability」(文献2)のサンプルコード(リスト1)を使って解説していきます。


リスト 1 Use After Free サンプルコード(出典 文献2)

文献2

Heap Spray Exploit Tutorial: Internet Explorer Use After Free Aurora Vulnerability(ブログ:The Grey Corner)

http://www.thegreycorner.com/2010/01/heap-spray-exploit-tutorial-internet.html


 リスト1は、以下の手順で Use After Freeを行っています。

  1. 解放したオブジェクトを上書きするためのArray1を作成し、コメントオブジェクトをヒープ上に確保する
  2. プログラム中に用意した変数Element1に、createEventObjectで作成したイメージタグのアドレスを記録する
  3. イメージタグのinnerHTMLを“”にすることで、“SpanID”に該当するオブジェクトを開放し、この結果として、イメージタグも開放される(再割り当てにより上書きが可能になる)
  4. 新たにヒープ領域を確保するため、確保済みのArray1のコメントオブジェクトを書き換えて、特定の文字列で構成される大量のデータを書き込む作業を続ける
  5. イメージタグが割り当てられていた領域はすでに解放されているため、このアドレスに上記4.の領域が割り当てられ、データへの上書きが行われる
  6. ここで、変数Element1を使って、イメージタグのメンバーsrcElementを呼び出すと、上書きされた仮想関数テーブルを取り出して、実行(call)する。リスト1の例では、イメージタグが割り当てられていた領域に“\uAAAA”が書き込まれているため、アドレス0xAAAAAAAからを読み出そうとし、アクセス違反でプログラムが異常終了する。

 上記、1〜2、3、4〜6のメモリマップは図2のようになっているものと考えられます。

 多くのヒープに対する攻撃と同様に、このサンプルコードも、ヒープ領域が連続して取得されること、常に一定のアドレスにヒープが割り当てられていることを前提としています。


図2 リスト1のメモリマップの推移(推測)

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る