(57)【特許請求の範囲】
【請求項１】
メモリと、
プロセスを実行し、そのプロセスのためメモリを管理するように構成された少なくとも１つのプロセッサと、を備え、
少なくとも１つのプロセッサは、
アプリケーションに関連付けられた１つ以上のプログラム命令を実行し、
１つ以上のプログラム命令の制御フロー転送に達し、
ターゲット制御フローの不遵守に応じて、１つ以上のプログラム命令に関連付けられたコールスタックを展開し、
問題のある関数コールを特定し、そして、
問題のある関数コールを書き換える、ように構成され、
書き換えられる関数コールは、メモリ操作境界チェックを含む、コンピュータ装置。
【請求項２】
プロセッサは、ターゲット制御フローの不遵守に応じて、メモリへの書き込み許可を有効化するようにさらに構成される、請求項１に記載のコンピュータ装置。
【請求項３】
プロセッサは、問題のある関数コールの書き換えに応じて、メモリへの書き込み許可を無効化するようにさらに構成される、請求項２に記載のコンピュータ装置。
【請求項４】
プロセスは、ランタイム動作中に発生するように構成される、請求項１に記載のコンピュータ装置。
【請求項５】
プロセッサは、問題のある関数コールのデータサイズ制限を判定するようにさらに構成される、請求項１に記載のコンピュータ装置。
【請求項６】
メモリ操作境界チェックは、データサイズ制限に関連付けられる、請求項５に記載のコンピュータ装置。
【請求項７】
プロセッサで実行するプロセスのためメモリを管理する方法であって、
メモリに格納され、アプリケーションに関連付けられた１つ以上のプログラム命令を実行すること、
１つ以上のプログラム命令の制御フロー転送に達すること、
ターゲット制御フローの不遵守に応じて、１つ以上のプログラム命令に関連付けられたコールスタックを展開すること、
問題のある関数コールを特定すること、そして、
問題のある関数コールを書き換えること、を含み、
書き換えられる関数コールは、メモリ操作境界チェックを含む、方法。
【請求項８】
方法は、プログラムコールスタックを以前の状態に復元するステップをさらに含む請求項７に記載の方法。
【請求項９】
方法は、ターゲット制御フローの不遵守に応じて、前記メモリに対する書き込み許可を有効化するステップをさらに含む、請求項７に記載の方法。
【請求項１０】
方法は、問題のある関数コールの書き換えに応じて、前記メモリに対する書き込み許可を無効化するステップをさらに含む、請求項９に記載の方法。
【請求項１１】
方法は、ランタイム動作中に行われる、請求項７に記載の方法。
【請求項１２】
プロセッサは、問題のある関数コールのデータサイズ制限を判定するようにさらに構成される、請求項７に記載の方法。
【請求項１３】
メモリ操作境界チェックは、データサイズ制限に関連付けられる、請求項１２に記載の方法。
【請求項１４】
メモリと、
プロセスを実行し、そのプロセスのためメモリを管理するように構成された少なくとも１つのプロセッサと、を備え、
少なくとも１つのプロセッサは、
アプリケーションに関連付けられた１つ以上のプログラム命令を実行し、
１つ以上のプログラム命令の制御フロー転送に達し、
ターゲット制御フローの不遵守に応じて、１つ以上のプログラム命令に関連付けられたコールスタックを展開し、
問題のある関数コールおよびその問題のある関数コールに関連付けられたメモリ内のレジスタのデータサイズ制限を特定し、そして、
問題のある関数コールを書き換えるように構成され、
書き換えられた関数コールは、メモリ操作境界チェックを含む、車両内のコンピュータ装置。
【請求項１５】
プロセッサは、プログラムコールスタックを以前の状態に復元するように構成される請求項１４に記載のコンピュータ装置。
【請求項１６】
プロセッサは、ターゲット制御フローの不遵守に応じて、メモリへの書き込み許可を有効化するようにさらに構成される、請求項１４に記載のコンピュータ装置。
【請求項１７】
プロセッサは、問題のある関数コールの書き換えに応じて、メモリへの書き込み許可を無効化するようにさらに構成される、請求項１６に記載のコンピュータ装置。
【請求項１８】
プロセスは、ランタイム動作中に行われるように構成される、請求項１４に記載のコンピュータ装置。
【請求項１９】
プロセッサは、問題のある関数コールのデータサイズ制限を判定するようにさらに構成される、請求項１４に記載のコンピュータ装置。
【請求項２０】
メモリ操作境界チェックは、データサイズ制限に関連付けられる、請求項１９に記載のコンピュータ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンピュータ装置、およびコンピュータ装置にてメモリを管理する方法に関する。
【背景技術】
【０００２】
多くの脆弱性は、攻撃者がアプリケーションの通常の制御フローを変更することによって悪用され、悪用されたアプリケーションの権限で任意の悪意のあるアクティビティが実行される。制御フローインテグリティ（ＣＦＩ）は、コンパイルされたバイナリコードの元の制御フローグラフへの変更を禁止するセキュリティメカニズムであり、そのような攻撃の実行を著しく困難にする。
【発明の概要】
【０００３】
一実施形態によれば、コンピュータ装置はメモリを含む。コンピュータ装置は、プロセスを実行し、そのプロセスのためメモリを管理するように構成された少なくとも１つのプロセッサも含む。プロセッサはさらに、アプリケーションに関連付けられた１つ以上のプログラム命令を実行し、１つ以上のプログラム命令の制御フロー転送に達し、ターゲット制御フローの不遵守に応じて、１つ以上のプログラム命令に関連付けられたコールスタックを展開し、問題のある関数コールを特定し、そして、問題のある関数コールを書き換えるように構成される。書き換えられる関数コールは、メモリ操作境界チェックを含む。
【０００４】
第２実施形態によれば、プロセッサで実行するプロセスのためのメモリ管理方法は、アプリケーションに関連付けられた１つ以上のプログラム命令を実行し、１つ以上のプログラム命令の制御フロー転送に達し、ターゲット制御フローの不遵守に応じて、１つ以上のプログラム命令に関連付けられたコールスタックを展開し、問題のある関数コールを特定し、そして、問題のある関数コールを書き換えることを含み、書き換えられる関数コールは、メモリ操作境界チェックを含む。
【０００５】
第３実施形態によれば、車両内のコンピュータ装置は、メモリと、プロセスを実行し、そのプロセスのためメモリを管理するように構成された少なくとも１つのプロセッサを含む。プロセッサは、アプリケーションに関連付けられた１つ以上のプログラム命令を実行するように構成される。プロセッサはさらに、１つ以上のプログラム命令の制御フロー転送に達し、ターゲット制御フローの不遵守に応じて、１つ以上のプログラム命令に関連付けられたコールスタックを展開し、問題のある関数コールおよびその問題のある関数コールに関連付けられたメモリ内のレジスタのデータサイズ制限を特定し、そして、メモリ操作境界チェックを含む問題のある関数コールを書き換えるように構成される。
【図面の簡単な説明】
【０００６】
【図１】本開示の実施形態による、プロセスに割り当てられたメモリの一部のエラーを検出するための例示的なコンピュータシステムの図である。
【図２】本開示の実施形態による、例示的なコンピュータ装置の概略ブロック図である。
【図３】本開示の実施形態による、制御フローインテグリティ（ＣＦＩ）強化の例示的な方法のフローチャート３００である。
【発明を実施するための形態】
【０００７】
本開示の実施形態が本明細書で説明される。しかしながら、開示された実施形態は単なる例であり、他の実施形態は様々な代替の形態をとることができることを理解されたい。図は必ずしも縮尺どおりではない。特定のコンポーネントの詳細を表示するために、一部の特徴が誇張または最小化され得る。したがって、本明細書で開示される特定の構造および機能の詳細は、限定するものとして解釈されるべきではなく、実施形態を様々に採用することを当業者に教示するための単なる代表的な基礎として解釈されるべきである。当業者が理解するように、図のいずれかを参照して図示および説明される様々な特徴は、明示的に図示または説明されていない実施形態を生み出すように、１つ以上の他の図に示される特徴と組み合わせることができる。図示された特徴の組み合わせは、典型的な用途のための代表的な実施形態を提供する。しかしながら、本開示の教示と矛盾しない特徴の様々な組み合わせおよび変更は、特定の用途または実施のために望ましい可能性がある。
【０００８】
メモリの不正は、たとえばＣやＣ＋＋などの低級言語で記述されたソフトウェアを利用するコンピューティングシステムで発生する可能性がある。これは、このような言語はデフォルトではメモリの読み書きのデータ検証チェックをコンパイルしないためである。例えば、コンパイルされたＣコードには、データバッファに割り当てられたメモリ領域外にデータが書き込まれるのを防ぐための検証が含まれていない場合がある。このような範囲外のアクセスは、バッファオーバーフローまたはバッファオーバーランと呼ばれることがある。
【０００９】
プロセスがコンパイル済みコードを実行すると、データのスタックがメモリのブロックとしてプロセスに割り当てられる。実行中のコードによって関数がコールされると、新しいフレームがこのスタックにプッシュされる。新しいフレームには、関数に渡されるパラメータ、関数のローカルデータ変数、関数が完了したときに実行を継続する位置のリターンアドレスが含まれる。関数が完了すると、フレームがスタックから除去され、リターンアドレスがプログラムカウンタに配置されて、プログラムフローが再開される。リターンアドレスは通常、関数がコールされた直後のコンパイル済みコードの命令である。
【００１０】
スタックバッファオーバーフローは、プログラムフローを変更するために使用される特定のタイプのバッファオーバーフローである。例えば、攻撃者は、悪意のあるコードへジャンプするリターンアドレスに上書きされるように形成された、スタック上のローカル変数のバッファオーバーランを設計する可能性がある。これは、攻撃者がどのようにして特定のプログラミング言語に固有のデータ検証の省略を悪用し、コンピューティングシステムで実行されているプログラムの制御フローをハイジャックするかの一例である。
【００１１】
制御フローインテグリティ（ＣＦＩ）技術は、ある種のメモリ不正を検出するために使用され得るが、応答能力には限界がある。ＣＦＩは、最初にコードまたはプログラムで実行可能なすべてのパスをトレースして制御フローグラフ（ＣＦＧ）を構築し、次に実行時に、プログラムフローが制御フローグラフを遵守することを強制することによって動作する。ＣＦＩ強制チェックは、コードの制御フローが制御フローグラフから逸脱することを防ぐセキュリティの形式としてコードにおいて実行され、悪用されたアプリケーションから発生する権限で、制御フローを変更し、任意の悪意のあるアクティビティ（例えば、マルウェア、ウイルス、トロイの木馬、スパイウェアなど）を実行する攻撃を行うことを著しく困難にさせる。このように、ＣＦＩ技術は、コンピュータ環境内の制御転送および／またはプログラムフローを監視し、維持することができる。ＣＦＩ技術は、照合モニタ（インラインまたは外部）と、その照合モニタを通過し、グランドトゥルースＣＦＩグラフと比較されるコードの関数遷移とを使用し、異常な、または逸脱した動作を判定することができる。ＣＦＩ技術は、環境放射（例えば、電場や磁場など）、ランダムノイズ、信号エラー、部品の故障などを含む、悪意のないまたは自然の原因から生じる違反を識別する可能性がある。さらに重要なことに、ＣＦＩ技術は、ユーザが提供した悪意のあるプログラム入力での操作など、意図的な行為から発生する違反を検出することができる。典型的なＣＦＩ違反処理は、実行の停止と、新しい状態でのプログラムの再実行をもたらす。ただし、このような処理メカニズムは、脆弱性への敵対的なアクセスを排除することに失敗し、永続的な悪用を許すことにより、さらにシステムの利用可能性を低下させる。
【００１２】
改善されたＣＦＩ技術では、プログラムは、やはり初期のＣＦＩ強制命令を装備され得る。ただし、ＣＦＩ違反を検出すると、実行を停止または再開する代わりに、プログラムコールスタックが、障害ポイントから展開され、違反の原因となった問題のある関数を特定することができる。次いで、問題のある関数でオーバーランしたターゲットバッファについて境界チェックを実行する命令を含むように、問題のある関数が変更（つまり、書き換え）され得る。問題のある関数が書き換えられると、以前のプログラムコールスタック状態を使用して、問題のある関数がコールされる以前のポイントから実行が再開され得る。意義深いことに、書き換えられた関数は、境界チェックを含むようになったので、初期の違反につながる異常なデータが別の違反を引き起こすことが防止される。したがって、再開された実行でメモリの不正が防止され、攻撃者はオーバーフローの脆弱性を全うすることができない。このように、単に実行を止めて、アプリケーションの実行を突然停止するのではなく、アプリケーションは修正されて再開され、それにより、攻撃から回復すると同時に、そのポイントで、アプリケーションの将来のエラーや問題を防ぐことができる。
【００１３】
ここで、図１を参照すると、例示的なコンピュータシステム１００は、コンピュータ装置１１０を含む。コンピュータ装置１１０は、限定されるものではないが、例えば、デスクトップまたはラップトップまたはタブレットコンピュータ、携帯電話、ゲームデバイス、複合現実または仮想現実デバイス、音楽デバイス、テレビ、ナビゲーションデバイス、カメラ、パーソナルデジタルアシスタント（ＰＤＡ）、ハンドヘルドデバイス、電子制御ユニット、１つ以上の他のデバイスとの有線および／又は無線接続機能を備えた任意の他のコンピュータデバイス、または、ビデオ出力信号を生成可能な任意の他のタイプのコンピュータ化されたデバイスを含む、任意の携帯式または固定式のコンピュータ装置であり得る。
【００１４】
コンピュータ装置１１０は、メモリ１１６に格納された命令を実行する中央処理装置（ＣＰＵ）１１４を含むことができる。例えば、ＣＰＵ１１４は、オペレーティングシステム１４０および１つ以上のアプリケーション１３０を実行することができる。オペレーティングシステム１４０およびアプリケーション１３０はそれぞれ、プロセス識別子があてがわれ、メモリ１１６の一部が割り当てられ得る１つ以上のプロセスに関連付けられることができる。
【００１５】
メモリ１１６は、データおよび／またはコンピュータ実行可能命令を格納するように構成され得る。コンピュータ実行可能命令は、オペレーティングシステム１４０および／またはアプリケーション１３０を定義し、および／またはそれらと関連付けることができる。ＣＰＵ１１４は、オペレーティングシステム１４０および／またはアプリケーション１３０を実行することができる。メモリ１１６は、コンピュータ装置１１０にて、アクセス可能な１つ以上のハードウェアメモリデバイスを代表することができる。メモリ１１６の例は、限定するものではないが、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、テープ、磁気ディスク、光ディスク、揮発性メモリ、不揮発性メモリ、およびそれらの任意の組み合わせなどの、コンピュータによって使用可能なタイプのメモリを含むことができる。メモリ１１６は、ＣＰＵ１１４によって実行されているアプリケーションのローカルバージョンを格納してもよい。図示の例では、メモリ１１６は、ＲＡＭ１２０、ページキャッシュ１２２、ハードドライブ１２４、およびネットワークインターフェース１２６を含む。ＲＡＭ１２０は、１つ以上のデュアルインラインメモリモジュール（ＤＩＭＭ）などのハードウェアコンポーネントであり得る。ページキャッシュ１２２は、ハードドライブ１２４などの二次ストレージで発生したページを記憶するために使用されるＲＡＭ１２０の一部であってもよい。ハードドライブ１２４は、任意の二次ストレージを代表することができる。ハードドライブ１２４は、ＲＡＭ１２０よりも大きな容量を持つが、アクセス時間が遅い場合がある。ネットワークインターフェース１２６は、例えば、ネットワークドライブとしての二次ストレージとして使用されてもよい。
【００１６】
ＣＰＵ１１４は、命令を実行する１つ以上のプロセッサを含むことができる。ＣＰＵ１１４の例には、限定するものではないが、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、グラフィックスプロセッシングユニット（ＧＰＵ）、システムオンチップ（ＳｏＣ）、または、他のプログラム可能なロジックまたはステートマシンを含む、本明細書で説明されるように特別にプログラムされた任意のプロセッサを含むことができる。ＣＰＵ１１４は、算術論理ユニット（ＡＬＵ）、レジスタ、および制御ユニットなどの他の処理コンポーネントを含んでもよい。ＣＰＵ１１４は、複数のコアを含んでもよく、複数のスレッドを実行するために、複数のコアを使用して、命令および／またはデータの異なるセットを同時に処理することができてもよい。
【００１７】
オペレーティングシステム１４０は、メモリ１１６に格納され、ＣＰＵ１１４によって実行可能な命令（アプリケーション１３０など）を含むことができる。オペレーティングシステム１４０は、プロセスにメモリを割り当てるためのメモリマネージャ１４２を含むことができる。例えば、メモリマネージャ１４２は、仮想メモリシステムを実装してもよい。メモリ１１６は、限られた容量のＲＡＭ１２０を含むことができる。ＣＰＵ１１４によって実行されるプロセスは、ＲＡＭ１２０の利用可能な容量よりも多くのメモリを要求することが可能である。ただし、要求されたメモリの大部分は、かなりの時間の間、アイドルのまま（使用できないまま）になる可能性がある。メモリマネージャ１４２は、仮想メモリを使用して、仮想メモリアドレス１４６をプロセスに割り当てることにより、メモリに対する要求を満たすことができる。次いで、仮想メモリアドレス１４６は、ＲＡＭ１２０またはページ内の物理メモリアドレスにそれぞれ関連付けられてもよく、それらは、圧縮メモリ１６４またはハードドライブ１２４などの他の論理および物理コンポーネントに格納されてもよい。一実施態様では、仮想メモリは、各仮想メモリアドレス１４６のメモリ内容（たとえば、ポインタ）の位置を記憶するページテーブル１４４を含むことができる。一実施形態において、ページテーブル１４４は、メモリエラーまたは不正を検出および訂正するためのメタデータ１４８も記憶してもよい。例えば、メタデータ１４８のセットは、ページテーブル１４４の各仮想メモリアドレス１４６に関連付けられてもよい。
【００１８】
通知アプリケーションプログラミングインターフェース（ＡＰＩ）１５４または他のタイプのソフトウェアは、プロセスがメモリマネージャ１４２と通信可能にすることができ、プロセスのためのメモリ管理の一部の特徴を構成する。一実装形態では、メモリマネージャ１４２は、不正が行われたメモリに関する通知をプロセスまたは関数に提供することができる。例えば、メモリマネージャ１４２は、不正が行われたメモリが検出されたときに通知を生成することができる。例えば、メモリマネージャ１４２は、不正が行われたメモリが検出されたこと、またはＣＦＩ違反が発生したことを示す例外をスローしてもよい。プロセスは、プロセスが例外を処理しているかどうかを指示してもよい。メモリマネージャ１４２が、プロセスが例外を処理しているという指示を受け取らない場合、メモリマネージャ１４２は、例外を処理する方法を決定してもよい（例えば、回復の試み、プロセスの終了、システムのクラッシュ）。通知の別の例として、改変されたデータが訂正されたときに、メモリマネージャ１４２は通知を生成してもよい。不正が行われたメモリの検出と同様に、一部のプロセスは、修正されたメモリを特定の方法で処理することができる。例えば、プロセスは、メモリマネージャ１４２が不正が行われたメモリを正常に修正したと信頼するのではなく、データを再生成できる場合がある。他のケースでは、不正が行われたメモリが修正されたときの通知を、プロセスが受け取らないことを選択してもよい。
【００１９】
エラー検出器１５８は、関数コールがこわれたかどうかを評価するためのソフトウェアまたはハードウェアであり得る。例えば、エラー検出器１５８は、バッファアクセスがメモリ１１６内のバッファ容量を超えるかどうかを調べることにより、バッファエラーを認識することができる。エラー検出器１５８は、エラーが検出されたとき、通知ＡＰＩ１５４に指示を提供することができる。エラー検出器１５８は、関数コールがプロセスによって要求されたときに関数コールを評価するように構成されてもよい。したがって、エラー検出器１５８は、プロセスが検証されたデータを受け取っていることを確実にすることができる。追加的に、または代替的に、エラー検出器１５８は、関数コールがこわれたかどうかを判断するために、関数コールを定期的に評価してもよい。例えば、エラー検出器１５８は、アイドルプロセスを使用してエラーをチェックしてもよいし、または比較的長時間メモリに存在していた関数を選択してもよい。例えば、バックグラウンドで実行されているアプリケーションについて、アプリケーションをそれらのタイプで識別し、そのアプリケーションの通常のランタイム（例えば、ランタイム閾値）を決定してもよい。通常のランタイムを超えた場合、エラー検出器１５８は、アプリケーションにエラーが存在する可能性があると判断することができる。例えば、特定のアプリケーションが１分間だけ実行されることが予想され、アプリケーションが、１分を超える時間実行される場合、エラー検出器１５８は、関数がこわれたと判断することができる。他の例では、監視時にアプリケーションが予期される応答または「ハートビート」を受信しないか判断するために、ウォッチドッグが利用されてもよい。
【００２０】
エラー修正器１５９は、エラー検出器１５８によって検出されたときに、こわれた関数コールを修正しようと試みることができる。エラー修正器１５９は、関数コールのコードを決定論的に変更することができる。例えば、エラー修正器１５９は、エラーをテストするためにコードを順次修正することができる。例えば、エラー修正器１５９は、修正すべきコードの各ライン（またはコードのラインのグループ）を分析し、修正されたコードの各ラインをところてん式に、エラーがないかテストしてもよい。次いで、エラー修正器１５９は、エラー検出器１５８を使用して、修正された関数コールが元の関数コールと一致するかどうかを評価することができる。
【００２１】
ここで、図２を参照すると、図１と比較して追加のコンポーネントの詳細を含む、実施形態による例示的なコンピュータ装置１１０が示されている。一例では、コンピュータ装置１１０は、本明細書で説明されるコンポーネントおよび機能の１つ以上に関連付けられた処理関数を実行するためのプロセッサ４８を含むことができる。プロセッサ４８は、単一または複数セットのプロセッサ、またはマルチコアプロセッサを含むことができる。さらに、プロセッサ４８は、統合処理システムおよび／または分散処理システムとして実現することができる。一実施形態では、例えば、プロセッサ４８は、ＣＰＵ１１４を含むことができる。
【００２２】
一例では、コンピュータ装置１１０は、本明細書で説明される機能を実行するためにプロセッサ４８によって実行可能な命令を格納するためのメモリ５０を含むことができる。一実装形態では、例えば、メモリ５０はメモリ１１６を含むことができる。ＣＰＵ１１４は、記載された機能を実行するための特殊な命令を含むこともできる（例えば、制御フロー転送の妥当性／正しさをチェックするために、これらの特殊な命令を呼び出して関数コールを調べる）。これらのチェックは、エラー検出器１５８の一部として含まれている照合モニタと、オペレーティングシステム１４０またはアプリケーション１３０にコンパイルされたインスツルメンテーションとによって実行されてもよい。
【００２３】
さらに、コンピュータ装置１１０は、本明細書で説明されるハードウェア、ソフトウェア、およびサービスを利用する１以上の関係者との通信を確立し、維持することを提供する通信コンポーネント５２を含むことができる。通信コンポーネント５２は、コンピュータ装置１１０のコンポーネント間、ならびにコンピュータ装置１１０と、通信ネットワークを介して配置されるデバイスおよび／またはコンピュータ装置１１０とシリアルまたはローカルに接続されたデバイスなどの外部デバイスとの間の通信を伝えることができる。例えば、通信コンポーネント５２は、１つ以上のバスを含むことができ、さらに、外部デバイスとインターフェースで接続するように動作可能な、送信機および受信機それぞれと関連付けられる送信チェーンコンポーネントおよび受信チェーンコンポーネントを含むことができる。
【００２４】
さらに、コンピュータ装置１１０は、本明細書に記載の実施形態と関連して使用される情報、データベース、およびプログラムの大容量記憶を提供する、ハードウェアおよび／またはソフトウェアの任意の適切な組み合わせとすることができるデータストア５４を含むことができる。例えば、データストア５４は、オペレーティングシステム１４０および／またはアプリケーション１３０のためのデータ収納場所であってもよい。データストアは、メモリ１１６を含んでもよい。
【００２５】
コンピュータ装置１１０はまた、コンピュータ装置１１０のユーザから入力を受け取るように動作可能であり、さらに、ユーザへの提示のための出力を生成するように動作可能であるユーザインターフェースコンポーネント５６も含むことができる。ユーザインターフェースコンポーネント５６は、限定されるものではないが、触覚入力、キーボード、テンキー、マウス、タッチセンシティブディスプレイ、デジタイザ、ナビゲーションキー、ファンクションキー、マイク、音声認識コンポーネント、ユーザから入力を受けることが可能な任意の他の機構、または、それらの任意の組み合わせを含む、１つ以上の入力デバイスを含むことができる。さらに、ユーザインターフェースコンポーネント５６は、限定されるものではないが、ディスプレイ、スピーカ、触覚フィードバック機構、プリンタ、ユーザに出力を提示することができる任意の他の機構、またはそれらの任意の組み合わせを含む、１つ以上の出力デバイスを含むことができる。
【００２６】
一実施形態において、ユーザインターフェースコンポーネント５６は、オペレーティングシステム１４０および／またはアプリケーション１３０の動作に対応するメッセージを送信および／または受信することができる。加えて、プロセッサ４８は、オペレーティングシステム１４０および／またはアプリケーション１３０を実行することができ、メモリ５０またはデータストア５４は、それらを格納することができる。
【００２７】
コンピュータ装置１１０は、車両の内部に配置され得る。例えば、コンピュータ装置１１０は、ナビゲーションシステム、オーディオヘッドユニット、車両安全システム、および他の車両コンポーネントを含む車両コンピュータシステムの一部であってもよい。そのような例では、コンピュータ装置１１０は、車両バス（例えば、コントローラエリアネットワーク（ＣＡＮ、登録商標）バスなど）などの車両通信ネットワークを利用して他の車両コンポーネントとやりとりすることができる。
【００２８】
図３は、本実施形態によるＣＦＩ強制の例示的な方法のフローチャート３００である。一例において、例示的な方法は、ＣＰＵ１１４による実行のために、アプリケーション１３０または他のコンピュータコード命令をメモリ１１６にロードするコンピュータ装置１１０によって実行され得る。
【００２９】
工程３０１で、コンピュータ装置１１０はプログラム命令を実行する。プログラム命令は、コンピュータ装置１１０のＣＰＵ１１４による実行の対象とする任意のタイプのコンパイルされたコードであり得る。例示的な例では、プログラム命令は、メモリの読み取りまたは書き込みに関するデータ検証チェックを欠く、ＣまたはＣ＋＋などの低級言語からコンパイルされた命令を含む。コンピュータ装置１１０は、コンピュータ装置１１０の起動時に、または新しいアプリケーションをロードするときに、任意の所与のプログラムを実行することができる。コンピュータ装置１１０は、コードまたは命令に基づいてコードを自動的に実行することができる。別の例では、コードは、ユーザがコードを手動で実行することに基づいて実行されてもよい。そのような例には、プログラムのダブルクリック、コードを実行するための指示のタイピング、タッチインターフェイス上のアプリケーションアイコンへのタッチ、任意の入力デバイスに基づくアイコンの起動、車両機能の起動などが含まれる。他の入力インターフェースも、プログラムを実行するために利用され得る。
【００３０】
工程３０３において、実行されているコードのプログラムフローは、制御フロー転送に到達する。制御フロー転送は、プログラムの制御をあるコード位置から別のコード位置に転送するプログラム命令のマシンコード命令であり得る。このような命令の例には、プログラムのフローをサブルーチンの位置に転送する（そして、呼び出しに続く命令のアドレスをスタックに保存して、後でリターン命令で使用できるようにする）コール命令、サブルーチンの実行に完了時にスタックに保存された位置に戻すことを可能にするリターン命令、オプションで、１つ以上のテスト条件の充足に基づいて、制御を別の命令位置に転送する条件付きジャンプ命令、条件に係わらず無条件に制御をターゲット位置に転送する無条件ジャンプ命令などが含まれる。
【００３１】
工程３０５において、システムは、制御フロー転送の宛先命令が有効なターゲットコード命令であるかどうかを判定する。制御フロー転送がプログラムに期待されるものと一致するプログラムフローの転送を試みている（または引き起こしている）場合、ターゲットコード命令は有効であると見做され得る。違反は、環境放射、ランダムノイズ、信号エラーを含む、悪意のないまたは自然の原因、あるいは人為的な原因から生じる可能性がある。または、ユーザによって提供された悪意のあるプログラム入力による操作などの意図的な行為から違反が生じる場合もある。一実施形態では、ターゲットが有効であるかどうかを識別するために、システムは、ＣＦＩ強制の対象となる様々な関数コールへの鉤を含むことができる。また、システムは、コンピュータ装置１１０で操作されているコードまたはプログラム命令に由来する通常のプログラムフローを表すＣＦＧモデルを格納してもよい。エラー検出器１５８は、鉤を利用して、関数コールを傍受し、係属している制御フロー転送の実行から生じるプログラムフローとＣＦＧモデルの通常のプログラムフローとの比較を実行することができる。ただし、ターゲットが有効でない場合、制御は工程３０７に進む。一例では、ターゲットがＣＦＧモデルと一致する場合、ターゲットは有効であると見做され、制御は工程３０１に戻って、制御フロー転送命令の実行を進める。例えば、プログラムの実行中、マシンコード命令が制御を転送するときは常に、事前に作成されたＣＦＧによって決定された有効な宛先をターゲットとする。プログラムフローがＣＦＧモデルと一致しない場合、エラー検出器１５８またはシステムは、制御フロー転送の到達に基づいて違反が発生したか判定することができる。
【００３２】
工程３０７で、システムはプログラムコールスタックを展開する。一例では、システムは、現在の問題のある関数がコールされた以前は、プログラムの実行が一貫した安定したポイントにあり、スタックが実行中のそのポイントにて損傷を受けていないという仮定に基づいて、プログラムコールスタックから現在のスタックフレームを取り出すことができる。マシンコードの逆アセンブルは、プログラムコールスタックの問題のある関数に対して実行され、内部のメモリ演算子／オペランドが識別される。以下でより詳細に説明するように、問題のある関数コードは、それをそのままにしておき、違反状態が繰り返される危険性があるのとは対照的に、書き換えられ、メモリ不正の脆弱性（つまり、バッファオーバーフロー）を除去することができる。例えば、アプリケーションまたはプログラムは、マシン語からアセンブリ言語に逆アセンブルされ得る。エラー修正器１５９は、マシン語をアセンブリ言語に逆アセンブルするのに利用され得る。その後、エラー修正器１５９は、コードのラインを分析して（例えば、個別に、またはそれらをまとめてグループ化して）、メモリの動作およびコードのラインのデータサイズ制限を判定することができる。
【００３３】
工程３０９で、システムは問題のある関数コードを分析して、データサイズ制限を判定する。例えば、システム（たとえば、エラー検出器１５８）は、メモリアクセス演算子およびオペランドを識別するために、命令に対してコード分析を実行することができる。また、システム（例えば、エラー検出器１５８）は、インスタンスが、定義されている変数の境界を示し得るので、変数のインスタンスを特定するために命令に対してコード分析を実行してもよい。１つの可能性として、データサイズの制限は、プログラム命令の静的、動的、またはシンボリック分析によって抽出することができる。一例では、システムは、関数のプログラム実行をエミュレートして、メモリ不正につながるバッファを識別する。別の例において、システムは、データサイズ制限をパラメータ、レジスタ、または即値として含むバッファ初期化コードについてプログラム命令を検索することができる。いくつかの実装形態では、コード分析を実行するために、システムは問題のある関数のマシン命令コードを、一層高度な分析により適したアセンブリ表現または他の表現に逆アセンブルすることができる。
【００３４】
別の例では、マシンコード逆アセンブルは、問題のある関数、および特定された問題のある関数内のメモリ演算子／オペランドに対して実行されてもよい。オペランドはそのインスタンスまでトレースされ、それによってデータサイズの制限を判定する。境界チェックは、これらの判定されたデータサイズ制限に基づいてサイズ比較を実行するマシン命令で構成される。これらの命令は、境界チェック用のスペースを作成するためにシフトするか、さもなければ再配置することにより、既存の命令とインラインに追加される。コードを書き換える理由は、それをそのままにしておき、違反状態が繰り返される危険性があるのとは対照的に、メモリ不正の脆弱性（つまり、バッファオーバーフロー）を削除するためである。このようにして、悪意のある運用環境での、システム全体の信頼性と利用可能性を向上することができる。一例では、エラー修正器１５９を利用してコードを書き換えて、メモリの不正を削除することができる。
【００３５】
工程３１１で、システムは、変更されるコード命令を格納するメモリへの書き込み許可を有効化する。多くの実施形態において、実行可能なコードを含むメモリセグメントは、コードが読み取られることを許可するがコードが変更されるのを防ぐために、メモリマネージャ１４２によって読み取り専用として記録される。書き込みアクセス制限により、プログラム命令が一旦メモリにロードされると、プログラム命令の偶発的または意図的な改ざんまたは変更が防止されるため、これは一般的に有利である。しかしながら、コード命令への書き込みアクセスに対するこの制限は、ＣＦＩ強制方法によって識別されるランタイムプログラムの改善の実行を妨げる可能性がある。一例では、割り当てられる許可モデルは、書き込みアクセス制限を強制し、コンピューティング装置の操作中に許可の変更を禁止することができる。また、システムは、メモリマネージャ１４２に、読み取りおよび書き込み両方の許可を、コードを格納するメモリに一時的にマークするように指示することができ、それにより、問題のある関数が識別された場合にコードを書き換えることが可能になる。
【００３６】
工程３１３で、システムは、データサイズ制限に従うメモリ動作境界チェックを含むように関数を書き換える。書き換えられた関数には、関数のデータバッファへの書き込み操作がバッファのサイズに制限されていることを確認する境界チェックが含まれる。システムは、データバッファのサイズを判定するために違反をトレースすることができる。システムは、書き換えられた関数コールに関連付けられるメモリのデータサイズ制限を分析することにより、書き換えられた関数コールについてデータサイズ制限を減らすことを保証することができる。境界チェックコード命令の生成を支援するために、システム（例えば、エラー修正器１５９）は、データサイズ制限と、書き換えられるコードを生成するために挿入され得るメモリオペランド位置とを有するコードテンプレートを利用することができる。その後、システムは書き換えられたコードを既存のマシンコードに投入して、今後のＣＦＩエラーを防止する。例えば、既存のコードをシフトするか、さもなければ既存のコードを移動して新しい境界チェック命令用のスペースを作成することにより、新しい命令を既存の命令とインラインに追加することができる。コードを書き換えることにより、メモリ不正の脆弱性（つまり、バッファオーバーフロー）を削除することができる。これにより、違反状態が繰り返される可能性が回避される。このようにして、システム全体の信頼性と利用可能性を向上することができる。データサイズの制限は、問題のある関数コールから初期化までトレースすることができる。例えば、データサイズの制限は、プログラム命令の静的、動的、またはシンボリック分析によって抽出することができる。システム（例えば、エラー検出器１５８）は、問題のある関数コールを決定し、プログラム命令を逆アセンブルするか、またはプログラムの実行をエミュレートして、メモリの不正につながるバッファを識別することができる。システムは、メモリまたはプログラムの命令内で、パラメータ、レジスタ、または即値としてデータサイズの制限を含むバッファ初期化コードを検索することができる。復元されたデータサイズの制限とメモリオペランドの位置がコードテンプレートに挿入され、修正されたコードが生成される。別の例では、システム（たとえば、エラー修正器１５９）は、修正されたコードをテストして、元の命令と比較して修正された命令の機能的同等性を検証することができる。システムは、修正されたプログラムに様々なソフトウェアテスト（例えば、ユニットテスト、回帰テスト、統合テスト、形式的検証テスト、ハードウェアインザループテスト、コーディングルールテストなど）を適用し、修正されたコードにエラーがないかどうかを判断するために、エミュレーション環境下で良性または不正な入力で修正されたプログラムを再実行することができる。なんらかのエラーに応じて、システムは修正を変更し（例えば、ランダム変更、遺伝的アルゴリズムなどを使用して）、合格基準が満たされるまでテストを繰り返す。システムは、問題のある関数コールを決定し、プログラム命令を逆アセンブルするか、またはプログラムの実行をエミュレートして、メモリの不正につながるバッファを識別することができる。システムは、メモリまたはプログラムの命令内で、パラメータ、レジスタ、または即値としてデータサイズの制限を含むバッファ初期化コードを検索することができる。復元されたデータサイズの制限とメモリオペランドの位置がコードテンプレートに挿入され、修正されたコードが生成される。システムは、操作を停止するのとは対照的に、実行時の操作中に、関数コールを書き換えることができる。
【００３７】
工程３１５で、システムは、コード命令を格納するメモリへの書き込み許可を無効にする。これは、メモリマネージャ１４２によるコードへの書き込みアクセスの防止を再開させ、それによって、偶然にまたは悪意のあるユーザによって、メモリにロードされたコードが書き換えられることを再び防止する。かくして、無効化された書き込み許可にて、権限のないユーザによりコードを修正できなくすることができる。許可が無効化されると、ファイルの作成、ファイルの削除、ファイル名の変更など、メモリまたはストレージのエントリを変更できなくなる。
【００３８】
工程３１７で、システムはプログラムコールスタックを以前の状態に復元する。例えば、プログラムスタック、プログラムカウンタおよび他のＣＰＵレジスタ、および他のプログラム状態が、問題のある関数が実行される前のプログラム命令の実行と一致する状態にリセットされ得る。工程３１７の後、制御は工程３０１に進み、コードの実行を再開する。問題のある関数を書き換えることで、以前のプログラムコールスタック状態を使用して、問題のある関数がコールされる前のポイントから実行を再開することができる。書き換えられた関数は境界チェックを含むので、発生した違反が別の違反を引き起こすことが防止される。従って、再開された実行においてメモリ不正が防止される。このように、単に実行を止めて、アプリケーションの実行を突然停止するのではなく、アプリケーションは修正され回復状態から再開され、それにより、攻撃から回復すると同時に、そのポイントで、アプリケーションの将来のエラーや問題を防ぐことができる。かくして、プログラムは、関数コールがデータサイズ制限に従うメモリ操作の境界チェックを含むように書き換えられた後、修正がなされた関数を伴って、実行を再開することができる。その後、プログラムは、最初から実行を再開する場合があり、それは境界チェックを可能にする。実行は、回復された状態で行われ得る。
【００３９】
例示的な実施形態が上記に説明されているが、これらの実施形態が、特許請求の範囲に包含されるすべての可能な形態を説明することは意図されていない。本明細書で使用される用語は、限定ではなく説明の用語であり、本開示の主旨および範囲から逸脱することなく、様々な変更を行うことが可能であることが理解されよう。前述したように、様々な実施形態の特徴は、明示的に記載されていないか、または図示されていないかもしれない本発明のさらなる実施形態を形成するために組み合わせることができる。種々の実施形態は、１つ以上の所望の特性に関して、他の実施形態または先行技術の実施形態よりも利点を提供するか、または好ましいものであると説明されてきたかもしれないが、当業者であれば、１つ以上の特徴または特性は、特定の用途および実施に依存する所望のシステム全体の属性を達成するために妥協され得ることを認識するであろう。これらの属性は、コスト、強度、耐久性、ライフサイクルコスト、市場性、外観、パッケージング、サイズ、サービス性、重量、製造性、組み立ての容易さなどを含むことができるが、これらに限定されない。このように、任意の実施形態が、１つ以上の特性に関して他の実施形態または先行技術の実施形態よりも望ましくないと記載されている範囲において、これらの実施形態は、本開示の範囲外ではなく、特定の用途にとって望ましいものであり得る。
【符号の説明】
【００４０】
４８：プロセッサ、５０：メモリ、５２：通信コンポーネント、５４：データストア、５６：ユーザインターフェースコンポーネント、１００：コンピュータシステム、１１０：コンピュータ装置、１１４：ＣＰＵ、１１６：メモリ、１２０：ＲＡＭ、１２２：ページキャッシュ、１２４：ハードドライブ、１２６：ネットワークインターフェース、１３０：アプリケーション、１４０：オペレーティングシステム、１４２：メモリマネージャ、１４４：ページテーブル、１４６：仮想メモリアドレス、１４８：メタデータ、１５４：通知ＡＰＩ、１５８：エラー検出器、１５９：エラー修正器、１６４：圧縮メモリ
【図１】
0006984710.tif 000002
【図２】
0006984710.tif 000003
【図３】
0006984710.tif 000004