コンピュータセキュリティにおいて、ヒープスプレーは、任意のコード実行を容易にするためにエクスプロイトで使用される手法です。この手法を実装するエクスプロイトのソースコード部分は、ヒープスプレーと呼ばれます。[ 1 ]一般に、ヒープをスプレーするコードは、ターゲットプロセスのヒープ上に(大きな)ブロックを割り当て、これらのブロック内のバイトを適切な値で埋めることによって、特定のバイト列をターゲットプロセスのメモリ内の所定の場所に配置しようとします。
ヒープスプレー自体はセキュリティ上の脆弱性を悪用するものではありませんが、脆弱性を悪用しやすくするために利用されることがあります。ヒープスプレー単独ではセキュリティ境界を破ることはできません。別途セキュリティ上の脆弱性を悪用する必要があります。
セキュリティ上の脆弱性を悪用することは、さまざまな要因が影響するため、多くの場合困難です。メモリとタイミングの偶然的な配置は、(攻撃者の視点から見て)多くのランダム性をもたらします。ヒープスプレーを使用すると、これを補うために大量の秩序を導入し、悪用が成功する可能性を高めることができます。ヒープスプレーは、ほとんどのアーキテクチャとオペレーティングシステムにおいて、大きなヒープ割り当ての開始位置が予測可能であり、連続する割り当てがほぼ連続しているという事実を利用します。つまり、ヒープスプレーを実行するたびに、スプレーされたヒープはほぼ同じ位置になります。
攻撃では、ヒープに格納されているデータが複数の役割を果たすため、特定のバイトを使用してヒープをスプレーすることがよくあります。セキュリティ上の脆弱性を悪用する際、アプリケーションコードはメモリ内の任意の場所からアドレスを読み取るように仕向けられることがよくあります。このアドレスは、コードによって実行される関数のアドレスとして使用されます。攻撃者がアプリケーションにスプレーされたヒープからこのアドレスを読み取らせることができれば、コードがそのアドレスを関数ポインタとして使用し、スプレーされたヒープにリダイレクトする際に、実行フローを制御できます。攻撃者が制御フローをスプレーされたヒープにリダイレクトすることに成功すると、そこにあるバイトが実行され、攻撃者は望むあらゆるアクションを実行できます。そのため、ヒープ上のバイトは、ヒープスプレー自体の中で有効なアドレスを表すように制限され、ターゲットアーキテクチャに対して有効な命令を保持するようにすることで、アプリケーションがクラッシュしないようにします。したがって、ターゲットアーキテクチャ上で有効なアドレスとNOPまたはNOPライクな命令の両方に変換される単一のバイトでスプレーすることが一般的です。これにより、ヒープスプレーは非常に大きなNOP スレッドとして機能することができます(たとえば、x860x0c0c0c0cでは非標準 NOP としてよく使用されます[ 2 ] )。
ヒープスプレーは、少なくとも2001年以来、エクスプロイトで時折使用されてきましたが、[ 3 ] [ 4 ] 、この手法がWebブラウザのエクスプロイトで広く使用されるようになったのは、Internet Explorerのさまざまなバグに対してこの手法を使用したエクスプロイトがいくつかリリースされた後の2005年の夏からです。[ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ]これらのエクスプロイトで使用されたヒープスプレーはすべて非常に似ており、この手法の汎用性と使いやすさを示しており、エクスプロイト間で大きな変更は必要ありませんでした。理解して使用するのが非常に簡単であることが証明され、初心者のハッカーがWebブラウザやWebブラウザプラグインの多くの種類の脆弱性に対して信頼性の高いエクスプロイトを迅速に作成できるようになりました。ヒープスプレーを使用するWebブラウザのエクスプロイトの多くは、以前のエクスプロイトからコピー&ペーストされたヒープスプレーと、脆弱性をトリガーする小さなスクリプトまたはHTMLのみで構成されています。
ウェブブラウザ向けのヒープスプレーは一般的にJavaScriptで実装され、大きな文字列を作成することでヒープを攻撃します。最も一般的な手法は、1文字の文字列から始めて、それを何度も連結していくことです。こうすることで、文字列の長さはスクリプトエンジンが許容する最大長まで指数関数的に増加します。ブラウザが文字列をどのように実装するかによって、文字列にはASCII文字またはUnicode文字のいずれかを使用できます。ヒープスプレーコードは、シェルコードを含む長い文字列のコピーを作成し、エクスプロイトが確実に機能するのに十分なメモリが攻撃されるまで、これらのコピーを配列に格納します。
時折、Internet Explorerでは、String関数を使用して文字列を作成するためにVBScriptが使用されることがあります。
2009年7月、Adobe FlashのヒープにActionScriptを使用して攻撃を行うエクスプロイトが発見された。[ 10 ] [ 11 ]
ヒープスプレーは、例えばイメージファイルをプロセスにロードするなど、他の方法でも実行できることが証明されているが、[ 12 ]これは広く使用されていない(2008年8月現在)。
2012年9月、EuSecWest 2012で新しい技術が発表されました。[ 13 ] COREの研究者であるFederico MuttisとAnibal Saccoは、 HTML5で導入された技術を使用することで、ヒープを非常に高い割り当て粒度でスプレーできることを示しました。具体的には、 canvas APIが提供する低レベルのビットマップインターフェースとWebワーカーを使用して、より高速に実行しました。
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)