(57)【特許請求の範囲】
【請求項１】
キャッシュメモリを含む処理回路内で動作可能な方法であって、
実行可能なコードシーケンスの少なくとも一部を前記キャッシュメモリにロードするステップと、
前記キャッシュメモリから前記実行可能なコードシーケンスの命令フェッチを実行するステップと、
前記命令フェッチに応答して１つまたは複数の命令フェッチキャッシュミスを検出するステップであって、個々の命令フェッチキャッシュミスが、前記実行可能なコードシーケンスの対応する命令フェッチについてキャッシュメモリにはないフェッチされた命令を表す、ステップと、
異常な命令フェッチキャッシュミス動作を動的に検出するために、前記１つまたは複数の命令フェッチキャッシュミスに関連する前記命令フェッチを監視するステップと、
前記異常な命令フェッチキャッシュミス動作を報告するステップと、
前記報告に応じて、前記実行可能なコードシーケンスを終了する是正措置を実行するステップと
を備える、方法。
【請求項２】
キャッシュミスに関連する前記命令フェッチを監視するステップが、
前記命令フェッチに応答して、１つまたは複数の命令フェッチキャッシュヒットを検出するステップと、
前記検出された命令フェッチキャッシュヒットおよび前記命令フェッチキャッシュミスに応じて、命令フェッチキャッシュヒット／ミス率を決定し、
有効なコードシーケンスを示す有効なヒット/ミス比率に対して選択されたしきい値よりも低いヒット/ミス比率を検出することによって、異常な命令フェッチキャッシュミス動作を検出するステップとを含む、請求項1に記載の方法。
【請求項３】
前記有効なヒット/ミス比率が、前記監視中に、リターン指向プログラミングエクスプロイトを含まない前記実行可能なコードシーケンスのうちの複数から、命令フェッチキャッシュヒット/ミス比率を監視することで決定される、請求項2に記載の方法。
【請求項４】
選択された動作期間中は前記監視が中断される、請求項1に記載の方法。
【請求項５】
前記選択された動作期間が新しい処理の起動段階を含む、請求項4に記載の方法。
【請求項６】
前記異常なミス動作が、あらかじめ定義された数の先行命令にわたって、またはあらかじめ定義された時間にわたって判定される、請求項1に記載の方法。
【請求項７】
前記異常な命令フェッチキャッシュミス動作があらかじめ定められたオペレーティングコンテキスト内で判定される、請求項1に記載の方法。
【請求項８】
実行可能なコードシーケンスをフェッチして実行するように構成された処理回路と、
前記処理回路に動作可能に結合され、少なくとも1つのキャッシュメモリを含むキャッシュメモリシステムと、
命令フェッチに応答して１つまたは複数の命令フェッチキャッシュミスを検出するように構成されたキャッシュモニタであって、個々の命令フェッチキャッシュミスが、前記実行可能なコードシーケンスの対応する命令フェッチについてキャッシュメモリにはないフェッチされた命令を表し、異常な命令フェッチキャッシュミス動作を動的に検出するために、前記１つまたは複数の命令フェッチキャッシュミスに関連する命令フェッチを監視するようにさらに構成されたキャッシュモニタと、
前記キャッシュモニタが前記異常なミス動作を報告すると、前記実行可能なコードシーケンスのうちの1つまたは複数の実行を終了するように構成された是正措置ユニットとを備える、処理装置。
【請求項９】
前記キャッシュモニタ、前記是正措置ユニット、前記処理回路、またはそれらの組合せが、
前記命令フェッチに応答して、１つまたは複数の命令フェッチキャッシュヒットを検出し、
前記検出された命令フェッチキャッシュヒットおよび前記命令フェッチキャッシュミスに応じて、命令フェッチキャッシュヒット／ミス率を決定し、
有効なコードシーケンスを示す有効なヒット/ミス比率に対して選択されたしきい値よりも低いヒット/ミス比率を検出することによって、異常な命令フェッチキャッシュミス動作を検出するように構成される、請求項8に記載の処理装置。
【請求項１０】
前記キャッシュメモリシステムが、データキャッシュおよび命令キャッシュを含み、前記キャッシュモニタが前記命令キャッシュから命令ローディングプロファイルを展開するように構成される、請求項8に記載の処理装置。
【請求項１１】
前記キャッシュメモリシステムが複数のレベルのキャッシュを含み、前記キャッシュモニタが、前記複数のレベルのキャッシュのうちの少なくとも1つについての命令ローディングプロファイルを展開するように構成される、請求項8に記載の処理装置。
【請求項１２】
前記キャッシュモニタが、選択された動作期間中は監視するステップを中断するように構成される、請求項8に記載の処理装置。
【請求項１３】
前記選択された動作期間が新しい処理の起動段階を含む、請求項12に記載の処理装置。
【請求項１４】
前記キャッシュモニタが、前記異常な命令フェッチキャッシュミス動作をあらかじめ定義された数の先行命令にわたって、またはあらかじめ定義された時間にわたって検出する、請求項12に記載の処理装置。
【請求項１５】
実行可能なコードシーケンスの少なくとも一部をキャッシュメモリにロードするための手段と、
前記キャッシュメモリから前記実行可能なコードシーケンスの命令フェッチを実行するための手段と、
前記命令フェッチに応答して１つまたは複数の命令フェッチキャッシュミスを検出するための手段であって、個々の命令フェッチキャッシュミスが、前記実行可能なコードシーケンスの対応する命令フェッチについてキャッシュメモリにはないフェッチされた命令を表す、手段と、
異常な命令フェッチキャッシュミス動作を動的に検出するために、前記１つまたは複数の命令フェッチキャッシュミスに関連する前記命令フェッチを監視するための手段と、
前記異常な命令フェッチキャッシュミス動作を報告するための手段と、
前記報告に応じて、前記実行可能なコードシーケンスの実行を終了する是正措置を実行するための手段と
を備える、処理装置。
【請求項１６】
前記異常なミス動作を、あらかじめ定義された数の先行命令にわたって、またはあらかじめ定義された時間にわたって判定するための手段をさらに備える、請求項15に記載の処理装置。
【請求項１７】
命令を記憶した機械可読記憶媒体であって、前記命令が処理回路によって実行されると、前記処理回路に、
実行可能なコードシーケンスの少なくとも一部をキャッシュメモリにロードさせ、
前記キャッシュメモリから前記実行可能なコードシーケンスの命令フェッチを実行させ、
前記命令フェッチに応答して１つまたは複数の命令フェッチキャッシュミスを検出させ、個々の命令フェッチキャッシュミスが、前記実行可能なコードシーケンスの対応する命令フェッチについてキャッシュメモリにはないフェッチされた命令を表し、
異常な命令フェッチキャッシュミス動作を動的に検出するために、前記１つまたは複数の命令フェッチキャッシュミスに関連する前記命令フェッチを監視させ、
前記異常な命令フェッチキャッシュミス動作を報告させ、
前記報告に応じて、前記実行可能なコードシーケンスの実行を終了する是正措置を実行させる、機械可読記憶媒体。
【請求項１８】
前記命令が、前記処理回路に、
前記命令フェッチに応答して、１つまたは複数の命令フェッチキャッシュヒットを検出させ、
前記検出された命令フェッチキャッシュヒットおよび前記命令フェッチキャッシュミスに応じて、命令フェッチキャッシュヒット／ミス率を決定させ、
有効なコードシーケンスを示す有効な命令フェッチキャッシュヒット/ミス比率に対して選択されたしきい値よりも低い命令フェッチキャッシュヒット/ミス比率を検出することによって、異常な命令フェッチキャッシュミス動作を検出させる、請求項17に記載の機械可読記憶媒体。
【請求項１９】
キャッシュメモリに結合された処理回路内のコード断片の意図しないシーケンスを実行するステップであって、各コード断片が、制御転送命令を含む少なくとも1つの実行可能命令を含み、前記コード断片のうちの1つまたは複数が、元々意図した制御転送命令とは異なる変更された制御転送命令を含み、前記複数のうちの少なくとも1つのコード断片が、前記キャッシュメモリ内では見つからないキャッシュされていないコード断片であるステップと、
キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開するステップであって、前記キャッシュミスが、前記命令フェッチの前記キャッシュメモリにはないフェッチされた命令であるステップと、
前記命令ローディングプロファイルが、前記意図しないシーケンスの前記コード断片のうちのいくつかの実行を示す場合、前記意図しないシーケンスの少なくとも1つのコード断片の実行を終了するステップとを備える、方法。
【請求項２０】
コード断片の前記意図しないシーケンスを実行するステップが、マルチレベルキャッシュを前記キャッシュメモリとして利用するステップを含み、キャッシュされた命令が、前記処理回路により近いキャッシュレベル内の命令であり、キャッシュされていない命令が、前記処理回路からより離れているメインメモリまたはキャッシュレベル内の命令である、請求項19に記載の方法。
【請求項２１】
前記命令ローディングプロファイルを、有効なコードシーケンスを示す有効なヒット/ミス比率に対して選択されたしきい値よりも低い、キャッシュされていない命令に対するキャッシュされた命令のフェッチのヒット/ミス比率として展開するステップをさらに備える、請求項19に記載の方法。
【請求項２２】
前記監視中に、リターン指向プログラミングエクスプロイトを含まないとして知られる複数の実行可能なコードシーケンスからヒット/ミス比率を監視することで、前記有効なヒット/ミス比率を決定するステップをさらに備える、請求項21に記載の方法。
【請求項２３】
実行可能なコードシーケンスをフェッチして実行するように構成された処理回路であって、前記実行可能なコードシーケンスがコード断片の意図しないシーケンスを含み、各コード断片が制御転送命令を含む少なくとも1つの実行可能命令を含み、前記コード断片のうちの1つまたは複数が、元々意図した制御転送命令とは異なる変更された制御転送命令を含む処理回路と、
前記処理回路に動作可能に結合され、少なくとも1つのキャッシュメモリを含むキャッシュメモリシステムであって、前記意図しないシーケンスの少なくとも1つのコード断片が、前記キャッシュメモリ内では見つからないキャッシュされていないコード断片であるキャッシュメモリシステムと、
キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開するように構成されたキャッシュモニタであって、前記キャッシュミスが、前記命令フェッチの前記キャッシュメモリにはないフェッチされた命令であるキャッシュモニタと、
前記命令ローディングプロファイルが、前記意図しないシーケンスの前記コード断片のうちのいくつかの実行を示す場合、前記意図しないシーケンスの少なくとも1つのコード断片の実行を終了するように構成された是正措置ユニットとを備える、処理装置。
【請求項２４】
前記キャッシュメモリシステムがデータキャッシュおよび命令キャッシュを含み、前記キャッシュモニタが前記命令キャッシュから前記命令ローディングプロファイルを展開するためのものである、請求項23に記載の処理装置。
【請求項２５】
前記キャッシュメモリシステムが複数のレベルのキャッシュを含み、前記キャッシュモニタが、前記複数のレベルのキャッシュのうちの少なくとも1つについての前記命令ローディングプロファイルを展開するためのものである、請求項23に記載の処理装置。
【請求項２６】
前記是正措置ユニットは、前記命令ローディングプロファイルがコード断片の前記意図しないシーケンスを示す場合、前記実行可能なコードシーケンスに対して是正措置を実行するようにさらに構成され、前記キャッシュモニタ、前記是正措置ユニット、前記処理回路、またはそれらの組合せが、前記命令ローディングプロファイルを、有効なコードシーケンスを示す有効なヒット/ミス比率に対して選択されたしきい値よりも低い、キャッシュされていない命令に対するキャッシュされた命令のフェッチのヒット/ミス比率として展開するように構成される、請求項23に記載の処理装置。
【請求項２７】
前記キャッシュモニタ、前記是正措置ユニット、前記処理回路、またはそれらの組合せが、前記監視中に、リターン指向プログラミングエクスプロイトを含まないとして知られる複数の実行可能なコードシーケンスから前記ヒット/ミス比率を監視することで、前記有効なヒット/ミス比率を決定するように構成される、請求項26に記載の処理装置。
【請求項２８】
前記キャッシュモニタが、選択された動作期間中は監視するステップを中断するように構成される、請求項23に記載の処理装置。
【請求項２９】
キャッシュメモリに結合された処理回路内のコード断片の意図しないシーケンスを実行するための手段であって、各コード断片が、制御転送命令を含む少なくとも1つの実行可能命令を含み、前記コード断片のうちの1つまたは複数が、元々意図した制御転送命令とは異なる変更された制御転送命令を含み、前記複数のうちの少なくとも1つのコード断片が、前記キャッシュメモリ内では見つからないキャッシュされていないコード断片である手段と、
キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開するための手段であって、前記キャッシュミスが、前記命令フェッチの前記キャッシュメモリにはないフェッチされた命令である手段と、
前記命令ローディングプロファイルが、前記意図しないシーケンスの前記コード断片のうちのいくつかの実行を示す場合、前記意図しないシーケンスの少なくとも1つのコード断片の実行を終了するための手段とを備える、処理装置。
【請求項３０】
前記命令ローディングプロファイルを、有効なコードシーケンスを示す有効なヒット/ミス比率に対して選択されたしきい値よりも低い、キャッシュされていない命令に対するキャッシュされた命令のフェッチのヒット/ミス比率として展開するための手段をさらに備える、請求項29に記載の処理装置。
【請求項３１】
命令を記憶した機械可読記憶媒体であって、前記命令がキャッシュメモリに結合された処理回路によって実行されると、前記処理回路に、
各コード断片が制御転送命令を含む少なくとも1つの実行可能命令を含むコード断片であって、前記コード断片のうちの1つまたは複数が、元々意図した制御転送命令とは異なる変更された制御転送命令を含み、前記複数のうちの少なくとも1つのコード断片が、前記キャッシュメモリ内では見つからないキャッシュされていないコード断片である、コード断片の意図しないシーケンスを実行させるとともに、
キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開させ、前記キャッシュミスが、前記命令フェッチの前記キャッシュメモリにはないフェッチされた命令であり、
前記命令ローディングプロファイルが、前記意図しないシーケンスの前記コード断片のうちのいくつかの実行を示す場合、前記意図しないシーケンスの少なくとも1つのコード断片の実行を終了させる、機械可読記憶媒体。
【請求項３２】
前記キャッシュメモリは、命令キャッシュを含み、前記方法のステップが前記命令キャッシュを使用して実行される、請求項１に記載の方法。
【請求項３３】
前記キャッシュメモリは、命令キャッシュを含み、前記ロードするための手段と、前記命令フェッチを実行するための手段と、前記１つまたは複数の命令フェッチキャッシュミスを検出するための手段と、前記監視するための手段とが、前記命令キャッシュを使用する、請求項15に記載の処理装置。
【請求項３４】
前記キャッシュメモリは、命令キャッシュを含み、前記命令は、前記処理回路に、前記命令キャッシュを使用して、前記ロードの動作を実行させ、命令フェッチを実行させ、１つまたは複数の命令フェッチキャッシュミスを検出させ、前記命令フェッチを監視させる、請求項17に記載の機械可読記憶媒体。
【請求項３５】
前記キャッシュメモリは、命令キャッシュを含み、前記方法のステップが前記命令キャッシュを使用して実行される、請求項19に記載の方法。
【請求項３６】
前記キャッシュメモリは、命令キャッシュを含み、前記処理回路内のコード断片の前記意図しないシーケンスを実行するための前記手段と、キャッシュミスに関連する命令フェッチを監視することによって前記命令ローディングプロファイルを展開するための手段とは、前記命令キャッシュを使用する、請求項29に記載の処理装置。
【請求項３７】
前記キャッシュメモリは、命令キャッシュを含み、前記命令は、前記処理回路に、前記命令キャッシュを使用して、前記コード断片の意図しないシーケンスを実行する動作を実行させ、キャッシュミスに関連する命令フェッチを監視することによって前記命令ローディングプロファイルを展開させる、請求項31に記載の機械可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
１つの特徴は、一般に、ソフトウェアシステム内の悪意のあるコードの検出に関し、より具体的には、ソフトウェアシステム内のリターン指向プログラミングの悪用を検出する方法およびデバイスに関する。
【背景技術】
【０００２】
ソフトウェアを実行しているコンピューティングシステムは、一般にハッカーと呼ばれる攻撃者から、ますます多くの攻撃を受けている。これらの攻撃者は、コンピューティングシステムに悪意のあるコードを挿入して、次いでコンピューティングシステムにその悪意のあるコードを実行させるための方法を発見してきた。悪意のあるコードは、コンピューティングシステムを通常よりも遅く実行させる、コンピューティングシステム上の動作を監視する、コンピューティングシステムに、ユーザが伝えられることを望まないような情報を送受信させる、永続メモリおよび非永続メモリ内のデータを破損する、ならびにコンピューティングシステムをクラッシュさせるなどの、多くの異なる動作を実行し得る。
【０００３】
最近、しばしばリターン指向プログラミング(ROP)エクスプロイトと呼ばれる攻撃メカニズムが提案されている。ROPエクスプロイトの１つの分類は、多くのソフトウェアシステム内に常駐する標準Cライブラリを使用するので、しばしばreturn-to-libc攻撃と呼ばれている。ROPエクスプロイトは、攻撃者が、プロセッサのアドレス空間に新しい悪意のあるコードをまったく注入せずに、ソフトウェアプログラム内の有効なコードシーケンスを悪用することを可能にする強力な技法である。しばしばガジェットと呼ばれる有効なコードシーケンスの小さい断片が攻撃者によって見つけられ、次いで、新しい悪意のあるコードシーケンスを形成するためにつなげられ、それによってコード注入に対する防御を回避する。
【０００４】
ROPエクスプロイトでは、小さいコード断片は、リターン命令で終了するコードの一部である。関数が呼び出されると、呼出し後の命令のアドレスが、呼び出された関数が完了した後に戻るためのアドレスとしてスタックにプッシュされる。したがって、スタックは、呼び出された関数が完了したときにプロセッサがジャンプするための多くのリターンアドレスを含み得る。攻撃者がスタックに情報を書き込むことができる場合、攻撃者は意図したリターンアドレスに悪意のあるリターンアドレスを上書きすることができる。このリターンアドレスは、攻撃者が識別したガジェットのうちの1つに戻るためのアドレスでよい。
【０００５】
複数のリターンアドレスを操作することによって、呼出しスタックを制御する攻撃者は、プロセッサのアドレス空間に新しいコードをまったく注入せずに、複数のガジェットをつないで悪意のあるコードシーケンスを作成することができる。これらの悪意のあるコードシーケンスおよびそれらの構成の選択を通じて、攻撃者は、一連のガジェットで構成される悪意のあるプログラムの恣意的な(それでも依然としてチューリング完全である)挙動を誘導することができる。ほとんどのシステムではコードおよびデータアドレスが予測可能なので、このタイプの攻撃が成功する。つまり、攻撃者は、自分自身のコンピュータに特定のコードをロードして、コードがどのようにロードされているかを判定するためにそれらのスタックを閲覧して、そのようなコードがターゲットであるコンピュータにロードされると、この情報を用いてリターンスタックを悪用することができる。そのような攻撃は、一般的に、異なるコンピュータ間で同じ方法でロードされたコードに依存する場合がある。
【発明の概要】
【発明が解決しようとする課題】
【０００６】
そのため、スタック内の脆弱性が悪用されていることを検出して、そのような悪用が検出された場合は是正措置を実行することができる、堅牢な対策が必要とされている。
【課題を解決するための手段】
【０００７】
本開示の様々な特徴は、装置、方法、およびコンピュータ可読媒体に実装され得る。そのような特徴は、スタック内の脆弱性が悪用されていることを検出して、そのような悪用が検出された場合は是正措置を実行することを含み得る。
【０００８】
一例では、キャッシュメモリを含む処理回路において動作可能な方法が提供される。本方法は、実行可能なコードシーケンスの少なくとも一部をキャッシュメモリにロードするステップを含み得る。一例では、実行可能なコードシーケンスは、一連の実行可能なコードシーケンスを含むことができ、一連の実行可能なコードシーケンスのうちの1つまたは複数が、呼出しスタック上の命令に関連付けられる。
【０００９】
また、本方法は、キャッシュメモリから実行可能なコードシーケンスの命令フェッチを実行するステップと、異常なミス動作を動的に検出するために、命令フェッチのキャッシュメモリにはないフェッチされた命令であるキャッシュミスに関連する命令フェッチを監視するステップとを含むことができる。一例では、キャッシュミスに関連する命令フェッチを監視するステップは、命令フェッチのうちのいくつかがキャッシュヒットであり、異常なミス動作が、有効なコードシーケンスを示す有効なヒット/ミス比率に対して選択されたしきい値よりも低い、キャッシュミスに対するキャッシュヒットのヒット/ミス比率を示すことを監視するステップを含み得る。
【００１０】
異常なミス動作は、実行可能なコードシーケンスに対する是正措置を実行するために報告され得る。是正措置は、異常なミス動作の報告に応じて、実行可能なコードシーケンスの実行を終了することによって実行され得る。一例では、有効なヒット/ミス比率は、監視中に、リターン指向プログラミングエクスプロイトを含まない実行可能なコードシーケンスのうちの複数から、ヒット/ミス比率を監視することで決定され得る。一態様によれば、選択された動作期間中は、監視が中断され得る。たとえば、選択された動作期間は新しい処理の起動段階を含み得る。一態様によれば、異常なミス動作は、あらかじめ定義された数の先行命令にわたって、あらかじめ定義された時間にわたって、および/またはあらかじめ定められたオペレーティングコンテキスト内で決定され得る。一特徴によれば、異常なミス動作は、リターン指向プログラミングエクスプロイトを示すと判定され得る。
【００１１】
第2の例では、処理回路、キャッシュメモリシステム、およびキャッシュモニタを含む処理装置が提供される。処理回路は、実行可能なコードシーケンスをフェッチして実行するように構成され得る。キャッシュメモリシステムは、処理回路に動作可能に結合されて、少なくとも1つのキャッシュメモリを含む。キャッシュモニタは、異常なミス動作を動的に検出するためにキャッシュミスに関連する命令フェッチを監視するように構成されてよく、キャッシュミスは、命令フェッチのキャッシュメモリにはないフェッチされた命令である。
【００１２】
第3の例では、処理回路内のコード断片の意図しないシーケンスを実行するステップを含む方法であって、各コード断片が、制御転送命令を含む少なくとも1つの実行可能命令を含む方法が提供される。コード断片のうちの1つまたは複数は、元々意図した制御転送命令とは異なる変更された制御転送命令を含むことができ、複数のうちの少なくとも1つのコード断片は、キャッシュメモリ内では見つからないキャッシュされていないコード断片である。また、本方法は、キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開するステップであって、キャッシュミスが、命令フェッチのキャッシュメモリにはないフェッチされた命令であるステップを含み得る。命令ローディングプロファイルが、意図しないシーケンスのコード断片のうちのいくつかの実行を示す場合、意図しないシーケンスの少なくとも1つのコード断片の実行が終了され得る。コード断片の意図しないシーケンスを実行するステップは、マルチレベルキャッシュをキャッシュメモリとして利用するステップを含み、キャッシュされた命令は、処理回路により近いキャッシュレベル内の命令であり、キャッシュされていない命令は、処理回路から離れているメインメモリまたはキャッシュレベル内の命令である。命令ローディングプロファイルは、有効なコードシーケンスを示す有効なヒット/ミス比率に対して、選択されたしきい値よりも低い、キャッシュされていない命令に対するキャッシュされた命令のフェッチのヒット/ミス比率として展開または生成され得る。有効なヒット/ミス比率は、監視中に、リターン指向プログラミングエクスプロイトを含まないとして知られる複数の実行可能なコードシーケンスからヒット/ミス比率を監視することで決定され得る。
【００１３】
第4の例では、処理回路、キャッシュモニタ、および是正措置ユニットを含む処理装置が提供される。処理回路は、実行可能なコードシーケンスをフェッチして実行するように構成されてよく、キャッシュメモリシステムは、処理回路に動作可能に結合されて、少なくとも1つのキャッシュメモリを含む。キャッシュモニタは、キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開するように構成されてよく、キャッシュミスは、命令フェッチのキャッシュメモリにはないフェッチされた命令である。是正措置ユニットは、命令ローディングプロファイルがコード断片の意図しないシーケンスを示す場合、実行可能なコードシーケンスに対して是正措置を実行するように構成され得る。各コード断片は、制御転送命令を含む少なくとも1つの実行可能命令を含み、コード断片のうちの1つまたは複数は、元々意図した制御転送命令とは異なる変更された制御転送命令を含み、複数のうちの少なくとも1つのコード断片は、キャッシュメモリ内では見つからないキャッシュされていないコード断片である。
【００１４】
本開示の他の態様は、処理回路内のコード断片の意図しないシーケンスを実行するための手段を含む処理装置を含む。各コード断片は、制御転送命令を含む少なくとも1つの実行可能命令を含み、コード断片のうちの1つまたは複数は、元々意図した制御転送命令とは異なる変更された制御転送命令を含み、複数のうちの少なくとも1つのコード断片は、キャッシュメモリ内では見つからないキャッシュされていないコード断片である。また、処理装置は、キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開するための手段であって、キャッシュミスが、命令フェッチのキャッシュメモリにはないフェッチされた命令である手段を含む。
【００１５】
本開示の他の態様は、処理回路によって実行されると、処理回路にコード断片の意図しないシーケンスを実行させる命令を格納したコンピュータ可読媒体を含む。各コード断片は、制御転送命令を含む少なくとも1つの実行可能命令を含み、コード断片のうちの1つまたは複数は、元々意図した制御転送命令とは異なる変更された制御転送命令を含み、複数のうちの少なくとも1つのコード断片は、キャッシュメモリ内では見つからないキャッシュされていないコード断片である。また、命令は、処理回路に、キャッシュミスに関連する命令フェッチを監視することによって命令ローディングプロファイルを展開させ、キャッシュミスは、命令フェッチのキャッシュメモリにはないフェッチされた命令である。
【図面の簡単な説明】
【００１６】
【図１】可能なシステムメモリ構成を含む、例示的処理システム100を示すブロック図である。
【図２】例示的な、一般的呼出しスタックを示す図である。
【図３】有効なコードシーケンスからの小さいコード断片で構成される例示的ガジェットを示す図である。
【図４】キャッシュメモリシステムを含む、例示的処理システムを示す図である。
【図５】図4のキャッシュメモリシステムの一例の詳細を示す図である。
【図６】リターン指向プログラミング(ROP)エクスプロイトを形成するためにつなげられたガジェットを含む、悪意のあるコードシーケンスを生成するための破損した呼出しスタックの例を示す図である。
【図７】キャッシュメモリがROPエクスプロイトを検出して終了させるように、異常なミス動作を検出するための例示的処理を示す流れ図である。
【図８】命令ローディングプロファイルを展開して、命令ローディングプロファイルの分析に応じて是正措置を実行するための例示的処理を示す流れ図である。
【図９】命令ローディングプロファイルを分析する際に使用するための、有効なコードシーケンスの実行についての情報を展開するための例示的処理を示す流れ図である。
【発明を実施するための形態】
【００１７】
以下の説明では、例として、本開示が実行され得る具体的な例が示されている添付の図面を参照する。例は、説明された特徴のうちの1つまたは複数を当業者が実施できるようにするために、本開示の態様を十分に詳細に説明することを意図するものである。本開示の範囲から逸脱することなしに、他の特徴が利用されてよく、また開示された例に変更が行われてよい。以下の詳細な説明は限定的な意味に解釈されるべきではなく、本発明の範囲は添付の特許請求の範囲によってのみ定義される。
【００１８】
「データ」という用語は、プロセッサによって使用され得るコンピューティング命令、およびプロセッサによって操作され得るデータを指すために、本明細書で互換的に使用され得る。「データ」が命令を指している場合、「データ」という用語を使用するコンテキストは、それを明らかにする必要がある。必要に応じて、命令は、明示的に命令または指示データと呼ばれ得る。
【００１９】
概要
本開示は、スタック内の脆弱性が悪用されていることを検出して、そのような悪用が検出された場合は是正措置を実行するための装置、方法、およびコンピュータ可読媒体を指す。
【００２０】
一特徴によれば、プロセッサは、実行可能なコードでキャッシュメモリの1つまたは複数のラインをロードすることができる(たとえば、外部記憶装置またはメインメモリから)。次いで、プロセッサは、キャッシュメモリ内のアドレス(位置)から命令を呼び出して、キャッシュメモリ内では見つからない命令のために、前記新しい命令を呼び出す前に、またはそれと同時に、新しい命令をキャッシュメモリにロードする(たとえば、外部/メインメモリから)ことによって、実行可能コードを実行する。プロセッサは、ヒット/ミス比率を生成するために、キャッシュメモリ内で見つかった命令が呼び出される回数対、キャッシュメモリ内で見つからない命令が呼び出される回数を監視することができる。たとえば、従来のコードでは、新しいラインをロードする必要(「ミス」)は、たとえば100回の命令につき一度だけ、またはその程度発生し得る。対照的に、ROPエクスプロイトでは、新しいページをロードする必要は、3回の命令につき一度発生し得る。プロセッサは、ヒット/ミス比率があらかじめ定められたしきい値を下回る場合、実行可能なコードシーケンスの実行を終了することができる。しきい値は、正規のプログラムの典型的なヒット/ミス比率よりも低くなるように選択され得る。たとえば、ヒット/ミスしきい値は、オペレーティングシステムおよび/またはプロセッサタイプごとに経験的に選択されてよい。プロセッサまたはオペレーティングシステムの初期起動中に、重要なページ切替えやページローディングがある傾向があるので、監視するステップは、プロセッサの起動段階(または他の選択された動作期間)に一時停止され得る。ROPエクスプロイトの発生をより迅速に検出するために、ヒット/ミス比率は、一定数の先行命令(たとえば、最後の10、50、100個の命令)を介して計算され得る。
【００２１】
例示的データ構造
攻撃者は、コンピューティングシステムに悪意のあるコードを挿入する方法を発見した。それに応じて、多くのコンピューティングシステム設計者は、データ実行防止(DEP)およびアドレス空間配置のランダム化(ASLR)などのシステムを実装することによって、コンピューティングシステムを攻撃者にとってより困難にした。
【００２２】
DEPは、プロセッサが、実行可能情報または非実行可能情報のいずれかとして使用し得る情報にタグ付けすることを含む。多くのソフトウェアシステムでは、ハッカーは、命令ではなくデータと考えられる情報をプロセッサにフェッチさせることができる。プロセッサは、このデータを解釈して、ソフトウェアプログラマによって意図されていなかった命令として実行することができる。このように情報を実行可能としてタグ付けすることによって、データが非実行可能としてタグ付けされるので、ハッカーがデータをプロセッサに実行させることがより困難になる。
【００２３】
アドレス空間配置のランダム化(ASLR)は、実行可能コードの基底、ライブラリの位置、ヒープの位置、およびスタックの位置などの、主なデータおよび命令空間のためにプロセッサのアドレス空間内の位置をランダムに配置することを含む。
【００２４】
しかしながら、リターン指向プログラミング(ROP)エクスプロイトはどのようなコードの挿入も必要としないので、ROPエクスプロイトはこれらの保護メカニズムを回避する。代わりに、ROPエクスプロイトは、呼出しスタック上のリターンアドレスを変更することによって、良好なコードの断片を悪用する。
【００２５】
図1は、可能なシステムメモリ構成を含む例示的処理システム100を示すブロック図である。処理システム100内のソフトウェアを実行する場合、処理装置102は、一般的に永続記憶装置106にアクセスして、実行可能命令をコードの形式で読み出す。
【００２６】
永続記憶装置106は、情報を命令およびデータの形式で格納するための任意の適切な構造でよい。例として、これに限定されないが、これらの記憶媒体はコンピュータ可読媒体(CRM)を含み得る。このCRMは、これに限定されないが、ディスクドライブ、磁気テープ、CD(コンパクトディスク)、DVD(デジタル多用途ディスク、またはデジタルビデオディスク)、および他の同等の記憶装置などの、磁気および光学式記憶装置を含み得る。
【００２７】
実行可能命令は、処理装置102がコードを実行する際に使用し得る他のデータ構造とともに、メインメモリ104に格納される。図1に示されるいくつかの例示的データ構造は、ヒープ、スタック、定数データ、初期化されたデータ、および命令を含む。ヒープは、様々なソフトウェアプログラムが処理システム100内でアクティブであり得る間に、それらの動的割当てのためにしばしば使用される。定数データ、および初期化されたデータなどの様々なデータは、処理システム100上で実行している1つまたは複数のプログラムによってアクセスされるために、メインメモリ104に格納され得る。様々なプログラムに関連付けられる命令は、命令域、ヒープ、またはそれらの組合せに格納され得る。
【００２８】
処理システム100内に様々なスタックがあってよい。特に関心があるスタックは、しばしば呼出しスタックと呼ばれる。呼出しスタックは、ROPエクスプロイトによって破損される場合があり、以下でより完全に記述するように、キャッシュ動作の監視に応じて、本明細書に記述される1つまたは複数の特徴/態様によって検出され得る。
【００２９】
図2は、例示的な、一般的呼出しスタック200を示している。呼出しスタック200は、関数が呼び出される時に使用され得る様々な情報を格納するために使用され得る。スタック上でプッシュされる各関数は、呼出し関数A、B、およびCについてそれぞれフレーム202A、202B、および202Cによって示されるように、フレーム202を占める。
【００３０】
非限定的な例として、呼出しスタック200の各フレーム202は、呼出し元の関数から呼び出された関数へと渡されるパラメータなどの情報を含み得る。また、呼出しスタック200は、呼び出されたプログラムによって使用され得る様々なローカル変数を格納するためのメモリの空間を含み得る。呼び出された関数が実行を完了した後、関数の呼出しの実行を継続するべき場所を示すリターンアドレスも、呼出しスタック200に含まれ得る。呼出しスタック200は、スタックにプッシュされた最後のデータが、スタックからポップされた最初のデータであることを意味する、後入れ先出し(LIFO)バッファとして動作する。呼出しスタック200は、かなり深い場合があり、多くの関数呼出しが他の関数内にネストされていることを示す。
【００３１】
フレームポインタ204は、一般的に、現在動作している関数のフレーム202を指す。スタックポインタ206は、ポップオフ(popped off)されて、プロセッサに返されるために利用可能な、スタック上のデータの次の位置を指す。
【００３２】
ROPエクスプロイトは、様々なフレーム202のリターンアドレス部に悪意のあるアドレスを書き込むことによって、スタックデータ構造を利用する。以下でより完全に説明するように、ROPエクスプロイトによって破損される、呼出しスタック200に関連する動作は、キャッシュ動作の監視に応じて、本明細書に記述される1つまたは複数の特徴および/または態様によって検出され得る。
【００３３】
図3は、様々なコードシーケンス300からの小さいコード断片で構成されるガジェット304およびガジェット306を示している。命令は、命令データの1つまたは複数のバイトを含むものとして図3に示されている。非限定的な例として、有効なコードシーケンス300(実行可能なコードシーケンスとも呼ばれ得る)は、3バイトの比較(CMP)命令、2バイトの右シフト(SHR)命令、3バイトのロードアキュムレータ(LDA)命令、2バイトの追加(ADD)命令、4バイトのレジスタcからレジスタaへの移動(MOV a, c)命令、および2バイトのリターン(RET)命令を含む。図3に示される様々なバイトの命令における命令および符号化は作られたものであり、何らかの特定の命令セットを示すことを意図するものではない。
【００３４】
他の関数から呼び出される関数は、一般的にリターン命令302で終了する。プロセッサがリターン命令302を検出すると、一番上のリターンアドレスをスタック200(図2)からポップオフして、実行が進むべき場所を決定する。スタックの一番上のアドレスは、一般的に、関数の呼出しの呼出し命令の後の、関数の呼出し内の次の命令のアドレスを指すべきである。しかしながら、ROPエクスプロイトを用いた攻撃においては、異なるアドレスを指すためにリターンアドレスが変更されている場合がある。
【００３５】
攻撃者は、攻撃者にとって有益であり得る特定の機能を実行するガジェット304を識別し得る。ガジェット304は、有効なコードシーケンス300のリターン命令302で終了する。しかしながら、一般的に、リターン命令302の前に有益な命令を含むために、有効なコードシーケンス300内のどこかで開始する。したがって、ガジェット304は、追加命令に続いて移動命令、その後にリターン命令302を含む。
【００３６】
縮小命令セットコンピュータ(RISC)命令などのある命令セットは一般的に固定長であり、すべての命令が同数のバイト(たとえば、4バイト)で構成されることを意味する。複数命令セットコンピュータ(CISC)命令などの他の命令セットは、図3に示されるように長さが変化する場合がある。可変長命令を使用すると、攻撃者は、元の有効なコードシーケンス300で意図されていなかった新しい命令を作成する機会を有することになる。非限定的な例として、ガジェット306は、有効なコードシーケンス300の移動命令内の位置で開始して、プロセッサがその時点で実行を開始すると、減算命令を作成し得る。したがって、ガジェット306は減算命令に続いてリターン命令302を含む。
【００３７】
攻撃者は、たとえば標準Cライブラリなどのメモリ、またはオペレーティングシステムの一部に常駐しているコードを調べることができる。次いで、攻撃者は、ROP命令のライブラリを作成するために、これらのガジェット304およびガジェット306(すなわち、小さいコード断片)の多くを識別し得る。次いで、メモリにコードをまったく挿入せずに、有益な、意図しない、および悪意のあるコードシーケンスを作成するために、これらのROP命令がつなげられ得る。むしろ、攻撃者は、所望のガジェット304およびガジェット306の先頭を指すために、呼出しスタック200上のリターンアドレスを変更するだけでよい。
【００３８】
例示的アーキテクチャおよびコンポーネント
図4は、キャッシュメモリシステム404を含む処理システム100の例を示している。処理システム100は、1つまたは複数のプロセッサ402、キャッシュメモリシステム404、およびメインメモリ104を含み得る。様々な通信インターフェース424、および入力/出力(I/O)インターフェース426も含まれ得る。
【００３９】
非限定的な例として、通信インターフェース424は、セルラーネットワーク上の通信のためのインターフェース、シリアルポート、パラレルポート、イーサネット(登録商標)接続、ユニバーサルシリアルバス(USB)接続、IEEE 1394(「ファイアワイヤ」)接続、ブルートゥースワイヤレス接続、802.1 a/b/g/nタイプワイヤレス接続、ならびに他の適切な通信プロトコルおよびインターフェースを含み得る。
【００４０】
非限定的な例として、I/Oインターフェース426は、キーボード、マウス、トラックボール、触覚装置、音声入力および出力、ならびにディスプレイなどのデバイスへのインターフェースを含み得る。
【００４１】
キャッシュモニタ414は、キャッシュメモリシステム404への様々なアクセスが、アクセスされたデータがキャッシュメモリシステム404に常駐し、かつ有効であることを意味する「ヒット」か、それとも所望の位置がキャッシュメモリシステム404に存在しない、または無効なデータを含むことを意味する「ミス」かどうかを監視するために含まれる。したがって、バス416は、ミスかヒットか、ならびに他の情報をキャッシュモニタ414に示し得る。キャッシュモニタ414は、あらかじめ定められた時間にわたる、またはあらかじめ定められた命令フェッチ数にわたる、ヒット数およびミス数などの情報を収集し得る。ヒットおよびミスについての収集された情報は、バス418上で是正措置ユニット420に送信され得る。是正措置ユニット420は、ヒットおよびミス情報を処理して、バス422を介して結果をプロセッサ402に報告し得る。以下でより完全に説明するように、プロセッサ402についての収集および識別された情報は、異なる例または実装形態で異なってよく、命令ローディングプロファイルなどのより複雑なものに対してヒット/ミス比率と同じくらい単純でよい。
【００４２】
キャッシュモニタ414の機能、是正措置ユニット420の機能、またはそれらの組合せは、異なる例においてハードウェアで実行されてもよく、ソフトウェアで実行されてもよい。
【００４３】
非限定的な例として、キャッシュモニタ414内の1つまたは複数の単純なハードウェアカウンタは、キャッシュヒット、キャッシュミス、またはそれらの組合せの記録を付けるために使用され得る。ハードウェアカウンタは、一定の時間、一定数の命令フェッチ、またはそれらの組合せにわたって、キャッシュヒット情報またはキャッシュミス情報を制御して分析するために、ソフトウェアによって消去、プリセット、および読出しされ得る。一例として、是正措置ユニット420は、ソフトウェアの制御下で、ヒット/ミス比率または命令ローディングプロファイルを判定するように構成され得る。制御は、ハードウェア内の一定の基準を満たすことに基づいてハードウェアが割込みを生成するプッシュ型モデルに基づき得る。たとえば、所与の時間内に一定のしきい値数のミスまたはフェッチが要求されると、次いでハードウェアが割込みを生成し得る。制御は、ソフトウェアが、経過時間、コンテキストスイッチ、およびフェッチされた命令の数などの特定のイベントに関連してハードウェアレジスタを監視し得るプル型モデルにも基づき得る。一例では、ハードウェアレジスタは、異常キャッシュミスまたは命令フェッチ条件が検出されるかどうかを確認するために、周期的なクロック割込みで確認され得る。
【００４４】
別の非限定的な例として、しきい値レジスタ、または現在の操作について予測される挙動に基づいてカーネルまたはオペレーティングシステムによって設定され得る他のプロファイル情報などの、より多くのハードウェアが含まれ得る。次いで、ハードウェアが、ヒット/ミス比率がしきい値レジスタまたはプロファイル情報を超えるか、それを下回ると、割込みを生成し得る。
【００４５】
いくつかの例では、プロセッサ402、キャッシュメモリシステム404、キャッシュモニタ414、および是正措置ユニット420は、すべて同じ半導体デバイスまたは処理装置428上にあってよい。他の例では、キャッシュメモリシステム404は、プロセッサ402とは別のデバイス上にあってよい。このような例では、キャッシュモニタ414および是正措置ユニット420は、プロセッサ402とともに、キャッシュメモリシステム404とともに、またはその2つのデバイスの間に分割して配置され得る。
【００４６】
多くのキャッシュメモリシステム404は、複数のレベルのキャッシュメモリ412を含むマルチレベルキャッシュを含む。図4の非限定的な例は、別の命令キャッシュ406およびデータキャッシュ408を含む第1のレベルのキャッシュを示している。データから命令を分離することで、情報をフェッチするための並列パスを作成して、命令およびデータとは異なる場合がある時間的近接性および空間的近接性を利用することによって、パフォーマンスの強化をもたらし得る。第2のレベルのキャッシュは、命令キャッシュ406のための命令とデータキャッシュ408のためのデータの両方を含む、統合されたキャッシュ410として構成される。さらに、キャッシュ設計の当業者によって知られているように、キャッシュメモリシステム404は、たとえばセットアソシアティブ方式のキャッシュ、およびキャッシュがいっぱいの際の様々な置換プロトコルなどの、キャッシュのための異なる構成を含み得る。
【００４７】
キャッシュはメインメモリ104に行くことと比較して、命令およびデータのより高速な取出しを可能にする。従来のメモリと比較したトレードオフは、サイズである。一般的に、より小さいメモリはより高い帯域幅、より低いレイテンシ、または両者の組合せを有する。メインメモリ104は、典型的に、比較的良好な帯域幅を有することができるが、比較的長いレイテンシを有し得る、ダイナミックランダムアクセスメモリ(DRAM)として実装される。キャッシュ内の頻繁に使用されるデータおよび命令をキャッシュすることによって、プロセッサ402からのフェッチがはるかに迅速に、かつより高い帯域幅で受信され得る。一般的に、レベル1のキャッシュ(すなわち、プロセッサ402に最も近いキャッシュ)は、より小さく、より速く、またレイテンシがより低い。一般的に、レベル2のキャッシュはより大きく、より遅い場合があり、また、より長いレイテンシを有する場合がある。しかしながら、それらは依然としてメインメモリ104よりも高速なので、第2のレベルのキャッシュを含むことによってパフォーマンスの向上が可能である。
【００４８】
図4のキャッシュメモリシステム404は一例にすぎない。より多数またはより少数のレベルが使用されてよく、各レベルは統合されたキャッシュ410として、または別の命令キャッシュ406およびデータキャッシュ408として実装され得る。本明細書に記述される例は、主に命令に関係する。その結果、議論は特に命令キャッシュ406を参照し得る。しかしながら、当業者は、これらの特徴は任意のレベルのキャッシュで、および命令キャッシュ406と統合されたキャッシュ410の両方で実施され得ることが理解できるであろう。
【００４９】
プロセッサは、キャッシュ内に保持され、メインメモリ104から取り出さなければならない可能性があるものを最適化するために、空間的近接性および時間的近接性の特性を利用する。たとえば、頻繁に呼び出されるコードまたは関数は、命令キャッシュ406内に保持され得る。また、ページ内の関数またはコードが、他の近隣の、または空間的に近接したコード(たとえば、同じページ内の)を呼び出すことは一般的である。
【００５０】
しかしながら、そのような近接の仮定は、ROPエクスプロイトの基本的なプロパティは、メモリの異なる、およびランダムに見える部分に位置するコードの小さい断片をまとめることなので、必ずしもROPガジェットを保持しない。ガジェットのこの分散は、ROPエクスプロイトのための多くの「ミス」をもたらす場合がある。言い換えれば、プロセッサ402は、呼び出されたガジェットを見つけるために、新しいラインをキャッシュに頻繁にロードしなければならない。対照的に、有効なコードシーケンス300(図3)が有するミスは一般的にはるかに少なく、また「ヒット」がより多い。言い換えれば、呼び出された関数またはコードを、すでにキャッシュにロードされた同じラインに見つけることができる。有効なコードシーケンス300の影響と比較した、キャッシュヒット/ミス特性へのROPエクスプロイトの異なる影響は、ROPペイロードが成功裏に実行されることを防ぐ検出メカニズムを構築するために利用され得る。そのようなシステム(ヒット/ミス特性を監視する)は、特定のオペレーティングシステム(OS)または処理にトレーニングされ得る。
【００５１】
本開示のいくつかの特徴または態様によって、可能な最も低いレベルでのROPエクスプロイトの実行の検出が可能になり、したがって処理だけではなくOSレベルの粒度でも適用され得る。さらに、様々な態様または特徴は、ソースコードあるいはコンパイル時間変更に結び付けられない場合がある。本開示のいくつかの例は、攻撃者がメモリのいずれかの部分を読み取ること、または実行の流れを制御することを防ぐことに必ずしも依存しない。ROPエクスプロイト(具体的には、ASLR)を緩和するためのすべての現在知られているメカニズムは、さらなるバグがメモリレイアウトを攻撃者にリークするか、メモリの何らかの部分が依然として容易に予測可能であると判かるので、いつも避けられてしまい、したがってROPペイロードを見つけるための攻撃面を提供してしまう。対照的に、提案された方法は、たとえ攻撃者が攻撃される処理のメモリマップの完全な知識を持っている場合でも、ROPエクスプロイトの実行を検出し得る。
【００５２】
図5は、本開示の様々な態様に関連するキャッシュの動作を説明するために、異なるコンテキストにおける図4のキャッシュメモリシステム404の例の詳細を示している。命令キャッシュ406はラインの集合を含み、各ラインはインデックス部502およびデータ部504を含む。インデックス部は部分アドレス(通常、最上位ビットMSB)を含むので、同じMSBを有するメモリの異なる空間が命令キャッシュ406の特定のラインにマッピングされ得る。したがって、図示されるように、インデックス2を有するキャッシュラインは、メインメモリ104内の命令データ2A、またはメインメモリ104内の命令データ2Bから発信する命令データ2を含み得る。新しい命令をロードすることを所望するが、利用可能なキャッシュラインがもうない場合、各キャッシュラインは、より最近の(すなわち、時間的により近い)命令で上書き(すなわち、置換)されてもよい。
【００５３】
動作において、プロセッサ402は、命令を取り出すために特定のアドレスを要求する。そのアドレスが命令キャッシュ406のライン内のインデックスと一致する場合、「ヒット」ラインの命令データ(またはその一部)が、キャッシュされた命令としてプロセッサ402に戻される。要求されたアドレスが、命令キャッシュ406内の有効なインデックスのうちのいずれにも一致しない場合、「ミス」が発生して、命令キャッシュ406が、キャッシュのラインを埋めて、キャッシュのライン内に要求されたアドレスのインデックスを配置するために、キャッシュされていない命令506を含むメインメモリ104から十分な情報をフェッチする。次に、その特定のインデックスを有するそのキャッシュラインへの後続の要求がキャッシュされた命令へのヒットを生成するので、メインメモリ104から命令データをフェッチする必要がなくなる。
【００５４】
長いキャッシュラインが空間的近接性を作成し、またキャッシュラインをより最近使用されたデータで置換する機能が時間的近接性を作成する。有効なコード300(図3)は、一般的に良好な空間的近接性と良好な時間的近接性の両方を有する。一方、ROPエクスプロイトは、一般的に、必ずしも頻繁にアクセスされていないメモリの多くの異なる領域に配置され得る短い断片の性質上、あまり良好ではない空間的近接性とあまり良好ではない時間的近接性を有する。
【００５５】
例示的リターン指向プログラミング検出
図6は、リターン指向プログラミング(ROP)エクスプロイトを形成するためにつなげられたガジェットを含む、悪意のあるコードシーケンスを生成するための呼出しスタック600の例を示している。破損した呼出しスタック600は、攻撃者が破損した呼出しスタック上のリターンアドレスのうちの1つまたは複数を変更しているために、破損した形式である。命令キャッシュ406の一部およびメインメモリ104の一部も図6に示されている。
【００５６】
図3、図5、および図6を参照すると、破損した呼出しスタック600は、関数U-Zのフレームを含み得る。破損した呼出しスタック600から命令キャッシュ406への実線の矢印は、プロセッサ402に特定のガジェットの先頭で実行を開始させるスタックからポップオフされたリターンアドレスを示している。命令キャッシュ406から破損した呼出しスタック600への点線の矢印は、スタックからリターンアドレスをフェッチするために特定のガジェットの最後に実行されたリターン命令を示している。
【００５７】
破損した呼出しスタック600において、関数Zのリターンアドレスは、ガジェットAの先頭アドレスを指すように変更されている。同様に、関数Yのリターンアドレスは、ガジェットBの先頭アドレスを指すように変更されており、関数Wのリターンアドレスは、ガジェットEの先頭アドレスを指すように変更されており、関数Vのリターンアドレスは、ガジェットDの先頭アドレスを指すように変更されており、関数Uのリターンアドレスは、ガジェットCの先頭アドレスを指すように変更されている。関数Xのリターンアドレスは変更されていない。
【００５８】
これらの変更により、関数Zが動作を完了してリターン命令302が実行されると、適切な場所に戻らずに、制御はガジェットAの先頭に続き、アドレスが関数Zのリターンアドレス内に配置される。すべてのガジェットは、リターン命令302で終了する。したがって、ガジェットAが命令302を完了すると、関数Yのリターンアドレスを指す。しかしながら、関数YのリターンアドレスがガジェットBの先頭を指すように変更されている。その結果、適切な場所に戻らずに、制御はガジェットBの先頭に続く。ガジェットの実行を継続すると、ガジェットBが完了した後、関数Uの適切な場所に戻らずに、制御はガジェットCの先頭に続く。ガジェットCが完了した後、関数Vの適切な場所に戻らずに、制御はガジェットDの先頭に続く。ガジェットDが完了した後、関数Wの適切な場所に戻らずに、制御はガジェットEの先頭に続く。このようにガジェットA-Eをつなげることによって、ROPエクスプロイトの少なくとも一部を形成する重要な機能を実行することができる。
【００５９】
しかしながら、これらのガジェットA-Eは様々なアドレスに存在し得るので、プログラムの実行が正常に起こっていた場合、多数のキャッシュミスを発生させる場合がある。図6の非限定的な例では、ガジェットAは命令キャッシュ406に配置されておらず、ミス、およびキャッシュされていないコード断片602をメインメモリ104からフェッチする必要性を発生させる。同様に、ガジェットC、D、およびEは命令キャッシュ406をミスして、それぞれメインメモリ104からのキャッシュされていないコード断片604、606、および608のフェッチを発生させる。ガジェットBのフェッチがヒットを引き起こし、ガジェットBのキャッシュされたコード断片のリターンを可能にする。
【００６０】
より長いROPエクスプロイトペイロードはより多くのコード断片で構成されているので、ヒットに対してミスの数が予測よりも多いという傾向がより明らかになり、ROPエクスプロイトが原因である可能性があるという確信が高まる。
【００６１】
図7は、キャッシュメモリがROPエクスプロイトを検出して終了させるために、異常なミス動作を検出する例示的処理700を示す流れ図である。処理700を図7および図4を参照して説明する。動作ブロック702で、処理は実行可能なコードシーケンスをキャッシュメモリにロードするステップを含む。言い換えれば、キャッシュラインのうちの少なくともいくつかが、実行可能なコードシーケンスの少なくとも一部とともにロードされる。動作ブロック704で、プロセッサ402が、キャッシュメモリから実行可能なコードシーケンスの命令フェッチを実行する。実行可能なコードシーケンスは、キャッシュヒットおよびキャッシュミスを含み得る。これらのコードシーケンスは有効なコードシーケンスであってもよく、ROPエクスプロイトペイロードを形成する一連のガジェットであってもよい。
【００６２】
動作ブロック706で、キャッシュモニタ414が単独で、是正措置ユニット420と組み合わせて、または是正措置ユニット420およびプロセッサ402の両方と組み合わせて、異常なミス動作があるかどうかを動的に判定するために、キャッシュミスに関連する命令フェッチを監視する。キャッシュミスは、命令フェッチのキャッシュメモリにはないフェッチされた命令である。特定の命令シーケンスに関連するキャッシュヒット/ミス挙動をあらかじめ判定するために命令フェッチを監視するよりもむしろ、命令の実行の間、命令フェッチは動的に監視される。異常なミス動作は、異なるメトリクスによって判定され得る。いくつかの非限定的なメトリクスは、ヒット/ミス比率を展開するためのキャッシュミス数に対するキャッシュヒット数、命令フェッチ数に対するキャッシュミス数、一定の時間にわたるキャッシュミス数、または予測されるコードシーケンスにわたるキャッシュミス数である。非限定的な例として、このヒット/ミス比率は、命令がフェッチする際の移動平均である。もちろん、ヒット/ミス比率はミス/ヒット比率として逆に表すことができる。
【００６３】
いくつかの例では、異常なミス動作を判定するために、一定のあらかじめ定義された数の命令フェッチが所望され得る。決定ブロック708は、フェッチが所望の数に達したかどうかを確認するためにテストが発生することを示している。フェッチが所望の数に達していない場合、制御は動作ブロック704に戻って、より多くの命令がフェッチおよび実行される。非限定的な例として、所望の数のフェッチは、10個の命令、50個の命令、および100個の命令などの数に設定され得る。さらに、所望の数のフェッチはあらかじめ定義された時間にわたって決定され得る。別の非限定的な例として、所望の数のフェッチは、特定のソフトウェアプログラム、特定のソフトウェアライブラリ、または特定のオペレーティングシステム動作の実行などの、あらかじめ定められたオペレーティングコンテキストと相互に関連付けられ得る。
【００６４】
十分な命令フェッチが発生すると、決定ブロック710は、しきい値を下回るヒット/ミス比率と定義され得る、異常なミス動作があるかどうかを確認するためのテストを示す。異常なミス動作がない場合、有効なコードシーケンスが実行されている可能性があり、制御は動作ブロック704に戻って、より多くの命令フェッチを監視する。
【００６５】
異常なミス動作がある場合、ROPエクスプロイトが実行している可能性があり、動作ブロック712は異常なミス動作が報告され得ることを示し、したがって実行可能コードシーケンスに対して是正措置動作を取ることができる。上記で説明したように、報告は是正措置ユニット420またはプロセッサ402に行われ得る。
【００６６】
動作ブロック714は、実行され得るあるタイプの是正手段は、異常なミス動作の報告に応じて、実行可能なコードシーケンスの実行を終了することであることを示している。この終了は、たとえば、ハードウェアまたはソフトウェアの例外を作成すること、あるいはハードウェアまたはソフトウェア割込みを作成することなどの、多くの異なる方法で終了し得る。
【００６７】
しきい値は、有効なコードシーケンスの典型的なヒット/ミス比率よりも低くなるように選択され得る。たとえば、ヒット/ミスしきい値は、オペレーティングシステムおよび/またはプロセッサタイプごとに経験的に選択され得る。
【００６８】
さらに、たとえばキャッシュトラッシングを発生させ得る有効な命令または特定の有効なコードシーケンスとともにキャッシュがまだロードされていない起動段階中に、実行の期間、または多数のミスが予測され得る、あるタイプの有効なコードシーケンスの実行があってよい。したがって、監視動作が一時停止され得る場合、プロセッサ402またはオペレーティングシステムの初期起動中などに選択された操作期間があってよい。これらのタイプのイベントが知られている場合、有効なコードシーケンスとROPエクスプロイトの両方のために、より複雑な命令ローディングプロファイルが展開され得る。
【００６９】
動作ブロック716は、処理はまた、異常なミス動作がリターン指向プログラミングエクスプロイトを示すと判定し得ることを示している。最後に示されているが、動作ブロック716の動作が実行されると、動作712および動作714が潜在的なROPエクスプロイトの判定に応答し得る方法で、処理内でより早く実行され得る。
【００７０】
図8は、命令ローディングプロファイルを展開して、命令ローディングプロファイルの分析に応じて是正措置を実行する例示的処理800を示す流れ図である。処理800を図8および図4を参照して説明する。動作ブロック802は、処理が、処理回路402内のコード断片の意図しないシーケンスを実行することを示しており、各コード断片は、制御転送命令を含む少なくとも1つの実行可能命令を備えている。複数のうちの少なくとも1つのコード断片は、キャッシュメモリ内では見つからないキャッシュされていないコード断片である。コード断片のうちの1つまたは複数は、元々意図した制御転送命令とは異なる変更された制御転送命令を含むので、処理は意図しないコードシーケンスを実行する。非限定的な例として、制御転送命令は、ジャンプ命令、リターン命令、およびブランチ命令などの命令でよい。したがって、元々意図した制御転送関数は、たとえば、意図した有効なプログラムとして呼出しスタック上に元々配置されたリターン命令である。ROPエクスプロイトでは、元々意図した制御転送関数は、コード断片の意図しないシーケンスをもたらす異なる関数を実行するために、変更された制御転送命令に変更され得る。
【００７１】
動作ブロック804は、処理が、キャッシュミスに関連する命令フェッチを監視することによって、命令ローディングプロファイルを展開することを示している。キャッシュミスは、命令フェッチのキャッシュメモリにはないフェッチされた命令である。言い換えれば、有効なコードシーケンスおよびコード断片の実行中に、キャッシュヒットおよびキャッシュミスが監視される。これらの命令フェッチが発生すると、命令ローディングプロファイルが展開され得る。命令ローディングプロファイルは非常に複雑でよく、たとえばキャッシュミスの間の時間的分離および空間分離などのイベントおよび動作を追跡し、またあるキャッシュラインがROPエクスプロイトに関与している可能性が高いかどうかを示すために、キャッシュラインインデックスの置換も追跡し得る。一方、命令ローディングプロファイルは、図7を参照して上述したヒット/ミス比率と同じくらい単純でよい。
【００７２】
動作ブロック806は、命令ローディングプロファイルが、キャッシュされていない命令に対するキャッシュされた命令のフェッチのヒット/ミス比率として展開され得ることを示している。動作は、ヒット/ミス比率が、有効なコードシーケンスを示す有効なヒット/ミス比率に対して決定または選択され得るしきい値よりも低いかどうかを確認するために監視し得る。
【００７３】
動作ブロック808は、以下で図9を参照してより完全に説明するように、有効なヒット/ミス比率は、ヒット/ミス比率の監視中に、リターン指向プログラミングエクスプロイトを含まないとして知られる複数の実行可能なコードシーケンスからヒット/ミス比率を監視することから決定され得ることを示している。
【００７４】
決定ブロック810は、現在の命令ローディングプロファイルがROPエクスプロイトの命令ローディングプロファイルと類似しているかどうかを確認するために、テストが実行され得ることを示している。類似していない場合、制御は動作ブロック804に戻って、さらなる命令フェッチ、およびそれらの命令フェッチがキャッシュヒットまたはキャッシュミスを発生させるかどうかを監視し得る。
【００７５】
現在の命令ローディングプロファイルがROPエクスプロイトの命令ローディングプロファイルと類似している場合、動作ブロック812は、命令ローディングプロファイルが実行可能なコードシーケンスのうちの1つまたは複数を含むリターン指向プログラミングエクスプロイトの実行を示す場合、実行可能なコードシーケンスに対する是正措置が実行され得ることを示す。非限定的な例として、命令ローディングプロファイルが、図7を参照する上記のシーケンスのコード断片のうちの少なくともいくつかの実行を示す場合、是正措置は、シーケンスの少なくとも1つのコード断片の実行を終了することができる。
【００７６】
有効なコードシーケンスとROPエクスプロイトの両方のプロファイルは、通常の動作中に使用するためのテスト環境で事前に展開され得る。
【００７７】
図9は、命令ローディングプロファイルを分析する際に使用するための、有効なコードシーケンスおよびROPエクスプロイトの実行についての情報を展開するための例示的処理900を示す流れ図である。処理900を図9および図4を参照して説明する。動作ブロック902で、有効なテストコードシーケンスが実行される。動作ブロック904で、有効なテストコードシーケンスのために、キャッシュヒットおよびキャッシュミスが監視される。一例では、有効なヒット/ミス比率は、有効なテストコードシーケンスの実行から展開され得る。動作ブロック906は、有効なコードシーケンスのために、様々な命令ローディングプロファイルが展開され得ることを示している。このように、比較的低いヒット/ミス比率を有し得る有効なコードシーケンスは、依然として、それらをROPエクスプロイトではなく有効なコードシーケンスとして識別する他のヒット/ミス特性を有する場合がある。動作ブロック902、904、および906は、関心があると思われる任意の数の有効なコードシーケンスについて繰り返すことができる。
【００７８】
動作ブロック908で、テストROPエクスプロイトシーケンスが実行される。動作ブロック910で、テストROPエクスプロイトシーケンスのために、キャッシュヒットおよびキャッシュミスが監視される。動作ブロック912は、テストROPエクスプロイトシーケンスのために、様々な命令ローディングプロファイルが展開され得ることを示している。攻撃者は非常に創造的であり、予想しないことをするので、テストROPエクスプロイトシーケンスを展開することは、関心がある有効なコードシーケンスを識別することよりも困難である場合がある。しかしながら、少なくともいくつかのROPエクスプロイトのための命令ローディングプロファイルの展開は、キャッシュモニタ414、是正措置ユニット420、およびプロセッサ402が、ROPエクスプロイトが実行されているかどうかについてより多くの情報に基づいた決定を行うために役立つ場合がある。
【００７９】
図8に戻ると、有効なコードシーケンス300とROPエクスプロイトの両方についての命令ローディングプロファイルがあれば、決定ブロック810は、現在の命令ローディングプロファイルがROPエクスプロイトと類似しているか、または有効なコードシーケンスとは似ていないかをテストするために拡張され得る。
【００８０】
図7、図8、および図9を参照して本明細書に記述した処理は、キャッシュメモリシステム404を監視することによってROPエクスプロイトを検出することに関連する処理であり、必ずしも処理システム100で実行しているソフトウェアプログラムの実行に関連する処理ではないことが指摘されるべきである。
【００８１】
図示および説明した特定の実装形態は例にすぎず、本明細書に指定がない限り、本開示を実装するための唯一の方法として解釈されるべきではない。本開示における様々な例は他の多くの分割ソリューション(partitioning solutions)によって実施され得ることが、当業者には容易に明らかである。
【００８２】
本明細書で説明し、図面に示した、コンポーネント、動作、特徴、および/または機能のうちの1つまたは複数は、単一のコンポーネント、動作、特徴、または機能に再構成および/または結合されてもよく、いくつかのコンポーネント、動作、特徴、または機能に具現化されてもよい。本明細書で説明した様々な特徴および/または態様から逸脱することなしに、さらなる要素、コンポーネント、動作、および/または機能も追加され得る。また、本明細書で説明したアルゴリズムは、効率的にソフトウェアに実装されてもよく、ハードウェアに組み込まれてもよい。
【００８３】
説明において、要素、回路、および機能は、本開示を不要な詳細で曖昧にしないために、ブロック図の形式で示され得る。逆に、図示および説明した特定の実装形態は例にすぎず、本明細書に指定がない限り、本開示を実装するための唯一の方法として解釈されるべきではない。さらに、ブロック定義、および様々なブロック間のロジックの分割は、特定の実装形態の例である。本開示は、他の多くの分割ソリューションによって実施され得ることが当業者には容易に明らかである。ほとんどの部分について、タイミングの問題等に関する詳細が、本開示の完全な理解を得るために必要ではなく、関連分野の当業者の能力の範囲内である場合、そのような詳細は省略されている。
【００８４】
また、例は、フローチャート、流れ図、構造図、またはブロック図として描かれる処理として説明され得る点に留意されたい。フローチャートは動作を逐次処理として説明し得るが、動作の多くは並行して、または同時に実行され得る。さらに、動作の順序は再構成されてもよい。処理は、その動作が完了すると終了する。処理は、方法、関数、手順、サブルーチン、サブプログラム等に対応し得る。処理が関数に対応する場合、その終了は、関数が、関数の呼出しまたはmain関数に戻ることに対応する。
【００８５】
当業者は、情報および信号は、様々な異なる技術および技法のいずれかを使用して表され得ることを理解するであろう。たとえば、本明細書全体にわたって参照され得る、データ、命令、コマンド、情報、信号、ビット、記号、およびチップは、電圧、電流、電磁波、磁界または磁性粒子、光学場または粒子、あるいはそれらの任意の組合せによって表され得る。いくつかの図面は、提示および説明を明確にするために、信号を単一の信号として示すことができる。信号は信号のバスを表すことができ、バスは様々なビット幅を有することができ、本開示は単一のデータ信号を含む任意の数のデータ信号上で実施され得ることを、当業者は理解するであろう。
【００８６】
本明細書で説明した要素は、同じ要素の複数の例を含み得る。これらの要素は、一般的に、数値指示(たとえば、110)によって示されてよく、また、数値表示に続いてアルファベット指示(たとえば、110A)または「ダッシュ」に続く数値表示(たとえば、110-1)によって具体的に示されてよい。以下の説明を容易にするために、大部分の要素の数値表示は、その要素が紹介されている、または完全に論じられている、図面の番号から開始する。
【００８７】
本明細書の「第1の」、「第2の」などの指定を使用する、本明細書の要素へのどのような参照も、そのような限定が明示的に述べられない限り、それらの要素の数量または順序を限定するものではないことが理解されるべきである。むしろ、これらの指定は、複数の要素、または要素の例を区別する便利な方法として、本明細書中で使用され得る。したがって、第1の要素、および第2の要素への参照は、そこで2つの要素だけが使用可能であることを意味するものではなく、第1の要素が、何らかの方法で第2の要素に先行しなければならないということを意味するものでもない。さらに、特に明記しない限り、要素のセットは1つまたは複数の要素を備え得る。
【００８８】
さらに、記憶媒体は、読出し専用メモリ(ROM)、ランダムアクセスメモリ(RAM)、磁気ディスク記憶媒体、光記憶媒体、フラッシュメモリデバイスおよび/または他の機械可読媒体を含む、データを格納するための1つまたは複数のデバイス、ならびに情報を格納するためのプロセッサ可読媒体、および/またはコンピュータ可読媒体を表すことができる。「機械可読媒体」、「コンピュータ可読媒体」、および/または「プロセッサ可読媒体」という用語は、これに限定されないが、そのようなポータブルまたは固定記憶デバイス、光記憶デバイスなどの非一時的媒体、ならびに命令および/またはデータを格納、内蔵、または搬送できる他の様々な媒体を含むことができる。したがって、本明細書で説明した様々な方法は、「機械可読媒体」、「コンピュータ可読媒体」、および/または「プロセッサ可読媒体」に格納され得る命令および/またはデータによって完全にまたは部分的に実装されて、1つまたは複数のプロセッサ、機械、および/またはデバイスによって実行され得る。
【００８９】
さらに、様々な特徴および/または態様が、ハードウェア、ソフトウェア、ファームウェア、ミドルウェア、マイクロコード、あるいはこれらの任意の組合せで実装され得る。ソフトウェア、ファームウェア、ミドルウェア、またはマイクロコードで実装される場合、必要なタスクを実行するためのプログラムコードまたはコードセグメントは、記憶媒体または他のストレージなどの機械可読媒体に格納され得る。プロセッサは必要なタスクを実行することができる。コードセグメントは、手順、機能、サブプログラム、プログラム、ルーチン、サブルーチン、モジュール、ソフトウェアパッケージ、クラス、あるいは命令、データ構造、またはプログラムステートメントの任意の組合せを表すことができる。コードセグメントは、情報、データ、引数、パラメータ、またはメモリコンテンツを渡す、および/または受信することによって、別のコードセグメントまたはハードウェア回路に結合され得る。情報、引数、パラメータ、データ等は、メモリ共有、メッセージパッシング、トークンパッシング、ネットワーク送信等を含む任意の適切な手段を介して、渡す、転送する、または送信することができる。
【００９０】
本明細書に開示した例に関連して説明した様々な例示的論理ブロック、モジュール、回路、要素、および/またはコンポーネントは、汎用プロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)または他のプログラマブルロジックコンポーネント、ディスクリートゲートまたはトランジスタロジック、ディスクリートハードウェアコンポーネント、あるいは本明細書で説明した機能を実行するように設計されたそれらの任意の組合せで実装または実行され得る。汎用プロセッサはマイクロプロセッサでもよいが、代替で、プロセッサは任意の従来のプロセッサ、コントローラ、マイクロコントローラ、またはステートマシンであってもよい。また、プロセッサは、コンピューティングコンポーネントの組合せ、たとえばDSPとマイクロプロセッサとの組合せ、複数のマイクロプロセッサ、DSPコアと連係した1つまたは複数のマイクロプロセッサ、あるいは他の任意のそのような構成として実装され得る。本明細書で説明した特徴を実行するために構成された汎用プロセッサは、そのような特徴を実行するための専用プロセッサと考えられ得る。同様に、汎用コンピュータも本明細書で説明した特徴を実行するために構成された場合、専用コンピュータと考えられ得る。
【００９１】
本明細書に開示された例に関連して説明した方法またはアルゴリズムは、直接ハードウェアで、プロセッサによってソフトウェアモジュールで、あるいは両方の組合せで、処理装置、プログラミング命令、または他の指示の形式で具現化されてもよく、単一のデバイスに含まれてもよく、複数のデバイスにわたって分散されてもよい。ソフトウェアモジュールは、RAMメモリ、フラッシュメモリ、ROMメモリ、EPROMメモリ、EEPROMメモリ、レジスタ、ハードディスク、リムーバブルディスク、CD-ROM、または当技術分野で知られている他の任意の形態の記憶媒体に常駐してよい。記憶媒体は、プロセッサが記憶媒体から情報を読み取り、また記憶媒体に情報を書き込むことができるように、プロセッサに結合され得る。代替では、記憶媒体はプロセッサと一体であってもよい。
【００９２】
本明細書に開示された例および特徴に関連して説明された様々な例示的論理ブロック、モジュール、回路、およびアルゴリズムステップは、電子ハードウェア、コンピュータソフトウェア、または両方の組合せとして実装され得ることが、当業者にはさらに理解されよう。ハードウェアとソフトウェアのこの互換性を明確に示すために、様々な例示的コンポーネント、ブロック、モジュール、回路、およびステップが、一般的にそれらの機能性の観点から上記で説明されている。そのような機能性が、ハードウェアとして実装されるか、ソフトウェアとして実装されるか、またはそれらの組合せとして実装されるかは、システム全体に課された特定のアプリケーションおよび設計選択に依存する。
【００９３】
本明細書で説明した様々な特徴は、異なるシステムに実装され得る。前述の例は、限定するものとして解釈されるべきではない点に留意されたい。例の説明は、例示することを意図するものであり、特許請求の範囲を限定することを意図するものではない。このように、本教示は、他のタイプの装置に容易に適用することができ、また多くの代替、修正、および変形が当業者には明らかであろう。
【符号の説明】
【００９４】
100  例示的処理システム
102  処理装置
104  メインメモリ
106  永続記憶装置
200  呼出しスタック
202A  フレーム
202B  フレーム
202C  フレーム
204  フレームポインタ
206  スタックポインタ
300  コードシーケンス
302  リターン命令
304  ガジェット
306  ガジェット
402  プロセッサ
404  キャッシュメモリシステム
406  命令キャッシュ
408  データキャッシュ
410  統合されたキャッシュ
412  複数のレベルのキャッシュメモリ
414  キャッシュモニタ
416  バス
418  バス
420  是正措置ユニット
422  バス
424  通信インターフェース
426  入力/出力(I/O)インターフェース
428  処理装置
502  インデックス部
504  データ部
600  呼出しスタック
602  コード断片
604  コード断片
606  コード断片
608  コード断片
【図１】
0005944520.tif 000002
【図２】
0005944520.tif 000003
【図３】
0005944520.tif 000004
【図４】
0005944520.tif 000005
【図５】
0005944520.tif 000006
【図６】
0005944520.tif 000007
【図７】
0005944520.tif 000008
【図８】
0005944520.tif 000009
【図９】
0005944520.tif 000010