(57)【特許請求の範囲】
【請求項１】
処理回路において動作可能な方法であって、
メモリデバイス内の実行可能コードの複数のメモリページの第1のサブセットに対する状態インジケータを非実行可能状態にセットするステップと、
前記複数のメモリページの前記第1のサブセット内の関数に対する間接スタブを含む、前記複数のメモリページの第2のサブセットに対する状態インジケータを実行可能状態にセットするステップと、
前記複数のメモリページの前記第2のサブセット内の対応する間接スタブに対して、前記複数のメモリページの前記第1のサブセット内の前記関数のうちの1つに対する関数呼び出しを指示するステップと、を含み、前記対応する間接スタブが、前記複数のメモリページの前記第1のサブセットからの前記呼び出された関数の実行を指示する前に、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを変更する方法。
【請求項２】
前記実行可能コードが、単一のアプリケーションとプロセスの一方または両方に対応する、請求項1に記載の方法。
【請求項３】
前記複数のメモリページの前記第1のサブセットまたは前記第2のサブセットのうちの少なくとも一方に対する状態インジケータが非実行可能状態にセットされた後で、前記メモリデバイスに実行可能コードの前記複数のメモリページをロードするステップをさらに含む、請求項1に記載の方法。
【請求項４】
前記複数のメモリページの前記第1のサブセットまたは前記第2のサブセットのうちの少なくとも一方に対する状態インジケータが非実行可能状態にセットされる前に、前記メモリデバイスに実行可能コードの前記複数のメモリページをロードするステップをさらに含む、請求項1に記載の方法。
【請求項５】
前記実行可能コードが駐在する前記メモリデバイスが仮想メモリを実装する、請求項1に記載の方法。
【請求項６】
前記複数のメモリページの前記第1のサブセット内に駐在する実行可能コードの実行防止を行うステップをさらに含む、請求項1に記載の方法。
【請求項７】
実行防止を行うステップが、
実行のために前記処理回路によって前記実行可能コードがフェッチされたときに前記非実行可能状態にあるメモリページ内に駐在するいずれかの実行可能コードの実行を打ち切るステップを含む、請求項6に記載の方法。
【請求項８】
前記対応する間接スタブが、前記呼び出された関数の実行を有効化するために、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを、前記非実行可能状態から前記実行可能状態に変更する、請求項1に記載の方法。
【請求項９】
前記呼び出された関数が完了すると、前記複数のメモリページの前記第2のサブセット内の前記対応する間接スタブにリターンするステップをさらに含み、前記対応する間接スタブが、次いで、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを変更する、請求項1に記載の方法。
【請求項１０】
前記対応する間接スタブが、前記呼び出された関数の実行を無効化するために、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを、実行可能状態から非実行可能状態に変更する、請求項9に記載の方法。
【請求項１１】
前記関数呼び出しが完了すると、前記処理回路の内部キャッシュメモリをフラッシュするステップをさらに含む、請求項1に記載の方法。
【請求項１２】
前記間接スタブが、前記実行可能コードのコンパイル段階またはプリコンパイル段階において生成される、請求項1に記載の方法。
【請求項１３】
前記対応する間接スタブが、前記処理回路によって順次実行されるように制限された、少なくとも第1の命令と第2の命令とを含む、請求項1に記載の方法。
【請求項１４】
前記第1の命令の後に前記第2の命令以外の命令が続く場合、前記関数の実行を打ち切るステップをさらに含む、請求項13に記載の方法。
【請求項１５】
前記第1の命令が前記関数呼び出しの一部であり、前記第2の命令が前記呼び出された関数の初期命令である、請求項13に記載の方法。
【請求項１６】
前記対応する間接スタブが、前記第1の命令の後に前記第2の命令が続かない場合に実行が打ち切られるように前記第1の命令を前記第2の命令に結び付けることによって実装される、請求項15に記載の方法。
【請求項１７】
前記呼び出された関数に対するコードが、前記複数のメモリページの前記第1のサブセット内の第1のメモリページ内に駐在し、
前記実行可能状態にある前記第1のメモリページの使用を追跡するステップと、
すべての進行中の関数呼び出しが前記第1のメモリページ内の対応するコードの実行をいつ完了したかを確認するステップと、
最後の進行中の関数呼び出しが完了すると、前記第1のメモリページに対する状態インジケータを前記非実行可能状態にセットするステップとをさらに含む、請求項1に記載の方法。
【請求項１８】
メモリデバイスと、
前記メモリデバイスに結合された処理回路とを備え、前記処理回路が、
前記メモリデバイス内の実行可能コードの複数のメモリページの第1のサブセットに対する状態インジケータを非実行可能状態にセットし、
前記複数のメモリページの前記第1のサブセット内の関数に対する間接スタブを含む、前記複数のメモリページの第2のサブセットに対する状態インジケータを実行可能状態にセットし、
前記複数のメモリページの前記第2のサブセット内の対応する間接スタブに対して、前記複数のメモリページの前記第1のサブセット内の前記関数のうちの1つに対する関数呼び出しを指示するように構成され、前記対応する間接スタブが、前記複数のメモリページの前記第1のサブセットからの前記呼び出された関数の実行を指示する前に、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを変更する処理デバイス。
【請求項１９】
前記処理回路が、
前記複数のメモリページの前記第1のサブセット内に駐在する実行可能コードの実行防止を行うようにさらに構成される、請求項18に記載の処理デバイス。
【請求項２０】
実行防止を行うと、前記処理回路が、
実行のために前記処理回路によって前記実行可能コードがフェッチされたときに前記非実行可能状態にあるメモリページ内に駐在するいずれかの実行可能コードの実行を打ち切るようにさらに構成される、請求項19に記載の処理デバイス。
【請求項２１】
前記対応する間接スタブが、前記関数の実行を有効化するために、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを、非実行可能状態から実行可能状態に変更する、請求項18に記載の処理デバイス。
【請求項２２】
前記処理回路が、
前記呼び出された関数が完了すると、前記複数のメモリページの前記第2のサブセット内の前記対応する間接スタブにリターンするようにさらに構成され、前記対応する間接スタブが、次いで、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを変更する、請求項18に記載の処理デバイス。
【請求項２３】
前記対応する間接スタブが、前記関数の実行を無効化するために、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを、実行可能状態から非実行可能状態に変更する、請求項18に記載の処理デバイス。
【請求項２４】
前記対応する間接スタブが、前記処理回路によって順次実行されるように制限された、少なくとも第1の命令と第2の命令とを含み、前記処理回路が、
前記第1の命令の後に前記第2の命令以外の命令が続く場合、前記関数呼び出しの実行を打ち切るようにさらに構成される、請求項18に記載の処理デバイス。
【請求項２５】
実行可能コードの複数のメモリページをメモリデバイスにロードするための手段と、
前記複数のメモリページの第1のサブセットに対する状態インジケータを非実行可能状態にセットするための手段と、
前記複数のメモリページの前記第1のサブセット内の関数に対する間接スタブを含む、前記複数のメモリページの第2のサブセットに対する状態インジケータを実行可能状態にセットするための手段と、
前記複数のメモリページの前記第2のサブセット内の対応する間接スタブに対して、前記複数のメモリページの前記第1のサブセット内の前記関数のうちの1つに対する関数呼び出しを指示するための手段と、を含み、前記対応する間接スタブが、前記複数のメモリページの前記第1のサブセットからの前記呼び出された関数の実行を指示する前に、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを変更する、処理デバイス。
【請求項２６】
命令を記憶した非一時的プロセッサ可読記憶媒体であって、前記命令が少なくとも1つのプロセッサによって実行されると、
メモリデバイス内の実行可能コードの複数のメモリページの第1のサブセットに対する状態インジケータを非実行可能状態にセットすることと、
前記複数のメモリページの前記第1のサブセット内の関数に対する間接スタブを含む、前記複数のメモリページの第2のサブセットに対する状態インジケータを実行可能状態にセットすることと、
前記複数のメモリページの前記第2のサブセット内の対応する間接スタブに対する、前記複数のメモリページの前記第1のサブセット内の前記関数のうちの1つに対する関数呼び出しを指示すること、とを前記少なくとも1つのプロセッサに実行させ、前記対応する間接スタブが、前記複数のメモリページの前記第1のサブセットからの前記呼び出された関数の実行を指示する前に、前記複数のメモリページの前記第1のサブセットに対する状態インジケータを変更する、非一時的プロセッサ可読記憶媒体。
【請求項２７】
処理回路において動作可能な方法であって、
複数の関数を含むアプリケーションソースコードを生成するステップと、
前記ソースコード内の各関数に対する間接コードを生成するステップと、
前記処理回路における前記ソースコードと前記間接コードとに基づいて実行可能コードを生成するステップ
とを含み、前記実行可能コードは、前記ソースコードに対応する前記実行可能コードの一部がメモリにロードされるときに非実行可能として識別され、前記間接コードに対応する前記実行可能コードの一部がメモリにロードされるときに実行可能として識別されるように構成される、方法。
【請求項２８】
前記実行可能コードが、単一のアプリケーションとプロセスの一方又は両方に対応する、請求項27に記載の方法。
【請求項２９】
前記間接コードが、前記実行可能コードのコンパイル段階またはプリコンパイル段階において生成される、請求項27に記載の方法。
【請求項３０】
前記ソースコードおよび間接コードが、メモリにロードされるときに個別のメモリページ内に駐在するようにコンパイルされる、請求項27に記載の方法。
【請求項３１】
第1の関数が実行のために起動されているときに、第1の間接コードが、対応する前記第1の関数に対するメモリ状態インジケータを非実行可能状態から実行可能状態に切り替えさせる、請求項27に記載の方法。
【請求項３２】
第1の関数が実行を終了すると、第1の間接コードが、対応する前記第1の関数に対するメモリ状態インジケータを実行可能状態から非実行可能状態に切り替えさせる、請求項27に記載の方法。
【請求項３３】
第1の関数に関連する第1の間接コードが前記第1の関数を指し、前記実行可能コードが生成されると、前記第1の間接コードおよび第1の関数が異なるメモリページ内にロードされるようにコンパイルされる、請求項27に記載の方法。
【請求項３４】
前記間接コードが、処理回路によって順次実行されるように制限された、少なくとも第1の命令と第2の命令とを含む、請求項27に記載の方法。
【請求項３５】
前記第1の命令の後に前記第2の命令以外の命令が続く場合、前記間接コードの実行を打ち切らせる命令を追加するステップをさらに含む、請求項34に記載の方法。
【請求項３６】
命令を記憶した非一時的プロセッサ可読記憶媒体であって、前記命令が少なくとも1つのプロセッサによって実行されると、
複数の関数を含むアプリケーションソースコードを生成することと、
前記ソースコード内の各関数に対する間接コードを生成することと、
前記ソースコードと前記間接コードとに基づいて実行可能コードを生成することとを前記少なくとも1つのプロセッサに実行させ、前記実行可能コードは、前記ソースコードに対応する前記実行可能コードの一部がメモリにロードされるときに非実行可能として識別され、前記間接コードに対応する前記実行可能コードの一部がメモリにロードされるときに実行可能として識別されるように構成される、非一時的プロセッサ可読記憶媒体。
【請求項３７】
前記実行可能コードが、単一のアプリケーションとプロセスの一方または両方に対応する、請求項36に記載の非一時的プロセッサ可読記憶媒体。
【請求項３８】
前記間接コードが、前記実行可能コードのコンパイル段階またはプリコンパイル段階において生成される、請求項36に記載の非一時的プロセッサ可読記憶媒体。
【請求項３９】
第1の関数が実行のために起動されているときに、第1の間接コードが、対応する前記第1の関数に対するメモリ状態インジケータを非実行可能状態から実行可能状態に切り替えさせる、請求項36に記載の非一時的プロセッサ可読記憶媒体。
【請求項４０】
第1の関数が実行を終了すると、第1の間接コードが、対応する前記第1の関数に対するメモリ状態インジケータを実行可能状態から非実行可能状態に切り替えさせる、請求項36に記載の非一時的プロセッサ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
1つの特徴は、一般に、ソフトウェアシステム内の悪意のあるコードの動作を抑制することに関し、より詳細には、ソフトウェアシステム内でリターン指向プログラミングの悪用(exploitation)にとって利用可能な命令の数を低減するために、実行防止を実装し、デフォルトでメモリページを非実行可能としてマークする方法およびデバイスに関する。
【背景技術】
【０００２】
ソフトウェアを実行するコンピューティングシステムは、ますます増加する一連の攻撃のもとにある。そのような攻撃は、しばしば、コンピューティングシステムに悪意のあるコードを挿入し、次いでコンピューティングシステムにその悪意のあるコードを実行させる。悪意のあるコードは、コンピューティングシステムに通常よりも遅く実行させる、コンピューティングシステム上の動作を監視する、ユーザが伝えられることを望まない情報をコンピューティングシステムに送信または受信させる、永続メモリおよび非永続メモリ内のデータを破損する、ならびにコンピューティングシステムをクラッシュさせるなどの、多くの異なる動作を実行し得る。
【０００３】
最近、しばしばリターン指向プログラミング(ROP: return-oriented programing)エクスプロイト(exploit)と呼ばれる攻撃メカニズムが提案されている。ROPエクスプロイトの1つのクラスは、しばしば、return-to-libc攻撃(またはreturn-into-libc攻撃)と呼ばれる。return-to-libc(またはreturn-into-libc)攻撃は、(a)多くのソフトウェアシステム内に駐在する標準Cライブラリを使用する。(b)libc関数の内部ではなく、libc関数のエントリポイントに直接ジャンプする、という2つの属性によって識別され得る。ROPエクスプロイトは、攻撃者が、プロセッサのアドレス空間に新しい悪意のあるコードをまったく注入せずに、ソフトウェアプログラム内の有効なコードシーケンスを悪用することを可能にする強力な技術である。何らかのバグまたは弱点を悪用することによって、攻撃は、次のメモリアドレスの制御権を得ることができ、そこから命令が実行される。一例では、これは、スタック上にセーブされた復帰アドレスを上書きすることによって発生することがある。たとえば、そのような攻撃は、バッファオーバーフローを利用して、復帰アドレスをスタック上の正規のコードブロックに指定することができ、そのことで、正規の関数がリターンするときに所望の影響が及ぼされる。命令ポインタを攻撃し、かつ/または次のメモリアドレスの制御権を得る他の方法も可能である。しばしばガジェットと呼ばれる有効なコードシーケンスの小さい断片が攻撃者によって見つけられ、次いで、新しい悪意のあるコードシーケンスを形成するためにつなげられ、それによってコード注入に対する防御を回避する。
【０００４】
従来のROPエクスプロイトでは、小さいコード断片(snippet)は、たとえば、リターン命令またはジャンプ命令で終了するコードの一部である。他の命令もまた、ガジェット終了命令として使用され得る。関数が呼び出されると、呼び出し後の命令のアドレスが、呼び出された関数が完了した後に戻るためのアドレスとしてスタックにプッシュされる。したがって、スタックは、呼び出された関数が完了したときにプロセッサがジャンプするための多くの復帰アドレスを含み得る。攻撃がスタックに情報を書き込むことができる場合、攻撃は意図した復帰アドレスに悪意のある復帰アドレスを上書きすることができる。この復帰アドレスは、攻撃が識別したガジェットのうちの1つに対応し得る。
【０００５】
複数の復帰アドレスを操作することによって、呼び出しスタックを制御する攻撃は、プロセッサのアドレス空間に新しいコードをまったく注入せずに、複数のガジェットをつないで悪意のあるコードシーケンスを作成することができる。これらの悪意のあるコードシーケンスおよびそれらの構成の選択を通じて、攻撃は、一連のガジェットで構成される悪意のあるプログラムの恣意的な挙動を誘導することができる。ほとんどのシステムではコードおよびデータアドレスが予測可能なので、このタイプの攻撃が成功する。つまり、攻撃は、第1のコンピュータに特定のコードをロード(load)して、コードがどのようにロードされているかを判定するために第1のコンピュータのスタックを閲覧して、そのようなコードが第2の(ターゲット)コンピュータにロードされると、この情報を用いてリターンスタックを悪用することができる。そのような攻撃は、一般的に、異なるコンピュータ間で同じ方法でロードされたコードに依存する場合がある。
【０００６】
したがって、リターン指向プログラミング攻撃を抑制し得るロバストな対抗手段が必要である。
【発明の概要】
【課題を解決するための手段】
【０００７】
本開示の実施形態は、スタックおよび/またはメモリにおける脆弱性の悪用を抑制するための装置、方法、およびコンピュータ可読媒体を含む。
【０００８】
処理回路内で動作可能な方法が、実行可能コードの実行防止によってリターン指向攻撃を挫折させるために提供される。メモリデバイス内の実行可能コードの複数のメモリページの第1のサブセットに対する状態インジケータが、非実行可能状態にセットされ得る。たとえば、この状態インジケータは、複数のメモリページの第1のサブセット内に駐在する実行可能コードの実行防止を実行するように働くことができる。同様に、複数のメモリページの第1のサブセット内の関数に対する間接スタブ(indirection stub)を含む、複数のメモリページの第2のサブセットに対する状態インジケータが、実行可能状態にセットされ得る。複数のメモリページの第1のサブセットまたは第2のサブセットのうちの少なくとも一方に対する状態インジケータが、非実行可能状態にセットされる前および/または後に、実行可能コードの複数のメモリページが、メモリデバイスにロードされ得ることに留意されたい。実行可能コードが駐在するメモリデバイスは、仮想メモリを実施し得る。次いで、複数のメモリページの第1のサブセットから、呼び出された関数の実行を指示する前に、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを変更する複数のメモリページの第2のサブセット内の対応する間接スタブに対して、関数呼び出しが指示される。間接スタブが、関数の実行を有効化するために、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを、非実行可能状態から実行可能状態に変更し得る。関数呼び出しが完了すると、方法は、複数のメモリページの第2のサブセット内の対応する間接スタブにリターンし、対応する間接スタブは、次いで、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを変更する。次いで、間接スタブが、関数の実行を無効化するために、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを、実行可能状態から非実行可能状態に変更してもよい。
【０００９】
一例では、実行防止を行うステップは、実行のために処理回路によって実行可能コードがフェッチ(fetch)されたときに、非実行可能状態にあるメモリページ内に駐在するいずれかの実行可能コードの実行を打ち切るステップを含んでもよい。
【００１０】
一例では、第1の命令が関数呼び出しの一部であり、第2の命令が、対応する関数の初期命令であり得る。間接スタブは、第1の命令の後に第2の命令が続かない場合に実行が打ち切られるように、第1の命令を第2の命令に結び付けることによって実施され得る。
【００１１】
実行可能コードは、単一のアプリケーションおよび/またはプロセスに対応し得る。いくつかの実施態様では、方法はまた、関数呼び出しが完了すると処理回路の内部キャッシュメモリをフラッシュ(flush)するステップを含み得る。いくつかの実施態様では、間接スタブは、実行可能コードのコンパイル段階またはプリコンパイル段階において生成され得る。
【００１２】
一例によれば、関数に対するコードが、複数のメモリページの第1のサブセット内の第1のメモリページ内に駐在し得る。実行可能状態にある第1のメモリページの使用が、すべての進行中の関数呼び出しが第1のメモリページ内の対応するコードの実行をいつ完了したかを確認するために追跡され得る。次いで、最後の進行中の関数呼び出しが完了すると、第1のメモリページに対する状態インジケータが、非実行可能状態にセットされる。
【００１３】
メモリデバイスと処理回路とを備える処理デバイスが、同様に提供され得る。処理回路は、(a)メモリデバイス内の実行可能コードの複数のメモリページの第1のサブセットに対する状態インジケータを非実行可能状態にセットし、(b)複数のメモリページの第1のサブセット内の関数に対する間接スタブを含む、複数のメモリページの第2のサブセットに対する状態インジケータを実行可能状態にセットし、および/または(c)複数のメモリページの第1のサブセットからの呼び出された関数の実行を指示する前に、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを変更する複数のメモリページの第2のサブセット内の対応する間接スタブに対して関数呼び出しを指示するように構成され得る。
【００１４】
別の態様によれば、対応する間接スタブが、処理回路によって順次実行されるように制限された、少なくとも第1の命令と第2の命令とを含み得る。第1の命令の後に第2の命令以外の命令が続く場合、関数呼び出しの実行が打ち切られる。
【００１５】
処理回路において動作可能なさらに別の方法が提供される。複数の関数を含むアプリケーションソースコードが生成される。ソースコード内の各関数に対する間接コード(indirection code)もまた、取得および/または生成される。メモリにロードされると、ソースコードを非実行可能として識別させるように、命令が追加され得る。同様に、メモリにロードされると、間接コードを実行可能として識別させるように、命令が追加され得る。ソースコードおよび間接コードは、実行可能コードを生成するために処理回路において変換され得る。実行可能コードは、単一のアプリケーションおよび/またはプロセスに対応し得る。間接スタブは、実行可能コードのコンパイル段階またはプリコンパイル段階において生成され得る。ソースコードおよび間接コードは、メモリにロードされると個別のメモリページ内に駐在するようにコンパイルされ得る。一例では、第1の関数が実行のために起動されているときに、第1の間接コードは、対応する第1の関数に対するメモリ状態インジケータを非実行可能状態から実行可能状態に切り替えてもよい。別の例では、第1の関数が実行を終了すると、第1の間接コードが、対応する第1の関数に対するメモリ状態インジケータを実行可能状態から非実行可能状態に切り替えてもよい。さらに別の例では、第1の関数に関連する第1の間接コードが第1の関数を指すように適合され、実行可能コードが生成されると、第1の間接コードおよび第1の関数が異なるメモリページ内にロードされるようにコンパイルされる。
【００１６】
一態様によれば、間接コードが、処理回路によって順次実行されるように制限された、少なくとも第1の命令と第2の命令とを含み得る。方法は、第1の命令の後に第2の命令以外の命令が続く場合、間接コードの実行を打ち切らせるための命令を追加するステップをさらに含んでもよい。
【図面の簡単な説明】
【００１７】
【図１】ROP攻撃を抑制するための1つまたは複数の特徴が実装され得る例示的な動作環境、デバイス、および/またはシステムを示すブロック図である。
【図２】メモリ内に実装され得る例示的な一般的呼び出しスタックを示す図である。
【図３】実行可能コードが非実行可能として駐在する、すべてまたは大半のメモリ空間を最初にタグ付けすることによって実行防止を行うように適合され得る例示的な処理回路を示す図である。
【図４】データ実行防止モジュールがキャッシュメモリシステムとメモリデバイスとの間に設置される例示的な処理回路に対する代替構成を示す図である。
【図５】向上したデータ実行防止の特徴を実行するように適合された処理回路の一例を示すブロック図である。
【図６】リターン指向プログラミング(ROP)エクスプロイトを形成するためにつなげられたガジェットを含む、悪意のあるコードシーケンスを生成するための破損した呼び出しスタックの例を示す図である。
【図７】図5の処理ユニットの状況におけるガジェットフェッチに対して起こるものを示すブロック図である。
【図８】処理回路内のコードの実行を抑制するための一般的な例示的方法を示すフロー図である。
【図９】ROPエクスプロイトからメモリを保護するための、処理回路内で動作可能な別の例示的な方法を示すフロー図である。
【図１０】ROPエクスプロイトからメモリを保護するための例示的な方法を示すフロー図である。
【図１１】必要とされるかまたは呼び出されたときにメモリエリアの状態を変更することを許可する間接レイヤの例示的な実装を示すブロック図である。
【図１２】必要とされるかまたは呼び出されたときにメモリエリアの状態を変更することを許可する間接レイヤを実装するための方法を示す図である。
【図１３】そのようなメモリエリアへのアクセスを保護するためにアプリケーション実行可能コードが駐在するメモリエリアの状態を変更することを許可するアプリケーション内の間接レイヤを実装するための方法を示す図である。
【発明を実施するための形態】
【００１８】
以下の説明では、例として、本開示が実施され得る具体的な実施形態が示されている添付の図面を参照する。実施形態は、本発明を当業者が実施できるようにするために、本開示の態様を十分に詳細に説明することを意図するものである。本開示の範囲から逸脱することなしに、他の実施形態が利用されてよく、また開示された実施形態に変更が行われてよい。以下の詳細な説明は限定的な意味に解釈されるべきではなく、本発明の範囲は添付の特許請求の範囲によってのみ定義される。
【００１９】
「データ」という用語は、プロセッサによって使用され得るコンピューティング命令、およびプロセッサによって操作され得るデータを指すために、本明細書で互換的に使用され得る。「データ」という用語の使用の状況は、「データ」が命令を指しているときを、明らかにするはずである。必要に応じて、命令は、明示的に命令または指示データと呼ばれ得る。
＜概要＞
【００２０】
本開示は、使用されない間はデフォルトで、実行可能と非実行可能の両メモリページを「非実行可能」としてマークすることによって、メモリスタックにおける脆弱性の悪用を抑制するための装置、方法、および機械可読媒体に言及する。したがって、処理回路は、「非実行可能」とマークされたメモリページ内の関数/命令に対して実行防止を実施し、それによりROP攻撃からの命令に対する呼び出しが実行されることを抑制することができる。
【００２１】
1つの特徴によれば、実行可能コードに対するすべての関数呼び出しがそのような実行可能コードが駐在するメモリ状態を変更するスタブコードに最初にリダイレクト(redirect)される、間接レイヤ(indirection layer)が実装される。スタブコードは、そのような実行可能コードが駐在するメモリ領域のメモリ状態を、デフォルトの「非実行可能」状態から「実行可能」状態に変更することができる。次いで、スタブコードは、実際の実行可能コードを指す。一例では、そのような特徴は、アプリケーションのソースコード内でおよび/またはそのようなアプリケーションを実行可能にコンパイルするときに、実施され得る。すなわち、間接レイヤ(たとえば、スタブコード)は、ソースコード内で本来的に生成され得、および/またはコンパイル時に生成され得る。
【００２２】
一態様によれば、処理回路は、「非実行可能」メモリページ内で発見されたコード/命令の実行防止を実施し得る。実行可能命令を含むメモリページは、最初にメモリにロードされ、すべてのページ(間接レイヤに対するスタブコードが駐在するページを除く)が、デフォルトで「非実行可能」としてマークされる。処理回路上で動作する正当なアプリケーションから開始された関数呼び出しは、そのようなメモリページからの命令/コードの取出しおよび/または実行の前にまたは同時に、メモリページの状態を「非実行可能」から「実行可能」に変更する間接レイヤ(すなわち、スタブコード)を通過する。命令/コードを実行する前に、処理回路は、命令/コードが「実行可能」とマークされたメモリページ内で発生していることを検査および/または確認することができる。ROP攻撃からの呼び出しは、間接レイヤ(スタブコード)をバイパスする。したがって、「非実行可能」とマークされたメモリページからの命令(たとえば、ガジェット)を使用することを試みるROP攻撃は、処理回路がそれらの実行を防止するかまたは打ち切るので、失敗する。
【００２３】
さらに別の態様によれば、間接コードが、処理回路によって順次実行されるように制限された、少なくとも第1の命令と第2の命令とを含み得る。第1の命令の後に第2の命令以外の何らかの命令が続く場合、関数呼び出しの実行が打ち切られる。例示的な一実施態様は、個別の間接レイヤを実施するための追加の命令の必要性を回避することができる。代わりに、対にされた対応する命令(たとえば、第1の命令および第2の命令)が使用されるとき、それらは、プロセッサに、メモリページを実行可能状態と非実行可能状態との間で切り替えさせ、および/または後続のコードを実行させることができる。いくつかの実施態様では、第1および第2の命令は順次実行されるように結び付けられるので、実行可能状態と非実行可能状態との間を切り替える必要はない。というのは、第2の命令以外のものが第1の命令に続く場合、プロセッサは、すべての後続の実行を打ち切るからである。
【００２４】
＜例示的な動作環境＞
図1は、ROP攻撃を抑制することに対する1つまたは複数の特徴が実施され得る例示的な動作環境、デバイス、および/またはシステム100を示すブロック図である。動作環境100は、1つまたは複数のメモリおよび/または記憶デバイスに結合された処理回路102(たとえば、1つまたは複数のプロセッサ)を含み得る。一例では、動作環境100は、仮想メモリとして知られているメモリ管理技術を実施し得る。仮想メモリは、マルチタスキングカーネルのために開発された技術である。仮想メモリは、直接アドレス可能な読出し/書込みメモリ(RAM)として挙動する一種類だけのメモリである「仮想」メモリが存在するかのように、プログラムが設計されることを可能にするランダムアクセスメモリおよびディスク記憶など、様々な形態のデータおよび/または実行可能コードの記憶を仮想化する。仮想メモリをサポートする多くのオペレーティングシステムはまた、それ自体の専用アドレス空間(たとえば、それ自体の仮想メモリ)内で各プロセスを実行し得、プログラムまたはアプリケーションが、仮想メモリへの唯一のアクセスを有するかのように設計されるようにする。たとえば、複数の専用アドレス空間120a、120b、120cが本明細書で示され、これらのアドレス空間のそれぞれは、異なるプロセス、プログラム、および/またはアプリケーションに関連付けられ得る。
【００２５】
この例では、仮想メモリ104は、1つまたは複数の物理メモリデバイス108および/または永続記憶デバイス106内でアドレス指定可能なメモリ空間を表す。処理回路102は、物理メモリデバイス108および/または永続記憶デバイス106内にロードされるコードおよび/またはデータの形態で実行可能命令を読み出すために、仮想メモリ104(または仮想メモリによってマッピングされたメモリアドレス)にアクセスするように適合され得る。
【００２６】
一例によれば、仮想メモリ104は、ヒープ110、スタック112、定数データ114、初期化されたデータ116、および実行可能命令118に配列されてもよい。ヒープ110は、様々なソフトウェアプログラムが処理環境100内でアクティブであり得る間に、それらに対する動的割当てのために使用され得る。定数データ114および初期化されたデータ116などの様々なデータは、処理環境100上で実行している1つまたは複数のプログラムによるアクセスのために、メインメモリデバイス104に格納されてもよい。様々なプログラムに関連付けられる実行可能命令118は、命令域118、ヒープ110、またはそれらの組合せに格納され得る。
【００２７】
特に具体的な注記がなければ、「メモリ」という用語は、以下の本明細書において、実行可能命令および/またはデータが処理回路102によってアクセスされる(たとえば、読出しおよび/または書込みが行われる)仮想メモリおよび/または任意の他のアドレス可能なメモリ空間を指すために使用される。本明細書で説明する概念は、様々なタイプのメモリアーキテクチャにおいて動作する。たとえば、仮想メモリは、処理回路102の外部のメモリデバイス(たとえば、メインメモリ)内に実装され得、および/または処理回路102内のメモリデバイス(たとえば、内部キャッシュメモリ)内に実装され得る。
【００２８】
1つの特徴によれば、データ実行防止が、リターン指向プログラミング攻撃の防止を助長するために、処理回路102によって実装される。一態様によれば、実行に先立って、実行可能命令が、処理回路102がコードを実行するときに使用することがある、対応する間接コード(スタブ)とともに、仮想メモリ104にロードされ得る。次いで、処理回路102は、仮想メモリ104から命令/データを読み出すこと、および/または仮想メモリ104に命令/データを書き込むことができる。
【００２９】
この特徴では、実行可能コードが駐在するすべての(または大半の)メモリページは、それらが、デフォルトで仮想メモリ104にロード(またはマッピング)されるときに、非実行可能としてマークされ得る。「非実行(No eXecute)」を表すNXビットが、命令(またはコード)の記憶またはデータの記憶のいずれかによる使用のためのメモリのエリアを分離するために、いくつかの処理回路によって使用され得る。(処理回路102上で実行中の)オペレーティングシステムは、NXビットに対するサポートを用いて、実行可能コードが非実行可能として駐在する仮想メモリ104のすべてのエリアをマークすることができる。一例では、間接コード(スタブ)が駐在する仮想メモリ104のエリアは、実行可能としてマークされ得る。この間接コード(スタブ)は、ソースコードに挿入されてよく、またはアプリケーションのコンパイル時に生成されてもよい。アプリケーションからの関数呼び出しは、間接コードを呼び出してよく(またはそこにリダイレクトされてよく)、間接コードは、「非実行可能」と「実行可能」との間でメモリ状態を変更し、次いで、実行可能コードの対応する部分に実行を指示する。
【００３０】
仮想メモリ104から処理回路102によってメモリページがロード/フェッチされるたびに、処理回路102内で動作する間接レイヤ(たとえば、スタブ)は、ロード/フェッチに先立って(または同時に)NXビットを「非実行可能」から「実行可能」に変更する。すなわち、メモリページ内の関数が、処理回路102によって実行されているアプリケーション/プログラムによって起動されると、メモリページは、間接レイヤによって「非実行可能」から「実行可能」に変更される。メモリページが、すでに「実行可能」とマークされている(すなわち、メモリページは、前に非実行可能から実行可能に切り替えられている)場合、間接レイヤは、NXビットを非実行可能に変更する必要はない。
【００３１】
処理回路102は、仮想メモリ104内に「非実行可能」とマークされたメモリページ内に駐在する任意のコードの実行を妨げる実行防止モジュールを含み得る。所望の関数の実行が終了すると、対応する実行可能コードが仮想メモリ104内に駐在するメモリページは、「実行可能」から元の「非実行可能」に切り替えられ得る。
【００３２】
「非実行可能」とマークされている仮想メモリ内のメモリページからの命令にアクセスすることを試みるROP攻撃は失敗する。それらのメモリページ(たとえば、メモリ内のエリア)内のすべての実行可能コード(たとえば、命令)を「非実行可能」として初期化し、それらのメモリページ(たとえば、エリア、またはセグメント)の状態(status)を、それらが間接レイヤを介して処理回路102によって呼び出された/フェッチされたとき「実行可能」に変更することのみによって、ROP攻撃は、現在「実行可能」とマークされている(仮想メモリ104内の)それらのメモリページから呼び出される命令に限定される。ROP攻撃からの呼び出しは、間接レイヤ(スタブ)をバイパスする。したがって、(仮想メモリ104内の)他のメモリページからの命令(たとえば、ガジェット)を使用することを試みるROP攻撃は、それらのメモリページが「非実行可能」とマークされているので、失敗する。したがって、そのような「非実行可能」なページの取出し時に、処理回路102の実行防止機能/モジュールが、そのようなメモリページ内の命令の実行を防止または排除する。すべてのメモリページを「非実行可能」とマークすることで、ROP攻撃が命令を使用し得るメモリページの数が大幅に減少する。ROP攻撃に利用可能な「実行可能」命令をさらに低減するために、関数が終了すると、対応するメモリページは、仮想メモリ104内で元の「非実行可能」にセットされる。
【００３３】
NXビットを使用することによる実行防止は、一般的に、アプリケーションスタック、およびデータを含む他のメモリ領域/エリアにおいてなされることに留意されたい。しかしながら、本特徴によれば、アプリケーションの適正な実行可能命令(たとえば、コード、関数など)を含むメモリ領域またはページが、非実行可能としてマークされる。
【００３４】
図2は、メモリ内に実装され得る例示的な一般的呼び出しスタック200を示す。呼び出しスタック200は、関数が呼び出される時に使用され得る様々な情報を格納するために使用され得る。スタック上でプッシュされる(pushed)各関数は、呼び出し関数A、B、およびCについてそれぞれフレーム202A、202B、および202Cによって示されるように、フレーム202を占める。
【００３５】
非限定的な例として、呼び出しスタック200の各フレーム202は、呼び出し元の関数から、呼び出された関数へと渡されるパラメータなどの情報を含み得る。また、呼び出しスタック200は、呼び出されたプログラムによって使用され得る様々なローカル変数を格納するためのメモリのエリアを含み得る。呼び出された関数が実行を完了した後、関数の呼び出しの実行を継続するべき場所を示す復帰アドレスも、呼び出しスタック200に含まれ得る。呼び出しスタック200は、スタックにプッシュされた最後のデータが、スタックからポップされた(popped)最初のデータであることを意味する、後入れ先出し(LIFO)バッファとして動作し得る。呼び出しスタック200は、かなり深い場合があり、多くの関数呼び出しが他の関数内にネストしている(nested)ことを示す。
【００３６】
フレームポインタ204は、一般的に、現在実行されている関数のフレーム202を指す。スタックポインタ206は、ポップオフ(popped off)されて、プロセッサに返されるために利用可能な、スタック200上のデータの次の位置を指す。
【００３７】
ROPエクスプロイトは、様々なフレーム202A、202B、および202Cの復帰アドレス部に悪意のあるアドレスを書き込むことによって、スタックデータ構造を利用する。攻撃者は、たとえば標準Cライブラリなどのメモリ、またはオペレーティングシステムの一部に駐在しているコードを調べることができる。次いで、攻撃者は、ROP命令のライブラリを作成するために、これらのガジェット(すなわち、小さいコード断片)の多くを識別し得る。次いで、メモリにコードをまったく挿入せずに、有益な、意図しない、および悪意のあるコードシーケンスを作成するために、これらのROP命令がつなげられ得る。むしろ、攻撃者は、所望のガジェットの先頭を指すために、呼び出しスタック200上の復帰アドレスを変更するだけでよい。したがって、呼び出しスタックに関連する動作は、ROPエクスプロイトによって破損され得る。しかしながら、そのようなROPエクスプロイトによって使用されるガジェットは、処理回路によって使用される間接レイヤをバイパスすることによって取り出されるので、これらのガジェットは、「非実行可能」とマークされたメモリページ内で発見される可能性が高い。したがって、処理回路は、それらの実行を拒絶するかまたは打ち切る。
【００３８】
＜データ実行防止を有する例示的な処理回路＞
図3は、実行可能コードが非実行可能として駐在する、すべてまたは大半のメモリ空間を最初にタグ付けすることによって実行防止を実行するように適合され得る例示的な処理回路302を示す。処理回路302は、1つまたは複数のプロセッサ310および任意にキャッシュメモリシステム312を含んでもよい。処理回路302は、メモリデバイス304、様々な通信インターフェース306、および/または1つまたは複数の入力/出力(I/O)インターフェース308などの外部デバイスに結合され得る。非限定的な例として、通信インターフェース306は、バスを介する通信用インターフェース、セルラーネットワーク、シリアルポート、パラレルポート、イーサネット（登録商標）接続、ユニバーサルシリアルバス(USB)接続、IEEE 1394(「ファイアワイヤ」)接続、ブルートゥースワイヤレス接続、802.1 a/b/g/nタイプのワイヤレス接続、ならびに他の適切な通信プロトコルおよびインターフェースを含み得る。非限定的な例として、I/Oインターフェース308は、キーボード、マウス、トラックボール、触覚装置、音声入力および出力、ならびにディスプレイなどのデバイスへのインターフェースを含み得る。
【００３９】
いくつかのキャッシュメモリシステム312は、複数のレベル314のキャッシュメモリを含むマルチレベルキャッシュを含む。この例では、第1のレベルのキャッシュは、別の命令キャッシュ316およびデータキャッシュ318を含み得る。データから命令を分離することは、情報をフェッチするための並列パスを作成して、命令およびデータについて異なり得る時間的ならびに空間的近接性(proximity)を利用することによって、パフォーマンスの強化をもたらし得る。第2のレベルのキャッシュは、命令キャッシュ316のための命令とデータキャッシュ318のためのデータの両方を含む、統合されたキャッシュ320として構成され得る。さらに、キャッシュ設計の当業者によって知られているように、キャッシュメモリシステム312は、たとえばセットアソシアティブ方式の(set-associative)キャッシュ、および充満したキャッシュの様々な置換プロトコルなどの、キャッシュのための異なる構成を含み得る。
【００４０】
キャッシュは、メインメモリ304からそのようなデータおよび/または命令をフェッチしに行く必要があることと比較して、命令およびデータのより高速な取出しを可能にする。従来のメモリと比較したトレードオフは、サイズにある。一般的に、より小さいメモリはより高い帯域幅、より低い待ち時間、または両方の組合せを有する。メモリデバイス304は、典型的に、比較的良好な帯域幅を有し得るが、比較的長い待ち時間を有し得る、ダイナミックランダムアクセスメモリ(DRAM)として実装される。キャッシュメモリシステム312内で頻繁に使用されるデータおよび命令をキャッシュすることによって、プロセッサ312によるフェッチがはるかに迅速に、かつより高い帯域幅で受信され得る。原則として、レベル1のキャッシュ(すなわち、プロセッサ316および318に最も近いキャッシュ)は、より小さく、より速く、またレイテンシがより低い。一般的に、レベル2のキャッシュ320はより大きく、より遅い場合があり、また、より長いレイテンシを有する場合がある。しかしながら、それらは依然としてメモリデバイス304よりも高速なので、第2のレベルのキャッシュを含むことによってパフォーマンスの向上が可能である。
【００４１】
キャッシュメモリシステムの様々な例によれば、1つまたは複数のレベルが使用され、各レベルは、統合されたキャッシュとして、または個別の命令キャッシュおよびデータキャッシュとして実装され得る。本明細書に記述される実施形態は、主に命令に関係する。その結果、議論は特に命令キャッシュ316および/または統合されたキャッシュ320に注意を向けることができる。しかしながら、実施形態が、任意のレベルのキャッシュについて、および命令キャッシュ316と統合されたキャッシュ320の両方において実施され得ることが、当業者には理解されよう。
【００４２】
1つの特徴によれば、1つまたは複数のプロセッサ310によって使用される仮想メモリは、キャッシュメモリシステム312(たとえば、キャッシュメモリシステム内の任意のレベル)内および/またはメモリデバイス304内に駐在することができる。処理回路302はまた、実行防止モジュール322を含むかまたは実装することができる。この例では、実行防止モジュール322は、プロセッサ310と、メモリデバイス304およびキャッシュメモリシステム312との間で結合され得る。この例では、仮想メモリは、メモリデバイス304および/またはキャッシュメモリシステム312上に実装され得る。図4は、実行防止モジュール322が、キャッシュメモリシステム312とメモリデバイス304との間に設置される、例示的な処理回路402に対する代替構成を示す。この例では、仮想メモリは、メモリデバイス304内に実装され得る。
【００４３】
1つの特徴によれば、すべてまたは大半のメモリページは、最初に、フェッチされるかまたは仮想メモリにマッピングされるときに、非実行可能としてマークされる。次いで、処理回路302は、メインメモリ304内の「非実行可能」とマークされたこれらのエリア内に駐在するコードを実行することを拒絶する。代わりに、ページが、メインメモリ304からキャッシュメモリ312にロード/フェッチされるたびに、実行防止モジュール322は、ページをキャッシュメモリ312にロードする前に、NXビットを非実行可能から実行可能に変更する(または変更させる)。キャッシュメモリ312にロードされると、そのページ内の関数は実行され得る。
【００４４】
「非実行可能」とマークされている仮想メモリ内のページからの命令にアクセスすることを試みるROP攻撃は失敗する。すべての命令ページを「非実行可能」として初期化し、メモリページステータスが実行防止モジュール322を介してフェッチされたときだけ、そのステータスを「実行可能」に変更することによって、ROP攻撃は、現在「実行可能」とマークされているそれらのメモリページから呼び出される命令に制限される。「メモリページ」は、本明細書で説明する多くの例において使用されるが、任意のメモリユニット、セグメント、等しいかまたは異なるサイズの領域が「非実行可能」および/または「実行可能」とマークされてよいことに留意されたい。ROP攻撃からの呼び出しは、データ実行防止モジュール322をバイパスするので、それらが実行しようとする命令(たとえば、ガジェット)は、それらのメモリページが「非実行可能」とマークされているので失敗する。仮想メモリ内のすべてのメモリページをデフォルトで「非実行可能」とマークすることで、ROP攻撃が命令を使用し得るメモリページの数が大幅に減少する。ROP攻撃に利用可能な「実行可能」命令をさらに低減するために、関数が終了すると、その対応するメモリページが、キャッシュメモリからフラッシュされ得、および/または仮想メモリ内で元の非実行可能にセットされる。
【００４５】
図5は、向上した実行防止機能を実行するように適合された処理回路の一例を示すブロック図である。処理回路502は、非実行ビットモジュール536とともに、到来スタブ(incoming stub)508および/または送出スタブ(outgoing stub)510を備える間接レイヤを実装し得る。一例では、到来スタブ508および/または送出スタブ510は、メモリにロードされるアプリケーションの一部であってよい。しかしながら、そのような到来スタブ508および/または送出スタブ510は、「実行可能」(「Xフラグ」で示される)とマークされたメモリの異なる領域にロードされ得、一方、アプリケーションの対応する実行可能コードは、デフォルトで「非実行可能」(「NXフラグ」で示される)とマークされたメモリ領域にロードされ得る。この例では、間接スタブ540は、デフォルトで実行可能にセットされたNXフラグを有する第1のメモリページ542にロードされる。対応する実行可能コードは、メモリページk 512およびq 548にロードされる。ここで、各実行可能関数が対応する到来/送出スタブを有することが理解されよう。たとえば、メモリページk 512内の関数Fは、対応する到来/送出スタブF 544を有する。同様に、ページk 512内の関数Iは対応する到来/送出スタブI 552を有し、ページq 548内の関数Jは、対応する到来/送出スタブJ 554を有する。この例では、到来スタブ508および送出スタブ510は、到来/送出スタブF 544の論理表現(logical representation)である。
【００４６】
一例によれば、スタブ508/510は、間接レイヤとして作用し、処理回路502によって実行されるアプリケーションの一部であってよい。スタブ508/510は、アプリケーション514から/への関数呼び出しをインターセプト(intercept)するように作用し、および/またはアプリケーションの1つまたは複数の対応する関数(実行可能コード)に明確に関連付けられ得る。
【００４７】
例示のために、到来スタブ508および送出スタブ510は、処理回路502内に示され、仮想メモリ504から(たとえば、メモリページl 542から)ロードされた到来/送出スタブを表すように働く。常にアクティブ/オープンである関数呼び出しの数に応じて、複数の到来/送出スタブ(たとえば、メモリページl 542からの)が、処理回路502によってロードされ得ることに留意されたい。到来スタブ508は、メモリページに対する非実行可能(NX)フラグ(通常はビット)を実行可能(X)フラグに変更し、次いで、メモリページ内の呼び出された関数に制御を移し、呼び出された関数が完了すると、プロセスを反転する(たとえば、実行可能(X)から非実行可能(NX)にメモリページをセットする)ように作用してもよい。
【００４８】
図5に示す例では、処理回路によってアプリケーション514を実行すると、関数Fの呼び出し520(関数F 550は、仮想メモリ504内のメモリページk 512内に駐在する)が行われ得る。仮想メモリ504から直接、呼び出された関数(関数F)をフェッチするのではなく、関数呼び出し520は、代わりに、到来スタブ508に送られる。たとえば、関数Fの呼び出しが起動されると、到来スタブ544がフェッチされて実行される(たとえば、到来スタブ508として示される)。到来スタブ508(たとえば、到来スタブF 544)は、処理回路502による関数F 550のフェッチおよび/またはロードが行われる524前に、関数F 550が駐在するメモリページk 512から非実行可能(NX)フラグ/ビットがクリア/除去される522(すなわち、フラグ/ビットセットが実行可能(X)にセットされる)ようにする。非実行(NX)フラグ検査モジュール536は、処理回路502による関数F 550のロードおよび/または実行が行われる前に、メモリページが実行可能(X)としてマークされているのかまたは非実行可能(NX)としてマークされているのかを確認し得る。仮想メモリ504内で「実行可能」(X)とマークされたメモリページ(またはメモリエリア/セグメント)内で発見された命令だけが、処理回路502によって実行されることが許可される。
【００４９】
メモリページおよび/またはその中の命令は、仮想メモリ504内で「実行可能」とマークされていることを検証され、処理回路502内にフェッチされると、これらの命令は、処理回路502によって正常に実行され得る。ここで、関数F 550は、ロードされたメモリページk 512から実行される526。関数F 550の実行が終了すると、関数Fからのリターン528が、送出スタブ510(すなわち、送出スタブF 544)に送られる。送出スタブ510は、実行の制御を呼び出しアプリケーション514にリターンすることができる。さらに、送出スタブ510はまた、仮想メモリ504内のページk 512に対して非実行可能(NX)ページフラグをセットし530(すなわち、実行可能状態から非実行可能状態に切り替え)、同様に、処理回路502によって使用され得るいずれかの任意的なキャッシュメモリからページkをフラッシュする534ことができる。関数呼び出しが終了するとキャッシュメモリ506からページをフラッシュすることで、ROP攻撃にとって利用可能な実行可能命令の数を最小化する。
【００５０】
代替実施態様では、到来スタブは、すでに実行可能としてマークされているメモリページに関数/命令を移動させ、次いで、呼び出された関数に制御を移す(たとえば、対象とする関数Fを呼び出す)。呼び出された関数(たとえば、関数F)が実行を終了した後、リターンが、送出スタブ510に方向転換され、送出スタブは前の動作を反転する(すなわち、すでに実行可能とマークされているメモリページから関数/命令を取り除き、および/またはキャッシュからメモリページk 512のコピーをフラッシュする)。
【００５１】
このシステムの性能は、同じまたは近くのメモリページ上に「発呼(caller)」関数および「被呼(callee)」関数を配置すること、メモリページのセットまたはブロックと同時に非実行可能フラグをセットおよびクリアすること、および/あるいはそれぞれの関数入口および関数出口より少ない頻度で実行可能状態と非実行可能状態との間を切り替えること、によって改善され得る。たとえば、関数Fが、関数Pを呼び出す関数Mを呼び出す場合、これらの関数は、仮想メモリ504から一緒にロードまたはフェッチされ得る同じメモリページまたはページのブロック内に設置されることが有利である。したがって、関数Fが起動されたときに非実行(NX)ページフラグを変更することで、追加のページロードおよびNX状態変更なしに、続いて呼び出される関数MおよびPが実行可能になるように作用してもよい。
【００５２】
ROPエクスプロイトは、一般的に、必ずしも頻繁にアクセスされていないメモリの多くの異なるエリアに配置され得る、命令(たとえば、ガジェット)の短い断片の性質上、あまり良好ではない空間的近接性とあまり良好ではない時間的近接性を有する。
【００５３】
図6は、リターン指向プログラミング(ROP)エクスプロイトを形成するためにつなげられたガジェットを含む、悪意のあるコードシーケンスを生成するための、破損した呼び出しスタック600の例を示している。破損した呼び出しスタック600は、攻撃者が破損した呼び出しスタック600上の復帰アドレスのうちの1つまたは複数を変更しているために、破損した形式である。また、命令を含むメモリの一部分602を図6に示す。
【００５４】
破損した呼び出しスタック600は、関数U、V、W、X、Y、およびZに対するフレーム(関数呼び出し)を含み得る。破損した呼び出しスタック600からメモリ602への実線の矢印は、スタックをポップオフし、処理回路に特定のガジェットの先頭において実行を開始させる、復帰アドレスを示す。メモリ602から破損した呼び出しスタック600への点線の矢印は、スタックから復帰アドレスをフェッチするために特定のガジェットの最後において実行されたリターン命令を示す。
【００５５】
破損した呼び出しスタック600において、関数Z 608の復帰アドレスは、ガジェットA 612の先頭アドレス610(すなわち、GA復帰アドレス)を指すように変更されている。同様に、関数Y 614の復帰アドレスは、ガジェットB 618の先頭アドレス616(すなわち、GB復帰アドレス)を指すように変更されており、関数W 620の復帰アドレスは、ガジェットE 624の先頭アドレス622(すなわち、GE復帰アドレス)を指すように変更されており、関数V 626の復帰アドレスは、ガジェットD 630の先頭アドレス628(すなわち、GD復帰アドレス)を指すように変更されており、関数U 632の復帰アドレスは、ガジェットC 636の先頭アドレス634(すなわち、GC復帰アドレス)を指すように変更されている。この例では、関数X 640の復帰アドレス638は変更されていない。
【００５６】
これらの変更により、関数Z 608が動作を完了してリターン命令が実行されると、適切な場所に戻らずに、制御はガジェットA 612の先頭に続き、アドレスが関数Z 608の復帰アドレス610内に配置される。すべてのガジェットは、リターン命令で終了する。したがって、ガジェットA 612が完了すると、そのリターン命令は関数Y 614の復帰アドレス616を指す。しかしながら、関数Y 614の復帰アドレス616がガジェットB 618の先頭を指すように変更されている。その結果、適切な場所に戻らずに、制御はガジェットB 618の先頭に続く。ガジェットの実行を継続すると、ガジェットB 618が完了した後、関数U 632の適切な場所に戻らずに、制御はガジェットC 636の先頭に続く。ガジェットC 636が完了した後、関数V 626の適切な場所に戻らずに、制御はガジェットD 630の先頭に続く。ガジェットD 630が完了した後、関数W 620の適切な場所に戻らずに、制御はガジェットE 624の先頭に続く。このようにガジェットA-Eをつなげることによって、ROPエクスプロイトの少なくとも一部を形成する重要な機能を実行することができる。
【００５７】
しかしながら、本明細書で説明する処理回路はデータ実行防止を利用し、メモリ内のすべてのメモリページは、デフォルトで「非実行可能」としてマークされるので、間接レイヤを介して呼び出された関数/命令(たとえば、到来スタブ508および送出スタブ510)だけが、「実行可能」とマークされたメモリページに駐在することを保証される。したがって、「非実行可能」としてマークされたメモリエリア内に設置される任意のガジェットは、そのようなガジェットの呼び出しが間接レイヤをバイパスするので、処理回路によって実行されることに失敗する。
【００５８】
図7は、図5の処理ユニットの状況におけるガジェットフェッチに対して起こるものを示すブロック図である。この例では、様々な関数は、仮想メモリ504にロードされている。スタックは、ページq 548からガジェット702をロードするための呼び出しが発生するように、不正侵入されている。しかしながら、そのようなガジェット呼び出し702は、到来スタブ508を通って発生することはない。すなわち、仮想メモリ504内の対応する到来/送出スタブを有する関数呼び出しとは異なり、ガジェット呼び出しは、到来/送出スタブを持たない(たとえば、いくつかの命令の実行を達成するために選択された)メモリ内の任意のポイントにおいて開始する。したがって、到来スタブが呼び出されないので、ページq 548の状態は、依然として「非実行可能」としてマークされている。ガジェットがページq 548からフェッチされる704と、非実行可能(NX)フラグ検査モジュール536は、そのページが「非実行可能」とマークされているので、ページq 548のロードを排除するかまたは妨げる。これは、ガジェット呼び出しおよび/またはプロセスの終了の原因となる706。
【００５９】
＜処理回路内の実行を抑制するための例示的な方法＞
図8は、処理回路内のコードの実行を抑制するための一般的な例示的方法を示すフロー図である。この方法は、たとえば、メモリ(たとえば、仮想メモリ、内部/外部メモリなど)から命令をフェッチする処理回路によって実施されてもよい。メモリ内の実行可能コードのエリアが、非実行可能としてタグ付け(たとえば、マーク)される802。処理回路は、メモリ804から1つまたは複数の命令を実行するための要求を監視してもよい。1つまたは複数の命令を実行するための要求が検出される806と、1つまたは複数の命令が駐在するメモリエリアが、実行可能としてタグ付けされる808。次いで、処理回路は、メモリエリアから1つまたは複数の命令を実行してもよい810。完了すると、1つまたは複数の命令が駐在するメモリエリアが、元の非実行可能にタグ付けされる812。
【００６０】
図9は、ROPエクスプロイトからメモリを保護するための、処理回路内で動作可能な別の例示的な方法を示すフロー図である。この方法は、処理回路によるアプリケーションまたはプロセスの実行時に実施され得る。アプリケーションまたはプロセスは、その実行可能コードが、メモリにロードされることおよび/または以下のようにして保護させる命令を含み得る。実行可能コードの複数のメモリページは、メモリデバイス902にロードされ得る。実行可能コードは、単一のアプリケーションおよび/またはプロセスに対応し得る。実行可能コードがロードされるメモリデバイスは、仮想メモリを実装し得る。複数のメモリページの第1のサブセットに対する状態インジケータが、非実行可能状態にセットされ得る904。同様に、複数のメモリページの第1のサブセット内の関数に対する間接スタブを含む、複数のメモリページの第2のサブセットに対する状態インジケータが、実行可能状態にセットされる906。複数のメモリページの第1のサブセットおよび/または第2のサブセットのうちの少なくとも一方に対する状態インジケータが、非実行可能状態にセットされる前および/または後に、実行可能コードの複数のメモリページをメモリデバイスにロードするステップが発生し得ることに留意されたい。
【００６１】
間接スタブは、実行可能コードのコンパイル段階またはプリコンパイル段階において生成され得る。次いで、複数のメモリページの第1のサブセットからの呼び出された関数の実行を指示する前に、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを変更する、複数のメモリページの第2のサブセット内の対応する間接スタブに対して、関数呼び出しが指示され得る908。処理回路はまた、複数のメモリページの第1のサブセット内に駐在する実行可能コードの実行防止を実行し得る910。たとえば、実行防止を行うステップは、実行可能コードが実行のために処理回路によってフェッチされたときに、非実行可能状態にあるメモリページ内に駐在するすべての実行可能コードの実行を打ち切るステップを含んでもよい。処理回路はまた、関数呼び出しが完了すると、複数のメモリページの第2のサブセット内の対応する間接スタブにリターンし、対応する間接スタブが、次いで、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを変更してもよい912。
【００６２】
一例では、間接スタブが、関数の実行を有効化するために、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを、非実行可能状態から実行可能状態に変更してもよい。また、間接スタブが、関数の実行を無効化するために、複数のメモリページの第1のサブセット内の対応する関数に対する状態インジケータを、実行可能状態から非実行可能状態に変更してもよい。
【００６３】
一態様によれば、処理回路の内部キャッシュメモリは、関数呼び出しが完了すると、関数呼び出しをフラッシュ(クリア)され得る。
別の例では、関数呼び出しに対するコードが、複数のメモリページの第1のサブセット内の第1のメモリページ内に駐在する場合、方法は、(a)実行可能状態にある第1のメモリページの使用を追跡するステップ、(b)すべての進行中の関数呼び出しが、第1のメモリページ内の対応するコードの実行を完了したときを確認するステップ、および/または(c)最後の進行中の関数呼び出しが完了すると、第1のメモリページに対する状態インジケータを非実行可能状態にセットするステップをさらに含み得る。
【００６４】
図10は、ROPエクスプロイトからメモリを保護するための例示的な方法を示すフロー図である。この方法は、メモリ(たとえば、仮想メモリ)から実行可能コードまたは命令にアクセスする処理回路内で動作可能であってよい。
【００６５】
任意の特徴によれば、ネスト化された関数または関連した関数の実行可能コードは、実行の前に同じメモリページ内に配列され得る1000。たとえば、この配列は、実行可能コードのコンパイル中またはメモリに実行可能コードをロードするときに発生し得る。この方式における事前配列コード(pre-arranging code)は、メモリ内でともに密接に関連するコードを許容し、それにより、過度のメモリページフェッチを回避し、ひいては(たとえば、実行可能と非実行可能との間の)ページ状態の変化を最小化する。
【００６６】
処理回路は、メモリに実行可能コードの複数のメモリページをロードし1002、各メモリページに対する状態インジケータを非実行可能状態にセットする1004ことができる。一例では、そのようなメモリは仮想メモリと呼ばれ、仮想メモリは、メインメモリおよび/またはキャッシュメモリデバイスの物理メモリアドレスのマッピングであり得る。アプリケーションを実行すると、処理回路および/またはオペレーティングシステムは、メモリから対応する実行可能コードをフェッチする前に、アプリケーションからの関数呼び出しを検出、監視、および/またはインターセプトする1006ことができる。第1の実行可能コードがメモリ内に駐在する場合、第1のメモリページに対する状態インジケータが、実行可能状態にセットおよび/または変更される1008。次いで、第1のメモリページが、メモリからフェッチされ得る1010。第1のメモリページからの命令を実行する前に、第1のメモリページの状態インジケータが実行可能状態にセットされているかどうかについて、判断がなされる1012。メモリページ状態が実行可能状態でない場合、第1のメモリページのロード/実行が(処理回路によって)打ち切られる1014。そうではなく、第1のメモリページ状態が、実際には実行可能状態にある場合、第1の実行可能コードは(処理回路によって)実行される1016。第1の実行可能コードの実行が終了すると、処理回路は、任意の内部キャッシュメモリ(存在する場合)から第1のメモリページをフラッシュする1018ことができる。
【００６７】
さらに、処理回路はまた、メモリ内の状態インジケータを元の非実行可能にセットしてもよい1020。このようにして、アプリケーションの外部から発生する呼び出しはインターセプトされず、それらの対応する命令は、「非実行可能状態」を有するメモリページ内で発見される可能性が高い。
【００６８】
いくつかの実施態様では、1つまたは複数のメモリページ内の関数に対して多重にネストした呼び出しが存在することがある。一態様によれば、1つまたは複数のカウンタが、アプリケーションを実行している処理回路によって維持され得、各カウンタは、特定のメモリページ内の関数および/または命令の実行が終了したかどうかを追跡するように作用する。たとえば、ネスト化関数呼び出しを用いて、第1のメモリページ内の関数が第2のページ内の関数を呼び出す場合、複数のメモリページが同時にオープンのままであり得る。1つまたは複数のカウンタは、たとえば特定のメモリページへの入口の数ならびに出口の数を追跡するように働き、それにより、メモリページの使用がいつ完了したかが確認され、メモリページはフラッシュされるかまたは元の「非実行可能」に変更され得る。いくつかの実施態様では、コンパイラは、関連する実行可能コードを一緒に配列し、それによりそのコードは、同じメモリページ内に駐在することができる。これは、そのメモリページの「非実行可能」状態を頻繁にクリアおよびセットを行う必要なしに、メモリページからの命令を実行することを可能にする。
【００６９】
別の態様によれば、起動(boot-up)コードおよび/または特定の起動オペレーティングシステム実行可能コードは、本明細書で説明する実行防止機能から除外されてよい。すなわち、そのようなコードを含むメモリページは、デフォルトで(「非実行可能」ではなく)「実行可能」にマークされ得る。これは、最小オペレーティング機能が、処理回路またはその上で実行されるオペレーティングシステムにおいて達成されるまで、より速やかな起動を可能にする。
【００７０】
＜例示的な間接レイヤ＞
図11は、メモリエリアが必要とされるかまたは呼び出されたときにメモリエリアの状態を変更することを許容する間接レイヤの例示的な実施態様を示すブロック図である。この例では、処理回路1102は、実行可能命令/コード1108および/または対応する間接コード1104/1106(すなわち、間接レイヤ)を含むメモリモジュール1110(たとえば、仮想メモリ、メモリデバイスなど)に結合され得る。一例では、間接コード1104/1106は、実行可能コードに明確に追加または挿入されている(たとえば、プリコンパイル、コンパイル、および/またはポストコンパイルにおいて)個別の命令であってよい。別の例では、間接コード1104/1106は、メモリ内に駐在するいくつかの命令への確実なアクセスについて所望の機能を達成するために、プロセッサによって構成/翻訳される既存の命令であってよい。
【００７１】
一例では、間接コード1104/1106は、実行可能命令1108に対するメモリ状態をセット/クリアするように作用し得る。たとえば、関数Aが処理回路によって実行されるアプリケーション内から呼び出されると、対応する間接コードA 1104は、実際に呼び出される。間接コードA 1104は、実行可能コードA(関数A)に対して対応するメモリ領域1112の状態を「非実行可能」から「実行可能」にセットし、それにより命令は処理回路1102によって実行され得る。命令が完了すると、間接コード1104は、実行可能コードA(関数A)に対して対応するメモリ領域1112の状態を「実行可能」から「非実行可能」にセットし、それにより命令は、(たとえば、ROP攻撃による)実行にとって利用可能でなくなる。同じプロセスが、他の関数に対して繰り返され得る。たとえば、第2の関数Bは、実行可能コードB(関数B)1114にアクセスするための使用される、対応する間接コードB 1106を有し得る。
【００７２】
実行可能命令1108が駐在する(デフォルトで「非実行可能」とマークされている)メモリ空間とは対照的に、間接コード1104および/または1106は、「実行可能」とマークされているメモリ空間内に駐在し得、それにより処理回路1102は、そのようなコードを実行し得る。間接コード1104および/または1106は、そのような間接コードが実行可能命令と独立して構築される特定のアプリケーションのコンパイル時に生成され得る。その代りに、間接コード1104および/または1106は、実行可能命令1108をメモリにロードするときに動的に生成され得る。
【００７３】
一例では、各実行可能コード1112/1114(または関数)は、対応する間接コード1104/1106を有し得る。したがって、各間接コード(スタブ)1104/1106は、その対応する実行可能コード1112/1114がメモリ内のどこに駐在するのかを知り得、そのようなメモリアドレスを指すことができる。そのようなメモリアドレスは、各関数に関連する実行可能コードのサイズとともに、(アプリケーションの)コンパイル時に知られ得る。したがって、間接コード1104/1106は、どの、どれだけ多くのメモリページ内に、対応する実行可能コード1112/1114が駐在するかを判断することができる。任意の1つの関数に対する実行可能コードのサイズ、およびメモリページのサイズに応じて、1つまたは複数のメモリページが、所与の関数呼び出しに対して常に、「非実行可能」から「実行可能」に切り替えられ得る(または「実行可能」状態に保持され得る)。さらに、いくつかの実施態様では、最新の、未処理の、および/または未解決の関数呼び出しに対応する実行可能コードが駐在するメモリ領域/ページだけが、「実行可能」状態に保持される。さらに他の実施態様では、性能を改善するために、最後のn個の関数呼び出し内で使用されるメモリページが、「実行可能な」メモリ状態に保持される。
【００７４】
図12は、メモリエリアが必要とされるかまたは呼び出されたときにメモリエリアの状態を変更することを許容する間接レイヤを実装するための方法を示す。この方法は、オペレーティングシステムレベルまたはアプリケーションレベルにおいて実施され得る。関数呼び出し(たとえば、メモリ内の実行可能コードに対する呼び出し)は、アプリケーションの実行中にインターセプトされ得る1202。呼び出された関数をロード/実行する前に、間接レイヤは、呼び出された関数に対する実行可能コードに関連するメモリ状態を、非実行可能から実行可能に変更し得る1204。次いで、処理回路は、呼び出された関数に対する実行可能コードをフェッチおよび/または実行する1206ことができる。1つの特徴によれば、処理回路は、関数呼び出しがいつ完了したかを確認するために、実行可能コードからネストした入口および/または出口を追跡することができる1208。呼び出された関数が完了すると、間接レイヤは、呼び出された関数に対する実行可能コードに関連するメモリ状態を、実行可能から非実行可能に変更してもよい1210。
【００７５】
図13は、そのようなメモリエリアへのアクセスを保護するためにアプリケーション実行可能コードが駐在するメモリエリアの状態を変更することを許容するアプリケーション内の間接レイヤを実装するための方法を示す。複数の関数を含むアプリケーションソースコードが生成され得る1302。間接コードはまた、ソースコード内の各関数に対して生成されてもよい1304。メモリにロードされると、ソースコードを非実行可能として識別させるように、命令が追加されてもよい1306。また、メモリにロードされると、間接コードを実行可能として識別させるように、命令が追加され得る1308。ソースコードおよび間接コードが、実行可能コードを生成するように、処理回路において変換(たとえば、コンパイル)されてもよい1310。実行可能コードは、単一のアプリケーションおよび/またはプロセスに対応してもよい。間接スタブは、実行可能コードのコンパイル段階またはプリコンパイル段階において生成され得る。ソースコードおよび間接コードが、実行のためにメモリにロードされるときに、個別のメモリページ内に駐在するようにコンパイルされてもよい。たとえば、第1の関数に関連する第1の間接コードが第1の関数を指すように適合され、実行可能コードが生成されると、第1の間接コードおよび第1の関数が異なるメモリページ内にロードされるようにコンパイルされる。
【００７６】
一例では、第1の関数が実行のために起動されているときに、第1の間接コードが、対応する第1の関数に対するメモリ状態インジケータを非実行可能状態から実行可能状態に切り替えてもよい。
【００７７】
別の例では、第1の関数が実行を終了すると、第1の間接コードが、対応する第1の関数に対するメモリ状態インジケータを実行可能状態から非実行可能状態に切り替える。
【００７８】
例示的な実施態様では、図8、図9、図10、図12、および/または図13において開示する1つまたは複数の特徴が、1つまたは複数のプロセッサ内で並列に(たとえば、同時に)、および/または直列に(たとえば、連続的に)実施され得る。複数のプロセッサが1つまたは複数のステップを実行する場合、複数のプロセッサのそれぞれは、異なるステップ、同じステップ、および/またはステップのサブセットを実施し得る。
【００７９】
本明細書で言及する例示的な実施態様のいくつかにおいて、間接レイヤの関数は、アプリケーションのコンパイルの前、間、および/または後に、アプリケーションに追加される異なる命令/コードとして実施され得る。しかしながら、他の実施態様は、命令セット内に存在する命令を再使用すること、および/または実行可能状態と非実行可能状態との間の切替を回避することができる。
【００８０】
別の例示的な実施態様では、「間接レイヤ」は、命令セット内の2つ(または3つ以上)の相補型命令のセットとして実施されてもよい。たとえば、プロセッサは、第1の命令が実行されると、次の第2の命令以外はいずれもフェッチすることを拒絶するように構成されてもよい。そのような構成は、たとえば、内部的に(たとえば、プロセッサ内のハードワイヤで)、またはプロセッサにロードされた命令(たとえば、ローダ構成(loader configuration))によって、行われてもよい。第2の命令が、第1の命令の実行後に来るものである場合、プロセッサは実行を継続する。そうでない場合、プロセッサは実行を打ち切るかまたはリセットすることができる。この方式では、実行可能コードを含むメモリセグメントに対して「非実行可能」ステータスをセットすることは、任意および/または不要であってよい。たとえば、図5における個別の到来/送出スタブ540を有するのではなく、アプリケーション内の関数呼び出し命令(すなわち、第1の命令)の後には、呼び出された関数の最初の命令(すなわち、第2の命令)だけが続くように制限される。最初の命令でない他の命令が関数呼び出し命令に続いていることにプロセッサが気付いた場合、プロセッサは実行を打ち切る。そのような関数呼び出し命令(第1の命令)および最初の命令(第2の命令)は、命令セットに追加される新しい/特別な命令であってよい。その代りに、すでに命令セットの一部である通常の命令は、この目的に使用され得るが、ビットまたはマーカーが、第1の命令の後には第2の命令が続かなければならないことを指摘するために使用され得る。このようにして、プロセッサは、そのような命令シーケンスを検査し、第2の命令以外の他の何かが第1の命令に続く場合(たとえば、リターン指向攻撃における場合など)に実行を打ち切る。
【００８１】
そのような相補型命令対の一例では、第1の命令は、(たとえば、特定の関数を呼び出すための)「呼び出し」として機能する一方で、第2の命令は、関数入口に配置され得る「ランド(land)」として機能することができる。一例では、そのような命令対は、第2の命令が第1の命令に続かなければならず、そうでない場合にプロセッサが実行を打ち切る相補型命令となるように、命令セット内で明確に定義され得る。一例では、そのような命令の、関数呼び出しを開始するための命令(たとえば、到来スタブ)の第1の対と、関数呼び出しから出る/関数呼び出しを終了するための命令(たとえば、送出スタブ)の第2の対との、2つのセットが存在し得る。
【００８２】
代替例では、2つの専用の命令(たとえば、相補型の第1および第2の命令)を使用する代わりに、通常の命令が、それらがスタブ命令であるかどうかを示すために使用される専用のビットを用いて符号化またはマークされてもよい。たとえば、通常の第1の命令(たとえば、「呼び出し」命令)は、関数をロードするために使用される場合、ビット/マーカーのセットを有し得る。同様に、通常の第2の命令(たとえば、「ランド」命令)は、関数ロードの一部として使用される場合、類似のビット/マーカーのセットを有し得る。したがって、プロセッサは、命令が順次実行されていることを確かめ、そうでない場合に実行が打ち切られるように、第1および/または第2の命令を実行するときにそのようなビット/マーカーを検査し得る。第1の命令(たとえば、「呼び出し」命令)は、ジャンプ(JMP)命令、ロード命令などを含む、様々なタイプの命令であってよいことに留意されたい。同様に、(たとえば、関数が完了したときの)反転動作において、第1の命令は、リターン命令、終了命令などを含む、様々なタイプの命令であってよい。
【００８３】
一例では、「呼び出し」命令の実行は、呼び出された関数が駐在するメモリセグメント/ページの状態を非実行可能状態から実行可能状態に自動的に切り替えることを、プロセッサに行わせることができることに留意されたい。呼び出された関数の実行を終了すると、動作は反転され、メモリセグメント/ページは、元の非実行可能状態にセットされる。代替の実施形態では、メモリセグメント/ページは、まったく、非実行可能としてマークされない。代わりに、リターン指向プログラミング攻撃は、関数呼び出し命令(第1の命令)の後に、呼び出された関数の最初の命令(第2の命令)が続かなければならないという制限によって挫折させられ得る。これは、呼び出している命令の後にランディング命令(landing instruction)が続くように制限されるので、リターン指向プログラミング攻撃がメモリ内の特定の命令に選択的にジャンプすることを抑制する。
【００８４】
図示および説明した特定の実施態様は例にすぎず、本明細書に格別に指定がない限り、本開示を実装するための唯一の方法として解釈されるべきではない。本開示における様々な例は他の多くの分割ソリューション(partitioning solutions)によって実施され得ることが、当業者には容易に明らかである。
【００８５】
本明細書で説明し、図面に示した、コンポーネント、動作、特徴、および/または機能のうちの1つまたは複数は、単一のコンポーネント、動作、特徴、または機能に再構成および/または結合されてもよく、いくつかのコンポーネント、動作、特徴、または機能に具現化されてもよい。本発明から逸脱することなく、さらなる要素、構成要素、動作、および/または機能も追加されてもよい。本明細書で説明するアルゴリズムは、ソフトウェアでも効率的に実装されてもよいし、および/またはハードウェアにも組み込まれてもよい。
【００８６】
説明では、不要な詳細で本開示を不明瞭にしないように、要素、回路、および機能をブロック図形式で示すことがある。逆に、図示および説明した特定の実施態様は例にすぎず、本明細書に格別に指定がない限り、本開示を実装するための唯一の方法として解釈されるべきではない。さらに、ブロック定義、および様々なブロック間のロジックの分割は、特定の実施態様の例である。本開示は、他の多くの分割ソリューションによって実施され得ることが当業者には明白である。ほとんどの部分について、タイミングの問題等に関する詳細が、本開示の完全な理解を得るために必要ではなく、関連分野の当業者の能力の範囲内である場合、そのような詳細は省略されている。
【００８７】
また、実施形態は、フローチャート、流れ図、構造図またはブロック図として示されるプロセスとして説明され得ることに留意されたい。フローチャートは動作を逐次プロセスとして説明し得るが、動作の多くは並行してまたは同時に実行されてもよい。加えて、動作の順序は並び替えられてもよい。処理は、その動作が完了すると終了する。処理は、方法、関数、手順、サブルーチン、サブプログラム等に対応してもよい。処理が関数に対応する場合、その終了は、関数が、関数の呼び出しまたはmain関数に戻ることに対応する。
【００８８】
当業者は、情報および信号は、様々な異なる技術および技法のいずれかを使用して表され得ることを理解するであろう。たとえば、本明細書全体にわたって参照され得る、データ、命令、コマンド、情報、信号、ビット、記号、およびチップは、電圧、電流、電磁波、磁界もしくは磁性粒子、光学場もしくは光学粒子、またはそれらの任意の組合せによって表され得る。いくつかの図面は、提示および説明を明確にするために、信号を単一の信号として示すことができる。信号は信号のバスを表すことができ、バスは様々なビット幅を有することができ、本開示は単一のデータ信号を含む任意の数のデータ信号上で実施され得ることを、当業者は理解するであろう。
【００８９】
本明細書で「第1の」、「第2の」などの呼称を使用した要素へのいかなる参照も、そのような限定が明示的に述べられていない限り、それらの要素の量または順序を限定しないことを理解されたい。むしろ、これらの呼称は、複数の要素、または要素の例を区別する便利な方法として、本明細書中で使用され得る。したがって、第1および第2の要素への参照は、2つの要素のみがそこで採用され得ること、または何らかの形で第1の要素が第2の要素に先行しなければならないことを意味しない。加えて、別段に記載されていない限り、1組の要素は1つまたは複数の要素を含む場合がある。
【００９０】
その上、記憶媒体は、読み取り専用メモリ(ROM)、ランダムアクセスメモリ(RAM)、磁気ディスク記憶媒体、光学記憶媒体、フラッシュメモリデバイス、および/または、情報を記憶するための他の機械可読媒体、およびプロセッサ可読媒体、ならびに/もしくはコンピュータ可読媒体を含む、データを記憶するための1つまたは複数のデバイスを表し得る。「機械可読媒体」、「コンピュータ可読媒体」、および/または「プロセッサ可読媒体」という用語は、これに限定されないが、そのようなポータブルまたは固定記憶デバイス、光記憶デバイスなどの非一時的媒体、および命令ならびに/もしくはデータを格納、内蔵、または搬送できる他の様々な媒体を含んでもよい。したがって、本明細書で説明した様々な方法は、「機械可読媒体」、「コンピュータ可読媒体」、および/または「プロセッサ可読媒体」に格納され得る命令および/またはデータによって完全にまたは部分的に実装されて、1つまたは複数のプロセッサ、機械、および/またはデバイスによって実行されてもよい。
【００９１】
さらに、実施形態は、ハードウェア、ソフトウェア、ファームウェア、ミドルウェア、マイクロコード、またはそれらの任意の組合せによって実装され得る。ソフトウェア、ファームウェア、ミドルウェアまたはマイクロコードで実装されるとき、必要なタスクを実行するプログラムコードまたはコードセグメントは、記憶媒体または他のストレージなどの機械可読媒体に格納され得る。プロセッサは必要なタスクを実行し得る。コードセグメントは、手順、関数、サブプログラム、プログラム、ルーチン、サブルーチン、モジュール、ソフトウェアパッケージ、クラス、または命令、データ構造もしくはプログラムステートメントの任意の組合せを表し得る。コードセグメントは、情報、データ、引数、パラメータ、またはメモリ内容をパスおよび/または受信することによって、別のコードセグメントまたはハードウェア回路に結合され得る。情報、引数、パラメータ、データ等は、メモリ共有、メッセージパッシング、トークンパッシング、ネットワーク送信等を含む任意の適切な手段を介して、渡し、転送し、または送信することができる。
【００９２】
本明細書で開示する例に関して説明する様々な例示的な論理ブロック、モジュール、回路、要素、および/または構成要素は、汎用プロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)もしくは他のプログラマブル論理構成要素、個別ゲートもしくはトランジスタ論理、個別ハードウェア構成要素、または本明細書で説明する機能を実行するように設計されたそれらの任意の組合せで実装または実行することができる。汎用プロセッサはマイクロプロセッサであり得るが、代替として、プロセッサは任意の従来のプロセッサ、コントローラ、マイクロコントローラ、または状態機械(state machine)であり得る。また、プロセッサは、コンピューティングコンポーネントの組合せ、たとえばDSPとマイクロプロセッサとの組合せ、複数のマイクロプロセッサ、DSPコアと連係した1つまたは複数のマイクロプロセッサ、あるいは他の任意のそのような構成として実装され得る。本明細書で説明する実施形態を実行するために構成された汎用プロセッサは、そのような実施形態を実行するための専用プロセッサと見なされる。同様に、汎用コンピュータは、本明細書で説明する実施形態を実行するために構成されるときの専用コンピュータと見なされる。
【００９３】
本明細書で開示する例に関して説明する方法またはアルゴリズムは、ハードウェアで、プロセッサによって実行可能なソフトウェアモジュールで、または両方の組合せで、処理ユニット、プログラミング命令、または他の指示の形態で直接具体化され得、単一のデバイスに含まれるかまたは複数のデバイスにわたって分散され得る。ソフトウェアモジュールは、RAMメモリ、フラッシュメモリ、ROMメモリ、EPROMメモリ、EEPROMメモリ、レジスタ、ハードディスク、リムーバブルディスク、CD-ROM、または当技術分野で知られている任意の他の形態の記憶媒体中に駐在し得る。記憶媒体は、プロセッサがその記憶媒体から情報を読み取り、その記憶媒体に情報を書き込むことができるようにプロセッサに結合され得る。代替として、記憶媒体はプロセッサと一体であり得る。
【００９４】
さらに、本明細書で開示する実施形態に関して説明する様々な例示的な論理ブロック、モジュール、回路、およびアルゴリズムステップは、電子ハードウェア、コンピュータソフトウェア、または両方の組合せとして実装され得ることを当業者は諒解されよう。ハードウェアとソフトウェアのこの互換性を明確に示すために、様々な例示的な構成要素、ブロック、モジュール、回路、およびステップを、上記では概してそれらの機能に関して説明した。そのような機能性が、ハードウェアとして実装されるか、ソフトウェアとして実装されるか、またはそれらの組合せとして実装されるかは、システム全体に課された特定のアプリケーションおよび設計選択に依存する。
【００９５】
本明細書で説明する本発明の様々な特徴は、本発明から逸脱することなく様々なシステムで実装され得る。上記の実施形態は例にすぎず、本発明を限定するものと解釈すべきではないことに留意されたい。実施形態の説明は、例示的なものであり、特許請求の範囲を限定するものではない。したがって、本教示は、他のタイプの装置、ならびに多くの代替形態、変更形態、および変形形態に容易に適用され得ることが当業者には明らかであろう。
【符号の説明】
【００９６】
100  動作環境、処理環境
102  処理回路
104  仮想メモリ
106  永続記憶デバイス
108  物理メモリデバイス
110  ヒープ
112  スタック
114  定数データ
116  初期化されたデータ
118  実行可能命令
120a  専用アドレス空間
120b  専用アドレス空間
120c  専用アドレス空間
200  呼び出しスタック
202A  フレーム
202B  フレーム
202C  フレーム
204  フレームポインタ
206  スタックポインタ
302  処理回路
304  メモリデバイス
306  通信インターフェース
308  入力/出力(I/O)インターフェース
310  プロセッサ
312  キャッシュメモリシステム
314  キャッシュメモリ
316  命令キャッシュ
318  データキャッシュ
320  統合されたキャッシュ
322  実行防止モジュール
402  処理回路
502  処理回路
504  仮想メモリ
506  キャッシュメモリ
508  到来スタブ
510  送出スタブ
512  メモリページk
514  アプリケーション
520  関数Fを呼び出す
522  非実行可能(NX)フラグ/ビットがクリア/除去される
524  関数Fをフェッチおよび/またはロードする
526  関数Fを実行する
528  関数Fからリターンする
530  非実行可能(NX)ページフラグをセットする
534  キャッシュメモリからページkをフラッシュする
536  非実行ビットモジュール
540  間接スタブ
542  第1のメモリページ、メモリページl
544  到来/送出スタブF
548  メモリページq
550  関数F
552  到来/送出スタブI
554  到来/送出スタブJ
600  破損した呼び出しスタック
602  命令を含むメモリの一部分
610  先頭アドレス
612  ガジェットA
614  関数Y
616  先頭アドレス
618  ガジェットB
620  関数W
622  先頭アドレス
624  ガジェットE
626  関数V
628  先頭アドレス
630  ガジェットD
632  関数U
634  先頭アドレス
636  ガジェットC
638  復帰アドレス
640  関数X
702  ガジェット
704  ガジェットがフェッチされる
706  ガジェット呼び出しおよび/またはプロセスを終了する
1102  処理回路
1104  間接コード
1106  間接コード
1108  実行可能命令
1110  メモリモジュール
1112  メモリ領域、実行可能コード
1114  実行可能コードB
【図１】
0005769891.tif 000002
【図２】
0005769891.tif 000003
【図３】
0005769891.tif 000004
【図４】
0005769891.tif 000005
【図５】
0005769891.tif 000006
【図６】
0005769891.tif 000007
【図７】
0005769891.tif 000008
【図８】
0005769891.tif 000009
【図９】
0005769891.tif 000010
【図１０】
0005769891.tif 000011
【図１１】
0005769891.tif 000012
【図１２】
0005769891.tif 000013
【図１３】
0005769891.tif 000014