(57)【特許請求の範囲】
【請求項１】
プロセッサにおけるソフトウェアプログラムのフロー制御を実施するための方法であって、
プログラムコード内の複数のコードポインタを識別するために前記ソフトウェアプログラムの前記プログラムコードを分析するステップと、
前記複数のコードポインタの各々のコードポインタのアドレス内の共通のビット値のセットを識別するステップと、
を含み、
前記複数のコードポインタのコードポインタごとに、
前記コードポインタに基づいて認証タグを生成するステップと、
前記コードポインタ内のビットのセットを前記認証タグからのビットのセットに置換することによって、タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正するステップであって、ビットの前記セットが、前記共通のビット値のセットに対応する前記コードポインタ内で置換される、ステップと
を含む、方法。
【請求項２】
前記タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正するステップが、
前記認証タグおよび前記コードポインタにマスクを適用することによって前記タグ付きコードポインタを生成するステップをさらに備える、請求項1に記載の方法。
【請求項３】
前記認証タグおよび前記コードポインタに前記マスクを適用することによって前記タグ付きコードポインタを生成するステップが、
前記マスクを使用して、前記認証タグから第1のビットセットを選択するステップと、
前記タグ付きコードポインタを生成するために、前記第1のビットセットに対応する前記コードポインタの第2のビットセットを、前記第1のビットセットに置換するステップと
をさらに備える、請求項2に記載の方法。
【請求項４】
前記共通のビットのセットに基づいて、前記マスクを決定するステップ
をさらに備える、請求項2に記載の方法。
【請求項５】
前記複数のコードポインタのうちの1つに関連付けられる前記タグ付きコードポインタを認証するステップと、
前記認証タグが変更されたことに応答してエラー処理を実行するステップと、
前記認証タグが変更されていないことに応答して前記コードポインタの前記アドレスにおいてプログラム命令を実行するステップと
をさらに備える、請求項1に記載の方法。
【請求項６】
前記タグ付きコードポインタを認証するステップが、
マスクを使用して、前記タグ付きコードポインタから、復元されたコードポインタ値を決定するステップを備える、請求項5に記載の方法。
【請求項７】
前記マスクを使用して、前記タグ付きコードポインタから、埋め込まれた認証タグ値を抽出するステップをさらに備える、請求項6に記載の方法。
【請求項８】
前記復元されたコードポインタ値およびコンテキスト値に少なくとも部分的に基づいて、復元された認証タグを生成するステップをさらに備える、請求項7に記載の方法。
【請求項９】
前記マスクを使用して、前記復元された認証タグから、マスクされたタグ値を抽出するステップをさらに備える、請求項8に記載の方法。
【請求項１０】
前記タグ付きコードポインタが変更されているかどうかを決定するために、前記マスクされたタグ値を前記埋め込まれた認証タグ値と比較するステップをさらに備える、請求項9に記載の方法。
【請求項１１】
プロセッサにおけるソフトウェアプログラムのフロー制御を実施するための装置であって、
プログラムコード内の複数のコードポインタを識別するために前記ソフトウェアプログラムの前記プログラムコードを分析するための手段と、
前記複数のコードポインタの各々のコードポインタのアドレス内の共通のビット値のセットを識別するための手段と、
前記複数のコードポインタのコードポインタごとに、前記コードポインタに基づいて認証タグを生成するための手段と、
前記複数のコードポインタのコードポインタごとに、タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正するための手段であって、前記コードポインタ内のビットのセットを前記認証タグからのビットのセットに置換するための手段を備え、ビットの前記セットが、前記共通のビット値のセットに対応する前記コードポインタ内で置換される、手段と
を備える、装置。
【請求項１２】
前記タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正するための前記手段が、
前記認証タグおよび前記コードポインタにマスクを適用することによって前記タグ付きコードポインタを生成するための手段をさらに備える、請求項11に記載の装置。
【請求項１３】
前記認証タグおよび前記コードポインタに前記マスクを適用することによって前記タグ付きコードポインタを生成するための前記手段が、
前記マスクを使用して、前記認証タグから第1のビットセットを選択するための手段と、
前記タグ付きコードポインタを生成するために、前記第1のビットセットに対応する前記コードポインタの第2のビットセットを、前記第1のビットセットに置換するための手段と
をさらに備える、請求項12に記載の装置。
【請求項１４】
前記共通のビットのセットに基づいて、前記マスクを決定するための手段をさらに備える、請求項12に記載の装置。
【請求項１５】
前記複数のコードポインタのうちの1つに関連付けられる前記タグ付きコードポインタを認証するための手段と、
前記認証タグが変更されたことに応答してエラー処理を実行するための手段と、
前記認証タグが変更されていないことに応答して、前記コードポインタの前記アドレスにおいてプログラム命令を実行するための手段と
をさらに備える、請求項11に記載の装置。
【請求項１６】
前記タグ付きコードポインタを認証するための手段が、
マスクを使用して、前記タグ付きコードポインタから、復元されたコードポインタ値を決定するための手段を備える、請求項15に記載の装置。
【請求項１７】
プロセッサにおけるソフトウェアプログラムのフロー制御を実施するための装置であって、
プログラムコード内の複数のコードポインタを識別するために前記ソフトウェアプログラムの前記プログラムコードを分析することと、
前記複数のコードポインタの各々のコードポインタのアドレス内の共通のビット値のセットを識別することと
を行うとともに、
前記複数のコードポインタのコードポインタごとに、
前記コードポインタに基づいて認証タグを生成することと、
前記コードポインタ内のビットのセットを前記認証タグからのビットのセットに置換することによって、タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正することであって、ビットの前記セットが、前記共通のビット値のセットに対応する前記コードポインタ内で置換される、修正することと
を行うように構成されたプロセッサを備える、装置。
【請求項１８】
前記タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正するように構成されている前記プロセッサが、
前記認証タグおよび前記コードポインタにマスクを適用することによって前記タグ付きコードポインタを生成するようにさらに構成される、請求項17に記載の装置。
【請求項１９】
前記認証タグおよび前記コードポインタに前記マスクを適用することによって前記タグ付きコードポインタを生成するように構成された前記プロセッサが、
前記マスクを使用して、前記認証タグから第1のビットセットを選択し、
前記タグ付きコードポインタを生成するために、前記第1のビットセットに対応する前記コードポインタの第2のビットセットを、前記第1のビットセットに置換する
ようにさらに構成される、請求項18に記載の装置。
【請求項２０】
前記プロセッサが、
前記共通のビットのセットに基づいて、前記マスクを決定する
ようにさらに構成される、請求項18に記載の装置。
【請求項２１】
前記プロセッサが、
前記複数のコードポインタのうちの1つに関連付けられる前記タグ付きコードポインタを認証し、
前記認証タグが変更されたことに応答してエラー処理を実行し、
前記認証タグが変更されていないことに応答して、前記コードポインタの前記アドレスにおいてプログラム命令を実行する
ようにさらに構成される、請求項17に記載の装置。
【請求項２２】
前記タグ付きコードポインタを認証するように構成された前記プロセッサが、
マスクを使用して、前記タグ付きコードポインタから、復元されたコードポインタ値を決定するようにさらに構成される、請求項21に記載の装置。
【請求項２３】
前記プロセッサが、
前記マスクを使用して、前記タグ付きコードポインタから、埋め込まれた認証タグ値を抽出するようにさらに構成される、請求項22に記載の装置。
【請求項２４】
プロセッサにおけるソフトウェアプログラムのフロー制御を実施するためのコンピュータ可読命令を記憶した非一時的コンピュータ可読媒体であって、コンピュータに、
プログラムコード内の複数のコードポインタを識別するために前記ソフトウェアプログラムの前記プログラムコードを分析することと、
前記複数のコードポインタの各々のコードポインタのアドレス内の共通のビット値のセットを識別することと
を行わせるとともに、
前記複数のコードポインタのコードポインタごとに、
前記コードポインタに基づいて認証タグを生成することと、
前記コードポインタ内のビットのセットを前記認証タグからのビットのセットに置換することによって、タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正することであって、ビットの前記セットが、前記共通のビット値のセットに対応する前記コードポインタ内で置換される、修正することと
を行わせるように構成された命令を備える、非一時的コンピュータ可読媒体。
【請求項２５】
前記コンピュータに、前記タグ付きコードポインタを生成するために前記認証タグを用いて前記プログラムコード内の前記コードポインタを修正することを行わせるように構成された前記命令が、前記コンピュータに、
前記認証タグおよび前記コードポインタにマスクを適用することによって前記タグ付きコードポインタを生成することを行わせるように構成された命令をさらに備える、請求項24に記載の非一時的コンピュータ可読媒体。
【請求項２６】
前記コンピュータに、前記認証タグおよび前記コードポインタに前記マスクを適用することによって前記タグ付きコードポインタを生成することを行わせるように構成された前記命令が、前記コンピュータに、
前記マスクを使用して、前記認証タグから第1のビットセットを選択することと、
前記タグ付きコードポインタを生成するために、前記第1のビットセットに対応する前記コードポインタの第2のビットセットを、前記第1のビットセットに置換することと
を行わせるように構成された命令をさらに備える、請求項25に記載の非一時的コンピュータ可読媒体。
【請求項２７】
前記コンピュータに、
前記共通のビットのセットに基づいて、前記マスクを決定すること
を行わせるように構成された命令をさらに備える、請求項25に記載の非一時的コンピュータ可読媒体。
【請求項２８】
前記コンピュータに、
前記複数のコードポインタのうちの1つに関連付けられる前記タグ付きコードポインタを認証することと、
前記認証タグが変更されたことに応答してエラー処理を実行することと、
前記認証タグが変更されていないことに応答して、前記コードポインタの前記アドレスにおいてプログラム命令を実行することと
を行わせるように構成された命令をさらに備える、請求項24に記載の非一時的コンピュータ可読媒体。
【請求項２９】
前記コンピュータに、前記タグ付きコードポインタを認証することを行わせるように構成された前記命令が、前記コンピュータに、
マスクを使用して、前記タグ付きコードポインタから、復元されたコードポインタ値を決定することを行わせるように構成された命令をさらに備える、請求項28に記載の非一時的コンピュータ可読媒体。
【請求項３０】
前記コンピュータに、
前記マスクを使用して、前記タグ付きコードポインタから、埋め込まれた認証タグ値を抽出することを行わせるように構成された命令をさらに備える、請求項29に記載の非一時的コンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハードウェアフロー制御のためのコードポインタ認証に関する。
【背景技術】
【０００２】
入力検証の欠落または誤りなどの、ソフトウェア実装のエラーは、境界を越えたバッファアクセスおよびメモリの破損につながり得る。これらの実装のエラーは、ソフトウェアが不安定になること、または最終的に通常の条件のもとでクラッシュすることにつながり得る。しかしながら、コンピュータシステムを攻撃することに専心している悪意のある者により入力が操作されるとき、これらのメモリの破損およびオーバーフローのバグが、ソフトウェアコードの予想される挙動を変更するために、また攻撃者によって決定されるコードまたは機能を実行するために、攻撃者により悪用され得る。
【０００３】
攻撃者は通常、リターンアドレス、関数ポインタ、または仮想テーブルポインタなどの、メモリ中のデータ構造を上書きすることによって、実行の制御権を得る。巨大なレガシーのコードベースにおけるすべての利用可能なメモリ破損のバグを見つけて修正することは、常に可能であるとは限らない。したがって、多くのコンピュータシステムが、「悪用軽減機構(Exploit Mitigation Mechanisms)」と呼ばれる包括的な防御機能を含んでおり、これは、これらのバグを悪用して標的のコンピュータシステムの制御権を得るために、かつ/または標的のコンピュータシステムに損害を与えるために攻撃者が使用する、よく知られている技法に対しては効果的である。
【０００４】
コンピュータシステムに一般的に含まれる悪用軽減機構のいくつかの例には、データ実行防止(DEP)、スタック保護(SP)、およびアドレス空間レイアウトランダム化(ASLR)がある。DEP技法では、すべてのコードセクションが読取り専用としてマークされ、すべての書込み可能な領域が実行不可能である。通常、コードセクションの読取り専用という性質および書込み可能セクションの実行不可能という性質は、プロセッサのメモリ管理ユニット(MMU)によって課される。この技法は、攻撃者が自身のコードをデータエリアに置き、そのコードに対する実行フローを指示するのを防ぐことができる。SPの手法では、コンパイラが、スタック上でのバッファのオーバーフローを検出するための関数を実装する。スタックベースのバッファのオーバーフローは悪用されやすいことがあり、それは、ローカルアレイの直後のスタック上にリターンアドレスまたは保存されたリンクレジスタがあることが多いからである。攻撃者は、ローカルアレイをオーバーフローさせ、ローカルアレイにリターンアドレス/リンクレジスタを上書きさせ、ソフトウェアの実行フローをリダイレクトさせることが可能である。多くの従来のスタック保護の実装形態は、関数の最初においてスタック上にガード値を挿入し、その関数から戻る前にその値の変更について確認する。バッファのオーバーフローが発生した場合、ガード値はリターンアドレスとともに上書きされており、それは、ガード値がスタックにおいてバッファとリターンアドレスの間に位置しているからである。ガード値は、SPの手法が安全であるために、ランダムな値および/または予測不可能な値でなければならない。ASLRの手法では、アプリケーションのメモリレイアウトが、各実行においてランダム化され得る。たとえば、コードのためのベースアドレス、静的データ、スタック、およびヒープがランダムに決定され得る。この手法は、悪用を難しくする。それは、攻撃の成功のために攻撃者が標的にする/操作する必要のあるコード/データ/ポインタの位置を、攻撃者が予測する必要があるからである。
【発明の概要】
【課題を解決するための手段】
【０００５】
本開示によるプロセッサにおけるソフトウェアプログラムのフロー制御を実施するための例示的な方法は、プログラムコード内のコードポインタを識別するためにソフトウェアプログラムのプログラムコードを分析するステップと、コードポインタに基づいて認証タグを生成するステップと、タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するステップとを含む。
【０００６】
そのような方法の実装形態は、以下の特徴のうちの1つまたは複数を含み得る。タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するステップは、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するステップをさらに含む。認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するステップは、マスクを使用して、認証タグから第1のビットセットを選択するステップと、タグ付きコードポインタを生成するために、第1のビットセットに対応するコードポインタの第2のビットセットを、第1のビットセットに置換するステップをさらに含む。プログラムコード内の複数のコードポインタを識別するステップと、マスクを決定するためにプログラムコード内の複数のコードポインタに共通のタグビットを識別するステップ。タグ付きコードポインタを認証するステップと、認証タグが変更されたことに応答してエラー処理を実行するステップと、認証タグが変更されていないことに応答してコードポインタに関連付けられるアドレスにおいてプログラム命令を実行するステップ。タグ付きコードポインタを認証するステップは、マスクを使用して、タグ付きコードポインタから、復元されたコードポインタ値を決定するステップを含む。マスクを使用して、タグ付きコードポインタから、埋め込まれた認証タグ値を抽出するステップ。復元されたコードポインタ値およびコンテキスト値に少なくとも部分的に基づいて、復元された認証タグを生成するステップ。マスクを使用して、復元された認証タグから、マスクされたタグ値を抽出するステップ。タグ付きコードポインタが変更されているかどうかを決定するために、マスクされたタグ値を埋め込まれた認証タグ値と比較するステップ。
【０００７】
本開示によるプロセッサにおけるソフトウェアプログラムのフロー制御を実施するための例示的な装置は、プログラムコード内のコードポインタを識別するためにソフトウェアプログラムのプログラムコードを分析するための手段と、コードポインタに基づいて認証タグを生成するための手段と、タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するための手段とを含む。
【０００８】
そのような装置の実装形態は、以下の特徴のうちの1つまたは複数を含み得る。タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するための手段は、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するための手段を含む。認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するための手段は、マスクを使用して、認証タグから第1のビットセットを選択するための手段と、タグ付きコードポインタを生成するために、第1のビットセットに対応するコードポインタの第2のビットセットを、第1のビットセットに置換するための手段をさらに含む。プログラムコード内の複数のコードポインタを識別するための手段と、マスクを決定するためにプログラムコード内の複数のコードポインタに共通のタグビットを識別するための手段。タグ付きコードポインタを認証するための手段と、認証タグが変更されたことに応答してエラー処理を実行するための手段と、認証タグが変更されていないことに応答して、コードポインタに関連付けられるアドレスにおいてプログラム命令を実行するための手段。マスクを使用して、タグ付きコードポインタから、復元されたコードポインタ値を決定するための手段。
【０００９】
本開示によるプロセッサにおけるソフトウェアプログラムのフロー制御を実施するための例示的な装置は、プログラムコード内のコードポインタを識別するためにソフトウェアプログラムのプログラムコードを分析し、コードポインタに基づいて認証タグを生成し、タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するように構成されたプロセッサを含む。
【００１０】
そのような装置の実装形態は、以下の特徴のうちの1つまたは複数を含み得る。タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するように構成されているプロセッサは、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するようにさらに構成される。認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するように構成されているプロセッサは、マスクを使用して、認証タグから第1のビットセットを選択し、タグ付きコードポインタを生成するために、第1のビットセットに対応するコードポインタの第2のビットセットを、第1のビットセットに置換するようにさらに構成される。本プロセッサは、プログラムコード内の複数のコードポインタを識別し、マスクを決定するためにプログラムコード内の複数のコードポインタに共通のタグビットを識別するようにさらに構成される。本プロセッサは、タグ付きコードポインタを認証し、認証タグが変更されたことに応答してエラー処理を実行し、認証タグが変更されていないことに応答して、コードポインタに関連付けられるアドレスにおいてプログラム命令を実行するようにさらに構成される。タグ付きコードポインタを認証するように構成されているプロセッサは、マスクを使用して、タグ付きコードポインタから、復元されたコードポインタ値を決定するようにさらに構成される。本プロセッサは、マスクを使用して、タグ付きコードポインタから、埋め込まれた認証タグ値を抽出するようにさらに構成される。
【００１１】
本開示によるプロセッサにおけるソフトウェアプログラムのフロー制御を実施するためのコンピュータ可読命令を記憶した非一時的コンピュータ可読媒体は、コンピュータに、プログラムコード内のコードポインタを識別するためにソフトウェアプログラムのプログラムコードを分析することと、コードポインタに基づいて認証タグを生成することと、タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正することと行わせるように構成された命令を含む。
【００１２】
コンピュータに、タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正することを行わせるように構成された命令は、コンピュータに、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成することを行わせるように構成された命令をさらに備える。コンピュータに、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成することを行わせるように構成された命令は、コンピュータに、マスクを使用して、認証タグから第1のビットセットを選択することと、タグ付きコードポインタを生成するために、第1のビットセットに対応するコードポインタの第2のビットセットを、第1のビットセットに置換することとを行わせるように構成された命令をさらに備える。コンピュータに、プログラムコード内の複数のコードポインタを識別することと、マスクを決定するためにプログラムコード内の複数のコードポインタに共通のタグビットを識別することとを行わせるように構成される命令。コンピュータに、タグ付きコードポインタを認証することと、認証タグが変更されたことに応答してエラー処理を実行することと、認証タグが変更されていないことに応答して、コードポインタに関連付けられるアドレスにおいてプログラム命令を実行することとを行わせるように構成される命令。コンピュータに、タグ付きコードポインタを認証することを行わせるように構成された命令は、コンピュータに、マスクを使用して、タグ付きコードポインタから、復元されたコードポインタ値を決定することを行わせるように構成された命令をさらに備える。コンピュータに、マスクを使用してタグ付きコードポインタから埋め込まれた認証タグ値を抽出することを行わせるように構成される命令。
【図面の簡単な説明】
【００１３】
【図１】本明細書で論じるコードポインタ認証技法が実装され得る例示的なコンピュータシステムの機能ブロック図である。
【図２】コードポインタ認証のための例示的なプロセスの流れ図である。
【図３】図2に示されるコードポインタ認証プロセスに従って保護されたコードポインタを認証するための例示的なプロセスの流れ図である。
【図４】認証タグを生成するための例示的なプロセスの流れ図である。
【図５】タグ付きコードポインタを生成するために認証タグを用いてコードポインタを修正するための例示的なプロセスの流れ図である。
【図６】図3に示されるコードポインタ認証プロセスに従って保護されたコードポインタを認証するための例示的なプロセスの流れ図である。
【図７】マスクを生成するための例示的なプロセスの流れ図である。
【図８】図4に示されるコードポインタをタグ付けするためのプロセスの一例を示す図である。
【図９】図5に示されるタグ付きコードポインタを認証するためのプロセスの一例を示す図である。
【発明を実施するための形態】
【００１４】
悪意のあるコードまたは不適切に記述されたコードが、コンピュータシステムのプロセッサによって実行されるべきソフトウェアコード内のコードポインタを修正することを防止するために、ハードウェアにおける実装されたコードポインタ認証のための技法が提供される。本明細書に開示された技法は、ソフトウェアコード内のコードポインタをタグ付けするために使用され得る。タグは、プロセッサがコードポインタに関連付けられるアドレスへのジャンプまたは分岐命令を実行する前に、実行可能コードへの有効ポインタとしてコードポインタを認証するために使用され得る。タグ付きコードポインタの認証に失敗した場合、プロセッサは、プログラムコードの実行を停止するために使用され得るエラー処理手順を実行するように構成され得、それによって、修正または破損されたコードポインタによって指摘され得る任意の悪質なコードの実行を防止する。
【００１５】
コードポインタは、攻撃者が有効なタグを偽造するのを困難にするような方法でタグ付けされ得る。ソフトウェアコードの論理フロー内の間接ジャンプまたは分岐を通じて到達され得るコード内の唯一の場所を表す認証タグが作成され得る。いくつかの実装形態では、タグは、タグへの変更をより困難にするプロセッサのみに知られている秘密鍵を使用して暗号化された暗号認証タグであり得る。
【００１６】
本明細書に開示される技法は、メモリ破損バグによって上書きされたコードポインタが誤って間接ジャンプまたは呼出しのターゲットとして使用されるのを防止するのに役立ち得る。
【００１７】
例示的なハードウェア
図1は、本明細書に開示される様々な技法を実装するために使用され得るコンピュータシステム100のブロック図である。コンピュータシステム100は、図2〜図9に示されるプロセスを少なくとも部分的に実装するために使用され得る。
【００１８】
コンピュータシステム100は、バス115によって相互に接続された汎用プロセッサ110、ワイヤレスインターフェース125、ネットワークインターフェース165、および非一時的メモリ160を備える。ワイヤレスインターフェース125は、コンピュータシステム100が、データを送信および/または受信するために使用され得る、1つまたは複数のワイヤレス広域ネットワーク(WWAN)システム、ワイヤレスローカルエリアネットワーク(WLAN)、および/または他のタイプのワイヤレス通信プロトコルに関連付けられるワイヤレス通信プロトコルを使用してデータを送信ならびに/あるいは受信することを可能にする、ワイヤレス受信機、送信機、トランシーバ、および/または他の要素を含み得る。ワイヤレスインターフェース125は、ワイヤレス通信プロトコルを使用して通信するように構成された他のワイヤレスデバイスへの/そこからの通信を送受信するために、回線132によってアンテナ134に接続される。コンピュータシステム100は、図1に示されるトランシーバに加えて、またはトランシーバの代わりに、他のワイヤレスプロトコルを使用して通信を受信および/または送信するように構成された1つまたは複数のトランシーバを含み得る。
【００１９】
ネットワークインターフェース165は、コンピュータシステム100を1つまたは複数のワイヤードネットワーク接続に接続するように構成され得る。ネットワークインターフェース165は、コンピュータシステム100が1つまたは複数のワイヤードデータ接続を介してデータを送信および受信することを可能にするように構成され得る。
【００２０】
プロセッサ110は、インテリジェントデバイス、たとえばIntel(登録商標)CorporationまたはAMD(登録商標)によって作られたものなどのパーソナルコンピュータ中央処理装置(CPU)、マイクロコントローラ、特定用途向け集積回路(ASIC)などであり得る。メモリ160は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、またはそれらの組合せを含むことができる非一時的記憶デバイスである。メモリ160は、本明細書に記述された関数を実行するようにプロセッサ110を制御するための命令を含むプロセッサ可読でプロセッサ実行可能なソフトウェアコードを記憶することができる(ただし、記述ではソフトウェアが関数を実行すると述べる場合がある)。ソフトウェアは、ネットワーク接続を介してダウンロードされることによってメモリ160にロードしたり、ディスクからアップロードしたりするなどできる。さらに、ソフトウェアは、実行前にコンパイルが必要など、直接的に実行可能ではない場合がある。
【００２１】
メモリ160内のソフトウェアは、プロセッサ110が、本明細書で論じるコードポインタ認証技法を保護するための様々な技法を実装することを含む、様々な動作を実行することを可能にするように構成される。
【００２２】
プロセッサ110は、本明細書に開示されるコードポインタ認証技法のための構成データを記憶するために使用され得る1つまたは複数のレジスタを含み得る。たとえば、プロセッサ110は、マスクレジスタ110-Aと、値レジスタ110-Bと、フラグレジスタ110-Cと、コンテキストレジスタ110-Dとを含む。マスクレジスタ110-Aは、コードポインタにタグを付け、タグ付きコードポインタを認証するために使用される現在のマスク用のマスクビットを記憶するために使用され得る。そのようなマスクデータ(マスク810)の一例が図8および図9に示されており、そのようなマスクを生成するための例示的なプロセスが図7に示されている。値レジスタ110-Bは、そのポインタを認証するためにタグ付きコードポインタのタグを外すときに使用される現在の値の値を記憶するために、およびコードポインタの元の値を復元するために使用され得る。そのような値データ(値805)の一例が図8および図9に示されており、値データを生成するための例示的なプロセスが図7に示されている。フラグレジスタ110-Cは、本明細書に開示されるコードポインタ認証および/またはスタックポインタ保護技法を可能および/または不可能にするために使用され得るフラグを含むように構成され得る。コンテキストレジスタ110-Dは、プロセッサ110によって実行されているプログラムコードに関連付けられ、プログラムコードのコードポインタに関連付けられる認証タグを生成するために使用される現在のコンテキスト値を含むために使用され得る。そのようなコンテキストデータ(コンテキスト値825)の一例が図8および図9に示されている。図2〜図6に示されるプロセスなどの他のプロセスは、レジスタ110-A、110-B、110-C、および110-Dに記憶された値にアクセスする、および/またはそれを修正することができる。他の実装形態に含まれるレジスタの数は変わる場合がある。
【００２３】
プロセッサ110は、プログラムコード内のコードポインタを識別するためにソフトウェアプログラムのプログラムコードを分析するための手段と、コードポインタに基づいて認証タグを生成するための手段と、タグ付きコードポインタを生成するために認証タグを用いてプログラムコード内のコードポインタを修正するための手段とを提供し得る。プロセッサ110はまた、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するための手段を提供し得る。プロセッサ110はまた、マスクを使用して、認証タグから第1のビットセットを選択するための手段と、タグ付きコードポインタを生成するために、第1のビットセットに対応するコードポインタの第2のビットセットを、第1のビットセットに置換するための手段とを提供することによって、認証タグおよびコードポインタにマスクを適用することによってタグ付きコードポインタを生成するための手段を提供し得る。プロセッサ110はまた、プログラムコード内の複数のコードポインタを識別するための手段と、マスクを決定するためにプログラムコード内の複数のコードポインタに共通のタグビットを識別するための手段とを提供し得る。プロセッサ110はまた、タグ付きコードポインタを認証するための手段と、認証タグが変更されたことに応答してエラー処理を実行するための手段と、認証タグが変更されていないことに応答して、コードポインタに関連付けられるアドレスにおいてプログラム命令を実行するための手段とを提供し得る。プロセッサ110はまた、マスクを使用して、タグ付きコードポインタから、復元されたコードポインタ値を決定するための手段を提供し得る。
【００２４】
例示的な実装形態
図2は、本明細書に開示されるコードポインタ認証技法を実装するために使用され得るプロセッサにおけるソフトウェアプログラムのフロー制御を実施するためのプロセスの流れ図である。図2に示されるプロセスは、図1に示されるコンピュータシステム100を使用して実施され得る。図1に示される例示的なコンピュータシステム100は、図2に示されるプロセスが実施され得る1つのコンピュータシステムの一例を提供し、図2に示されるプロセスは、図1に示される例とは異なるアーキテクチャを有するコンピュータシステムのプロセッサによって実施され得る。
【００２５】
ソフトウェアプログラムのプログラムコードは、プログラムコード内のコードポインタを識別するために分析され得る(段階205)。分析されるプログラムコードは、ソースコードであってもよく、バイナリコードであってもよい。コードポインタは、プログラムコードの実行のフローのジャンプポイントまたは分岐点から到達され得るプログラムコードの命令へのアドレスを表し得る。悪意のある者は、コードポインタが最初に関連付けられたものとは異なる命令に関連付けられるアドレスにおいてコードポインタを修正することによって、プログラムコードのフローの制御権を取得しようする場合がある。図1に示されるプロセスは、上述したものなどのメモリ破損の悪用を緩和するための技法として、プログラムコード内のコードポインタを識別することから始まる。
【００２６】
図1に示される例示的なプロセスは、フロー制御が実施されるべきプログラムコード内のコードポインタを識別することを含む。図1に示される例は、1つのコードポインタを識別することを論じているが、図1に示されるプロセスは、プログラムコード内に含まれる2つ以上のコードポインタを識別するように適合され得る。プロセッサ110は、プロセッサ110によるプログラムコードの実行の前に、プログラムコード内のコードポインタを識別するように構成され得る。たとえば、プロセッサ110は、プロセッサ110によってプログラムコードがロードされたとき、および動的または静的リンクが実行されたときに、プログラムコード内のコードポインタを識別するように構成され得る。
【００２７】
コードポインタのために認証タグが生成され得る(段階210)。認証タグは、悪意のある者が、検出されずに異なるアドレスを指すようにコードポインタを修正することを困難にするプロセスを使用して生成され得る。いくつかの実装形態では、コードポインタの少なくとも一部は、プロセッサ110によって維持される秘密鍵を使用して暗号化され得、コードポインタの認証タグは、コードポインタの暗号化された部分を使用して生成され得る。コードポインタのための認証タグを生成するための例示的なプロセスが、図5および図7に示されている。
【００２８】
プログラムコード内のコードポインタは、タグ付きコードポインタを生成するために認証タグを用いて修正され得る(段階215)。コードポインタは、段階210において生成された認証タグと全体的または部分的に置換され得る。コンピュータシステム100の構成に応じて、コンピュータシステム100のアーキテクチャを大幅に変更することなしに、コードポインタに追加のデータを付加することができない場合がある。したがって、本明細書に開示される技法は、認証タグを用いてコードポインタを修正し、タグ付きコードポインタに関連付けられるアドレスにおいて命令を実行する前にタグ付きコードポインタが修正されていないことを検証する。この手法は、タグ付きコードポインタがタグなしコードポインタに割り振られたメモリ空間内に収まるため、コンピュータシステム100のアーキテクチャを大幅に変更する必要はない。さらに、コードポインタ自体を修正することで、悪意のあるコードがプログラムフローを有効なアドレスにリダイレクトすることをより困難にすることができる。悪意のあるコードは、所望のターゲットアドレスに対する有効な認証タグを生成し、そのアドレスにプログラム実行のフローをリダイレクトするためにそのアドレスへの有効なタグ付きコードポインタを生成するようにコードポインタを修正することができる必要がある。
【００２９】
図3は、保護されたコードポインタを認証するための例示的なプロセスの流れ図である。図3に示されるプロセスは、図2に示されるプロセスを使用して修正されたコードポインタを認証するために使用され得る。さらに、図2に示されるプロセスは、図3に示されるプロセスの段階を含むように修正され得る。図3に示されるプロセスは、図1に示されるコンピュータシステム100を使用して実施され得る。図1に示される例示的なコンピュータシステム100は、図3に示されるプロセスが実施され得る1つのコンピュータシステムの一例を提供し、図3に示されるプロセスは、図1に示される例とは異なるアーキテクチャを有するコンピュータシステムのプロセッサによって実施され得る。
【００３０】
タグ付きコードポインタが認証され得る(段階310)。タグ付きコードポインタを含むプログラムコードの実行中のある時点において、プロセッサはタグ付きコードポインタに遭遇し、タグ付きコードポインタが変更されているかどうかを決定するために、そのタグ付きコードポインタを認証し得る。たとえば、タグ付きコードポインタは、悪意のあるコードまたは不適切に記述されたコードによって変更された可能性がある。たとえば、タグ付きコードポインタは、攻撃者がコードポインタに関連付けられるメモリアドレスの値を修正することを可能にするメモリ破損またはメモリオーバーフローバグを悪用する悪意のある行為によって修正されている可能性がある。いくつかの実装形態では、プロセッサ110は、コードポインタに関連付けられる認証タグを再生成し、2つのタグが一致するかどうかを決定するために、タグ付きコードポインタから抽出された認証タグと再生成された認証タグを比較することによって、タグ付きコードポインタが変更されたことを決定するように構成され得る。タグが一致する場合、タグ付きコードポインタは変更されておらず、タグが一致しない場合、タグ付きコードポインタは変更されている。タグ付きコードポインタを認証するための例示的なプロセスが、図6に示されている。図6に示されるプロセスは、図3に示される修正技法を使用して保護されたコードポインタを認証するために使用され得る。
【００３１】
次に図3に戻ると、認証タグが変更されたことに応答して、エラー処理が実行され得る(段階315)。プロセッサ110は、タグ付きコードポインタが変更されているプログラムコードの実行を停止するために使用され得る様々なタイプのエラー処理手順を実行するように構成され得る。たとえば、プロセッサ110は、タグ付きコードポインタが変更されていることを示すフラグを設定するように構成され得る。プロセッサ110は、フラグが設定されており、エラー状態に応答するように構成されていることを認識する命令をプログラムコードにおいて実行するように構成され得る。たとえば、プログラムコードは、制御された方法でプログラムコードの実行を終了させ、メモリ内で実行されているプログラムコードに関連付けられる任意のデータをクリーンアップする命令を含み得る。プログラムコードはまた、プログラムコードが実行されているコンピューティングデバイスのユーザに、エラーが発生したこと、およびプログラムコードがシャットダウンされていることを警告する命令を含み得る。プロセッサ110に、発生したエラーに関する情報を提供する情報をログに書き込ませる他の命令も、プログラムコードに含まれ得る。プログラムコードはまた、プロセッサ110に、プログラムコードを作成または配布したコンテンツプロバイダに関連付けられるコンテンツプロバイダサーバなどのリモートサーバにログを送信させる命令を含み得る。プロセッサ110はまた、プロセッサ110によって実行されているプログラムコードに含まれているエラー処理ルーティングの代わりに設定されているエラーフラグに応答して、上述したエラー処理を実行するように構成され得る。プロセッサ110はまた、タグ付きコードポインタが修正または変更されていると決定されたことに応答して、タグ付きコードポインタから元のコードポインタを復元しないように構成され得る。その結果、タグ付きコードポインタは有効なアドレスを参照せず、例外が発生され得る。プロセッサ110は、プロセッサ110によって実行されているプログラムコード内の無効なアドレスへの任意の参照と同様に、そのような例外を処理するように構成され得る。たとえば、プロセッサ110は、無効なアドレスを識別することに応答して、プログラムコードの実行を正常に停止する、エラー情報をログに書き込む、ログ情報をコンテンツ作成者またはプロバイダに送る、プログラムコードが実行されているコンピューティングデバイスのユーザに、エラーのためにプログラムコードをシャットダウンしなければならないことを通知する、および/または他のステップなどの、標準エラー処理ルーチンを実行するように構成され得る。エラー処理に対するこれらの手法は、プログラムコードのフローが悪意のあるコードまたは不適切に記述されたコードによってリダイレクトされることを防止することができる。
【００３２】
認証タグが変更されていないことに応答して、コードポインタに関連付けられるアドレスにおいてプログラム命令が実行され得る(段階320)。プロセッサ110は、タグ付きコードポインタが認証されていることに応答して、タグ付きコードポインタに関連付けられるアドレスにおいてプログラム命令を実行するように構成され得る。タグ付きコードポインタが正常に認証された場合、コードポインタは悪意のあるコードまたはメモリ悪用によって変更されていない可能性が高く、プログラム実行のフローは、コードポインタに関連付けられるメモリアドレスに配置された命令で継続し得る。
【００３３】
図4は、認証タグを生成するための例示的なプロセスの流れ図である。図4に示されるプロセスは、図2に示されるプロセスの段階210を実施するために使用され得る。図4に示されるプロセスは、図1に示されるコンピュータシステム100を使用して実施され得る。図1に示される例示的なコンピュータシステム100は、図4に示されるプロセスが実施され得る1つのコンピュータシステムの一例を提供し、図4に示されるプロセスは、図1に示される例とは異なるアーキテクチャを有するコンピュータシステムのプロセッサによって実施され得る。図4に示されるプロセスを、コードポインタ用の認証タグを生成するための、およびタグ付きコードポインタを生成するためにコードポインタを修正するためのプロセスの一例を提供する図8の図を参照して説明する。
【００３４】
プロセッサ110に関連付けられる秘密鍵がアクセスされ得る(段階405)。秘密鍵は、コードポインタを修正するために使用され得る認証タグを生成する際に使用され得る。コンピュータシステム100上で悪意のあるコードを実行することを望む者から鍵を安全に保つために、鍵は秘密に保持され、プロセッサ110がアクセスすることができるが、プロセッサ110によって実行されているプロセスによってアクセスされ得ない、実質的にアクセス不可能なメモリ位置に記憶されるべきである。いくつかの実装形態では、コンピュータシステム100のプロセッサ110に関連付けられる複数のキーが存在することがある。たとえば、多くのARMプロセッサとHEXAGONプロセッサには、モニタ、カーネル、およびユーザの実行モードなどの、複数の実行(特権)レベルが関連付けられている。これらの特権レベルの各々は、1つまたは複数の実行環境を含み得る。たとえば、各ユーザモードプロセスは、「ユーザ」特権レベルの実行環境内で動作し、これらのプロセスはオペレーティングシステム(OS)カーネルによって管理される。いくつかの実装形態では、ゲストOSは、コンピュータシステム100上に実装され得る。ゲストOSは、「カーネル」特権レベルの実行環境内で動作され、ハイパーバイザまたは仮想マシンモニタ(VMM)によって管理され得る。複数の特権レベルを有する環境では、コンピューティングシステム100のプロセッサ110に関連付けられる特権レベルごとに保護パラメータのセットが定義され得る。これらの保護パラメータは、コードポインタをタグ付けするため、およびタグ付きコードポインタを検証するために使用される鍵、コードポインタをタグ付けするために使用されるマスクおよび値、コードポインタ検証を可能および/または不可能にするためのプロセッサフラグ、ならびに/あるいはハードウェアベースのスタック保護などの他のセキュリティ機能を含み得る。実行コンテキストに関連付けられるパラメータは、同じまたはより低い特権レベルにおいて動作する他の実行コンテキストから隠される。プロセッサ110は、各特権レベルに関連付けられる保護パラメータを記憶するためのレジスタを含むように構成され得る。プロセッサ110はまた、特定の特権レベルにおいて実行するコードが次に低い特権レベルの構成レジスタを読み取って設
定できるように、保護パラメータを読み取って設定するために命令を公開するように構成され得る。いくつかの実装形態では、プロセッサ110は、モニタまたはハイパーバイザが、現在の特権レベルに関連付けられる鍵、ならびに次に最も低い特権レベルに関連付けられる鍵(もしあれば)を管理することが許可されるように構成される。プロセッサ110は、より高い特権レベルが、次に低い特権レベルの処理コンテキストを作成および/または切り替えるときに、鍵を生成および/または変更する役割を果たすように構成され得る。段階405において、実行環境に関連付けられる適切な特権レベルに関連付けられる鍵。複数の実行環境および/または特権レベルがサポートされていない場合、または特権レベルごとに異なるセキュリティが提供されない場合、プロセッサに関連付けられる鍵は、プロセッサ110のレジスタからアクセスされ得る。
【００３５】
プログラムコードに関連付けられるコンテキスト情報がアクセスされ得る(段階410)。コンテキスト情報は特定の実行環境に関連付けられてよく、特定の実行環境に関連付けられる固有の秘密値を備え得る。いくつかの実装形態では、コンテキスト情報は使用されない場合がある。しかしながら、コンテキスト情報は、追加のセキュリティレベルを提供する。たとえば、攻撃者がプログラムコードの情報漏えいの脆弱性を悪用することによって、メモリからタグ付きコードポインタを読み取ることができた場合、攻撃者はまた、タグ付きコードポインタに関連付けられる認証済みエントリポイントのうちのいずれか1つを呼び出すためにプログラムコードのフローを潜在的に制御できる可能性がある。攻撃者は、悪用の際にタグ付きコードポインタに含まれていたアドレスを使用することに制限されるが、タグ付きコードポインタはプログラムフローを変更するために相互に置換され得る。しかし、コンテキストの追加は、コンテキストによってコードポインタをグループ化することによって、攻撃者の能力をさらに制限する。コンテキストは、認証関数への追加の引数として導入され、同じコンテキストを持つポインタだけが相互に置換され得る。したがって、ロード時にコードポインタが適切なコンテキストでタグ付けされることを条件として、プログラムコードの制御フローインテグリティ(CFI)を実施するために、コンテキストを含む本明細書に開示される技法が使用され得る。
【００３６】
プロセッサ110は、同じ実行レベルで動作する実行環境が、同じまたはより高いレベルで動作する他の実行環境に関連付けられるコンテキスト情報にアクセスできないように構成され得る。プロセッサ110は、より高い特権レベルにおいて動作する実行環境が、より低い特権レベルにおいて動作する実行環境に関連付けられるコンテキスト情報にアクセス、修正、および/または生成できるように構成され得る。いくつかの実装形態では、プロセッサ110は、より高い特権レベルにおいて動作する実行環境が、現在の特権レベルよりも1つ下のレベルでのみ動作する実行環境に関連付けられるコンテキスト情報にアクセス、修正、および/または生成できるように構成され得る。
【００３７】
認証タグを生成するために、暗号アルゴリズムがコードポインタに適用され得る(段階415)。暗号アルゴリズムは、メッセージ認証コード(MAC)であり得る。図8に示される例示的な実装形態は、認証タグ835を生成するためにMACアルゴリズム830を使用する。MACアルゴリズム830への入力は、段階405において取得された鍵820、段階410において取得されたコンテキスト情報825、およびタグ付けされるコードポインタ815である。コンテキスト情報825およびコードポインタ815は、MACアルゴリズム830および鍵820を使用して暗号化され得る。コンテキスト情報815は、追加のセキュリティの層を提供するために認証タグを生成するときに使用され得る固有の値を備え得る。プログラムコードの実行のフローを制御しようとしてコードポインタを不正に修正しようとする悪意のある者は、プログラムコードが実行されている実行環境に関連付けられるコンテキスト情報の知識を有しておらず、認証タグ835を容易に複製することができないであろう。たとえば、悪意ある者がタグ付きコードポインタへのアクセスが許可されたメモリバグを悪用することができた場合、タグ付きコードポインタは、同じコンテキストに関連付けられる他のタグ付きコードポインタにしか置換され得ない。
【００３８】
図5は、タグ付きコードポインタを生成するために認証タグを用いてコードポインタを修正するための例示的なプロセスの流れ図である。図2に示されるプロセスの段階215を実施するために、図5に示されるプロセスが使用され得る。図5に示されるプロセスは、図1に示されるコンピュータシステム100を使用して実施され得る。図1に示される例示的なコンピュータシステム100は、図5に示されるプロセスが実施され得る1つのコンピュータシステムの一例を提供し、図5に示されるプロセスは、図1に示される例とは異なるアーキテクチャを有するコンピュータシステムのプロセッサによって実施され得る。図5に示されるプロセスを、コードポインタ用の認証タグを生成するための、およびタグ付きコードポインタを生成するためにコードポインタを修正するためのプロセスの一例を提供する図8の図を参照して説明する。
【００３９】
コードポインタに関連付けられる認証タグからのビットは、マスクを使用して選択され得る(段階505)。図8に示される例では、タグ付きコードポインタ840を生成するために、マスク810がコードポインタ815および認証タグ835に適用され得る。図7に示されるプロセスは、マスク810を生成するために使用され得る1つの技法を示す。さらに、上述したように、マスクは、特定の実行環境に、および/またはプロセッサ110によって実装される特定の特権レベルに関連付けられ得る。図8に示される例では、マスクは、16個の上位ビットと3個の最下位ビットとの19ビットを選択するように構成される。マスクは、コードポインタ815から対応するビットを選択するために使用される。
【００４０】
タグ付きコードポインタを生成するために、コードポインタ内のビットが認証タグから選択されたビットに置換され得る(段階510)。図8に示される例では、認証タグから選択されたものに対応するコードポインタ815内のビットが、タグ付きコードポインタ840を生成する認証タグビットに置換される。たとえば、タグ付きコードポインタ840の値は、以下の式を使用して導き出され得る。
(ポインタ&〜マスク)|(タグ&マスク)
上式で、「ポインタ」値はコードポインタ815の値を表し、「〜マスク」値はマスク810の逆値を表し、「タグ」値は認証タグ835を表し、「〜マスク」値はマスク810の値を表す。
【００４１】
タグ付きコードポインタは、コードポインタに関連付けられるメモリ位置に記憶され得る(段階515)。タグ付きコードポインタ840は、メモリ160内の位置、またはコードポインタ815が最初に記憶された他のメモリ位置に書き込まれ得る。プロセッサ110は、タグ付きコードポインタ840に関連付けられるアドレスにおいて命令を実行する前に、タグ付きコードポインタ840を復号および認証するように構成され得る。タグ付きコードポインタ840を修正しようとする悪意のある者は、認証タグ835を生成するために使用されるアルゴリズム、コードポインタ815のうちのどのビットが認証タグ835からのビットに置換されるべきかを選択するために使用されるマスク値810(本明細書では、マスク810とも呼ばれる)、ならびに/あるいは認証タグ835を生成するために使用されるコンテキスト情報825および鍵820を知ることなしにコードポインタの有効な値を生成することはできないであろう。
【００４２】
あるいは、タグ付きコードポインタを生成するための図5に示されるプロセスは、段階505において上述したように認証タグ835からのビットが選択され得るように修正され得るが、段階510は、コードポインタからのビットが、マスク810の逆値を使用してコードポインタから選択されるように修正され得る。次いで、タグ付きコードポインタ840を作成するために、認証タグ835から選択されたビットとコードポインタ815から選択されたビットとが組み合わせられ得る。
【００４３】
図6は、図3に示されるコードポインタ認証プロセスに従って保護されたタグ付きコードポインタを認証するための例示的なプロセスの流れ図である。図6に示されるプロセスは、図3に示されるプロセスの段階310を実施するために使用され得る。図6に示されるプロセスは、図1に示されるコンピュータシステム100を使用して実施され得る。図1に示される例示的なコンピュータシステム100は、図6に示されるプロセスが実施され得る1つのコンピュータシステムの一例を提供し、図6に示されるプロセスは、図1に示される例とは異なるアーキテクチャを有するコンピュータシステムのプロセッサによって実施され得る。図6に示されるプロセスは、タグ付きコードポインタから認証タグを復元し、タグ付きコードポインタが変更されているかどうかを決定するためのプロセスの一例を提供する図8および図9を参照して説明される。
【００４４】
タグ付きコードポインタから復元されたコードポインタ値は、マスクを使用して決定され得る(段階605)。復元されたコードポインタ905は、コードポインタを修正し、タグ付きコードポインタ840を作成するために使用された認証タグ835を生成するために、図5に示されるプロセスの段階505において使用されたマスク810を使用して、タグ付きコードポインタ840から決定され得る。上述したように、マスクはプロセッサ110に関連付けられてもよく、プロセッサ110は異なる実行環境および/または特権レベルに対して異なるマスクにアクセスしてもよい。プロセッサ110は、プロセッサ110によって複数の実行環境および/または特権レベルが実装されている場合、実行中のプログラムコードに関連付けられる実行環境および/または特権レベルに対して適切なマスク810を選択するように構成され得る。マスクは、タグ付きコードポインタ840から、認証タグ835からのビットに置換されたビットを選択するために使用される。タグ付きコードポインタ840の選択されたビットは、復元されたコードポインタ905を生成するために、これらのビットの元の値である値805によって置換される。値805を決定するための、およびマスクビットを生成するためのプロセスが図7に示されており、以下に詳細に説明する。
【００４５】
一例として、復元されたコードポインタ905の値は、以下の式を使用して導き出され得る。
(値&マスク)|(タグ付きコードポインタ&〜マスク)
上式で、「値」は値805によって表される共通のビットのセットを表し、「マスク」値はマスク810の値を表し、「タグ付きコードポインタ」値はタグ付きコードポインタ840を表し、「〜マスク」値はマスク810の逆値を表す。
【００４６】
復元された認証タグは、復元されたコードポインタ、コンテキスト値、および鍵に少なくとも部分的に基づいて生成され得る(段階610)。図9に示される例では、復元された認証タグ915は、復元されたコードポインタ905にMACアルゴリズム830を適用することによって生成される。MACアルゴリズム830は、鍵820、復元されたコードポインタ905、およびコンテキスト値825を入力として受け取る。復元された認証タグ915を生成するためのプロセスは、タグ付きコードポインタ840が生成された、図4および図8に示されるものと同様である。タグ付きコードポインタ840を生成するために当初に使用されていた鍵820およびコンテキスト情報825に加えて、復元されたコードポインタ905がMACロジック830への入力として提供される。MACロジック830は、復元された認証タグ915を出力する。
【００４７】
埋め込まれた認証タグ値は、マスクを使用してタグ付きコードポインタから抽出され得る(段階615)。埋め込まれた認証タグ910は、タグ付きコードポインタ840から復元されたコードポインタ905を抽出するために使用されたマスク810を使用して、コードポインタから抽出され得る。
【００４８】
一例として、埋め込まれた認証タグ910の値は、次の式を使用して導き出され得る。
復元されたコードポインタ&マスク
上式で、「復元されたコードポインタ」は復元されたコードポインタ905の値を表し、「マスク」値はマスク810の値を表す。
【００４９】
復元された認証タグ915から、マスクされたタグ値が抽出され得る(段階620)。図8および図9の例に見られるように、埋め込まれた認証タグ910を作成するために復元されたコードポインタ905から選択されたビットのセットは、当初に認証タグ835に含まれていたビットのすべてを含むとは限らない。しかしながら、復元された認証タグ915は、復元された認証タグ915にマスク810を適用した後に、埋め込まれた認証タグ910と比較され得る。マスクされたタグ920を生成するために、マスク810は、復元された認証タグ915に適用され得る。このプロセスは、タグ付きコードポインタ840から、埋め込まれた認証タグ910を決定するための上述したプロセスと同様である。
【００５０】
一例として、マスクされたタグ920の値は、以下の式を使用して導き出され得る。
復元されたタグ&マスク
上式で、「復元されたタグ」は復元されたコードポインタ905の値を表し、「マスク」値はマスク810の値を表す。
【００５１】
復元された認証タグを埋め込まれた認証タグと比較する(段階625)。段階625はまた、図9のブロック925によって表される。次いで、結果930を生成するために、マスクされたタグ920が埋め込まれた認証タグ910と比較され得る。マスクされたタグ920が埋め込まれた認証タグ910と一致する場合、タグ付きコードポインタ840は正常に認証され、結果930は、認証が成功したという表示を含むことができる。タグ付きコードポインタ840の値は、タグ付きコードポインタ840が生成されてメモリに配置されて以来、変更されていない可能性が高い。マスクされたタグ920が埋め込まれた認証タグ910と一致しない場合、タグ付きコードポインタ840は正常に認証されておらず、結果930は、認証が失敗したという指示を含むことができる。タグ付きコードポインタ840の値は、タグ付きコードポインタ840が生成されてメモリに記憶されて以来、変更または破損している。プロセッサ110は、悪意のあるプログラムコードがプロセッサ110によって実行されているプログラムコードのフローを制御することを認証が防止することに失敗した場合、エラー処理手順を実行するように構成され得る。
【００５２】
図7は、本明細書で論じるコードポインタ認証技法で使用され得るマスクを生成するための例示的なプロセスの流れ図である。図7に示されるプロセスは、図1に示されるコンピュータシステム100を使用して実施され得る。図1に示される例示的なコンピュータシステム100は、図6に示されるプロセスが実施され得る1つのコンピュータシステムの一例を提供し、図7に示されるプロセスは、図1に示される例とは異なるアーキテクチャを有するコンピュータシステムのプロセッサによって実施され得る。図7に示されるプロセスは、図2〜図6、図8、および図9に示されるプロセスを実行する前に実行され得る。たとえば、図7に示されるプロセスは、プロセッサ110がプログラムコードの静的または動的リンクを実行しているときに実行され得る。プロセッサ110はまた、別のときに、図2〜図6、図8、および図9に示されるプロセスを実行する前に、図7に示されるプロセスを実行するように構成され得る。
【００５３】
プログラムコードにおいて識別された複数のコードポインタが比較され得る(段階705)。プロセッサ110は、コードポインタに関連付けられるアドレス内の共通のビットのセットを決定するために、プログラムコード内の複数のコードポインタを比較するように構成され得る。プログラムコードのセット内のコードポインタに共通のビットは、コードポインタを損なうことなく、また認証タグを記憶するための追加のメモリ空間を必要とすることなく、認証タグ値に置換され得る。この手法は、本明細書に開示されるコードポインタ認証技法をサポートするためにプロセッサ110のアーキテクチャに加えられる必要があり得る変更の数を最小限に抑えるために役立ち得る。
【００５４】
コードポインタに関連付けられるアドレス内の共通のビットのセットが識別され得る(段階710)。共通のビットのセットは、図8および図9に示される例に示されている値805の基礎として使用され得、タグ付きコードポインタ840を認証するために、図6に示されるプロセスにおいて使用される。図8および図9に示される例では、コードポインタは、16個の上位ビットと3個の最下位ビットを共有する。プロセッサ110は、プロセッサ110がプログラムコードに関連付けられるコードポインタを認証する必要があるときに後にアクセスされ得るプロセッサ110にアクセス可能なレジスタまたは他のメモリ内のコードポインタに関連付けられるアドレス内の共通のビットのセットから導出された値805を記憶するように構成され得る。プロセッサ110は、他の実行コンテキストで実行中のプログラムコードから、ならびに/あるいは、同一および/またはより低い特権レベルにおいて実行中のプログラムコードによってアクセスできないレジスタまたは他のメモリ位置に、値805を配置するように構成され得る。
【００５５】
プログラムコードにとって利用可能なアドレス空間は制限されている可能性があり、コードポインタによってアドレス可能なメモリ容量は、通常、コードポインタによってアドレス可能なメモリ容量よりもはるかに大きい。64ビットシステムなどのいくつかのシステムでは、コードポインタによって表され得る可能性のあるアドレス可能な範囲がさらに制限されている。プロセッサ110はまた、実行時にコードが一緒にパックされるようにメモリ内のプログラムコードセグメントを整列させるように静的および動的なリンカが構成されるように、構成され得る。これにより、コードポインタがより多くのビットを共有することになり、それによって、タグ付きコードポインタに認証タグ情報を記憶するために使用され得るビット数が増加する。
【００５６】
マスクは、コードポインタに関連付けられるアドレス内で識別される共通ビットに基づいて生成され得る(段階715)。たとえば、図8および図9に示される例におけるマスク810は、コードポインタから共通ビットを識別するためにプログラムコード内のコードポインタを比較することから導出された値805に基づいて生成されている。比較ステップは、図8および図9には示されておらず、これらの図面に示されているタグ付けおよび認証プロセスの前に実行されているであろう。マスク810内のビットは1の2進値に設定され得、コードポインタの各々における対応するビットは同じ値を共有し、マスク810内のビットは0の2進値に設定され得、コードポインタの各々における対応するビットはすべてが同じ値を共有していたとは限らない。プロセッサ110は、他の実行コンテキストで実行中のプログラムコードから、ならびに/あるいは、同一および/またはより低い特権レベルにおいて実行中のプログラムコードによってアクセスできないレジスタまたは他のメモリ位置に、マスク810を記憶するように構成され得る。
【００５７】
本明細書に記述された方法は、用途に応じて様々な手段によって実装され得る。たとえば、これらの方法は、ハードウェア、ファームウェア、ソフトウェア、またはそれらの任意の組合せにおいて実装されてよい。ハードウェア実装の場合、処理ユニットは、本明細書で説明された機能を実行するように設計された、1つもしくは複数の特定用途向け集積回路(ASIC)、デジタル信号プロセッサ(DSP)、デジタル信号処理デバイス(DSPD)、プログラマブル論理デバイス(PLD)、フィールドプログラマブルゲートアレイ(FPGA)、プロセッサ、コントローラ、マイクロコントローラ、マイクロプロセッサ、電子デバイス、他の電子ユニット、またはそれらの組合せにおいて実装されてよい。
【００５８】
ファームウェアおよび/またはソフトウェア実装の場合、方法は、本明細書で説明される機能を実行するモジュール(たとえば、手順、機能など)で実装され得る。本明細書に記載の方法を実装する際に、命令を具体的に具現化する任意の機械可読媒体が使用され得る。たとえば、ソフトウェアコードは、メモリに記憶され、プロセッサユニットによって実行され得る。メモリは、プロセッサユニット内またはプロセッサユニットの外部に実装され得る。本明細書で使用される場合、「メモリ」という用語は、任意のタイプの長期、短期、揮発性、不揮発性、または他のメモリを指し、特定のメモリのタイプもしくはメモリの数、または媒体のタイプに限定されるものではない。有形の媒体には、ランダムアクセスメモリ、磁気記憶装置、光記憶媒体などの機械可読媒体の1つまたは複数の物理的物品が含まれる。
【００５９】
ファームウェアおよび/またはソフトウェアにおいて実装される場合、機能は、コンピュータ可読媒体上に1つまたは複数の命令またはコードとして記憶され得る。例として、データ構造体で符号化されたコンピュータ可読媒体、およびコンピュータプログラムで符号化されたコンピュータ可読媒体がある。コンピュータ可読媒体は、物理的なコンピュータ記憶媒体を含む。記憶媒体は、コンピュータによってアクセス可能な任意の利用可能な媒体であり得る。限定ではなく例として、そのようなコンピュータ可読媒体は、RAM、ROM、EEPROM、CD-ROMまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気記憶デバイス、あるいは所望のプログラムコードを命令またはデータ構造の形式で記憶するために使用され得る、コンピュータによってアクセス可能な任意の他の媒体を備え得、本明細書で使用される場合、ディスク(disk)およびディスク(disc)は、コンパクトディスク(CD)、レーザーディスク、光ディスク、デジタル多用途ディスク(DVD)、フロッピーディスクおよびBlu-rayディスクを含み、ディスク(disk)は通常データを磁気的に再生し、ディスク(disc)はデータをレーザーで光学的に再生する。上記の組合せもまた、コンピュータ可読媒体の範囲内に含まれるべきである。そのような媒体はまた、機械可読であり得る非一時的媒体の例を提供し、コンピュータは、そのような非一時的媒体から読み取ることができる機械の一例である。
【００６０】
本明細書で論じられる一般的な原理は、本開示または請求項の範囲の趣旨または範囲から逸脱することなく、他の実装形態に適用され得る。
【符号の説明】
【００６１】
100  コンピュータシステム
110  プロセッサ、汎用プロセッサ
110-A  マスクレジスタ
110-B  値レジスタ
110-C  フラグレジスタ
110-D  コンテキストレジスタ
115  バス
125  ワイヤレスインターフェース
132  回線
134  アンテナ
160  非一時的メモリ、メモリ
165  ネットワークインターフェース
805  値
810  マスク
815  コードポインタ
820  鍵
825  コンテキスト値、コンテキスト情報
830  MACアルゴリズム、MACロジック
835  認証タグ
840  タグ付きコードポインタ
905  復元されたコードポインタ
910  埋め込まれた認証タグ
915  復元された認証タグ
920  マスクされたタグ
930  結果
0006266843.tif 000002
【図１】
0006266843.tif 000003
【図２】
0006266843.tif 000004
【図３】
0006266843.tif 000005
【図４】
0006266843.tif 000006
【図５】
0006266843.tif 000007
【図６】
0006266843.tif 000008
【図７】
0006266843.tif 000009
【図８】
0006266843.tif 000010
【図９】
0006266843.tif 000011