(57)【要約】  ターゲット関数をコールするためにコール命令に応答して、関数リターン・アドレスに基づいて置換されるコール・パス識別子が維持される。コール・パス識別子は、ソース値に関連付けられる認証コードを生成及びチェックするための、認証コードの生成及びチェック命令用の修飾子値として使用される。認証コード・チェック命令に応答して、期待される認証コードがソース値について以前に生成された認証コードと不一致である場合、エラー・ハンドリング応答がトリガされる。これは、コードのある一部において有効であるアドレス・ポインタを、コードの別の部分で再利用させるように試みる攻撃を妨げるために有用である。
2020533683.tif 000002
【特許請求の範囲】
【請求項１】
命令を実行するための処理回路と、
コール・パス識別子を記憶するためのコール・パス識別子記憶要素であり、ターゲット関数をコールするためのコール命令に応答して、前記処理回路は、前記コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、前記コール・パス識別子を関数リターン・アドレスで置換するように構成される、コール・パス識別子記憶要素と
を備え、
第１のソース値を特定する認証コード生成命令に応答して、前記処理回路は前記第１のソース値及び少なくとも１つの修飾子値に依存する認証コードを生成するように構成され、
以前に生成された認証コードに関連付けられる第２のソース値を特定する認証コード・チェック命令に応答して、前記処理回路は前記以前に生成された認証コードが、前記第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックし、前記以前に生成された認証コードと前記期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガするように構成され、
前記認証コード生成命令のうちの少なくとも１つの変形、及び前記認証コード・チェック命令のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値は、前記コール・パス識別子記憶要素に記憶される前記コール・パス識別子に依存する値を含む、装置。
【請求項２】
前記コール・パス識別子に依存する前記値は、前記コール・パス識別子の暗号化されたバージョンを含む、請求項１に記載の装置。
【請求項３】
前記認証コード生成命令の第１の変形及び前記認証コード・チェック命令の第１の変形について、前記少なくとも１つの修飾子値は、前記コール・パス識別子に依存する前記値及びさらなる修飾子値を含む、請求項１又は２に記載の装置。
【請求項４】
前記さらなる修飾子値はスタック・ポインタを含む、請求項３に記載の装置。
【請求項５】
前記認証コード生成命令の第２の変形及び前記認証コード・チェック命令の第２の変形について、前記少なくとも１つの修飾子値は、前記コール・パス識別子に依存する前記値を含み、前記認証コード生成命令の少なくとも１つの他の変形及び前記認証コード・チェック命令の少なくとも１つの他の変形についての前記少なくとも１つの修飾子値の１つとして使用されるさらなる修飾子値には依存しない、請求項１から４までのいずれかに記載の装置。
【請求項６】
前記認証コード生成命令のさらなる変形及び前記認証コード・チェック命令のさらなる変形について、前記少なくとも１つの修飾子値は前記コール・パス識別子に依存しない、請求項１から５までのいずれかに記載の装置。
【請求項７】
モード表示値を記憶するためのモード記憶要素を備え、
前記モード表示値が第１の値を有する場合に実行される認証コード生成命令又は認証コード・チェック命令について、前記少なくとも１つの修飾子値は、前記コール・パス識別子に依存する前記値を含み、
前記モード表示値が第２の値を有する場合に実行される認証コード生成命令又は認証コード・チェック命令について、前記少なくとも１つの修飾子値は、前記コール・パス識別子に依存しない、
請求項１から６までのいずれかに記載の装置。
【請求項８】
前記第１のソース値はメモリ・アドレスを含み、前記認証コード生成命令に応答して、前記処理回路は、前記メモリ・アドレスのビットのサブセットを前記生成された認証コードで置き換えるように構成される、請求項１から７までのいずれかに記載の装置。
【請求項９】
前記第２のソース値はメモリ・アドレスを含み、前記エラー・ハンドリング応答は前記メモリ・アドレスを無効なアドレスに変えることを含む、請求項１から８までのいずれかに記載の装置。
【請求項１０】
前記エラー・ハンドリング応答は例外条件を伝達することを含む、請求項１から９までのいずれかに記載の装置。
【請求項１１】
前記コール命令に応答して、前記処理回路は、可逆の置換関数を使用して前記コール・パス識別子を前記関数リターン・アドレスで置換するように構成され、
前記ターゲット関数から以前の処理へのリターンをトリガするための関数リターン命令に応答して、前記処理回路は、前記コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、前記コール・パス識別子記憶要素に記憶される前記コール・パス識別子及び前記関数リターン・アドレスに対する逆置換関数を実施するように構成される、
請求項１から１０までのいずれかに記載の装置。
【請求項１２】
前記処理回路は、前記第１のソース値及び前記少なくとも１つの修飾子値に対して暗号関数を実施することにより前記認証コードを生成するように構成され、前記暗号関数は認証キー値に依存している、
請求項１から１１までのいずれかに記載の装置。
【請求項１３】
前記処理回路は、前記認証コード生成命令のプロパティに応じて複数の認証キー値の中から前記認証キー値を選択するように構成される、請求項１２に記載の装置。
【請求項１４】
コール・パス識別子保存命令に応答して、前記処理回路は、前記コール・パス識別子に依存する値をデータ・ストアに保存するように構成され、
コール・パス識別子リストア命令に応答して、前記処理回路は、前記データ・ストアから読み出した値に応じて前記コール・パス識別子記憶要素に値をリストアするように構成される、
請求項１から１３までのいずれかに記載の装置。
【請求項１５】
前記コール・パス識別子保存命令に応答して、前記処理回路は、前記コール・パス識別子の暗号化されたバージョンを前記データ・ストアに保存するように構成され、
前記コール・パス識別子リストア命令に応答して、前記処理回路は、前記データ・ストアから読み出した前記値を復号化して、前記復号化された値を前記コール・パス識別子記憶要素に記憶するように構成される、
請求項１４に記載の装置。
【請求項１６】
前記コール命令以外のコール・パス識別子置換命令に応答して、前記処理回路は、前記コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、前記コール・パス識別子を、前記コール・パス識別子置換命令によって指定されるソース・オペランドと置換するように構成される、
請求項１から１５までのいずれかに記載の装置。
【請求項１７】
前記処理回路は、複数の特権レベルのうちの１つにおいて動作するように構成され、
前記処理回路は、前記処理回路の現在の特権レベルがしきい値特権レベルよりも低い場合、前記コール・パス識別子置換命令の正常な実行を妨げるように構成される、
請求項１６に記載の装置。
【請求項１８】
ターゲット関数のコールに応答して、コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、前記コール・パス識別子記憶要素に記憶されるコール・パス識別子を関数リターン・アドレスと置換することと、
第１のソース値及び少なくとも１つの修飾子値に応じて認証コードを生成するために、前記第１のソース値に対して認証コード生成演算を実施することと、
以前に生成された認証コードが、第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックし、前記以前に生成された認証コードと前記期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガするために、前記以前に生成された認証コードに関連付けられる前記第２のソース値に対して認証コード・チェック演算を実施することと
を含み、
前記認証コード生成演算のうちの少なくとも１つの変形、及び前記認証コード・チェック演算のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値は、前記コール・パス識別子記憶要素に記憶される前記コール・パス識別子に依存する値を含む、データ処理方法。
【請求項１９】
請求項１８に記載の方法を実施するためのデータ処理装置を制御するための、コンピュータ・プログラム。
【請求項２０】
命令を実行するための命令実行環境を提供するようにホスト・データ処理装置を制御するためのコンピュータ・プログラムであって、
前記命令実行環境において前記命令の実行を制御するための処理プログラム・ロジックと、
コール・パス識別子を記憶するためのコール・パス識別子データ構造であり、ターゲット関数をコールするためのコール命令に応答して、前記処理プログラム・ロジックは、前記コール・パス識別子データ構造に記憶される更新されたコール・パス識別子を生成するために前記コール・パス識別子を関数リターン・アドレスで置換するように前記ホスト・データ処理装置を制御するように構成される、コール・パス識別子データ構造と
を備え、
第１のソース値を特定する認証コード生成命令に応答して、前記処理プログラム・ロジックは、前記第１のソース値及び少なくとも１つの修飾子値に依存する認証コードを生成するように前記ホスト・データ処理装置を制御するように構成され、
以前に生成された認証コードに関連付けられる第２のソース値を特定する認証コード・チェック命令に応答して、前記処理プログラム・ロジックは、前記以前に生成された認証コードが、前記第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックし、前記以前に生成された認証コードと前記期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガするように前記ホスト・データ処理装置を制御するように構成され、
前記認証コード生成命令のうちの少なくとも１つの変形、及び前記認証コード・チェック命令のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値は、前記コール・パス識別子データ構造に記憶される前記コール・パス識別子に依存する値を含む、
コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本技法、データ処理の分野に関する。
【背景技術】
【０００２】
いくつかのデータ処理システムは、攻撃者が処理回路にプログラム・コードの無認可のセクションを実行させようと試行する場合に潜在的な攻撃に対して防御するメカニズムを有することができる。そのような攻撃に対して防御する１つ方法は、予めメモリにインストールされた信頼できるソフトウェアのみが実行され得るように、メモリへの実行可能なコードの書き込みを禁止することであり得る。しかしながら、そのような制限を設けても、潜在的な攻撃はコードの再利用を含むことがあり、この場合、コード内に存在する間接的な分岐命令を妨げることにより、正当に実行可能なコードのスニペットがつなぎ合わされる。例えば、攻撃者が分岐命令のターゲット・アドレスを生成するために使用されるレジスタ内の値を変更する場合、攻撃者は、プロセッサがコードの不適切なポイントに分岐するよう騙すことができ、例えばパスワード・チェック又は認証動作などのセキュリティ的な保護を与えることのできるコードの一定のセクションをバイパスさせる。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】Ｂｏｒｇｈｏｆｆら、「ＰＲＩＮＣＥ-ａ  ｌｏｗ−ｌａｔｅｎｃｙ  ｂｌｏｃｋ  ｃｉｐｈｅｒ  ｆｏｒ  ｐｅｒｖａｓｉｖｅ  ｃｏｍｐｕｔｉｎｇ  ａｐｐｌｉｃａｔｉｏｎｓ．」、Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  ｔｈｅ  Ｔｈｅｏｒｙ  ａｎｄ  Ａｐｐｌｉｃａｔｉｏｎ  ｏｆ  Ｃｒｙｐｔｏｌｏｇｙ  ａｎｄ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ、シュプリンガー、ベルリン、ハイデルベルク、２０１２年
【非特許文献２】Ｊｅａｎら、「Ｔｗｅａｋｓ  ａｎｄ  ｋｅｙｓ  ｆｏｒ  ｂｌｏｃｋ  ｃｉｐｈｅｒｓ：  ｔｈｅ  ＴＷＥＡＫＥＹ  ｆｒａｍｅｗｏｒｋ．」、Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  ｔｈｅ  Ｔｈｅｏｒｙ  ａｎｄ  Ａｐｐｌｉｃａｔｉｏｎ  ｏｆ  Ｃｒｙｐｔｏｌｏｇｙ  ａｎｄ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ、シュプリンガー、ベルリン、ハイデルベルク、２０１４年
【非特許文献３】Ｒｏｂｅｒｔ  Ｂｅｄｉｃｈｅｋ、「Ｓｏｍｅ  Ｅｆｆｉｃｉｅｎｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅｓ」、１９９０年冬季ＵＳＥＮＩＸ  Ｃｏｎｆｅｒｅｎｃｅ、５３〜６３頁
【発明の概要】
【課題を解決するための手段】
【０００４】
少なくともいくつかの実例は、命令を実行するための処理回路と、コール・パス識別子を記憶するためのコール・パス識別子記憶要素であり、ターゲット関数をコールするためのコール命令に応答して、処理回路は、コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、コール・パス識別子を関数リターン・アドレスで置換するように構成される、コール・パス識別子記憶要素とを備え、第１のソース値を特定する認証コード生成命令に応答して、処理回路は第１のソース値及び少なくとも１つの修飾子値（ｍｏｄｉｆｉｅｒ  ｖａｌｕｅ）に依存する認証コードを生成するように構成され、以前に生成された認証コードに関連付けられる第２のソース値を特定する認証コード・チェック命令に応答して、処理回路は以前に生成された認証コードが、第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックし、以前に生成された認証コードと期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガするように構成され、認証コード生成命令のうちの少なくとも１つの変形、及び認証コード・チェック命令のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値はコール・パス識別子記憶要素に記憶されるコール・パス識別子に依存する値を含む、装置を提供する。
【０００５】
少なくともいくつかの実例は、ターゲット関数のコールに応答して、コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、コール・パス識別子記憶要素に記憶されるコール・パス識別子を関数リターン・アドレスと置換することと、第１のソース値及び少なくとも１つの修飾子値に応じて認証コードを生成するために第１のソース値に対して認証コード生成演算を実施することと、以前に生成された認証コードが、第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックし、以前に生成された認証コードと期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガするために、以前に生成された認証コードに関連付けられる第２のソース値に対して認証コード・チェック演算を実施することとを含み、認証コード生成演算のうちの少なくとも１つの変形、及び認証コード・チェック演算のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値はコール・パス識別子記憶要素に記憶されるコール・パス識別子に依存する値を含む、データ処理方法を提供する。
【０００６】
少なくともいくつかの実例は、上述の方法を実施するためのデータ処理装置を制御するための、コンピュータ・プログラムを提供する。コンピュータ・プログラムは記録媒体に記憶することができる。記録媒体は非一時的な記録媒体であってもよい。
【０００７】
少なくともいくつかの実例は、命令を実行するための命令実行環境を提供するようにホスト・データ処理装置を制御するためのコンピュータ・プログラムであって、命令実行環境において命令の実行を制御するための処理プログラム・ロジックと、コール・パス識別子を記憶するためのコール・パス識別子データ構造であり、ターゲット関数をコールするためのコール命令に応答して、処理プログラム・ロジックはホスト・データ処理装置が、コール・パス識別子データ構造に記憶される更新されたコール・パス識別子を生成するために、コール・パス識別子を関数リターン・アドレスで置換するように制御するように構成される、コール・パス識別子データ構造とを備え、第１のソース値を特定する認証コード生成命令に応答して、処理プログラム・ロジックはホスト・データ処理装置が、第１のソース値及び少なくとも１つの修飾子値に依存する認証コードを生成するように制御するように構成され、以前に生成された認証コードに関連付けられる第２のソース値を特定する認証コード・チェック命令に応答して、処理プログラム・ロジックはホスト・データ処理装置が、以前に生成された認証コードが、第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックし、以前に生成された認証コードと期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガするように、制御するように構成され、認証コード生成命令のうちの少なくとも１つの変形、及び認証コード・チェック命令のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値はコール・パス識別子データ構造に記憶されるコール・パス識別子に依存する値を含む、コンピュータ・プログラムを提供する。
【０００８】
命令実行環境を提供するためのホスト・データ処理装置を制御するためのコンピュータ・プログラムは、記録媒体に記録することができる。記録媒体は非一時的な記録媒体であってもよい。
【０００９】
本技法のさらなる態様、特徴及び利点は、添付の図面と併せて読まれる実例の以下の説明から明らかとなろう。
【図面の簡単な説明】
【００１０】
【図１】データ処理装置の実例を概略的に示す図である。
【図２】コール・パス識別子の使用の図である。
【図３Ａ】認証コード生成命令の実例の図である。
【図３Ｂ】認証コード・チェック命令の実例の図である。
【図４Ａ】修飾子値がコール・パス識別子に依存する認証コード生成命令の実例の図である。
【図４Ｂ】修飾子値がコール・パス識別子に依存する認証コード・チェック命令の実例の図である。
【図５Ａ】モード表示値が修飾子値の選択を制御する認証コード生成命令の実例の図である。
【図５Ｂ】モード表示値が修飾子値の選択を制御する認証コード・チェック命令の実例の図である。
【図６Ａ】コール・パス識別子の保存命令の実例の図である。
【図６Ｂ】コール・パス識別子のリストア命令の実例の図である。
【図７】コール・パス識別子置換命令の実例を示す。
【図８】関数コールに応答してコール・パス識別子を置換する方法を図示する流れ図である。
【図９】関数リターンに応答してコール・パス識別子の置換を反転させる方法を図示する流れ図である。
【図１０】認証コード生成命令を処理する方法を図示する流れ図である。
【図１１】認証コード・チェック命令を処理する方法を図示する流れ図である。
【図１２】使用され得るシミュレータ実装形態の図である。
【発明を実施するための形態】
【００１１】
装置は、命令を実行するための処理回路と、コール・パス識別子を記憶するためのコール・パス識別子記憶要素とを有する。ターゲット関数をコールするためのコール命令に応答して、処理回路はコール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、コール・パス識別子を関数リターン・アドレスと置換することができる。第１のソース値を特定する認証コード生成命令に応答して、処理回路は第１のソース値及び少なくとも１つの修飾子値に依存する認証コードを生成するように構成される。以前に生成された認証コードに関連付けられる第２のソース値を特定する認証コード・チェック命令に応答して、処理回路は以前に生成された認証コードが第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードと一致するかどうかをチェックすることができる。処理回路は、以前に生成された認証コードと期待される認証コードとの間に不一致が検出される場合はエラー・ハンドリング応答をトリガすることができる。認証コード生成命令のうちの少なくとも１つの変形、及び認証コード・チェック命令のうちの少なくとも１つの変形について、前記少なくとも１つの修飾子値はコール・パス識別子記憶要素に記憶されるコール・パス識別子に依存する値を含む。
【００１２】
これは、コード再利用攻撃に対する防御のための技法を提供する。コール・パス識別子は、プログラム内で実行の現在のポイントにつながる関数コールの履歴の記録を提供する。認証コード生成命令は、分岐アドレスを生成するためのベースとして使用される値が生成されるプログラム内のポイントにおいて使用することができ、第１のソース値及び修飾子値に依存する認証コードを生成することにより、これは修飾子値に関連付けられるいくつかのプログラムのコンテキストに結び付けることができる。コール・パス識別子を認証コード生成命令の少なくとも１つの変形についての修飾子値として使用することにより、これはソース値の使用をプログラム内の特定のポイントに結び付けるより強力な手段を提供することができるが、それは同一の関数がプログラムを通じて取られる異なるルートでコールされたとしても、コール・パス識別子は実行の現在のポイントにつながる関数コールの履歴に応じて異なる値を取ることができ、したがって一定の関数コールがバイパスされているケースか、又はプログラム内の特定の場所に異なるルートが取られているケースかを特定することができるからである。したがって、ソース値が使用される必要がある時点では、認証コード・チェック命令はその値を第２のソース値として指定することができ、その第２のソース値について以前に生成された認証コードを、第２のソース値及び少なくとも１つの修飾子値に依存する期待される認証コードに対してチェックすることができ、それによって、以前に生成された認証コードと期待される認証コードとが一致しない場合、エラー・ハンドリング応答をトリガすることができる。ひいては、コール・パス識別子を、認証コードを生成するための修飾子として使用することにより、これは攻撃者がコードの一部で正当であり得るデータ値をコードの異なる部分へ代入することをより難しいものとすることができる。
【００１３】
いくつかの実例において、コール・パス識別子に依存する値は単純にコール・パス識別子そのものであり得る。ひいては、コール・パス識別子に応じた修飾子を使用する認証コードの生成及びチェック命令の変形は、コール・パス識別子記憶要素に記憶されたコール・パス識別子に直接適用することができる。
【００１４】
しかしながら、いくつかの他の実例において、コール・パス識別子に依存する値は、コール・パス識別子の暗号化されたバージョンを含むことができる。コール・パス識別子が予測され得る機会を減らすことにより、また総当たり攻撃（ｂｒｕｔｅ−ｆｏｒｃｅ  ａｔｔａｃｋ）で攻撃者がコール・パス識別子を推測しようとするために必要とする置換の回数を減らすことを可能にするコール・パス識別子についてのサイド・チャネル情報が露見するリスクを減らすことにより、これはさらなるセキュリティを与えることができる。
【００１５】
いくつかの実例の実装形態において、認証コード生成命令のすべてのバージョンはコール・パス識別子に依存する認証コードを生成することができる。同様に、認証コード・チェック命令のすべてのバージョンは、コール・パス識別子に依存する値を含む少なくとも１つの修飾子値を使用することができる。
【００１６】
しかしながら、他の実例においては、異なる修飾子値を使用することができる認証コードの生成及びチェック命令の異なる変形が提供されていてもよい。
【００１７】
例えば、認証コード生成命令の第１の変形、及び認証コード・チェック命令の第１の変形は、コール・パス識別子とさらなる修飾子値との両方を含む複数の修飾子値を使用することができる。例えば、さらなる修飾子値はスタック・ポインタを含むことができる。認証コードが生成される値の使用を、コール・パス識別子の所与の値及びスタック・ポインタの所与の値に関連付けられるプログラム・コード内の特定の部分に制限することにより、これはさらなるセキュリティを与えることができる。
【００１８】
やはり、認証コード生成命令の第２の変形及び認証コード・チェック命令の第２の変形が提供され得、その場合少なくとも１つの修飾子値はコール・パス識別子に依存するが、認証コード生成／チェック命令の少なくとも１つの他の変形について使用することができるさらなる修飾子値には依存しない値を含む。例えば、第２の変形について、コール・パス識別子に依存する値は使用される修飾子のみであってもよい。
【００１９】
認証コード生成命令のさらなる変形、及び認証コード・チェック命令のさらなる変形は、少なくとも１つの修飾子値がコール・パス識別子に依存しない場合も実装することができる。したがって、認証コードの生成及びチェック命令の異なるバージョンを提供して、プログラマ又はコンパイラが、所与のソース値の使用を特定のプログラムのコンテキストに結び付ける程度を選択できるようにすることができる。例えば、いくつかのシナリオにおいて、一連の関数コールが実行されているプログラムの対応する部分につながり得る複数の異なるルートがある場合でも、値が正しく認証されることが望ましい場合があり、この場合、異なる関数コールの履歴が呼び出されても認証がなお続くことができるよう、コール・パス識別子以外の修飾子を使用するさらなる変形を選択することが好ましい場合がある。プログラムが正常に実行されている際、関数コールのより予測可能なフローがある場合のプログラムの他の部分について、コール・パス識別子に依存する修飾子を使用する認証コード生成命令の変形を使用することにより、セキュリティを向上させることができる。
【００２０】
認証コード生成命令又は認証コード・チェック命令の異なる変形は、様々な方法で区別することができる。一実例において、認証コード生成命令のそれぞれの変形は異なるオペコードを有することができる。代替的に、異なる変形は同一のオペコードを共有することができるが、認証コード生成命令のどの変形が使用されるかを指定する命令デコード中の別のフィールドを有してもよい（例えば、使用する修飾子値のタイプを特定する修飾子フィールド）。同様に、認証コード・チェック命令の変形は、それらのオペコードによって、又は命令エンコード中のさらなるフィールドによって区別することができる。
【００２１】
しかしながら、他の実例において、モード記憶要素に記憶されるモード表示値を使用して認証コード生成命令の変形か、又は認証コード・チェック命令の変形かを区別することができる。例えば、モード表示値が第１の値を有している際、認証コード生成命令又は認証コード・チェック命令が実行されている場合、少なくとも１つの修飾子値はコール・パス識別子に依存する値を含むことができる。モード表示値が第２の値を有している場合、認証コード生成／チェック命令は、少なくとも１つの修飾子値がコール・パス識別子に依存しない状態で実行することができる。これは、認証コード生成命令の２つ以上の変形又は認証コード・チェック命令の２つ以上の変形を表すための、複数の命令エンコードを割り当てる必要性を回避することができる。代わりに、認証コード生成命令のすべての形態（ソース値それ自身を特定するビット以外）について、単一のエンコードを使用することができる。同様に、第２のソース値を特定するビット以外の認証コード・チェック命令のすべての変形について、同一のエンコードを使用することができる。これは、他のタイプの動作を示すために命令の他のエンコードを空間フリーにしておき、より効率的な命令セット・アーキテクチャのエンコードを提供する。認証コード生成／チェック命令を実行する前に、後続の認証コード生成／チェック命令を制御するために必要であれば別の命令がモード表示値を変えて、所望の修飾子値を使用することができる。
【００２２】
認証コードは、認証コード生成命令により第１のソース値として指定されるあらゆる値について生成することができる。しかしながら、第１のソース値がメモリ・アドレスを含むケースにおいては、これを使用することは特に有用であり得る。これにより、異なるアドレスがアドレス・レジスタに代入されるコードの再利用に対して、保護されるべき分岐ターゲット・アドレスを生成するために、メモリ・アドレスに依拠する後続の分岐命令が可能となる。認証コードを使用してアドレスを保護するべく、認証コード生成命令は、アドレスが初めに生成された時点で、又はそのアドレスを使用することができるプログラム・コンテキストに到達した時点で実行することができ、次いで認証コード・チェック命令はアドレスが後続の分岐命令によって使用されようとした時点で実行することができる。
【００２３】
認証コードは、生成されると、あらゆる方法で対応するソース値に関連付けることができる。例えば、認証コードは、異なるレジスタに記憶される第１のソース値とともに、さらなるレジスタに記憶することができる。
【００２４】
しかしながら、第１のソース値がメモリ・アドレスを含む場合、これは処理回路が、メモリ・アドレスからのビットのサブセットを生成された認証コードで置き換えることにより、認証コードをアドレスに関連付けるために特に有用であり得る。いくつかの実例において、ビットのサブセットはメモリ・アドレスの最下位ビットの一定数を含むことができる。例えば、アドレスが２つのアドレス境界の一定のべき乗にアラインされていることが既知である場合、そのアドレスの最下位ビットのいくつかがゼロであり得ることを期待することができるため、これらは情報の欠落なしに認証コードで置き換えることができる。代替的に、メモリ・アドレスの置き換えられたサブセット・ビットは、最上位ビットのいくつか、又はメモリ・アドレス内の一定のしきい値ビットよりも上位であるビットであってもよい。これは、プロセッサ・アーキテクチャは一定ビット数（例えば、６４ビット）のアドレスをサポートすることができるが、実際に現実世界のデータ処理デバイスにおいては、６４ビットのアドレス空間全体が使用されることが見込まれるような大容量のメモリ記憶装置を伴うデバイスはまだ必要ないという事実を利用することができる。したがって、物理アドレスが６４ビットを有することができても、実用においては少ないビット数のみが実際には使用され、最上位ビットのいくつかがゼロに対応している場合がある。例えば現在実装されているプロセッサでは、４８ビットの物理アドレス空間が使用され、それによりアドレスの上位１６ビットが常にゼロであることが、比較的一般的であり得る。４８ビットのアドレス空間はなお、今日のニーズには十分な２５６テラバイトのメモリを与えるが、命令セット・アーキテクチャはさらなる拡張の余地を与えるために６４ビットのアドレスを実装してある。ひいては、実際には使用されないいくつかの上位ビットがあるため、これらのビットを認証コードで置き換えることができる（認証コードはアドレスの上端でこれらの未使用ビットのあらゆるサブセットに挿入することができる）。
【００２５】
メモリ・アドレスのどの特定のビットが認証コードで置き換えられるかに関わらず、認証コードが失われたり改竄されたりすることを回避するように認証コードがメモリ・アドレスとともに保持されることを確実にすることについて、これは便利なメカニズムを提供する。メモリ・アドレスの異なる記憶要素へのあらゆる転送は、アドレスが引き続き使用される場合その認証コードがなお存在できるように、この時やはり対応する認証コードを本質的に転送することになる。認証コード・チェック命令に応答して、処理回路は次いで関連するメモリ・アドレスのビットのサブセットから認証コードを抽出し、読み出された認証コードと期待される認証コードとの間に不一致があればエラー・ハンドリング応答をトリガすることができる。抽出された認証コードと期待される認証コードとの間に一致があれば、認証コード・チェック命令に応答して、処理回路は、メモリ・アドレスをあらゆる後続の分岐又は他の命令用に実際に使用する前に、対応するビットのサブセットを何らかのデフォルト値（すべてゼロなど）にリセットすることにより認証コードをクリアすることができる。
【００２６】
不一致の認証コードに応答してトリガされた例外ハンドリング応答は実装形態ごとに異なっていてもよい。場合によっては、エラー・ハンドリング応答は例外条件を伝達することを含むことができる。この時、例外ハンドラは検出された認証失敗に応答するよう処理回路をトリガすることができる。例えば、例外は処理の現在のスレッドを破棄させることができるか、又は検出された潜在的なセキュリティ違反を取り扱うために、処理をオペレーティング・システム又は他のスーパバイザ的なコードに向けさせることができる。
【００２７】
しかしながら、第２のソース値がメモリ・アドレスを含む場合、エラー・ハンドリング応答の形態の１つはそのメモリ・アドレスを無効なアドレスに変えることを含む。例えば、上で議論したようなメモリ・アドレス内のビットのサブセットが生成された認証コードで置き換えられるケース（メモリ・アドレスのすべてのビットが、実際にはメモリ・アドレスの現実のビットを表すために使用されないため）では、エラー・ハンドリング応答は、メモリ・アドレスのそれらの未使用のビットのサブセットを、有効なメモリ・アドレスでは通常これらの未使用ビットに見られるデフォルトの値以外の何らかの値に設定することを含む。例えば、アドレスがＸビットを有しているが、有効アドレスにはＹビット（Ｙ＜Ｘ）だけが使用される場合、上位Ｘ−Ｙビットの１つ又は複数を、無効なアドレスを表わすために非ゼロ値に設定することができる。処理装置に設ける必要のある追加されるエラー・ハンドリング機能性の量を減らすことができるため、この手法は有用であり得る。典型的には、処理装置は、無効なメモリ・アドレスに分岐するよう試行がある場合、又は無効なメモリ・アドレスに対してロード若しくはストア演算を実施する場合、メモリ・フォールトを扱うために既に例外を有していてもよい。したがって、不一致な認証コードが生成される際メモリ・アドレスを無効なアドレスに変えることによって、エラーは認証コード・チェック命令に応答して明示的にフラグを立てられる必要はないが、アドレスがロード／ストア演算、又は分岐に引き続き使用される場合、無効なアドレスへのアクセスによりメモリ・フォールトがトリガされるため、事実上エラーを特定することができる。例えば、メモリ保護ユニット又はメモリ管理ユニットに関連付けられるメカニズムをトリガする既存のメモリ・フォールトは、認証コードが不一致の場合に認証コード・チェック命令から得られる無効なアドレスに基づいてフォールトを生成するために使用することができる。
【００２８】
コール命令に応答してコール・パス識別子を関数リターン・アドレスと置換するために使用される置換関数は、可逆の置換関数であり得る。したがって、ターゲット関数から以前の処理へのリターンをトリガするための関数リターン命令に応答して、処理回路はコール・パス識別子記憶要素に記憶されるコール・パス識別子及び関数リターン・アドレスに対して逆置換関数を実施して、コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成することができる。ひいては、これはコール・パス値が、一定の関数をコールする直前、且つその関数からリターンした直後に一致するよう期待されることを意味することになり、それにより、一定の条件関数がその間実行されているかどうかにかかわらずシステムはプログラム・コード内の現在の位置の一貫した表現を有することができる。これにより、認証コード生成／チェック命令を使用してソース値の認証を可能にする、より信頼できる方法が与えられ得る。
【００２９】
様々な関数が置換関数として使用することができるが、場合によっては、少なくとも１つのコール・パス置換キーに依拠する暗号関数を使用することができる。ひいては、処理回路は、コール・パス置換キーに応じて実施される暗号関数を使用してコール・パス識別子を関数リターン・アドレスと置換するように構成することができる。例えば、コール・パス置換関数はブロック暗号であることができる。暗号法的に強力な関数の使用は、攻撃者によるコール・パス識別子の偽造のリスクを減らすために有用であり得る。代替的に、巡回冗長チェック関数などの暗号キーに依存しないコール・パス置換関数が使用されてもよい。
【００３０】
同様に、認証コードの生成は、暗号関数が認証キー値に依存する場合は、第１のソース値及び少なくとも１つの修飾子値に対して実施される暗号関数に基づくこともできる。認証コード・チェック命令に応答して期待される認証コードを生成するために実施される関数はまた暗号関数に依存してもよい。認証キー値はコール・パス置換キーと同一であってもよいが、コール・パス置換キー及び認証キーそれぞれとは異なるキーを使用することによってセキュリティを向上することができる。場合によっては、認証コード生成命令の複数のバージョンが与えられてもよく、それにより利用可能な複数の認証キー値のセットから異なる認証キー値を選択することが可能になる。例えば、１つの認証コード生成命令が、命令データのアクセス又は分岐のために使用されるアドレスについて認証コードを生成するために与えられてもよく、認証コードがデータ・アクセスのポインタ用に生成される場合、認証コード生成命令の異なる変形が異なる認証キー値を選択することができる。したがって、一般的に認証コード生成命令のいくつかのプロパティは、どの認証キー値を使用するかを選択することができる。同様に、認証コード・チェック命令もまた認証キーとは異なる値を選択するための異なるバージョンを有することができる。
【００３１】
コール・パス識別子保存命令は、処理回路がコール・パス識別子に依存する値をデータ・ストアに（例えば、スタック・データ構造に）保存するようトリガするために与えられてもよい。対応するコール・パス識別子リストア命令に応答して、処理回路はデータ・ストアから読み出した値に応じて、値をコール・パス識別子記憶要素にリストアすることができる。これにより、コール・パス識別子の以前の値を保存してリストアすることが可能となり、有効なコードのエントリ・ポイントにつながり得る複数の代替的な関数コールのシーケンスがあっても、コール・パス識別子の一定の値は認証コードを使用して以前に認証された値の一貫性のある認証を確実にするために、やはりリストアすることができる。
【００３２】
さらなるセキュリティを与えるため、コール・パス識別子保存命令に応答して、データ・ストアに保存されたコール・パス識別子のバージョンはコール・パス識別子の暗号化されたバージョンであってもよく、コール・パス識別子リストア命令に応答して、データ・ストアから読み出した値を復号化して、復号化された値をコール・パス識別子記憶要素に記憶するために、復号化を適用することができる。これは、攻撃者がコール・パス置換（ハッシュ）関数を推測又は導出できるような機会を減らすために、メモリへの実際のコール・パス識別子が露見することを回避している。
【００３３】
いくつかの実例において、関数コールに応答してコール・パス識別子を置換することに加えて、コール・パス識別子記憶要素に記憶される更新されたコール・パス識別子を生成するために、処理回路がコール・パス識別子をコール・パス識別子置換命令によって指定されるソース・オペランドと置換するようトリガするさらなるコール・パス識別子置換命令を実装することができる。これにより、実際には関数コールが１つも実施されなくても、関数コールが実施されたかのようにコール・パス識別子を置換することができる。これは、プログラム・コードが、ある一連の関数コールについてのコール・パス識別子の期待される値を、実際に対応する関数コードを実行する必要とせずに、素早く計算できるようにする。セキュリティを与えるため、いくつかの実例において、コール・パス識別子置換命令の正常な実行が、処理回路がしきい値特権レベル以上である一定の特権レベルで動作している時に制限されることがある。コール・パス識別子置換命令が、現在の特権レベルがしきい値の特権レベルより低い時に実行される場合、コール・パス識別子の正常な実行が妨げられることがある（例えば、コール・パス識別子置換命令を無視することにより、又は例外をトリガすることにより）。同様に、実際には関数リターンが実施されない場合でも関数リターンをシミュレートするために、逆置換命令によって指定されるリターン・アドレスに基づいて逆置換を適用するための対応するコール・パス識別子逆置換命令が与えられてもよい。
【００３４】
いくつかの実例において、上で議論した技法はハードウェアに実装することもできる。例えば、ハードウェア記憶要素がコール・パス識別子記憶要素として設けられてもよく、ターゲット関数のコールに応答して、ハードウェアに実装される回路論理を使用してコール・パス識別子を置換することができる。データ処理システムは、認証コードの生成及びチェック命令をサポートするための命令デコーダを有することができる。したがって、これらの命令に応答して、命令デコーダは認証コードをそれぞれ生成及びチェックするために、処理回路が対応する動作を実施するよう制御することができる。
【００３５】
しかしながら、他の実例において、そのような動作は、コール・パス識別子置換、並びに認証コードの生成及びチェックをサポートするハードウェア要素を有していないことがある汎用コンピュータで実行されるプログラム・コードを使用してソフトウェアで制御され得る。したがって、場合によっては、コンピュータ・プログラムは、データ処理装置を制御して、ターゲット関数のコールに応答してコール・パス識別子置換を実施するように、また認証コードの生成及びチェック動作を実施するように設けることができる。
【００３６】
別の実例において、コール・パス識別子置換、並びに認証コードの生成及びチェックの特徴をサポートするハードウェアを、それ自身が有する必要のないホスト・データ処理装置上での実行用のコンピュータ・プログラムを備えるシミュレータが設けられてもよい。シミュレータ・プログラムはこれらの特徴を有するプロセッサをエミュレートするため、必要とされるハードウェア特徴を有していないホスト・データ処理装置上で実行する場合でも、そのようなハードウェア実装プロセッサ上で実行するよう意図されているプログラム・コードがやはり正確に機能することができる。したがって、コンピュータ・プログラムはホスト・データ処理装置を制御して、命令の実行のための命令実行環境を提供するために設けられてもよく、この場合、処理プログラム・ロジックが命令実行環境内で命令の実行を制御する。コンピュータ・プログラムは、コール・パス識別子を記憶するためのコール・パス識別子データ構造と、コール・パス識別子データ構造に記憶される更新されたコール・パス識別子を生成するために、コール・パス識別子を関数リターン・アドレスで置換することによってターゲット関数をコールするためのコール命令に応答する処理プログラム・ロジックと、を提供することができる。同様に、認証コード生成命令に応答して、処理プログラム・ロジックはホスト・データ処理装置を制御して認証コードを生成し、認証コード・チェック命令に応答して、処理プログラム・ロジックはホスト・データ処理装置を制御して以前に生成された認証コードが期待される認証コードと一致するかどうかをチェックして、不一致が検出されるとエラー・ハンドリング応答をトリガする。やはり、認証コード生成命令又は認証コード・チェック命令の少なくとも１つの変形について、修飾子値はコール・パス識別子に応じた値を含む。
【００３７】
図１はデータ処理動作を実行するための処理ロジック４を備えるデータ処理装置２の実例を図示している。例えば、処理ロジックは様々なタイプの処理動作を実行するための実行ユニットを含むことができる。実行ユニットは例えば、加算、乗算、ＡＮＤ、ＯＲなどの算術若しくは論理演算を実行するための算術／論理ユニット（ＡＬＵ：ａｒｉｔｈｍｅｔｉｃ／ｌｏｇｉｃ  ｕｎｉｔ）、浮動小数点オペランドに対して浮動小数点演算を実施するための浮動小数点ユニット、又は複数のデータ要素を含むベクトル・オペランドに対してベクトル処理を実施するためのベクトル処理ユニットを含むことができる。アーキテクチャ・レジスタのセット６は、処理ロジックによって実行される命令用のオペランドを格納するために、また実行された命令の結果を記憶するために設けられる。命令デコーダ８は命令ハッシュ１０からフェッチされた命令をデコードし、処理ロジック４又はデータ処理装置の他の要素（ロード・ストア・ユニット１２、又は暗号化／復号化エンジン１４など）を制御するための制御信号を生成し、デコードされた命令によって表される演算を実施する。ロード・ストア・ユニット１２は、データ・ハッシュ１６若しくはメモリ１８からのデータ値をアーキテクチャ・レジスタ６にロードするためのロード演算を、又はアーキテクチャ・レジスタ６からのデータ値をデータ・ハッシュ１６若しくはメモリ１８にストアするためのストア演算を実施するために設けられる。メモリ管理ユニット２０はロード／ストア演算用に使用されるアドレスについて、アドレス変換を実施するために設けられる。メモリ管理ユニット２０はメモリ１８からページ・テーブルの部分をキャッシュするためのトランスレーション・ルックアサイド・バッファ（ＴＬＢ：ｔｒａｎｓｌａｔｉｏｎ  ｌｏｏｋａｓｉｄｅ  ｂｕｆｆｅｒ）を含むことができ、ＴＬＢはアドレス空間の異なる部分に使用されるアドレス・マッピングを定義し、またアドレス空間の一定のページが読み出し可能か、若しくは書き込み可能かどうかのパーミッション設定、又は処理回路４のどの特権レベルが特定のページにアクセスできるかの設定、などのアクセス・パーミッションを定義している。
【００３８】
暗号化／復号化エンジン１４は、データを暗号化若しくは復号化するために、又は暗号ハッシュ関数を適用するために、データ値に対して暗号アルゴリズムを実施するために設けられ、キー・ストレージ２２に記憶される暗号キーに依存する。暗号アルゴリズムは、アーキテクチャ・レジスタ６から読み出された一般的なデータ値に、又はコール・パス識別子記憶要素２４（ＣＳＨレジスタ）に記憶されたコール・パス識別子（又はコール・スタック・ハッシュ）に適用することができる。暗号化／復号化エンジン１４によって使用されるキーは、セッションごとに生成される乱数キーであってもよく、それによって攻撃者は１つのセッションで暗号化された又はハッシュされたものを別のセッション中で正確に再利用することができない。
【００３９】
図２は、コール・パス識別子（ＣＳＨ）の使用を図示している。アーキテクチャ・レジスタ６とは違って、ＣＳＨレジスタ２４はプロセッサ・コアによって維持される隠しレジスタであり、設計上ソフトウェアには可視ではない。図２に示すように、ＣＳＨは、関数コールがあると、その関数をコールしたコール命令のリターン・アドレスに基づいて置換され、その以前の値にリターンするために、同一の関数リターン・アドレスを使用して関数リターンで逆に置換される。したがって、ＣＳＨは、その関数のコールにつながった一連の関数コールのコンテキスト内で現在処理されている関数を表現するシグネチャとして作用する。
【００４０】
例えば、図２において、関数がリンク付き分岐（ＢＬ：ｂｒａｎｃｈ−ｗｉｔｈ−ｌｉｎｋ）命令を使用してコールされ、それに応じて関数リターン・アドレスがアーキテクチャ・レジスタ６内のリンク・レジスタ３０に記憶される。関数リターン・アドレスは例えば関数コール分岐命令それ自身に続く次の命令のアドレスにセットすることができる。またＢＬ命令に応答して、プログラム実行の現在点を示しているプログラム・カウンタ・レジスタ３２が、実行される関数コードの開始に対応して分岐ターゲット・アドレスに更新される。分岐ターゲット・アドレスはＢＬ命令のエンコードにより、又はレジスタ内で指定することができる。
【００４１】
関数コール命令ＢＬに応答して、暗号化／復号化エンジン１４はコール・スタック・ハッシュ２４の現在の値を関数リターン・アドレス及び暗号キー・ストレージ２２から読み出したコール・スタック・ハッシュ・キーで置換し、その結果を値としてＣＳＨレジスタ２４に書き戻す。
【００４２】
最初にコールされた関数（関数Ａ）内でさらなる関数コール命令（リンク付き分岐命令ＢＬ）に遭遇すると、この関数コールに応答して、さらなる関数Ｂをコールするプロセスの一部として、ＣＳＨは再度第２の関数コールに対応するコール命令の関数リターン・アドレス、及び置換キーで置換される。置換は、関数Ｂのコールから得られる更新されたコール・スタック・ハッシュが、関数Ｂが関数Ａ内からコールされる際、関数Ｂが異なる関数からコールされている場合とは異なる値を持つようなものであってもよい（例えば、関数Ａのコールに応答して実施される初期の置換が省略され、次いで関数Ｂのコールが異なる結果を導くような場合）。暗号キーにアクセスすることなくコール・スタック・ハッシュの値を推測することを計算機科学的に実行不可能にするために十分なビット数を有する暗号ハッシュ関数を使用することにより、これはコードの現在の場所、及びその場所に到達するために使用された過去の関数コールの履歴を特定するための強力な技法を提供する。
【００４３】
ＣＳＨをハッシュ化するために使用される置換関数は可逆の関数であるため、置換関数の所与の繰り返しは、対応する逆置換関数を実行することにより元に戻すことができる。所与の関数からリターンする際、関数コールに使用したのと同一の置換キー及びリンク・レジスタ３０から読み出した関数リターン・アドレスを使用して、コール・スタック・ハッシュ２４の現在の値に逆置換関数を適用することができる。関数のネストをサポートするために、次にネストされる関数がコールされる前にソフトウェアによってリンク・レジスタ３０の内容をスタックに保存することができ、それにより後続の関数コール命令（ＢＬ）に応答してリンク・レジスタを新しい関数の関数リターン・アドレスで上書きすることができる。同様に、ネストされた関数について関数リターンを実行する前に、ソフトウェアは以前の値をスタックからリンク・レジスタにリストアするための命令を含むことができる。さらにネストされる関数をコールしない関数については、リンク・レジスタのそのような保存／リストアは必要とされない。ひいては、関数Ｂからリターンする時でさえ、関数Ａに関連付けられるリターン・アドレスの以前の値は、リンク・レジスタ３０にリストアすることができ、それぞれの関数のリターンにおいて、コール・スタック・ハッシュの置換は逆の置換を適用することによってアンワインドすることができる。したがって、ソフトウェアがネストされる関数コールについて正確にリンク・レジスタの保存／リストアを扱うとすれば、関数Ａにリターンする際コール・スタック・ハッシュは関数Ｂがコールされる前に有していたのと同一の値を有することになり、バックグラウンド処理にリターンする際、コール・スタック・ハッシュは関数Ａがコールされる前に有していたのと同一の値にリターンする。攻撃者が、リンク・レジスタ３０内のリターン・アドレスを変えることによりコードの異なる場所にコードを分岐させようと騙す試行をする場合、これは関数のコールの前後でコール・スタック・ハッシュの不一致につながることがあり、以下で議論するような認証動作の失敗につながり、ひいては攻撃を検出することができる。
【００４４】
例えば、ＣＳＨ置換関数は６４ビットのｔｗｅａｋを伴う１２８ビットのブロック暗号であることができる。リターン・アドレスがｔｗｅａｋとして使用される。
【００４５】
巡回冗長チェック（ＣＲＣ：ｃｙｃｌｉｃ  ｒｅｄｕｎｄａｎｃｙ  ｃｈｅｃｋ）アルゴリズムに基づくＣＳＨ置換関数の別の実例を、以下に示す。
１：  ｕｉｎｔ３２＿ｔ  ｃａｌｌ（ｕｉｎｔ３２＿ｔ  ｃｒｃ，  ｕｉｎｔ３２＿ｔ  ｎｅｗ＿ｌｒ）  ｛
２：    ｃｒｃ  ＾＝  ｎｅｗ＿ｌｒ
３：    ｆｏｒ  （ｉｎｔ  ｉ  ＝  ０；  ｉ  ＜  ３２；  ｉ＋＋）
４：      ｃｒｃ  ＝  （ｃｒｃ  ＆  １）  ？  （ｃｒｃ  ＞＞  １）  ＾  ＰＯＬＹ  ：  （ｃｒｃ  ＞＞  １）；
５：    ｒｅｔｕｒｎ  ｃｒｃ；
６：  ｝
【００４６】
アルゴリズムはＣＲＣ（ｃｒｃ）の以前の値、及び関数リターン・アドレス（例えば、リンク・レジスタ値−ｎｅｗ＿ｌｒ）を使って２つの入力のハッシュを返す（この実例においてはハッシュ化を実施するために暗号キーは必要とされていない）。２行目で、ｃｒｃの以前の値は、新しいリンク・レジスタの値を使用して排他的ＯＲ演算（ＸＯＲ）される。当業者であれば理解することであるが、ＸＯＲ演算は可逆である。換言すれば、Ａ  ＸＯＲ  Ｂ  ＸＯＲ  Ｂは、Ａを返す。３行目及び４行目は、多項式（ＰＯＬＹ：ｐｏｌｙｎｏｍｉｎａｌ）を使用して「ＸＯＲ除算」を実施しながらｃｒｃのビットを通じて繰り返す。５行目で返される終了結果が多項式を使用する「ＸＯＲ除算」演算の剰余に対応すると考えると、出力は多項式よりも小さくなることが理解されよう。それに応じて、小さな多項式が使用される場合には衝突（２つの入力が同一の出力を有している）が発生する機会が多い。適切な多項式を選択するタスクが当業者にとって知られることになろう。
【００４７】
この実例に対応する逆置換関数は次の通りである。
１：  ｕｉｎｔ３２＿ｔ  ｒｅｔ（ｕｉｎｔ３２＿ｔ  ｃｒｃ，  ｕｉｎｔ３２＿ｔ  ｎｅｗ＿ｐｃ）  ｛
２：    ｆｏｒ  （ｉｎｔ  ｉ  ＝  ０；  ｉ  ＜  ３２；  ｉ＋＋）
３：      ｃｒｃ  ＝  （ｃｒｃ  ＆  ０ｘ８０００００００）  ？  （ｃｒｃ  ＜＜  １）  ＾  ＲＰＯＬＹ  ：  （ｃｒｃ  ＜＜  １）；
４：    ｃｒｃ  ＾＝  ｎｅｗ＿ｐｃ；
５：    ｒｅｔｕｒｎ  ｃｒｃ；
６：    ｝
【００４８】
関数への入力はｃｒｃ及びｎｅｗ＿ｐｃであり、ｎｅｗ＿ｐｃは関数コールのリターン後の新しいプログラム・カウンタである（すなわち代替的に、関数コールのリターン直前のリンク・レジスタの値である）。アルゴリズムの２行目及び３行目はｃｒｃのビットを通じて繰り返す。それぞれの繰り返しにおいて、そのビットが「１」であると考えられる場合、左シフトが起こり、結果はＲＰＯＬＹとＸＯＲ演算されるか、そうでなければ左シフトが起こる。これが済むと、４行目で終了結果がｎｅｗ＿ｐｃとＸＯＲ演算され、結果を与える。値ＲＰＯＬＹは、ＰＯＬＹの導関数であり、最初にＣＲＣを形成するために使用される。特に、ＲＰＯＬＹは１ビット左にシフトするＰＯＬＹの結果である。
【００４９】
上の実装形態におけるＰＯＬＹは最下位ビットを無視しており、またＲＰＯＬＹは最上位ビットを無視している。したがって、形式１ａｂｃｄｅｆ１の多項式について、ＰＯＬＹは「１ａｂｃｄｅｆ」であり、ＲＰＯＬＹは「ａｂｃｄｅｆ１」である。換言すると、３２ビットの多項式については、次の通りである。
ＲＰＯＬＹ  ＝  （ＰＯＬＹ  ＊  ２  ＋  １）  ＆  ０ｘｆｆｆｆｆｆｆｆ；
【００５０】
これらは、関数リターン・アドレスに基づいてコール・スタック識別子をハッシュ化するために使用することができる関数のいくつかの実例に過ぎないことが理解されよう。他の関数もやはり使用することができる。
【００５１】
図３Ａは認証コード生成命令ＰＡＣに応答して実施される認証コード生成演算の実例を図示している。ＰＡＣ命令は第１のソース・オペランドｓｒｃ１を指定している。ソース・オペランドはあらゆる値であってもよいが、認証コード生成演算をアドレス・ポインタに適用することが特に有用であり得る。ソース・オペランドは一定のビット数Ｘを含むアドレスを指定することができるが、実際にはそれらのビットのうち一定のビット数Ｙのみが有効アドレス用に使用され得る（例えば、Ｘは６４であってもよく、Ｙは４８であってもよい）。したがって、アドレスの上位Ｘ−Ｙビットが、デフォルトでゼロにセットされることになる。
【００５２】
認証コード生成命令ＰＡＣに応答して、ソース・オペランドは暗号化／復号化エンジン１４に通過することができ、暗号キー・ストレージ２２から読み出した暗号キー及び少なくとも１つの修飾子値に基づいて、第１のソース値に認証コード生成関数４０を適用することができる。得られる認証コード（ＰＡＣ）は、ポインタ・アドレスの未使用の上位ビットに挿入されて、命令の結果を生成する。結果は、例えば、ソース・オペランドを格納していた同一のレジスタに書き戻すことができる。認証コード生成関数４０は、使用された関数又は暗号キーを知らずには特定のアドレスに関連付けられる認証コードを推測することが計算機科学的に実行不可能にするために、暗号ハッシュ関数を使用することができる。
【００５３】
図３Ｂは、第２のソース・オペランドｓｒｃ２を指定する対応する認証コード・チェック命令ＡＵＴを示している。第２のソース・オペランドは、図３Ａで示されるＰＡＣ命令に応答して認証コードＰＡＣをその上位ビットに挿入することにより以前に認証されているポインタ・アドレスであることが期待されるが、攻撃者がポインタを変更してあれば、認証コードが有効でないことがある。認証チェック命令に応答して、命令デコーダ８は処理ロジック４及び暗号化／復号化エンジン１４を制御して、コードが生成された時に使用されたものに対応する暗号キー及び修飾子値を使用して、同一の認証コード生成関数４０を第２のソース・オペランド（認証コードＰＡＣを除く）のアドレス・ビットに適用する。次いで、期待される認証コードＰＡＣ’は、第２のソース・オペランドｓｒｃ２の上位ビットから抽出された以前に生成された認証コードＰＡＣと比較され、期待される認証コードと以前に生成された認証コードとが一致するかどうかが判断される。もし一致していれば、処理を継続することができるが、期待されるコードと以前に生成されたコードとの間に不一致があれば、エラー・ハンドリング応答がトリガされ、例えば、例外をトリガするか、又はソース・レジスタの上位ビットを無効なアドレスに対応する値に設定し、それによってそのアドレスへの後続のアクセスが、ＭＭＵ２０がページ・テーブル内でアドレスがマッピングされていない無効なアドレスへのアクセスによるメモリ・フォールトをトリガするようにトリガすることになる。
【００５４】
図３Ａ及び図３Ｂの認証コードの生成及びチェック命令を使用することによって、これはポインタを認証させることができ、そのため攻撃者が無認可のポインタをインジェクションし、コードがそのポインタによって特定される場所に成功裏に分岐させることをより困難なものにすることができる。暗号関数を認証コード生成関数４０として使用することにより、これは総当たり攻撃が特定のアドレスに関連付けられる認証コードを推測することを困難なものにすることができる。認証コード生成命令ＰＡＣはポインタ・アドレスが生成された時点でコードに含めることができ、また認証コード・チェック命令ＡＵＴはアドレスが実際に使用される時に後で含められて、そのアドレスに実際に分岐する前に認証コードをダブルチェックする。
【００５５】
認証コード生成関数４０は実装形態ごとに異なっていてもよい。例えば、Ｂｏｒｇｈｏｆｆら、「ＰＲＩＮＣＥ-ａ  ｌｏｗ−ｌａｔｅｎｃｙ  ｂｌｏｃｋ  ｃｉｐｈｅｒ  ｆｏｒ  ｐｅｒｖａｓｉｖｅ  ｃｏｍｐｕｔｉｎｇ  ａｐｐｌｉｃａｔｉｏｎｓ．」、Ｉｎｔｅrｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  ｔｈｅ  Ｔｈｅｏｒｙ  ａｎｄ  Ａｐｐｌｉｃａｔｉｏｎ  ｏｆ  Ｃｒｙｐｔｏｌｏｇｙ  ａｎｄ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ、シュプリンガー、ベルリン、ハイデルベルク、２０１２年は、ブロック暗号を提案している。Ｊｅａｎら、「Ｔｗｅａｋｓ  ａｎｄ  ｋｅｙｓ  ｆｏｒ  ｂｌｏｃｋ  ｃｉｐｈｅｒｓ：  ｔｈｅ  ＴＷＥＡＫＥＹ  ｆｒａｍｅｗｏｒｋ．」、Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  ｔｈｅ  Ｔｈｅｏｒｙ  ａｎｄ  Ａｐｐｌｉｃａｔｉｏｎ  ｏｆ  Ｃｒｙｐｔｏｌｏｇｙ  ａｎｄ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ、シュプリンガー、ベルリン、ハイデルベルク、２０１４年は、暗号化されるメッセージ及び暗号キーに加えて第２の入力に依存することができるよう暗号をｔｗｅａｋａｂｌｅにするＴＷＥＡＫＥＹフレームワークを説明している。したがって、一実例において、認証コード生成関数は、ＴＷＥＡＫＥＹフレームワークに基づいて修飾子値を第２の入力として使用してｔｗｅａｋａｂｌｅに変更されたＰＲＩＮＣＥ暗号を含むことができる。特許請求の範囲内に留まりながらも、ＰＲＩＮＣＥ−ＴＷＥＡＫＥＹ暗号にはさらなる変更がなされ得ることが理解されよう。また、他の実例において、セキュリティと所与のシステム実装に必要とされるハードウェア／ソフトウェアの実装コストとのバランスに応じて、全く異なる暗号法の暗号が認証コード生成関数４０として使用することができる。
【００５６】
ＰＡＣ及びＡＵＴ命令の異なる変形が、認証コードを生成するために使用される暗号関数にｔｗｅａｋを与える修飾子値の異なる形態を使用することができる。これを活用することで、使用される修飾子値が、プログラム・コードの特定の領域に特有な値であるようにし、攻撃者がプログラム・コードの一部から認証されたポインタを正しく読み取り、それらを後で、プログラム・コード内で再利用してプログラムのその特定の部分について有効な遷移とは期待されない特定のポインタ・アドレスに分岐させるようにすることができる機会を減らすことができる。
【００５７】
例えば、いくつかの変形例において、修飾子値はアーキテクチャ・レジスタ６内のスタック・ポインタ・レジスタ３４の内容に対応することができ、これは図２で示されるようなネストされる関数コールの間に保存／リストアされる関数リターン・アドレスを与えるリンク・レジスタ値などの一時変数を格納するためのメモリ１８内のスタックの場所を示している。例えば、コンテキストが特権レベル同士の間でスイッチ又は遷移するのに応答してスタック・ポインタ・レジスタ３４を更新することができ（又は、ハードウェアに実装されるいくつかのスタック・ポインタ・レジスタの中で、どのレジスタが現在アクティブなスタック・ポインタを提供するために参照されるか、は変わってもよい）、そのためスタック・ポインタを修飾子値として使用することにより、これはポインタの正しい認証をプログラム内の特定のコンテキストに制限することができる。
【００５８】
図４Ａ及び図４Ｂは、修飾子値がＣＳＨレジスタ２４に維持されているコール・スタック・ハッシュに依存するＰＡＣ及びＡＵＴ命令の別の変形例を図示している。これらの実例において、修飾子は暗号化／復号化エンジン１４によって生成されたコール・スタック・ハッシュの暗号化されたバージョンを含んでいる。ＣＳＨを暗号化するために使用される暗号化キーは認証コード生成関数４０に使用される暗号キーとは異なるキーであってもよい。図２に示すように、暗号化キーはコール・スタック・ハッシュの置換用の暗号化キーと同一であることができる。代替的に、ポインタの認証の目的でコール・スタック・ハッシュ２４を暗号化する際の暗号化キーは、関数コールに対するコール・スタック・ハッシュの通常の置換に使用されるキーとは異なっていてもよい。一般的に、コール・スタック・ハッシュを認証コード生成関数４０用に使用される修飾子を生成するためのベースとして使用する命令の変形を与えることにより、これは一定のアドレス・ポインタの使用をプログラム・コードの特定の部分に制限するための強力な技法を提供する。プログラム・コード内で処理を特定の関数に到達させる多様なルートがあるため、コール・スタック・ハッシュを認証コード生成関数用の修飾子として使用して、スタック・ポインタによって使用されるコードの特定の領域をより詳細にピンポイントすることが可能になり、特にプログラム内のスタック・ポインタについての潜在的な値の数はコール・スタック・ハッシュ２４についての潜在的な値の数よりもより限定される傾向にあるからである。これによって、攻撃者がスタック・ポインタ３４を変更するか、又はスタック・ポインタを同一のスタック深さにおいて他の関数からキャプチャすることができたとしても、攻撃者が認証されたポインタを１つの関数のコンテキストから別のものに代入することがより困難なものにすることができる。
【００５９】
図４Ａ及び図４Ｂの実例において、コール・スタック・ハッシュは使用される唯一の修飾子であるが、命令のいくつかの変形について複数の修飾子を使用することもまた可能であり、それによってコール・スタック・ハッシュをスタック・ポインタ３４などのさらなる修飾子とともに使用することができる。
【００６０】
図５Ａ及び図５Ｂは、アーキテクチャ状態６にあるステータス・レジスタ３８内に格納されるモード・ビット６０を使用してどのタイプの修飾子をＰＡＣ及びＡＵＴ命令に使用するかを制御する実例を示している。例えば、モード・ビットが第１の値（例えば、１）を有している場合、暗号化されたコール・スタック・ハッシュが修飾子として使用され、モード・ビットがゼロの場合はスタック・ポインタ３４などの別の修飾子が使用される。それ以外は、命令は図３Ａから図４Ｂまでの実例と同じようにふるまう。
【００６１】
図６Ａに示すように、命令デコーダ８によってデコードされたＣＳＨ保存命令に応答して、コール・スタック・ハッシュの現在の値はＣＳＨレジスタ２４からメモリ１８（例えば、スタック・ストレージ構造内に）に保存することができる。メモリに保存されるＣＳＨのバージョンは、コール・スタック・ハッシュ・キーに基づいて暗号化／復号化エンジン１４によって生成される暗号化されたバージョンであってもよい。これは生のコール・スタック・ハッシュの露見を回避する。同様に、図６Ｂに示すように、コール・スタック・ハッシュ・リストア命令は以前に保存したコール・スタック・ハッシュをスタック又はメモリ内の他の場所から読み出し、暗号化／復号化エンジン１４によって復号し、それからＣＳＨレジスタ２４にリストアするようにトリガすることができる。
【００６２】
図７に示すように、命令デコーダ８はまた、ソース・オペランドｏｐ１を指定し、処理ロジック４及び暗号化／復号化エンジン１４を制御して、コール・スタック・ハッシュ置換関数又は逆置換関数を、暗号キー・ストレージ２２から読み出されたコール・スタック・ハッシュ・キーを使用して指定されたソース・オペランドｏｐ１に適用するために、コール・スタック・ハッシュ置換命令又はコール・スタック・ハッシュ逆置換命令をサポートして、コール・スタック・ハッシュ・レジスタ２４に格納し戻される更新されたコール・スタック・ハッシュ値を生成することができる。ソース・オペランドｏｐ１はアーキテクチャ状態６における汎用アーキテクチャ・レジスタのうちの１つから読み出すことができる。この命令により、プログラム・コードが関数のコール及び関数のリターンをシミュレートすることができるが、これはそのような関数から得られると期待される対応するコール・スタック・ハッシュを取得するためである。場合によっては、コール・スタック・ハッシュの置換又は逆置換命令は、プロセッサの一定の特権レベルでの実行のみに制限することができる。
【００６３】
図８は関数コールを扱う方法を図示する流れ図である。ステップ１００において、処理ロジック４がある関数の処理に分岐するようトリガするために、関数コール命令が実行される。場合によっては、関数コール命令は、その関数に通過するよう引数を指定することができる。関数コール命令は、関数の処理が完了した後に処理がリターンするべき関数リターン・アドレスを指定することができるか、又はより一般的には関数リターン・アドレスはデフォルトで関数コール命令に続く次の命令のアドレスに設定されていてもよい。ステップ１０４において、関数コール用の関数リターン・アドレスがリンク・レジスタ３０に格納され、以前の内容を上書きする。リンク・レジスタ３０の以前の内容が保持される必要がある場合（例えば、処理が既に以前にコールされた関数内にあり、次の関数コールがその以前にコールされた関数内のネストされた関数のものであるので）、ソフトウェアは関数コール命令を実行する前にリンク・レジスタの内容をスタックに保存するための命令を実行することができる。ステップ１０６において、暗号化／復号化エンジン１４はコール・スタック・ハッシュ・レジスタ２４をリンク・レジスタの新しい内容及び暗号キー・ストレージ２２から読み出されたコール・スタック・ハッシュ暗号化キーで置換し、ＣＳＨレジスタ２４に格納し戻される新しい値ＣＳＨ’を生成する。ステップ１０８において、プログラム・カウンタ・レジスタ３２は関数コールのターゲット・アドレスに基づいて更新され、処理ロジック４が関数のターゲット・アドレスによって特定される命令の処理に分岐するように制御する。そして、関数内で処理が続く。
【００６４】
図９は関数の処理からのリターンを処理する方法を示している。ステップ１１０において、関数リターン・命令が実行される（任意選択で、適当な関数リターン・アドレスをスタックからリンク・レジスタ３０にリストアするための命令の実行に続いて）。ステップ１１２において、暗号化／復号化エンジン４０は逆置換を図８のステップ１０６で実施される置換関数に適用し、コール・スタック・ハッシュ２４の現在の値を、現在の関数がコールされる前に有していた値に戻すよう変形する。逆置換関数がコール・スタック値２４、リンク・レジスタ３０の現在の内容（その関数用の関数リターン・アドレスを与える）及びストレージ２２から読み出されたコール・スタック・ハッシュ・キーに適用され、その結果をＣＳＨレジスタ２４に書き込む。ステップ１１４において、プログラム・カウンタ３２はリンク・レジスタ内で表されるアドレスに分岐するように更新される。
【００６５】
図１０は、認証コード生成命令を処理する方法を示している。ステップ１２０において、第１のソース・オペランドを指定する認証コード生成命令が実行される。ステップ１２２において、認証コード生成命令の変形が特定され、どの修飾子値を使用するか判断する。すなわち、認証コード生成命令のデコードの間、デコーダ８は処理ロジック内の処理経路をアクティブ化して適当な修飾子を選択する制御信号を提供することができる。代替的に、ステータス・レジスタ３８内のモード値が使用される修飾子の変形を示してもよい。変形に応じて、ステップ１２４、１２６、及び１２８のうちの１つが実施され、暗号化されたコール・スタック・ハッシュ値（ステップ１２４）、スタック・ポインタ３４などの別の修飾子値（ステップ１２６）、又は暗号化されたコール・スタック・ハッシュの関数及び別の修飾子値（ステップ１２８）として、修飾子を決定する。場合によっては、修飾子は暗号化されたコール・スタック・ハッシュ又は他の修飾子に対応する絶対値でなくてもよく、これらの値から導出される何らかの関数であることができる。どの修飾子が選択されるかに関わらず、ステップ１３０において暗号化エンジン１４は認証コード生成関数を、命令、選択された修飾子、及び認証コード生成暗号化キーによって指定されるソース値に適用する。得られる認証コードはステップ１３２においてソース値に関連付けられる（例えば上で議論したように、ソース・アドレスの上位ビットを認証コードで置き換ることにより）。
【００６６】
図１１は、認証コード・チェック命令を処理する方法を示す流れ図である。ステップ１４０において、第２のソース・オペランドを指定する認証コード・チェック命令が実行される。ステップ１４２において、図１０のステップ１２２と同じ方法で命令の修飾子変形が特定される。どの変形が与えられるかに応じて、ステップ１４４、１４６、１４８それぞれにおいて修飾子は、暗号化されたコール・スタック・ハッシュの関数、スタック・ポインタなどの別の修飾子値の関数、又は暗号化されたコール・スタック・ハッシュ及び他の修飾子値の両方の関数のうちの１つに決定される。ステップ１５０において、どの修飾子が使用されるかに関わらず、図１０のステップ１３０に対応する関数を使用して選択された修飾子に基づいて、期待される認証コードＰＡＣ’が生成される。ステップ１５２において、処理ロジック４は、生成された期待される認証コードＰＡＣ’が、命令の第２のソース・オペランドｓｒｃ２に関連付けられた以前に生成された認証コードＰＡＣと一致するかどうかを判断する（例えば上で議論したように、ＰＡＣはアドレスの上位ビットから抽出される）。認証コードと一致しないケースにおいては、エラー・ハンドリング応答がステップ１５４においてトリガされる。ステップ１５６においてコードが一致する場合、認証コードは第２のソース値から、例えば、上位のアドレス・ビットをゼロにクリアすることにより除去され、次いでステップ１５８において第２のソース値を使用するあらゆる後続の演算を続行することができる。
【００６７】
要するに、プロセッサ・コアによって隠しレジスタを維持することができ、それぞれの関数コールに対してそのコールのリターン・アドレスに基づいて置換され、同一のアドレスを使用してリターンに対して逆に置換され、その以前の値に戻る。コール及びリターンについてのリターン・アドレスが値について一致している限り、レジスタは関数内で安定であり、それをコールした処理のコンテキストにおいてその関数を表すシグネチャとして作用する。関数コールと関数リターンとの間に見られるリターン・アドレスのバージョンに不一致がある場合、置換は不正確な結果を与え、すべての後続の置換が不正確になり得る（これは、例えば、攻撃者が関数の処理の間にリターン・アドレスを変更することにより意図されたプログラム・フローを覆そうと試行することを検出するために使用することができる）。アプリケーション・レベルの関数コールと、スーパバイザ的なコードの関数コールの両方を、コール・スタック・ハッシュに統合することができる。コール・スタック置換関数は６４ビットのｔｗｅａｋを伴う１２８ビットのブロック暗号であることができる。リターン・アドレスはｔｗｅａｋとして使用され、コール・スタック・ハッシュは必要に応じて暗号化／復号化に与えられ、コール・スタック・ハッシュ・レジスタに書き戻される。カーネル（オペレーティング・システム）は暗号化キーを準備してそれをアプリケーションから隠しておく。
【００６８】
ソフトウェアからの要求があれば（上で議論したように認証コード生成命令を実行することにより）、コール・スタック・レジスタの内容を暗号法的な方法でソフトウェア用の引数（認証コード生成命令の第１のソース・オペランド）と合わせることができる。例えば、引数はスタック・ポインタ又は関数リターン・アドレスであり得る。これらの値がプログラムの後方のポイントにおける使用のためにリロードされる際、これらは結合されたシグネチャに対して認証することができる。関与する値のあらゆるもの（保存されたポインタ、スタック・ポインタ又は関数シグネチャ）が変更されると、認証が失敗することになり、アプリケーションが失敗するようにポインタを使用不能にすることができる。
【００６９】
コール・スタック・ハッシュ（ＣＳＨ）を読み出すためのソフトウェア・アクセス、及びそれを別のパラメータに結合することは、転送用（読み出し又は書き込み）の２つのスカラ・レジスタ、及びｔｗｅａｋ用に３つ目を指定するソフトウェア命令を通じて行うことができる。ＣＳＨ値はコール及びリターンに関する同一のブロック暗号を通じて、しかし命令アクセスに特に使用される代替キーを使用して与えることができる。このキーはやはりカーネルによって設定され、秘密にしておくことができる。このインターフェースは、スレッドの切り替え用などにＣＳＨを保存／リストアするために、またいくつかの実装形態においては、認証コード生成／チェック命令用の修飾子値を抽出するためにも使用される。異なるキーの使用は、アプリケーション・ソフトウェアがこのインターフェースを使用して偽のコールをハッシュ内に又はハッシュからワインドさせようとする可能性に対して防御する。
【００７０】
別の命令によって、あたかもコール又はリターンによるものかのように、しかし、リターン・アドレスを指定するレジスタ・オペランドを使用して、コール・スタック・ハッシュを置換することができる。これらの命令は、ソフトウェアにより直接にＣＳＨへの変更を可能する。この命令はカーネルの特権を要求するよう制限することができるか、代替的に、追加的なソフトウェア・パラメータをＣＳＨに一時的に統合するために、アプリケーション・ソフトウェアに利用可能なままであってもよい（例えば、スレッドの切り替えの間、保存されたレジスタを検証する）。ＣＳＨ置換又は逆置換命令は上述の代替キーを使用することができる。カーネルは計算の間、一時的に代替キーをコールキーに一致するように設定することができる。これによってカーネルが実行時に外部データに基づいて素早くＣＳＨの期待される値を計算することができる。
【００７１】
図１は、コール・スタック・ハッシュの生成、並びに認証コードの生成及びチェックをサポートするためのハードウェア・リソースを有するデータ処理装置の実例を示している。例えば、これらのハードウェア・リソースは、命令デコーダ８、コール・スタック・ハッシュ・レジスタ２４、及び暗号化／復号化エンジン１４を含むことができる。しかしながら、図８〜図１１に示される方法はまた汎用プロセッサ上で実行する汎用のソフトウェアを使用して実装することもできる。
【００７２】
図１２は使用され得るシミュレータ実装形態を図示している。先に説明された実施例は考慮される技法をサポートする特定の処理ハードウェアを動作させるための装置及び方法の点で本発明を実装している一方、本明細書で説明される実施例にしたがっており、コンピュータ・プログラムの使用を通じて実装される命令実行環境を提供することも可能である。そのようなコンピュータ・プログラムは、それらがハードウェア・アーキテクチャのソフトウェアベースの実装形態を提供する限りにおいて、しばしばシミュレータと称される。シミュレータ・コンピュータ・プログラムの種類としては、エミュレータ、仮想マシン、モデル、及びダイナミック・バイナリ変換器を含むバイナリ変換器が挙げられる。典型的には、シミュレータ実装形態は、任意選択でホスト・オペレーティングシステム２２０を実行させ、シミュレータ・プログラム２１０をサポートする、ホスト・プロセッサ２３０上で実行することができる。いくつかの構成において、ハードウェアと提供される命令実行環境との間に複数のシミュレーションのレイヤ、及び／又は同一のホスト・プロセッサ上に設けられる複数の別個の命令実行環境があってもよい。歴史的には、適度な速度で実行するシミュレータ実装形態を提供するためにはパワーのあるプロセッサが要求されてきたが、そのような手法は一定の状況下で正当化されてもよく、例えば互換性又は再利用目的のために別のプロセッサにとってネイティブなコードを実行する所望がある場合などである。例えば、シミュレータ実装形態は、ホスト・プロセッサ・ハードウェアによってサポートされていない追加的な機能性を伴う命令実行環境を提供すること、又は典型的には異なるハードウェア・アーキテクチャに関連付けられる命令実行環境を提供することができる。シミュレーションの概略はＲｏｂｅｒｔ  Ｂｅｄｉｃｈｅｋ、「Ｓｏｍｅ  Ｅｆｆｉｃｉｅｎｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅｓ」、１９９０年冬季ＵＳＥＮＩＸ  Ｃｏｎｆｅｒｅｎｃｅ、５３〜６３頁に示されている。
【００７３】
実施例が特定のハードウェア構築物又は特徴を参照して以前に説明されてきた範囲で、シミュレートされる実施例において等価な機能性が適切なソフトウェア構築物又は特徴によって提供され得る。例えば、特定の回路がコンピュータ・プログラム・ロジックとしてシミュレートされる実施例に実装されてもよい。同様に、レジスタ又はハッシュなどのメモリ・ハードウェアが、ソフトウェア・データ構造体としてシミュレートされた実施例に実装されてもよい。以前に説明された実施例において参照されるハードウェア要素の１つ又は複数がホスト・ハードウェアに存在する構成（例えば、ホスト・プロセッサ２３０）において、いくつかのシミュレートされる実施例は適切であればホスト・ハードウェアを利用することができる。
【００７４】
シミュレータ・プログラム２１０はコンピュータ可読記憶媒体（非一時的媒体であってもよい）に記憶することができ、ターゲット・コード２００（アプリケーション、オペレーティング・システム、及びハイパーバイザを含み得る）にプログラム・インターフェース（命令実行環境）を提供するが、ターゲット・コード２００はシミュレータ・プログラム２１０によってモデリングされるハードウェア・アーキテクチャのアプリケーション・プログラム・インターフェースと同一のものである。したがって、上述の関数コール命令及び認証コード生成／チェック命令を含むターゲット・コード２００のプログラム命令は、命令実行環境内からシミュレータ・プログラム２１０を使用して実行することができ、それによって、上で議論した装置２のハードウェア特徴を実際には有していないホスト・コンピュータ２３０がこれらの特徴をエミュレートすることができる。
【００７５】
本出願において、語句「するように構成される」は、装置の要素が定義される動作を実行することができる構成を有することを意味するために使用される。この文脈において、「構成」はハードウェア又はソフトウェアの内部接続の、配置又はやり方を意味する。例えば、装置は定義される動作を提供する専用のハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスは機能を実施するためにプログラムされてもよい。「するように構成される」は、定義される動作を提供するために装置要素がいかなるやり方でも変えられる必要があることを含意するものではない。
【００７６】
本発明の図示的な実施例を本明細書において添付の図面を参照して詳細に説明してきたが、本発明はこれらの正確な実施例に限定されず、当業者により添付の特許請求の範囲によって定義されるような本発明の範囲及び精神を逸脱することなく、その様々な変形及び修正がそこになされ得ることを理解されたい。
【図１】
2020533683.tif 000003
【図２】
2020533683.tif 000004
【図３Ａ】
2020533683.tif 000005
【図３Ｂ】
2020533683.tif 000006
【図４Ａ】
2020533683.tif 000007
【図４Ｂ】
2020533683.tif 000008
【図５Ａ】
2020533683.tif 000009
【図５Ｂ】
2020533683.tif 000010
【図６Ａ】
2020533683.tif 000011
【図６Ｂ】
2020533683.tif 000012
【図７】
2020533683.tif 000013
【図８】
2020533683.tif 000014
【図９】
2020533683.tif 000015
【図１０】
2020533683.tif 000016
【図１１】
2020533683.tif 000017
【図１２】
2020533683.tif 000018
【国際調査報告】
2020533683.tif 000019
2020533683.tif 000020