(57)【特許請求の範囲】
【請求項１】
１つまたは複数のアプリケーションにおけるリターン指向プログラミング（ＲＯＰ）攻撃の検出及び防止のためのコンピュータ実装方法であって、
スタック内の１つまたは複数のＲＯＰガジェットを検出するために、スタック検査デバイスを用いてスタック検査を実行する工程と、
コンテインメントデバイスを用いて前記ＲＯＰ攻撃を封じ込める工程と、
攻撃分析デバイスを用いて前記ＲＯＰ攻撃中に前記スタック内で検出された前記１つまたは複数のＲＯＰガジェットを分析する工程と、
を有し、
前記スタック検査は、
１つまたは複数の障害条件を検出するために、スタックフレームを前記スタックの頂部から前記スタックの底部に向かってスタックウォーキングする工程と、
有効なスタックフレーム及びリターンコードアドレスが存在するか否かを判定する工程と、
有効なスタックフレーム及びリターンコードアドレスが存在しない場合、ＲＯＰ攻撃を示すタイプＩＩＩの障害条件を含む、障害条件タイプを判定する工程と、
を有し、
前記スタックフレームの有効性を、スタックポインタがスタックメモリメモリセクション内を指し示しているか否か及び巻き戻し情報が取得されたか否かによって判定し、
前記リターンコードアドレスの有効性を、前記リターンコードアドレスが実行可能許可を伴うメモリのデータセクション内またはコードメモリセクション内を指し示しているか否かによって判定し、
前記スタックポインタが前記スタックメモリセクション内を指し示していないために有効な前記スタックフレームが存在しないと判定した場合、あるいは前記リターンコードアドレスが前記実行可能許可を伴う前記メモリの前記データセクション内または前記コードメモリセクション内を指し示していないために有効な前記リターンコードアドレスが存在しないと判定した場合に、前記ＲＯＰ攻撃を示す前記タイプＩＩＩの障害条件であると判定する、コンピュータ実装方法。
【請求項２】
前記ＲＯＰ攻撃を封じ込める工程は、
前記検出されたＲＯＰガジェットを含む前記１つまたは複数のアプリケーションの実行を保留する工程と、
実行状況情報をストレージデバイスに格納する工程と、
を含み、
前記実行状況情報は、前記攻撃分析デバイスを用いて分析するためのレジスタ、スタック及びヒープメモリのうちの少なくとも１つを含む、請求項１に記載の方法。
【請求項３】
前記１つまたは複数のＲＯＰガジェットを分析する工程は、
実行されていないＲＯＰガジェットを特定及び分析するために、前方ＲＯＰガジェット検索を実行する工程と、
既に実行されたＲＯＰガジェットを特定及び分析するために、後方ＲＯＰガジェット検索を実行する工程と、
をさらに含む、請求項１に記載の方法。
【請求項４】
前記前方ＲＯＰガジェット検索は、前記スタックの前記底部に到達するまで反復的に繰り返し、前記後方ＲＯＰガジェット検索は、前記スタックの開始に到達するまで反復的に繰り返す、請求項３に記載の方法。
【請求項５】
前記後方ＲＯＰガジェット検索は、閾値レベルによって決定されるスタック位置に到達するまで反復的に繰り返す、請求項３に記載の方法。
【請求項６】
前記ＲＯＰ攻撃は、前記１つまたは複数のＲＯＰガジェットの実行前に、前記１つまたは複数のＲＯＰガジェットを封じ込めることで防止される、請求項１に記載の方法。
【請求項７】
前記障害条件タイプは、タイプＩ、タイプＩＩ及びタイプＩＩＩの障害条件を含む、請求項１に記載の方法。
【請求項８】
１つまたは複数のアプリケーションにおけるリターン指向プログラミング（ＲＯＰ）攻撃の検出及び防止のためのシステムであって、
スタック内の１つまたは複数のＲＯＰガジェットを検出するために、スタック検査を実行するスタック検査デバイスを含む、攻撃検出デバイスと、
前記ＲＯＰ攻撃を封じ込めるコンテインメントデバイスと、
前記ＲＯＰ攻撃中に前記スタック内で検出された前記１つまたは複数のＲＯＰガジェットを分析する攻撃分析デバイスと、
を有し、
前記スタック検査デバイスは、
１つまたは複数の障害条件を検出するために、スタックフレームを前記スタックの頂部から前記スタックの底部に向かってスタックウォーキングするスタックウォーキングデバイスと、
有効なスタックフレーム及びリターンコードアドレスが存在するか否かを判定し、ＲＯＰ攻撃を示すタイプＩＩＩの障害条件を含む、障害条件タイプを判定するアドレス妥当性判定デバイスと、
を有し、
前記スタック検査デバイスは、
前記スタックフレームの有効性を、スタックポインタがスタックメモリメモリセクション内を指し示しているか否か及び巻き戻し情報が取得されたか否かによって判定し、
前記リターンコードアドレスの有効性を、前記リターンコードアドレスが実行可能許可を伴うメモリのデータセクション内またはコードメモリセクション内を指し示しているか否かによって判定し、
前記スタックポインタが前記スタックメモリセクション内を指し示していないために有効な前記スタックフレームが存在しないと判定した場合、あるいは前記リターンコードアドレスが前記実行可能許可を伴う前記メモリの前記データセクション内または前記コードメモリセクション内を指し示していないために有効な前記リターンコードアドレスが存在しないと判定した場合に、前記ＲＯＰ攻撃を示す前記タイプＩＩＩの障害条件であると判定する、システム。
【請求項９】
前記コンテインメントデバイスは、
前記検出されたＲＯＰガジェットを含む前記１つまたは複数のアプリケーションの実行を保留し、実行状況情報をストレージデバイスに格納することで前記ＲＯＰ攻撃を封じ込め、
前記実行状況情報は、前記攻撃分析デバイスを用いて分析するためのレジスタ、スタック及びヒープメモリのうちの少なくとも１つを含む、請求項８に記載のシステム。
【請求項１０】
前記攻撃分析デバイスは、
実行されていないＲＯＰガジェットを特定及び分析するために、前方ＲＯＰガジェット検索を実行し、既に実行されたＲＯＰガジェットを特定及び分析するために、後方ＲＯＰガジェット検索を実行することで、前記１つまたは複数のＲＯＰガジェットを分析する、請求項８に記載のシステム。
【請求項１１】
前記前方ＲＯＰガジェット検索は、前記スタックの前記底部に到達するまで反復的に繰り返し、前記後方ＲＯＰガジェット検索は、前記スタックの開始に到達するまで反復的に繰り返す、請求項１０に記載のシステム。
【請求項１２】
前記後方ＲＯＰガジェット検索は、閾値レベルによって決定されるスタック位置に到達するまで反復的に繰り返す、請求項１０に記載のシステム。
【請求項１３】
前記コンテインメントデバイスは、
前記１つまたは複数のＲＯＰガジェットの実行前に前記１つまたは複数のＲＯＰガジェットを封じ込める、請求項８に記載のシステム。
【請求項１４】
前記障害条件のタイプは、タイプＩ、タイプＩＩ及びタイプＩＩＩの障害条件を含む、請求項８に記載のシステム。
【請求項１５】
コンピュータで読み取り可能なプログラムが格納された記録媒体であって、前記コンピュータで読み取り可能なプログラムが、コンピュータ上で実行されるとき、
スタック内の１つまたは複数のＲＯＰガジェットを検出するために、スタック検査デバイスを用いてスタック検査を実行する工程と、
コンテインメントデバイスを用いて前記ＲＯＰ攻撃を封じ込める工程と、
攻撃分析デバイスを用いて前記ＲＯＰ攻撃中に前記スタック内で検出された前記１つまたは複数のＲＯＰガジェットを分析する工程と、
をコンピュータに実行させ、
前記スタック検査として、
前記コンピュータに、
１つまたは複数の障害条件を検出するために、スタックフレームを前記スタックの頂部から前記スタックの底部に向かってスタックウォーキングする工程と、
有効なスタックフレーム及びリターンコードアドレスが存在するか否かを判定する工程と、
有効なスタックフレーム及びリターンコードアドレスが存在しない場合、ＲＯＰ攻撃を示すタイプＩＩＩの障害条件を含む、障害条件タイプを判定する工程と、
を実行させ、
前記スタックフレームの有効性を、スタックポインタがスタックメモリメモリセクション内を指し示しているか否か及び巻き戻し情報が取得されたか否かによって判定させ、
前記リターンコードアドレスの有効性を、前記リターンコードアドレスが実行可能許可を伴うメモリのデータセクション内またはコードメモリセクション内を指し示しているか否かによって判定させ、
前記スタックポインタが前記スタックメモリセクション内を指し示していないために有効な前記スタックフレームが存在しないと判定した場合、あるいは前記リターンコードアドレスが前記実行可能許可を伴う前記メモリの前記データセクション内または前記コードメモリセクション内を指し示していないために有効な前記リターンコードアドレスが存在しないと判定した場合に、前記ＲＯＰ攻撃を示す前記タイプＩＩＩの障害条件であると判定させるための、前記コンピュータで読み取り可能なプログラムが格納された記録媒体。
【請求項１６】
前記ＲＯＰ攻撃を封じ込める工程は、
前記検出されたＲＯＰガジェットを含む前記１つまたは複数のアプリケーションの実行を保留する工程と、
実行状況情報をストレージデバイスに格納する工程と、
を含み、
前記実行状況情報は、前記攻撃分析デバイスを使用して分析するためのレジスタ、スタック及びヒープメモリのうちの少なくとも１つを含む、請求項１５に記載のコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この出願は、２０１４年  ７月３１日に出願された米国特許仮出願第６２／０３１２０４号を基礎とし、その開示の全てをここに取り込む。
本発明は、リターン指向プログラミング（Return-oriented-programming：ＲＯＰ）攻撃の検出及び防止に関し、特にコード及び／またはスタックの不一致に基づくＲＯＰ攻撃の透過的な検出、抽出及び防止に関する。
【背景技術】
【０００２】
リターン指向プログラミング（ＲＯＰ）は、最も高度で強力な現代の攻撃技法のうちの１つであり、最先端のセキュリティ防御機構（例えばデータ実行防止（ＤＥＰ：Data Execution Prevention）、アドレス空間レイアウトランダム化（ＡＳＬＲ：Address Space layout randomization）等）をバイパスできる。この技法は、その強度ゆえに、現代の攻撃及びセキュリティ上の弱点を突く手段（exploit）で広まってきている。攻撃を検出するためにこれまでいくつかの手法が提案されてきたが、従来の手法は攻撃が発生した後にしかそれを検出できない。さらにほとんどの手法は、プログラム制御フローの分析（例えばバイナリコードまたはソースコードの分解）及びセキュリティ強化コードのプログラム内への挿入等、保護すべきプログラムを理解する必要がある。しかしながら、プログラムがサポート情報（例えばソースコード情報）無しに配備される製造環境では、必ずしもこうした要件を利用できるとは限らない。
【０００３】
ＲＯＰ攻撃を検出するための従来の手法（例えばｋＢｏｕｎｃｅｒ）では、コモディティプロセッサのハードウェア機能（例えばＩｎｔｅｌ  ＣＰＵ（Central Processing Unit）最終分岐記録）により提供される間接的分岐トレースを使用することでＲＯＰ攻撃を検出している。これらのＣＰＵは、最終分岐を特定のレジスタに格納する。例えばｋＢｏｕｎｃｅｒは、リターン命令を記録し、それらに呼び出し命令が先行しているか否かをチェックする。ＲＯＰ攻撃を検出するための従来の他の手法（例えばＲＯＰＰｅｃｋｅｒ）では、現代のＣＰＵの最終分岐記録により発見された互いに連鎖するＲＯＰガジェットの長いシーケンスの存在を識別することでＲＯＰ攻撃を検出する。この手法は、プログラムバイナリ及び関連ライブラリに含まれるＲＯＰガジェットを前処理する必要がある。この手法は、この情報及び最終分岐内のリターンアドレスを使用することで、長い連鎖の存在を判定する。しかしながら、これら従来の手法はいずれもＲＯＰガジェットが既に実行された後にＲＯＰ攻撃を検出できるにすぎない。
【発明の概要】
【０００４】
スタック検査を実行するためのコンピュータ実装方法は、スタック内の１つまたは複数のＲＯＰガジェットを検出するために、スタック検査デバイスを使用する。スタック検査は、１つまたは複数の障害条件を検出するためにスタックフレームをスタックの頂部からスタックの底部に向かってスタックウォーキングする工程と、有効なスタックフレーム及びリターンコードアドレスが存在するか否かを判定する工程と、有効なスタックフレーム及びリターンコードアドレスが存在しない場合、ＲＯＰ攻撃を示すタイプＩＩＩの障害条件を含む、障害条件タイプを判定する工程とを含む。ＲＯＰ攻撃は、コンテインメントデバイスを用いて封じ込まれ、ＲＯＰ攻撃中にスタック内で検出された１つまたは複数のＲＯＰガジェットは攻撃分析デバイスを用いて分析される。
【０００５】
１つまたは複数の応用例におけるリターン指向プログラミング（ＲＯＰ）攻撃の検出及び防止のためのシステムは、攻撃検出デバイスを含み、攻撃検出デバイスは、スタック内で１つまたは複数のＲＯＰガジェットを検出するためにスタック検査を実行するためのスタック検査デバイスを含む。スタック検査デバイスは、１つまたは複数の障害条件を検出するためにスタックフレームをスタックの頂部からスタックの底部に向かってスタックウォーキングするためのスタックウォーキングデバイスと、有効なスタックフレーム及びリターンコードアドレスが存在するか否かを判定し、ＲＯＰ攻撃を示すタイプＩＩＩの障害条件を含む、障害条件タイプを判定するための、アドレス妥当性判定デバイスと、をさらに含む。コンテインメントデバイスはＲＯＰ攻撃を封じ込め、攻撃分析デバイスはＲＯＰ攻撃中にスタック内で検出された１つまたは複数のＲＯＰガジェットを分析する。
【０００６】
コンピュータで読み取り可能なプログラムを含むコンピュータ読み取り可能な記録媒体であって、コンピュータで読み取り可能なプログラムが、コンピュータ上で実行されるとき、スタック内で１つまたは複数のＲＯＰガジェットを検出するためにスタック検査デバイスを使用してスタック検査を実行する工程をコンピュータに実行させる。スタック検査は、１つまたは複数の障害条件を検出するためにスタックフレームをスタックの頂部からスタックの底部に向かってスタックウォーキングする工程と、有効なスタックフレーム及びリターンコードアドレスが存在するか否かを判定する工程と、有効なスタックフレーム及びリターンコードアドレスが存在しない場合、ＲＯＰ攻撃を示すタイプＩＩＩの障害条件を含む、障害条件タイプを判定する工程とをさらに含む。ＲＯＰ攻撃はコンテインメントデバイスを用いて封じ込まれ、ＲＯＰ攻撃中にスタック内で検出された１つまたは複数のＲＯＰガジェットは攻撃分析デバイスを使用して分析される。
【０００７】
本発明のこれら及び他の利点は、当業者にとって以下の詳細な説明及び添付の図面を参照することで明らかになるであろう。
【図面の簡単な説明】
【０００８】
【図１】図１は、本原理の一実施形態による、本原理に好適な処理システムの一例を示している。
【図２】図２は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃を伴うスタックウォーキング及び伴わないスタックウォーキングの一例の図を示している。
【図３】図３は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃の検出、抽出及び防止のための方法の一例の高水準ブロック／フロー図を示している。
【図４】図４は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃検出のための方法の一例のブロック／フロー図を示している。
【図５】図５は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃検出のスタック検査のための方法の一例のブロック／フロー図を示している。
【図６】図６は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃検出のためのスタックウォーキングの方法の一例を示している。
【図７】図７は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）ガジェット分析のための方法の一例のブロック／フロー図を示している。
【図８】図８は、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃の検出、抽出及び防止のためのシステムの一例のブロック／フロー図を示している。
【発明を実施するための形態】
【０００９】
本発明は、本原理の様々な実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃の検出、抽出及び防止を対象としている。一実施形態において、本原理では、プログラムコードとスタック状況との一致を利用する。例えば、スタックからアクティブスタックフレームの関数リターンアドレスのシーケンスを検出するため、スタックウォーキングのバリエーション（例えばスタック巻き戻し）を実行し、本原理では、いずれかの不一致を検出する。
【００１０】
一実施形態において、本原理では、ガジェットが実行される前または（遅くとも）ガジェットから発せられた第１のシステムコールが実行される前に、そのいずれのソースコードも分析または分解することなしにプログラムバイナリを用いてスタック内のＲＯＰガジェットを検出する。このようにＲＯＰ攻撃を事前に緩和することに加えて、本原理では、例えばオフラインのフォレンジック（forensic）分析を用いて攻撃者が注入したＲＯＰガジェット（例えば実行済みのガジェットと未実行のガジェットの両方を含む）の全シーケンスを系統的に抽出する。
【００１１】
特に有用な実施形態において、本原理では、ＲＯＰ攻撃が最先のスタック内に配備された後で実行される前に、または最新のガジェットから第１のＯＳ（Operating System）イベントが実行される前に、ＲＯＰ攻撃を検出する。ほとんどのガジェットは、他のプログラムの分岐、その権限の変更、またはファイルへの書き込み等、大きな影響をもたらすシステムコール等のシステムサービスをトリガすることを意図している。本原理では、ＯＳイベントを介してオペレーティングシステムまたは他のプログラムに向けてプログラムの境界を越えるような影響を受けるＲＯＰ攻撃を緩和する。
【００１２】
一実施形態において、本原理では、プログラムを正しく実行させるためにコードとスタック状況とが一致していなければならないことを有利に活用する。従来、この一致はアプリケーション／プログラムの実行中に厳密にチェックされないため、ＲＯＰガジェットは（例えばＣＰＵ状態において少なくとも一時的に）停止せずに実行される。本原理では、プログラムスタックを効率的にスキャンし、ランタイム時に一致の妥当性を評価するためのスタックウォーキング技法の一変型を介して、ほとんどのネイティブプログラムバイナリ内に埋め込まれた、そのような一致を意味する情報のタイプである、特定の例外ハンドラテーブル情報を用いる。
【００１３】
スタックウォーキング（例えばスタック展開）は、従来はデバッギング、例外ハンドリングで使用される技法、さらに最近ではランタイム最適化技法（例えばメモリ管理のためのスタックウォーク）である。この技法はスタックをスキャンし、サイズが変化するスタックフレームを用いてスタックポインタを進行させることでリターンコードアドレスのシーケンスを発見する。一実施形態において、本原理では、スタックの一致を効率的にチェックし、スタック内にＲＯＰガジェットが配備されているか否かを事前に判定するために、この技法の変形をセキュリティドメインに採用する。検出はスタック内の（例えば潜在的に深い位置にある）スタックフレーム全体に基づくものであり、本原理のシステム及び方法では、現在発生している、または過去に発生した攻撃を検出するだけでなく、様々な実施形態では、将来実行される攻撃を検出できる。
【００１４】
一実施形態において、本原理では、ＲＯＰガジェットを検出し、スタック内でガジェットがその実行前に（またはガジェットからトリガされる第１のＯＳイベントの前に）ＲＯＰ攻撃を受けないようにする。本原理について、ＲＯＰガジェットの観点から説明するが、様々な実施形態では、スタック内のリターンアドレスの任意のタイプの操作が検出及び防止できることに留意されたい。本原理では、（例えば将来実行される、及び／または過去に実行された）スタック内に配備されたＲＯＰガジェットの全シーケンスを発見するための系統的なフォレンジック能力も提供する。
【００１５】
本明細書で説明する実施形態は、全てハードウェアであるか、またはハードウェア要素と、ファームウェア、常駐ソフトウェア、マイクロコード等を含むが、これらに限定されないソフトウェア要素との、両方を含んでいてもよいことを理解されたい。好ましい実施形態において、本発明はハードウェア内に実装される。
【００１６】
各実施形態は、コンピュータまたは任意の命令実行システムによって、あるいはこれらで使用するためのプログラムコードを提供する、コンピュータで使用可能またはコンピュータで読み取り可能な媒体からアクセス可能な、コンピュータプログラム製品を含んでいてもよい。コンピュータで使用可能またはコンピュータで読み取り可能な媒体は、命令実行システム、装置またはデバイスに接続される、あるいはこれらで使用するためのプログラムを格納、通信、伝搬または移送する、任意の装置を含んでいてもよい。媒体は、磁気、光、電子、電磁、赤外線または半導体のシステム（または装置またはデバイス）、あるいは伝搬媒体とすることができる。媒体は、半導体またはソリッドステートメモリ、磁気テープ、取り外し可能なコンピュータディスケット、ランダムアクセスメモリ（ＲＡＭ：Random Access Memory）、読み取り専用メモリ（ＲＯＭ：Read-Only Memory）、リジッド磁気ディスク、光ディスク等の、コンピュータ読み取り可能な記録媒体を含んでいてもよい。
【００１７】
プログラムコードを記憶及び／または実行するのに適したデータ処理システムは、システムバスを介してメモリ要素に直接または間接的に接続された、少なくとも１つのプロセッサを含んでいてもよい。メモリ要素には、プログラムコードの実行中に用いられるローカルメモリ、バルクストレージ、並びに実行中にコードがバルクストレージから読み出される回数を減らすために少なくとも何らかのプログラムコードの一時ストレージを提供するキャッシュメモリを含むことができる。システムには、入力／出力、すなわちＩ／Ｏデバイス（キーボード、ディスプレイ、ポインティングデバイス等を含むがこれらに限定されない）を、直接またはＩ／Ｏコントローラを介して接続してもよい。
【００１８】
システムには、ネットワークアダプタを接続し、データ処理システムを、専用または公衆ネットワークを介して他のデータ処理システムまたはリモートプリンタまたはストレージデバイスに接続できるようにしてもよい。モデム、ケーブルモデム及びイーサネット（登録商標）カードは、現在使用可能なタイプのネットワークアダプタのほんの数例である。
【００１９】
次に、同じ数字が同一または同様の要素を表す図面、まず図１を参照すると、図１には、本原理の一実施形態による、本原理に好適な処理システム１００の一例が示されている。処理システム１００は、システムバス１０２を介して他の構成要素に動作可能に接続された、少なくとも１つのプロセッサ（ＣＰＵ）１０４を含む。システムバス１０２には、キャッシュ１０６、読み取り専用メモリ（ＲＯＭ）１０８、ランダムアクセスメモリ（ＲＡＭ）１１０、入力／出力（Ｉ／Ｏ）アダプタ１２０、サウンドアダプタ１３０、ネットワークアダプタ１４０、ユーザインターフェースアダプタ１５０及びディスプレイアダプタ１６０が動作可能に接続されている。
【００２０】
第１のストレージデバイス１２２及び第２のストレージデバイス１２４は、Ｉ／Ｏアダプタ１２０によりシステムバス１０２に動作可能に接続されている。ストレージデバイス１２２及び１２４は、ディスク記憶装置（例えば、磁気記憶装置または光学ディスク記憶装置）、固体磁気装置等のいずれであってもよい。ストレージデバイス１２２及び１２４は、同じタイプの記憶装置であってもよく、異なるタイプの記憶装置であってもよい。
【００２１】
スピーカ１３２は、サウンドアダプタ１３０によってシステムバス１０２に動作可能に接続されている。トランシーバ１４２は、ネットワークアダプタ１４０によってシステムバス１０２に動作可能に接続されている。ディスプレイデバイス１６２は、ディスプレイアダプタ１６０によってシステムバス１０２に動作可能に接続されている。
【００２２】
第１のユーザ入力デバイス１５２、第２のユーザ入力デバイス１５４及び第３のユーザ入力デバイス１５６は、ユーザインターフェースアダプタ１５０によってシステムバス１０２に動作可能に接続されている。ユーザ入力デバイス１５２、１５４及び１５６は、キーボード、マウス、キーパッド、イメージキャプチャデバイス、モーション感知デバイス、マイクロフォン、あるいはこれらのデバイスのうちの少なくとも２つのデバイスの機能が組み込まれたデバイス等のいずれであってもよい。本原理の趣旨を維持する限りにおいて、他のタイプの入力デバイスを使用してもよい。ユーザ入力デバイス１５２、１５４及び１５６は、同じタイプのユーザ入力デバイスであってもよく、異なるタイプのユーザ入力デバイスであってもよい。ユーザ入力デバイス１５２、１５４及び１５６は、システム１００に情報を入力し、システム１００から情報を出力するために使用される。
【００２３】
処理システム１００は、当業者であれば容易に思いつくような他の要素（図示せず）を含んでいてもよく、特定の要素を除いてもよい。例えば、当業者であれば容易に理解できるが、処理システム１００には、その詳細な実装に応じて他の様々な入力デバイス及び／または出力デバイスを含むことができる。例えば、無線及び／または有線による種々の入力デバイス及び／または出力デバイスを使用できる。さらに、当業者であれば容易に理解できるが、様々な構成において追加のプロセッサ、コントローラ、メモリ等を使用することも可能である。処理システム１００の上記及び他の変形例は、本明細書で提供される本原理の教示によって当業者であれば容易に考えられるであろう。
【００２４】
さらに、図１および図８に関して以下で説明するシステム１００および８００は、本原理のそれぞれの実施形態を実装するためのシステムであることが理解されよう。処理システム１００の一部または全部は、図８のシステム８００の１つまたは複数の要素で実現されてもよい。
【００２５】
さらに、処理システム１００は、例えば図２、図３、図４、図５、図６及び図７で示す方法２００、３００、４００、５００、６００及び７００を含む、本明細書において説明する方法の少なくとも一部を実行してもよいと理解されるべきである。同様に、図８のシステム８００の一部または全部を用いて、図２、図３、図４、図５、図６及び図７で示す方法２００、３００、４００、５００、６００及び７００の少なくとも一部を実行してもよい。
【００２６】
次に、図２を参照すると、図２には、本原理の一実施形態による、ＲＯＰ攻撃を伴う及びＲＯＰ攻撃を伴わないスタックウォーキング２００の一例の図が示されている。一実施形態において、例えばプログラムカウンタ及びスタックポインタのペアの入力を受信すると、スタックウォーキングはスタック頂部から開始し、スタック底部に向かって移動しながら、スタック２０２をスキャンする。スタックポインタは、各スタックフレーム（例えばｓ３、ｓ２、ｓ１等）のサイズに対して反復的に進行し、各工程でリターンコードアドレス（例えばｃ３、ｃ２、ｃ１、ｃ０等）を見つける（例えば反復前進）。所与のコードアドレスにおける各スタックフレーム（例えばｓ３、ｓ２、ｓ１等）のサイズは、プログラムバイナリに存在する、以下で詳細に説明する、巻き戻し情報から見つけることができる。ブロック２０１には、ＲＯＰ攻撃を伴わないスタックウォーキングのための疑似コードの一例（例えばオリジナルコード）が示されている。
【００２７】
ブロック２０４には、本原理による、ＲＯＰ攻撃を伴うスタックウォーキングの一例が示されている。一実施形態において、ＲＯＰ攻撃が発生した時、ＲＯＰガジェットのシーケンスが実行され、この制御フローはオリジナルのアプリケーション／プログラムでは異常である。関数コードの異常な部分（例えばリターンで終わる関数の中央へのリターンまたはジャンプ）を使用することで、リターンアドレス間の距離はもはや有効な関数呼び出しの距離ではない。したがって、スタックウォーキングは、次のスタックフレームの適切なリターンアドレスを見つけられない可能性がある。例えばブロック２０５のコードを含むガジェットによって、リターンアドレス（ｃｘ）がスタック距離（ｓｘ）を与えることになり、その位置で（例えばＲＯＰ攻撃により）無効なリターンアドレスが見つかる。
【００２８】
様々な実施形態において、本原理では、スタック内の全てのスタックフレームを検査してもよく、スタック内に配備されたＲＯＰガジェットをＲＯＰ攻撃が発生する前に検出できる。さらに、攻撃が発生する前に攻撃を緩和することに加えて、本原理では、攻撃がスタック内に注入された可能性のあるガジェットの攻撃シーケンスを、自動的に抽出することが可能であり、これにより様々な実施形態においてフォレンジック分析の系統的能力を提供する。これらの実施形態を以下でより詳細に説明する。
【００２９】
次に、図３を参照すると、図３には、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃の検出、抽出及び防止のための方法３００の一例の高水準ブロック／フロー図が示されている。一実施形態において、本原理によるシステム及び方法は、複数のアプリケーション３１３、３１５及び３１７を含むオペレーティングシステムカーネル３１０と交信できる。
【００３０】
ブロック３２０では、オペレーティングシステムイベント（例えばシステム呼び出し、中断、コンテキスト交換等）が実行され、ブロック３２０におけるオペレーティングシステムイベントの実行により、ブロック３３０では、１つまたは複数のアプリケーション（例えば３１３、３１５及び３１７）においてＲＯＰ攻撃が発生しているか否かを検出するために、本原理によるシステム及び方法がトリガされる。様々な実施形態において、ブロック３３０における検出は、透過的に（例えばどのようなアプリケーションソフトウェアの挿入や修正を伴うことなく）実行される。ブロック３３１で攻撃が検出された場合、ブロック３４０で攻撃が封じ込まれ、ブロック３５０でＲＯＰガジェットが分析され、その後、ブロック３６０で出力が生成される。ブロック３３１で攻撃が検出されない場合、ブロック３３３にてアプリケーションの実行が続行される。
【００３１】
一実施形態において、本原理では３つの主な構成要素を採用する。第１の構成要素は、ブロック３３０でＲＯＰ攻撃を検出するＲＯＰ攻撃検出デバイスである。第２の構成要素は、攻撃の進行を止め、オペレーティングシステムまたは他のプログラムに対するいかなる影響もブロックするために、攻撃下におけるプロセス（例えばアプリケーション／プログラム）の実行を保留することで、ブロック３４０にて検出された攻撃を封じ込めるコンテインメントデバイスである。第３の構成要素は、ブロック３５０で、保留されたプロセス状態を分析し、ＲＯＰガジェットのシーケンス（例えばＲＯＰ攻撃に対して使用される連鎖したオリジナルコードの再使用片であってよい）を発見する、攻撃分析デバイスである。これらの構成要素を以下でより詳細に説明する。
【００３２】
次に、図４を参照すると、図４には、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃検出のための方法４００の一例のブロック／フロー図が示されている。ブロック４２０で、１つまたは複数のオペレーティングシステムイベントが実行され、これによりＲＯＰ攻撃が存在するか否かを判定するためにブロック４３０でＲＯＰ攻撃検出がトリガされる。ブロック４３２で、最適化スイッチがオンに切り替えられたか否かが判定される。最適化スイッチは、いくつかの実施形態において、攻撃検出中にシステム性能に対する最適化を適用するために採用してもよい。この最適化は、性能と攻撃検出のタイミングとの間のトレードオフに関連するため、この最適化は、オペレーティングシステム、アプリケーション等のポリシーに応じて、いくつかの実施形態ではオプションであってもよい。
【００３３】
一実施形態において、最適化スイッチがオフに切り替えられた（または存在しない）場合、ブロック４３４にてスタック検査が実行される。ブロック４３２では、最適化スイッチがオンに切り替えられた場合、ブロック４３６でＲＯＰ攻撃の脅威レベルが閾値（例えば予め設定された閾値）よりも高いか否かを判定するために、この脅威レベルがチェックされる。ブロック４３６で脅威レベルが閾値レベルよりも高いと判定された場合、ブロック４３４でスタック検査が実行され、ブロック４４０にて攻撃が封じ込められる。ブロック４３６で脅威レベルが閾値レベルよりも低いと判定された場合、ブロック４３８ではスタック検査がスキップされる。
【００３４】
ブロック４３６では、本原理の一実施形態による、ＣＰＵハードウェアレベル情報に基づく閾値レベルとの比較のために、ＲＯＰ攻撃脅威レベルの推定が実行される。例えば、現代のＣＰＵは、プログラム実行の効率を向上させるために関数リターンの予測メカニズムを含む。リターンアドレスを予測するために、ＣＰＵは制限されたサイズ内でハードウェアスタックを維持できる（例えば「リターンスタックバッファ」）。プログラムの通常の実行では、リターンは呼び出しにほぼ合致するため、この情報が使用される。しかしながら、ＲＯＰ攻撃が発生した場合、ＲＯＰ攻撃は呼び出しとリターンとのペアを壊すため、リターンに多くの予測誤りが生じる。
【００３５】
一意実施形態において、予測誤りの数は、ハードウェア性能カウンタ（例えばＢＰＵ＿ＭＩＳＳＥＤ＿ＣＡＬＬ＿ＲＥＴ）を用いて効率的に測定できる。このカウンタの予測誤り率を測定することで、ＲＯＰ攻撃の可能性が推定される。ＲＯＰ脅威レベルが閾値レベルより上であるか否かは、ブロック４３６で、この推定が本原理による特定のプログラムに対して定義された閾値よりも高いか低いかによって決定される。
【００３６】
次に、図５を参照すると、図５には、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃検出のスタック検査のための方法５００の一例のブロック／フロー図が示されている。ブロック５３４にて、ＲＯＰ攻撃を検出するためにスタック検査が実行される。一実施形態において、ブロック５０１で、スタックの頂部からスタックウォーキングが開始され、ブロック５０３で、例えばプログラムバイナリから巻き戻し情報を採用することで、スタック内の次のフレームが特定される。ブロック５０５で、スタックポインタがスタックの底部を示す（例えばスタックウォーキングがスタックの底部に到達した）場合、ブロック５０７でスタック検査を終了する。ブロック５０５で、スタックポインタがスタックの底部を示していない場合、ブロック５０９で、スタックフレームから有効なスタックフレーム及び／またはリターンコード（例えばリターンアドレス）が見つかったか否かを判定する。
【００３７】
一実施形態において、ブロック５０９で、有効なスタックフレーム及びリターンコードが見つかった場合、ブロック５０３で、次のスタックフレームを特定するためにスタック検査を進める。ブロック５０９で、有効なスタックフレーム及びリターンコードが見つからなかった場合、本原理を採用する様々な実施形態では、いずれのタイプの障害が存在するかを判定する。
【００３８】
一実施形態において、スタックウォーキングは、説明のために３つのタイプの障害ケースに分類される、複数の理由の障害条件に戻る。例えば動的に生成されたコードが実行された場合、スタックウォーキング方法では（例えば巻き戻し情報の見落としにより）スタックフレームが見つからない場合がある。仮想機械、インタープリタ、エミュレータ等は、このタイプのコードを使用する。このような障害ケースは、実行可能許可を伴うメモリのデータセクション内のコードリターンアドレスにより特徴付けることが可能であり、スタックポインタは有効なスタックメモリセクションに属する。説明を容易にするため、これらのタイプの障害ケースをタイプＩ障害と呼ぶ。
【００３９】
一実施形態において、次のタイプの障害（タイプＩＩと呼ばれる）は、アプリケーション内のほとんどの他のコードが適切な巻き戻し情報を有する一方で、適切な巻き戻し情報を持たないアプリケーション内の特定のコードによって引き起こされる。このケースでは、コードリターンアドレスは実行可能許可を伴うコードメモリセクション内にあり、コードに関する対応するバイナリファイルが存在する。スタックポインタは有効なスタックメモリセクションに属する。第３のタイプの障害（タイプＩＩＩと呼ばれる）は、無効なスタックポインタまたは無効なコードアドレスによって特徴付けることができる。特に、この条件は、コードリターンアドレスがいずれのメモリセクションにも属さない場合、またはコードアドレスが実行不能なメモリセクションに属する場合、またはスタックポインタが有効なスタックメモリセクションに属さない場合に決定される。これは、ＲＯＰ攻撃によって引き起こされる、プログラムカウンタ及びスタックのランタイム状況が一致しない通常の特徴であり、ＲＯＰ攻撃の存在を示すものである。
【００４０】
一実施形態において、ブロック５０９で、障害が検出された（例えば有効なスタックフレーム及びリターンコードがない）場合、ブロック５１１で、最初に障害をチェックし、障害がタイプＩであるかタイプＩＩであるかを判定する。ブロック５１１でタイプＩまたはタイプＩＩの障害であると判定された場合、ブロック５１５で耐障害スタックウォーキング（resilient stack walking）を実行する。耐障害スタックウォーキングでは、タイプＩＩＩ障害を回避しながら、有効なスタックフレームのスタックを（例えばブルートフォース（brute force）様式で）スキャンしてもよい。ブロック５１７で、ブロック５１５の耐障害スタックウォーキングがスタックの底部に到達したと判定された場合、ブロック５０７でスタック検査が停止されて終了する。ブロック５１７で、スタックの底部に到達していないと判定された場合、ブロック５０９で、有効なスタックフレーム及びリターンコードが存在するか否かがチェックされる。
【００４１】
一実施形態において、ブロック５１１で、タイプＩまたはタイプＩＩの障害が見つからない場合、ブロック５１３で、タイプＩＩＩ障害が存在するか否かが判定される。タイプＩＩＩ障害が検出された場合、ブロック５４０で攻撃が封じ込められる。タイプＩＩＩ障害が存在しない場合、ブロック５０７でスタック検査を終了する。いくつかの実施形態において、ブロック５１１でタイプＩまたはタイプＩＩの障害が検出されない場合、ブロック５１３で障害はタイプＩＩＩ障害であると自動的に決定される。
【００４２】
次に、図６を参照すると、図６には、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃検出のためのスタックウォーキングの方法６００の一例が示されている。一実施形態において、本原理を採用し、スタックの頂部６０５から開始し、スタックの底部６１７に到達するまで、スタック６０１を上方にスキャンする。一実施形態において、フレーム６０３は、第１の無効なフレーム６０７を検出するためにスタック頂部から連続してスキャンされる。ブロック６１１及び６１４で、タイプＩ及び／またはタイプＩＩの障害が検出される（及び停止せずにスキャンされる）可能性があるが、ブロック６１５で、検出ポイント（ＰＯＤ）６０９でタイプＩＩＩ障害が検出された場合、検出された攻撃はブロック６４０にて封じ込められる。
【００４３】
一実施形態において、攻撃の封じ込めは、ブロック６４０にて、コンテインメントデバイスによって実行される。攻撃のいずれの進行も回避し、コンピューティングシステム内部で影響をブロックするために、ブロック６４０で、見つかった疑わしいプロセス（例えばＲＯＰ攻撃）の封じ込めが実行される。ブロック６４０における攻撃の封じ込めには、一実施形態による２つのタスクを実行する。第１に、見つかったプロセスの実行を保留する。第２に、攻撃分析デバイスを使用して攻撃の詳細を判断するために、実行状況情報（例えばオフライン分析のための全てのレジスタ、スタック及びヒープメモリ）をストレージデバイス内に格納する（図７に関して以下で詳細に説明する）。加えて、タイプＩＩＩが検出されたポイントのプログラムカウンタ及びスタックポインタのペアを、ストレージデバイスに格納する。この実行状況情報は検出ポイント（ＰＯＤ）と呼んでもよく、攻撃分析デバイスを使用して攻撃を分析するための開始ポイントである（図７に関して以下で詳細に説明する）。
【００４４】
次に、図４及び図５を参照しつつ図７を参照すると、図７には、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）ガジェット分析のための方法７００の一例のブロック／フロー図が示されている。ブロック７５０にて、一実施形態による攻撃分析デバイスを使用してＲＯＰガジェット分析を実行する。ブロック７５０におけるガジェット分析は、保存された疑わしいプロセスのランタイム状況から攻撃（例えばＲＯＰ攻撃）の詳細を決定する。ＲＯＰ攻撃において、攻撃者は、違法コードの一部（例えばＲＯＰガジェット）を示す連鎖する一連のリターンアドレスを置く。こうした一連のコード（例えばＲＯＰガジェット）は、オリジナルプログラムでは意図していない悪意のある論理（例えば悪意のあるプログラム関数）を実行することがある。一実施形態において、本原理による、ガジェットの検索及び分析７５０は、ブロック７０１の前方ＲＯＰガジェット検索及び／または分析と、ブロック７０３の後方ＲＯＰガジェット検索及び／または分析との両方を実行するため、ＰＯＤからスタックのスキャンを開始することで、ＲＯＰガジェットのシーケンスを自動的に見つけることができる。
【００４５】
一実施形態において、前方ＲＯＰガジェット検索７０１は、ブロック７１１でＰＯＤからスタックの検索を開始する。ＰＯＤは、ブロック４３０で攻撃検出器デバイスによって検出され、ブロック７４０にて、攻撃の封じ込め中にストレージデバイスに封じ込められる。本原理を採用して、スタックポインタのサイズだけスタックポインタをスタックの底部に向けて前進させ、ブロック７１２で、スタック内の次のリターンアドレスを見つけるためのサブルーチンとして、ブロック５０１で実行されるスタックウォーキングと同様のスタックウォーキング方法を適用してもよい。ブロック７１３にてスタックの底部に到達した場合、ブロック７１４にて最後に取得されたＲＯＰガジェットをＲＯＰガジェットシーケンスの終端としてマークし、前方ＲＯＰガジェット検索７０１を停止する。
【００４６】
一実施形態において、スタックの底部に到達していない場合、前方ＲＯＰガジェット検索は、ブロック７１７にて、スタックウォーキング方法が有効なリターンアドレスを戻すか否かを判定する。ブロック７１７にて、無効なリターンアドレス（例えばコードアドレス）が戻された場合、ブロック７１６にて、無効なアドレスに呼び出し命令が先行しているか否かが判定される。例えば安全なプログラム制御フローでは、これは呼び出し命令によってプッシュされる値であり、呼び出し命令が先行しているはずである。しかしながら、一般に、ＲＯＰでは、このアドレスが必ずしも呼び出し命令に先行していないＲＯＰガジェットのエントリを示す。この条件に見合わない（例えばアドレスに有効な呼び出し命令が先行していない）場合、ブロック７１５にて、リターンコードアドレスがＲＯＰガジェットとして記録され、ブロック７１２にて、次のリターンアドレスが特定される。アドレスに有効な呼び出し命令が先行している場合、前方ＲＯＰガジェット検索は、本原理によるいずれのＲＯＰガジェットも記録せずに、ブロック７１２にて次のリターンアドレスを特定する。
【００４７】
一実施形態において、いくつかのＲＯＰガジェットが検出時点で既に実行されている場合、ＰＯＤはまだ実行されていない第１のＲＯＰガジェットを示す。こうしたケースでは、前方ＲＯＰガジェット検索７０１がＲＯＰガジェットのまだ実行されていない部分シーケンスを検索及び／または分析した後、本原理の実施形態による後方ＲＯＰガジェット検索７０３を実行し、既に実行されたＲＯＰガジェットを検索及び／または分析する。
【００４８】
一実施形態において、ブロック７２１にて、後方ＲＯＰガジェット検索７０３がＰＯＤから開始し、ブロック７２２にて、次のリターンアドレスを特定するため及び／またはＲＯＰガジェットとなる命令を見つけるために、スタックの開始に向けてスタックポインタのサイズだけ検索を前進させる。前進はブロック７２３にて、スタックの開始まで、または閾値条件（例えば所定の閾値レベル）によって決められたスタック位置まで続行してもよい。ブロック７２３にて、スタックの開始（または閾値条件）に到達したと判定した場合、最後に見つかったＲＯＰガジェットは、ブロック７２４にて、ＲＯＰガジェットシーケンスの開始としてマークされ、ブロック７０５にて、後方ＲＯＰガジェット検索７０３が完了する。
【００４９】
一実施形態において、ブロック７２３にて、スタックの開始（または閾値条件）に到達していないと判定した場合、検索は、スタックウォーキングサブルーチンが無効なアドレスを戻したか否か、及び無効なアドレスに呼び出し命令が先行しているか否かを、ブロック７２６にて判定する。無効なアドレスが見つかった場合、及びブロック７２６で無効なアドレスに呼び出し命令が先行していない場合、ブロック７２５にて、リターンコードアドレスをＲＯＰガジェットとして記録し、ブロック７２２にて、次のリターンアドレスを特定する。アドレスが有効であり、ブロック７２６にて、有効な呼び出し命令が先行していると判定した場合、後方ＲＯＰガジェット検索は、本原理の一実施形態により、いずれのＲＯＰガジェットも記録せずにブロック７２２にて次のリターンアドレスを特定する。
【００５０】
次に、図４、図５及び図７を参照しつつ図８を参照すると、図８には、本原理の一実施形態による、リターン指向プログラミング（ＲＯＰ）攻撃の検出、抽出及び防止のためのシステム８００の一例のブロック／フロー図が示されている。説明が煩雑とならないよう、システム８００の多くの態様を単一の形で説明するが、システム８００の説明で記載する複数のアイテムには同様の態様を適用できる。例えば、攻撃検出器８０３について単一のＲＯＰ攻撃を記載しているが、本原理の趣旨を維持する限りにおいて、本原理が教示する複数の攻撃検出器８０３により複数のＲＯＰ攻撃を検出してもよい。さらに、攻撃検出器８０３は、本原理の趣旨を維持する限りにおいて、複数の形に拡張可能なシステム８００に関連する、単なる一態様であることが理解されよう。
【００５１】
本原理の様々な実施形態によるシステム８００は、バス８０１に接続される、１つまたは複数の攻撃検出器８０３、１つまたは複数のコンテインメントデバイス８０５、１つまたは複数の攻撃分析デバイス８０７、１つまたは複数のスタック検査デバイス８０９、１つまたは複数の最適化スイッチ８１１、１つまたは複数のスタックウォーキングデバイス８１３、１つまたは複数のアドレス妥当性判定デバイス８１５、並びに１つまたは複数のストレージデバイス８１７を含むことができる。
【００５２】
一実施形態において、１つまたは複数の攻撃検出器８０３を用いて、本原理による（例えばブロック４３０で）ＲＯＰ攻撃を検出してもよく、また（例えばブロック４３６で）ＲＯＰ脅威が閾値レベルよりも上であるかまたは下であるかを判定してもよい。１つまたは複数のコンテインメントデバイス８０５を用いて、攻撃のいずれの進行も防止し（例えばコンピューティングシステム、アプリケーション等における）、いずれの攻撃の影響もブロックするために、（ブロック４４０で）ＲＯＰ攻撃を封じ込めてもよく、ＲＯＰ攻撃情報をストレージデバイス８１７に格納してもよい。攻撃検索及び分析デバイス８０７は、（例えばブロック７５０で）ＲＯＰガジェットの検索及び分析を実行してもよい。攻撃検索及び分析デバイス８０７は、本原理の様々な実施形態による、（例えばブロック７０１で）前方ＲＯＰガジェット検索及び／または（例えばブロック７０３で）後方ＲＯＰガジェット検索を実行してもよい。
【００５３】
一実施形態において、スタック検査デバイス８０９を用いて、ＲＯＰ攻撃を検出するために（例えばブロック５３４で）１つまたは複数のスタックを検査し、障害のタイプ（例えばタイプＩ、ＩＩ及び／またはＩＩＩ）を決定する。最適化スイッチ８１１を用いて（例えばブロック４３２で）、オーバーヘッドコストを低下させて速度を上げてもよく、本原理が適用されるシステムのハードウェアに依存してもよい。一実施形態において、スタックウォーキングデバイス８１３を用いて、スタックウォーキング及び／または耐障害スタックウォーキングを（例えばそれぞれブロック５０１及び５１５で）実行してもよく、アドレス妥当性判定デバイス８１５は、本原理の様々な実施形態により、（例えばブロック５０９で）有効なスタックフレーム及び／またはリターンアドレスを見つけたか否かを判定してもよい。
【００５４】
上述した説明は、あらゆる点で説明的かつ例示的なものであり、制限的なものではないと理解されるべきであり、本明細書で開示する本発明の範囲は、詳細な説明から決定されるべきではなく、特許法で認められた最大限の広さに基づいて解釈される特許請求の範囲から決定されるべきである。「追加情報」と題する出願に対する付属書に追加の情報が与えられる。本明細書で示し、説明した実施形態は、本原理に関する例示にすぎないこと、また当業者は、本発明の範囲及び主旨から逸脱することなく、様々な変更を実施してもよいと理解されるべきである。当業者は、本発明の範囲及び主旨から逸脱することなく、他の様々な特徴の組み合わせを実施できる。
【図１】
0006494744.tif 000002
【図２】
0006494744.tif 000003
【図３】
0006494744.tif 000004
【図４】
0006494744.tif 000005
【図５】
0006494744.tif 000006
【図６】
0006494744.tif 000007
【図７】
0006494744.tif 000008
【図８】
0006494744.tif 000009