(57)【要約】【課題】リターン指向プログラミング（ＲＯＰ）ペイロードの存在を検出するシステム、方法、および、媒体を提供する。【解決手段】潜在的なガジェットアドレス空間を識別し、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定し、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、データ内にＲＯＰペイロードが存在していることを示しているか否かを決定し、データ内にＲＯＰペイロードが存在していることを複数の操作が示しているという決定が所定の回数なされたことに応じて、データ内にＲＯＰペイロードが存在していることを示す。【選択図】図３
2014526751.tif 000002
【特許請求の範囲】
【請求項１】
データ内のリターン指向プログラミング（ＲＯＰ）ペイロードの存在を検出するシステムであって、
ハードウェアプロセッサを備え、
前記ハードウェアプロセッサは、
潜在的なガジェットアドレス空間を識別し、
前記データの一部分が前記潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定し、
前記データの一部分が前記潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、
前記アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、前記データ内にＲＯＰペイロードが存在していることを示しているか否かを決定し、
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているという決定が所定の回数なされたことに応じて、前記データ内にＲＯＰペイロードが存在していることを示す、システム。
【請求項２】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かの決定において、前記ハードウェアプロセッサは、エミュレータを用いて、前記アドレスから始まる複数の命令の実行を試みる、請求項１に記載のシステム。
【請求項３】
前記ハードウェアプロセッサは、前記エミュレータを用いて、前記アドレスから始まる前記複数の命令を実行する試みが、不当な実行アドレスの命令を実行する試みを含むか否かを決定する、請求項２に記載のシステム。
【請求項４】
前記ハードウェアプロセッサは、前記エミュレータを用いて、前記アドレスから始まる前記複数の命令を実行する試みが、不当命令または特権命令を実行する試みを含むか否かを決定する、請求項２に記載のシステム。
【請求項５】
前記ハードウェアプロセッサは、前記潜在的なガジェットアドレス空間からの命令により、エミュレータの仮想アドレス空間を初期化する、請求項１に記載のシステム。
【請求項６】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かの決定において、前記ハードウェアプロセッサは、前記複数の操作が、前記データの不変の部分によって制御される間接的な制御移行命令を実行するか否かを決定する、請求項１に記載のシステム。
【請求項７】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かの決定において、前記ハードウェアプロセッサは、前記複数の操作が、前記データの不変の部分によって制御されるリターン命令を実行するかどうかを決定する、請求項１に記載のシステム。
【請求項８】
前記ハードウェアプロセッサは、ガジェットにおける命令数のカウントを計算し、前記ガジェットにおける前記命令数の前記カウントをしきい値と比較する、請求項１に記載のシステム。
【請求項９】
前記ハードウェアプロセッサは、実行される命令の総数のカウントを計算し、前記実行される命令の前記総数の前記カウントをしきい値と比較する、請求項１に記載のシステム。
【請求項１０】
前記ハードウェアプロセッサは、
前記データの次の部分を選択し、
前記データの前記次の部分が、前記潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定し、
前記データの前記次の部分が前記潜在的なガジェットアドレス空間のアドレスと一致するとの決定に応じて、
前記アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、前記データ内にＲＯＰペイロードが存在していることを示しているか否かを決定し、
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているという決定が所定の回数なされたことに応じて、前記データ内にＲＯＰペイロードが存在していることを示す、請求項１に記載のシステム。
【請求項１１】
データ内のリターン指向プログラミング（ＲＯＰ）ペイロードの存在を検出する方法であって、
ハードウェアプロセッサを用い、潜在的なガジェットアドレス空間を識別するステップと、
前記ハードウェアプロセッサを用い、前記データの一部分が前記潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定するステップと、
前記データの一部分が前記潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、
前記ハードウェアプロセッサを用い、前記アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、前記データ内にＲＯＰペイロードが存在していることを示しているか否かを決定するステップと、
前記ハードウェアプロセッサを用い、前記データ内にＲＯＰペイロードが存在していることを複数の操作が示しているという決定が所定回数なされたことに応じて、前記データ内にＲＯＰペイロードが存在していることを示すステップと、
を含む方法。
【請求項１２】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かを決定するステップは、エミュレータを用いて前記アドレスから始まる複数の命令の実行を試みるステップを含む、請求項１１に記載の方法。
【請求項１３】
前記エミュレータを用いて前記アドレスから始まる前記複数の命令の実行を試みるステップは、不当な実行アドレスの命令の実行を試みることを含むか否かを、前記ハードウェアプロセッサを用いて決定するステップをさらに含む、請求項１２に記載の方法。
【請求項１４】
前記エミュレータを用いて前記アドレスから始まる前記複数の命令の実行を試みるステップは、不当命令または特権命令の実行を試みることを含むか否かを、前記ハードウェアプロセッサを用いて決定するステップをさらに含む、請求項１２に記載の方法。
【請求項１５】
前記ハードウェアプロセッサを用いて、前記潜在的なガジェットアドレス空間からの命令によりエミュレータの仮想アドレス空間を初期化するステップをさらに含む、請求項１１に記載の方法。
【請求項１６】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているかを決定するステップは、前記複数の操作が、前記データの不変の部分によって制御される間接的な制御移行命令を実行するか否かを決定するステップを含む、請求項１１に記載の方法。
【請求項１７】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かを決定するステップは、前記複数の操作が、前記データの不変の部分によって制御されるリターン命令を実行するか否かを決定するステップを含む、請求項１１に記載の方法。
【請求項１８】
前記ハードウェアプロセッサを用い、ガジェットにおける命令数のカウントを計算し、前記ガジェットにおける命令数の前記カウントをしきい値と比較するステップをさらに含む、請求項１１に記載の方法。
【請求項１９】
前記ハードウェアプロセッサを用い、実行される命令の総数のカウントを計算し、前記実行される命令の総数の前記カウントをしきい値と比較するステップをさらに含む、請求項１１に記載の方法。
【請求項２０】
前記ハードウェアプロセッサを用いて、前記データの次の部分を選択するステップと、
前記データの前記次の部分が、前記潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定するステップと、
前記データの前記次の部分が前記潜在的なガジェットアドレス空間のアドレスと一致するとの決定に応じて、
前記ハードウェアプロセッサを用いて、前記アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、前記データ内にＲＯＰペイロードが存在していることを示しているか否かを決定するステップと、
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているという決定が所定の回数なされたことに応じて、前記ハードウエアプロセッサを用いて、前記データ内にＲＯＰペイロードが存在していることを示すステップと、をさらに含む、請求項１１に記載の方法。
【請求項２１】
コンピュータ実行可能命令を含む非一時的コンピュータ可読媒体であって、前記コンピュータ実行可能命令は、プロセッサにより実行されると、データ内のリターン指向プログラミング（ＲＯＰ）ペイロードの存在を検出する方法を前記プロセッサに実行させ、前記方法は、
潜在的なガジェットアドレス空間を識別するステップと、
前記データの一部分が前記潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定するステップと、
前記データの一部分が前記潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、
前記アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、前記データ内にＲＯＰペイロードが存在していることを示しているか否かを決定するステップと、
前記データ内にＲＯＰペイロードが存在していることを複数の操作が示しているという決定が所定回数なされたことに応じて、前記データ内にＲＯＰペイロードが存在していることを示すステップと、
を含む、非一時的コンピュータ可読媒体。
【請求項２２】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かを決定するステップは、エミュレータを用いて前記アドレスから始まる複数の命令の実行を試みるステップを含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【請求項２３】
前記方法は、前記エミュレータを用いて前記アドレスから始まる前記複数の命令の実行を試みるステップが、不当な実行アドレスの命令の実行を試みることを含むか否かを決定するステップをさらに含む、請求項２２に記載の非一時的コンピュータ可読媒体。
【請求項２４】
前記方法は、前記エミュレータを用いて前記アドレスから始まる前記複数の命令の実行を試みるステップが、不当命令または特権命令の実行を試みることを含むか否かを決定するステップをさらに含む、請求項２２に記載の非一時的コンピュータ可読媒体。
【請求項２５】
前記方法は、前記潜在的なガジェットアドレス空間からの命令によりエミュレータの仮想アドレス空間を初期化するステップをさらに含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【請求項２６】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているかを決定するステップは、前記複数の操作が、前記データの不変の部分によって制御される間接的な制御移行命令を実行するか否かを決定するステップを含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【請求項２７】
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているか否かを決定するステップは、前記複数の操作が、前記データの不変の部分によって制御されるリターン命令を実行するか否かを決定するステップを含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【請求項２８】
前記方法は、ガジェットにおける命令数のカウントを計算し、前記ガジェットにおける命令数の前記カウントをしきい値と比較するステップをさらに含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【請求項２９】
前記方法は、実行される命令の総数のカウントを計算し、前記実行される命令の総数の前記カウントをしきい値と比較するステップをさらに含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【請求項３０】
前記方法は、
前記データの次の部分を選択するステップと、
前記データの前記次の部分が、前記潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定するステップと、
前記データの前記次の部分が前記潜在的なガジェットアドレス空間のアドレスと一致するとの決定に応じて、
前記アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、前記データ内にＲＯＰペイロードが存在していることを示しているか否かを決定するステップと、
前記データ内にＲＯＰペイロードが存在していることを前記複数の操作が示しているという決定が所定の回数なされたことに応じて、前記データ内にＲＯＰペイロードが存在していることを示すステップと、
をさらに含む、請求項２１に記載の非一時的コンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、リターン指向プログラミングのペイロードを検出するためのシステム、方法、および、非一時的コンピュータ可読媒体に関するものである。
【背景技術】
【０００２】
［関連出願の相互参照］
本願は、２０１２年９月１５日に出願された米国仮特許出願番号第６１／５３５，２８８号の優先権を主張するものであり、その全体の内容を、参考としてここに援用している。
【０００３】
システムを危殆化させたり、マルウェア感染させる手段の１つとして、サーバ／クライアントアプリケーションにおけるメモリ破損の脆弱性につけ込むことが一般的になってきている。攻撃者は、標的とするアプリケーションに悪意のある入力を与えることにより、脆弱なプロセスに対して、シェルコードとして知られる任意のコードを注入して実行することができる。
【０００４】
コード注入による攻撃が一般化するにともない、人気のあるオペレーティングシステムの最新バージョンでは、例えばデータ実行防止（ＤＥＰ）のような、メモリページを実行不可とすることによって上記攻撃を弱体化するための対応策が広く採られるようになってきている。
【０００５】
一方、攻撃者は、これらの防御を回避するために、コードを注入せずとも標的とするシステムに対して任意コードを実行できるリターン指向プログラミング（ＲＯＰ）を利用する傾向が強まっている。ＲＯＰは、プロセスの実行可能なアドレス空間にすでに存在するコードの実行によるものだが、ライブラリ機能全体のコードを実行するのではなく、プロセスのコードセグメント全体に散乱している、「ガジェット」と呼ばれる小さいコードフラグメントの組合せを実行する。ガジェットの実行順序は、攻撃ペイロードの一部である一連のガジェットアドレスによって制御される。これは、攻撃者が制御データのみを注入することによって、攻撃の対象であるシステムに対して任意コードを実行できることを意味する。
【０００６】
攻撃中、ＲＯＰペイロードによって呼び出された各ガジェットは、注入されたＲＯＰペイロードに含まれる一連のガジェットアドレスを読み出す間接的な制御移行命令によって次のガジェットに制御を移行する。
【０００７】
ＲＯＰペイロードがそれ自体に記憶するガジェットアドレスを用いて上記ガジェットの実行制御を行えるようにするために、ＲＯＰペイロードによって選択されるガジェットは、一般的に、実行可能なメモリ空間の不揮発性部分に格納されている。例えば、実行可能なメモリ空間のこのような不揮発性部分は、一般的に、アドレス空間配置のランダム化（ＡＳＬＲ）の対象にはならないだろう。ガジェットが存在する実行可能なメモリ空間は、ガジェットアドレス空間と呼ばれることもある。
【０００８】
図１は、ＲＯＰペイロードの一例を示す図であり、ＲＯＰペイロードがどのようにガジェットの実行を制御するかを示している。図に示すように、ＲＯＰペイロードは、アドレスＸから始まるデータメモリ内に存在し、各ｎバイトのデータは、新しいペイロードでありうる。図中、ｎは、攻撃の標的となるシステムで用いられるアドレスサイズである（例えば、４バイト）。ＲＯＰペイロードは、標的のシステムの命令ポインタ（ＥＩＰ）およびスタックポインタ（ＥＳＰ）を制御して所望のガジェットを呼び出すことができる。
【０００９】
より詳しくは、例えば、命令ポインタ（ＥＩＰ）およびスタックポインタ（ＥＳＰ）は、まず、図１に示すような値０７００７２Ｆ７およびメモリアドレスＸ＋ｎ＊１で初期化されうる。命令ポインタ（ＥＩＰ）およびスタックポインタ（ＥＳＰ）にこれらの値を付与するために、いずれかの適切な機構が用いられうる。例えば、命令ポインタ（ＥＩＰ）およびスタックポインタ（ＥＳＰ）を設定するために、スタックピボットの命令シーケンスが用いられうる。
【００１０】
これによって第１のガジェットが呼び出されることになる（図１の右側の「第１」）。図に示すように、この呼び出しの間に、「ｐｏｐ  ｅａｘ」命令および「ｒｅｔ」命令が実行される。この「ｐｏｐ  ｅａｘ」命令は、スタックポインタ（ＥＳＰ）によって指示されるアドレス（Ｘ＋ｎ＊１）の値（０ｘ００１０１０４）をレジスタＥＡＸにコピーし、ＥＳＰを１メモリアドレスサイズ程度をインクリメントする（例えば、３２ビットのアドレスサイズでは４バイト）。「ｒｅｔ」（リターン）命令は、スタックポインタ（ＥＳＰ）によって指示されたアドレスの値を命令ポインタ（ＥＩＰ）に代入し、スタックポインタ（ＥＳＰ）のアドレスサイズをインクリメントする。よって、この「ｒｅｔ」コマンドは、スタックポインタ（ＥＳＰ）に指示されたアドレス（Ｘ＋ｎ＊２）の値（０７００１５ＢＢ）を命令ポインタ（ＥＩＰ）に設定することによって、アドレス０７００１５ＢＢにおける次のガジェットの呼び出し（図１の右側の「第２」）をセットアップする。そして、他のガジェットの呼び出し（図１の右側の「第３」、「第４」、および、「第５」）は、ＲＯＰペイロードで特定されているアドレスによって指定された順序で実行することができる。これによって、図に示すように、スタックポインタ（ＥＳＰ）は、ＲＯＰペイロードにおけるガジェットアドレスリストに従い、所望のガジェットへと制御を移行するための「インデックス」レジスタとして用いられることができるようになる。
【発明の概要】
【発明が解決しようとする課題】
【００１１】
図１に示すように、ガジェットは「ｒｅｔ」命令で終わるが、他の間接的な制御移行命令が用いられる可能性もある。
【００１２】
したがって、リターン指向プログラミングペイロードを検出する機構が望まれる。
【課題を解決するための手段】
【００１３】
リターン指向プログラミング（ＲＯＰ）のペイロードの存在を検出するためのシステム、方法、および、媒体を提供する。
【００１４】
いくつかの実施形態では、リターン指向プログラミング（ＲＯＰ）のペイロードの存在を検出するためのシステムが提供される。システムは、ハードウェアプロセッサを備え、ハードウェアプロセッサは、潜在的なガジェットアドレス空間を識別し、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定し、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、データ内にＲＯＰペイロードが存在していることを示しているか否かを決定し、データ内にＲＯＰペイロードが存在していることを複数の操作が示しているという決定が所定の回数なされたことに応じて、データ内にＲＯＰペイロードが存在していることを示す。
【００１５】
いくつかの実施形態では、リターン指向プログラミング（ＲＯＰ）のペイロードの存在を検出するための方法が提供される。方法は、ハードウェアプロセッサを用い、潜在的なガジェットアドレス空間を識別するステップと、ハードウェアプロセッサを用い、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定するステップと、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、ハードウェアプロセッサを用い、アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、データ内にＲＯＰペイロードが存在していることを示しているか否かを決定するステップと、ハードウェアプロセッサを用い、データ内にＲＯＰペイロードが存在していることを複数の操作が示しているという決定が所定回数なされたことに応じて、データ内にＲＯＰペイロードが存在していることを示すステップと、を含む。
【００１６】
いくつかの実施形態では、プロセッサにより実行されると、データ内のリターン指向プログラミング（ＲＯＰ）ペイロードの存在を検出する方法をプロセッサに実行させるコンピュータ実行可能命令を含む非一時的コンピュータ可読媒体が提供される。方法は、潜在的なガジェットアドレス空間を識別するステップと、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するか否かを決定するステップと、データの一部分が潜在的なガジェットアドレス空間のアドレスと一致するという決定に応じて、アドレスから始まる複数の命令にそれぞれ関連する複数の操作が、データ内にＲＯＰペイロードが存在していることを示しているか否かを決定するステップと、データ内にＲＯＰペイロードが存在していることを複数の操作が示しているという決定が所定回数なされたことに応じて、データ内にＲＯＰペイロードが存在していることを示すステップと、を含む。
【図面の簡単な説明】
【００１７】
【図１】従来技術に従う、ガジェットの実行を制御するリターン指向プログラミング（ＲＯＰ）のペイロードを示す。
【図２】いくつかの実施形態に従う、ＲＯＰペイロードを検出するプロセスの一例を示す。
【図３】いくつかの実施形態に従う、ＲＯＰペイロードが含まれているか否かを決定するためにデータに対して実行されうる動作の例を示す。
【図４】いくつかの実施形態に従う、ＲＯＰペイロードを検出するために用いられうるハードウェアの一例を示す。
【発明を実施するための形態】
【００１８】
リターン指向プログラミング（ＲＯＰ）ペイロードの存在を検出するためのシステム、方法、および、媒体を提供する。
【００１９】
いくつかの実施形態では、これらシステム、方法、および、媒体は、ネットワークトラフィックまたはプロセスのメモリバッファなどのデータにおけるＲＯＰペイロードを識別することができる。また、これらシステム、方法、および、媒体は、標的となるプロセスのアドレス空間にすでに存在するコードを、データに従って投機的に実行することにより、ＲＯＰペイロードを識別できる。例えば、データに含まれている有効メモリアドレスにおける標的プロセスのアドレス空間に存在するコードフラグメント（ガジェット）を投機的に実行するために、コードエミュレータが用いられてよい。データに含まれているメモリアドレスを呼び出すことにより、固有のガジェットがしきい値の回数実行された場合、そのデータはＲＯＰペイロードを含むと識別できる。
【００２０】
いくつかの実施形態では、ＣＰＵエミュレータを用いるシェルコード検出器の一部として、または、それに加えて、ＲＯＰペイロードの存在を検出する機構を実装することにより、任意の適切な実行時のヒューリスティックを用いて、さまざまなタイプのシェルコードの実行時の動作を識別することもできる。例えば、いくつかの実施形態では、これらの機構は、Ｎｅｍｕと称されるシェルコード検出器またはＳｈｅｌｌＯＳと称されるシェルコード検出器の一部、または、それらに加えて実装されうる。
【００２１】
図２は、いくつかの実施形態に従う、ＲＯＰペイロードを識別するために用いられうるプロセス２００を示す。図に示すように、プロセス２００は、２０２で開始された後、２０４において、ＲＯＰペイロードによって使用されるかもしれない１つ以上の潜在的なガジェットアドレス空間を識別する。これら１つ以上のガジェットアドレス空間は、任意の適切な方法で識別されてもよい。例えば、いくつかの実施形態において、これらのガジェットアドレス空間は、不揮発性コード（例えば、ＡＳＬＲの対象にならないコード）を含む実行可能なメモリ空間として識別されてもよい。また、いくつかの実施形態における他の例としては、１つ以上のガジェットアドレス空間、または、１つ以上のアプリケーションに対して複数のガジェットアドレス空間が識別されてもよい。いくつかの実施形態におけるさらなる他の例としては、同じコードでバージョンが異なる場合、同じコードで状態が異なる（例えば、オンデマンドダイナミックリンクライブラリを用いたときのようにコードが随時変化する）場合、同じコードでメモリレイアウトが異なる場合、異なるアプリケーションで用いられるときに同じコードでコンテクストが異なる場合、などに対しては、複数のガジェットアドレス空間が識別されうる。
【００２２】
次に、２０６において、エミュレータの仮想アドレス空間は、識別された１つ以上のガジェットアドレス空間のインスタンス（例えば、実際のインスタンス）からのプロセスメモリのスナップショットで初期化される。いくつかの実施形態では、エミュレータ内に異なるページテーブルが維持されることにより、潜在的なＲＯＰペイロードのためのデータチェックが複数のガジェット空間に対して同時に可能になる。
【００２３】
次に、２０８において、第１のデータが選択される。このデータは、任意の適切なソースから得られてよく、任意の適切なフォーマットであってよい。データは、例えば、メモリ、バッファ、ストリーミングコンテンツ、記憶装置、ファイル、メッセージなどから得られてよい。他の例としては、データは、任意の適切なバイト数（例えば４）またはビット数（例えば３２）のグループで格納されてよく、任意の適切な配置（例えば、「リトルエンディアン」または「ビッグエンディアン」）で並べられてもよい。以下に説明するが、いくつかの実施形態では、何が「オリジナル」データ（すなわち、ガジェットの実行中に変更されないデータ）であり、何が非オリジナルデータであるかを識別できるように格納されてよい。
【００２４】
その後、プロセス２００は、選択されたデータの値がエミュレータの１つ以上のアドレス空間のいずれかにおけるアドレスと一致するかどうかを決定する。例えば、図３（ａ）に示すように、データ３０２の値は「００７２Ｆ７４１」であり、これは、ガジェットアドレス空間３０４の有効アドレスと一致しない。他の例では、図３（ｂ）に示すように、別データ３０６の値は「０７００７２Ｆ７」であり、これは、詳細な部分３０８によって示されるように、ガジェットアドレス空間３０４の中の１つのアドレスと一致する。
【００２５】
選択されたデータの値が１つ以上のアドレス空間のいずれかの有効アドレスと一致しないことを決定すると、プロセス２００は、２１２において次のデータを選択する。次のデータは、任意の適切な方法で選択されてよい。例えば、次のデータは、複数のバイトを囲む選択ウィンドウを１バイト移動させることによって選択されてよい。例えば、図３（ａ）および３（ｂ）で示すように、次のデータを選択すると、４バイトを１データとして選択しているウィンドウ３１０は、１バイト移動して異なる組み合わせの４バイトを１データとして選択している新たなウィンドウ３１２を形成してよい。
【００２６】
一方、選択されたデータの値が１つ以上のガジェットアドレス空間のいずれかの有効アドレスと一致することを決定した場合、プロセス２００は、２１４において、エミュレータを用いて、一致する１つ以上のガジェットアドレス空間におけるアドレスからコードの実行開始を試みる。この試みは、選択されたデータの値に命令ポインタ（ＥＩＰ）を設定し、かつ、（例えば、上記２１２のように、次のデータが選択されたかのように）次のデータを指示するようスタックポインタ（ＥＳＰ）を設定することによって開始されてよい。例えば、図３（ｂ）に示すように、命令ポインタ（ＥＩＰ）は、「０７００７２Ｆ７」に設定されてよく、スタックポインタ（ＥＳＰ）は、次のデータを指示するよう設定されてよい。
【００２７】
上述のように、これによって、第１のガジェットが呼び出されることになる。この呼び出し中に、「ｐｏｐ  ｅａｘ」命令、および、「ｒｅｔ」命令が実行される。この「ｐｏｐ  ｅａｘ」命令は、スタックポインタ（ＥＳＰ）によって指示されるアドレスの値（０ｘ００１０１０４）をレジスタＥＡＸにコピーし、ＥＳＰのメモリアドレスサイズをインクリメントする（例えば、図に示すように４バイト）。「ｒｅｔ」（リターン）命令は、スタックポインタ（ＥＳＰ）によって指示されたアドレスの値を命令ポインタ（ＥＩＰ）に代入し、ＥＳＰのメモリアドレスサイズをインクリメントする。そして、スタックポインタ（ＥＳＰ）によって指示されたアドレスの値（０７００１５ＢＢ）を命令ポインタ（ＥＩＰ）に設定することにより、上記「ｒｅｔ」コマンドは、アドレス０７００１５ＢＢで次のガジェットの呼び出しをセットアップする。図に示すように、これによって、スタックポインタ（ＥＳＰ）は、ＲＯＰペイロードにおけるアドレスリストに従い、所望のガジェットへと制御を移行するための「インデックス」レジスタとして用いられることができるようになる。
【００２８】
いくつかの実施形態では、データの値と一致するガジェットアドレス空間におけるアドレスで命令の実行を試みる前に、そのアドレスがガジェットと一致するものとしてすでに識別されているか否かの決定がなされてよい。まだ識別されていない場合、プロセス２００は、２１４をスキップして直接２２４に分岐してよい（図２には示されていない）。そうでない場合、記載通りに２１４を実行してよい。アドレスがガジェットと一致すると識別するために、また、アドレスがガジェットと一致するとしてすでに識別されているか否かを決定するために、任意の適切な機構が用いられてよい。
【００２９】
いくつかの実施形態では、１つ以上のガジェットにおける命令がスタックポインタを正確に操作する限り、エミュレータは、ガジェットの実行を継続させることができ、また、以下の理由の１つまたは複数によって実行を終了させることができる。
ｉ）ガジェットが、不当なアドレスに制御を移行した場合。
ｉｉ）エミュレータに不当なまたは特権命令が与えられた場合。
ｉｉｉ）現在のガジェットで実行されている命令の数が特定のしきい値に達している場合。
ｉｖ）実行された命令の総数が総実行しきい値に達している場合。
【００３０】
いくつかの実施形態では、ｉｉｉ）またはｉｖ）であるかどうかを決定するために、エミュレータは、現在のガジェットで実行されているガジェット命令数だけでなく、エミュレータが２１４で実行している、ガジェットコードを実行する現在の試みでの命令の総数もカウントしてよい。
【００３１】
図２に示すように、プロセス２００は、２１６において、不当な実行アドレスについてのテストを行うことができる。いくつかの実施形態では、不当な実行アドレスを識別するために任意の適切なテストを用いてもよい。例えば、ＤＥＰによって保護されたアドレス、カーネルによってのみアクセス可能なアドレスなどに命令ポインタ（ＥＩＰ）が設定された場合、プロセス２００は、不当な実行アドレスを識別してよい。不当な実行アドレスに到達した場合、プロセス２００は、２２４に分岐し、以下に記載するようにデータの終わりに達したかどうかを決定してよい。
【００３２】
そうでない場合、プロセス２００は、２１８に分岐し、不当または特権命令についてのテストを行ってよい。いくつかの実施形態では、不当または特権命令を識別するために任意の適切なテストを用いてもよい。例えば、害のない入力のランダムなアドレスは、コードセグメントの１つにおける実際の命令の中間位置に該当するので、不当としてよい。あるいは、そのバイトは、カーネルのみが実行することを許可されている特権命令のオペコードに対応するので、不当としてよい。不当または特権命令に到達した場合、プロセス２００は、２２４に分岐し、以下に記載するようにデータの終わりに達しているか否かを決定する。
【００３３】
そうでない場合、プロセス２００は、２２０に分岐し、現在のガジェットで実行されているガジェット命令数のカウントがしきい値に達しているか、および／または、しきい値を超えているか否かを決定する。このテストは、ランダム符号の実行と、ＲＯＰペイロードによるガジェットの実行とを区別するのに役立つ。いくつかの場合では、チューリング完全なプログラムだけでなく、一般的なエクスプロイトにおいて用いられるガジェットの典型的なサイズは、２〜５命令の範囲であり、一方、単一のガジェットにおいて実行される命令数は、最大でも１０命令だけであってよい。いくつかの実施形態では、現在のガジェットで実行されるガジェット命令数のカウントが３２または他の適切な数（例えば、３２未満）に設定されてよい。現在のガジェットで実行されるガジェット命令数のカウントがしきい値に達する、および／または、しきい値を超える場合、プロセス２００は、２２４に分岐し、以下に記載するように、データの終わりに達しているか否かを決定してよい。
【００３４】
そうでない場合、プロセス２００は、２２２に分岐し、現在の試みで実行されている命令の総数のカウントがしきい値に達している、および／または、しきい値を超えているか否かを決定する。このテストは、例えば、制御フローがループまたは長すぎる直線状のコードパスに「はまって」しまった場合、確実に実行を停止することができる。いくつかの実施形態では、任意の適切なしきい値が用いられてよい。いくつかの実施形態では、例えば、しきい値は、５００、４０９６、および／または、他の任意の適切な値に設定されてよい。現在の試みで実行されている命令の総数のカウントがしきい値に達する、および／または、しきい値を超える場合、プロセス２００は、２２４に分岐し、以下に記載するように、データの終わりに達しているか否かを決定する。
【００３５】
上述のように、不当な実行アドレスが識別されたこと、不当または特権命令が識別されたこと、現在のガジェットの実行命令数のカウントがしきい値に達したこと、または、現在の試みで実行されている命令の総数のカウントがしきい値に達したことが２１６、２１８、２２０、および、２２２でそれぞれ決定された場合、プロセス２００は、２２４に分岐し、データの終りであるか否かを決定してよい。この決定は、任意の適切な方法でなされてもよい。例えば、いくつかの実施形態では、特定のメモリアドレスに達した場合、データストリームが停止した場合、ファイルの終わりに達した場合などに、プロセス２００は、データの終わりであると決定してよい。データの終わりではない、と決定した場合、プロセス２００は、２１２に関連して前述したように、次のデータを選択してよい。そうでない場合、プロセス２００は、２３４において、データがＲＯＰペイロードを含まないものとして識別し、２３６で終了してよい。
【００３６】
しかしながら、２２２において、現在の試みで実行されている命令の総数のカウントがしきい値を下回ったことが決定された場合、プロセス２００は、２２６において、ＲＯＰペイロードによる意図的なガジェットの実行を示す１つ以上の操作が行われたか否かを決定してよい。いくつかの実施形態では、ＲＯＰペイロードによる意図的なガジェットの実行が行われたことを示すために任意の適切な操作が用いられてよい。例えば、いくつかの実施形態では、ランダム命令シーケンスの偶発的な実行と、ＲＯＰペイロードによる意図的なガジェットの実行とを区別する操作が用いられてもよい。
【００３７】
いくつかの実施形態によれば、２２６における決定は、ＲＯＰペイロードの実行時の動作を識別するための、任意の適切な実行時のヒューリスティックを用いてなされてよい。例えば、いくつかの実施形態では、オリジナルデータ（すなわち、疑わしいＲＯＰペイロードのオリジナルデータ）によって制御される間接的な制御移行命令は、ＲＯＰペイロードによるガジェットの意図的な実行が行われたことを示す操作でありうる。
【００３８】
例えば、図１に関連して上述したように、第１のガジェット呼び出しの終わりの「ｒｅｔ」（リターン）命令は、スタックポインタ（ＥＳＰ）に指示されたアドレスの値を命令ポインタ（ＥＩＰ）に代入し、スタックポインタ（ＥＳＰ）のアドレスサイズをインクリメントする。スタックポインタ（ＥＳＰ）により指示されたオリジナルデータのアドレス（Ｘ＋ｎ＊２）の値０７００１５ＢＢ（オリジナルデータで特定されている）を命令ポインタに設定することにより、「ｒｅｔ」コマンドは、アドレス０７００１５ＢＢで次のガジェット呼び出し（図１の右側の「第２」）をセットアップする。この「ｒｅｔ」命令は、ＲＯＰペイロードによって意図的にガジェットが実行されたことを示す操作であってよい。
【００３９】
いくつかの実施形態における他の例としては、命令シーケンスの実行中に、「ｊｍｐ  ｅａｘ」命令によって制御がガジェット空間の他の有効な位置に移行されても、ＥＡＸの値がデータからロードされなかった場合、この命令シーケンスは、操作などではないと識別されてよい。
【００４０】
また、他の例では、「ｒｅｔ」命令に続き、ある時点で、命令ポインタ（ＥＩＰ）の現在位置から数バイト離れた先に制御を移行する相対的な呼び出し命令も考慮される。この場合には、「ｒｅｔ」命令が（ペイロードからアドレスを読み出し、そこへジャンプしても）操作であるということにはならないだろう。なぜなら、読み出された値は、データのその位置にあったオリジナル値ではなく、呼び出し命令により実行時に追加（ＰＵＳＨ）されたリターンアドレスだからである。
【００４１】
ＲＯＰペイロードによる意図的なガジェットの実行を示す操作が行われなかったことが２２６で決定された場合、プロセス２００は、２１４に戻り、１つ以上のガジェットアドレス空間において命令を実行する試みを継続してよい。
【００４２】
そうでない場合、プロセス２００は、２２８においてガジェットカウントをインクリメントし、２３０において、ガジェットカウントがしきい値に達した、および／または、しきい値を超えたか否かを決定する。このガジェットカウントは、任意の適切な方法でインクリメントされてよい。
例えば、いくつかの実施形態では、ガジェットカウントは、各ガジェットの終了に応じてインクリメントされてよい。いくつかの実施形態における他の例としては、ガジェットカウントは、それぞれ固有のガジェット（例えば、以前に実行されていないガジェット）の終了に応じてのみインクリメントされてよい。いくつかの実施形態におけるさらなる他の例としては、ガジェットカウントは、２つ（または他の適切な数）以上の命令を有する固有のガジェットのそれぞれが終了したことに応じてのみインクリメントされてよい。いくつかの実施形態では、任意の適切なしきい値が用いられてよい。いくつかの実施形態では、例えば、４から８（例えば６）の固有のガジェットのしきい値が用いられてよい。
【００４３】
ガジェットカウントがしきい値に達していない、および／または、しきい値以下であることが２３０で決定された場合、プロセス２００は、２１４に戻り、１つ以上のガジェットアドレス空間において命令を実行する試みを継続してよい。そうでない場合、プロセス２００は、２３２において、データがＲＯＰペイロードを含むものと識別し、２３６で終了する。
【００４４】
いくつかの実施形態によれば、（例えば、図１、２、３に示し、それに関連して説明された）本願明細書に記載の機構を実行するために任意の適切なハードウェアおよび／またはソフトウェアが用いられてよい。例えば、本願明細書に記載された機構を実行するソフトウェアを実行するために、コンピュータなどの多目的装置、あるいは、クライアント、サーバなどの特殊目的装置が用いられてよい。図４に示す装置４００などの多目的または特殊目的装置のいずれかは、例えば、ハードウェアプロセッサ４０２（マイクロプロセッサ、デジタルシグナルプロセッサ、コントローラなどでありうる）、メモリ４０４、通信インターフェース４０６、ディスプレイインターフェースおよびディスプレイ４０８、ユーザ入力デバイス４１０、データベースおよび／または記憶装置４３２（４１２？）、コミュニケーションバス４１４などの任意の適切なコンポーネントを含みうる。通信インターフェース４０６によって、ハードウェアおよび／またはソフトウェアと、他の通信ネットワーク（例えば、インターネット、有線ネットワーク、無線ネットワークなど）や他の装置との通信が可能になりうる。このハードウェアおよび／またはソフトウェアは、他の装置の一部として、あるいは、スタンドアロン装置として実装されてよい。これらの装置のいずれかが、ハードウェアおよび／またはソフトウェアでの実装に関わらず、エミュレータを含んでよい。
【００４５】
いくつかの実施形態では、本願明細書に記載された処理を実行する命令を格納するのに用いられる任意の適切なコンピュータ可読媒体が用いられてよい。例えば、いくつかの実施形態では、コンピュータ可読媒体は、一時的または非一時的であってもよい。例えば、非一時的コンピュータ可読媒体は、磁気媒体（ハードディスク、フロッピーディスクなど）、光媒体（コンパクトディスク、デジタルビデオディスク、ブルーレイディスクなど）、半導体媒体（フラッシュメモリ、電気的プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）など）、伝送中に瞬時的でない、すなわち永続的な状態を欠かない任意の適切な媒体、および／または任意の適切な有形媒体を含んでよい。別の例として、一時的なコンピュータ可読媒体は、ネットワーク、ワイヤ、導体、光ファイバ、回路、伝送中に瞬時的である、すなわち、永続的な状態を欠く任意の適切な媒体、および／または、任意の適切な無形媒体に信号を含めてよい。
【００４６】
上述の例示的実施形態において本発明を説明してきたが、本開示は一例にすぎず、本発明の主旨および範囲から逸脱することなく、本発明の実施に関する詳細に関して多くの変更を行うことができ、本発明は下記の請求項によってのみ制限されると理解されよう。本開示のいくつかの実施形態の特徴は、種々の方法による組み合わせや再編成が可能である。
【図１】
2014526751.tif 000003
【図２】
2014526751.tif 000004
【図３】
2014526751.tif 000005
【図４】
2014526751.tif 000006
【国際調査報告】
2014526751.tif 000007