(57)【要約】      （修正有）【課題】セキュリティエージェントのカーネルモードコンポーネントによってビルドされた非同期プロシージャコール（ＡＰＣ）に基づいて、セキュリティエージェントのユーザモードコンポーネントをロードするための技法を提供する。【解決手段】ＡＰＣ１３２は、プロセス１１０をロードする間に実行され、プロセス１１０にユーザモードコンポーネント１１２をロードさせる。ユーザモードコンポーネント１１２は、プロセス１１０のスラックスペース１２０を識別し、命令をスラックスペース１２０内に記憶し、プロセス１１０のファンクションのフックを行い、それは、スラックスペース１２０内に記憶された命令をコールするように、ファンクションの命令を変更することを含む。それら変更された命令が、記憶された命令をコールするとき、記憶された命令は、ユーザモードコンポーネント１１２を呼び出し、それは、フックされたファンクションからデータを受け取る。【選択図】図１
2017174426.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、
前記プロセッサに結合されたメモリと、
システムによるユーザモードプロセスのロードの通知を受け取り、前記ユーザモードプロセスのメインスレッドによって実行される非同期プロシージャコール（ＡＰＣ）をビルドし、前記ＡＰＣを前記ユーザモードプロセスの前記メインスレッドの待ち行列に入れるために、前記プロセッサによって操作されるように構成されたカーネルモードコンポーネントと、
前記カーネルモードコンポーネントと関連付けられ、また前記ユーザモードプロセス内のスラックスペースを識別し、ユーザモードコンポーネントを呼び出すための命令を前記スラックスペース内に記憶し、前記ユーザモードプロセスのファンクションをフックするために、前記プロセッサによって操作されるように構成された前記ユーザモードコンポーネントと
を備え、
前記ＡＰＣは、
メモリを割り当てるための命令、および前記ユーザモードコンポーネントをロードするための命令を前記割り当てられたメモリ内に記憶するための命令をコールするカーネルルーチンと、
前記ユーザモードコンポーネントをロードするための前記命令をコールするユーザルーチンと
を含み、
前記ユーザモードコンポーネントは、前記ユーザルーチンに応答してロードされたときに、前記スラックスペース内に記憶された前記命令をコールするように、前記ファンクションと関連付けられた単一の命令または機械語サイズの命令のセットを変更することによって、前記ファンクションをフックし、
前記ファンクションの前記単一の命令または機械語サイズの命令のセットは、実行されたときに、前記コールを実行し、それは、前記ファンクションと関連付けられたデータを受け取り、そのデータを前記カーネルモードコンポーネントに提供するために、前記ユーザモードコンポーネントを呼び出すという結果をもたらす
ことを特徴とするシステム。
【請求項２】
前記ファンクションは、ユーザモードメモリ割り当て、ユーザモードにおけるスレッドコンテキストの設定、またはカーネルモードからフックされることができない任意のシステムコールのうちの１つと関連付けられることを特徴とする請求項１に記載のシステム。
【請求項３】
前記ファンクションは、３２ビットデバイスにおける前記プロセスの３２ビットシステムライブラリコンポーネント、または６４ビットデバイスにおける前記プロセスの６４ビットシステムライブラリコンポーネントのファンクションであることを特徴とする請求項１に記載のシステム。
【請求項４】
フックされるプロセスの１または複数のファンクションを識別するステップと、
メモリ内の前記プロセスのスラックスペース内のロケーションに命令を記憶するステップと、
前記１または複数のファンクションをフックするステップであって、前記ロケーションに記憶された前記命令をコールするように、前記１または複数のファンクションのうちの各ファンクションのための単一の命令または命令のセットを変更することを含む、ステップと
を含み、
前記命令は、前記１または複数のファンクションのうちのファンクションからのコールに応答して実行されたときに、前記１または複数のファンクションのうちの前記ファンクションと関連付けられたデータを受け取るために、セキュリティエージェントを呼び出す
ことを特徴とするコンピュータ実施方法。
【請求項５】
前記プロセスのロードの通知を受け取り、前記通知に応答して、前記識別するステップ、前記記憶するステップ、および前記フックするステップを実行するステップをさらに含むことを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項６】
前記通知を受け取ったことに応答して、前記プロセスの利用可能なスラックスペースを識別するステップであって、前記スラックスペース内に前記ロケーションを含む、ステップをさらに含むことを特徴とする請求項５に記載のコンピュータ実施方法。
【請求項７】
前記通知を受け取ったことに応答して、制御フロー保護メカニズムをバイパスするステップであって、前記制御フロー保護メカニズムの検証機能をポイントするポインタを、代替検証機能をポイントするように設定することを含む、ステップをさらに含むことを特徴とする請求項５に記載のコンピュータ実施方法。
【請求項８】
前記識別するステップ、前記記憶するステップ、および前記フックするステップは、前記セキュリティエージェントのユーザモードコンポーネントによって実行されることを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項９】
前記セキュリティエージェントを呼び出すことは、前記ユーザモードコンポーネントを呼び出すことを含み、前記ユーザモードコンポーネントは、前記１または複数のファンクションのうちの前記ファンクションと関連付けられた前記受け取られたデータを、前記セキュリティエージェントのカーネルモードコンポーネントに提供することを特徴とする請求項８に記載のコンピュータ実施方法。
【請求項１０】
前記ユーザモードコンポーネントによって、アンロード時に元の命令を回復するステップをさらに含むことを特徴とする請求項９に記載のコンピュータ実施方法。
【請求項１１】
前記カーネルモードコンポーネントは、非同期プロシージャコール（ＡＰＣ）をビルドし、前記ＡＰＣは、
メモリを割り当てるための命令、および前記ユーザモードコンポーネントをロードするための命令を前記割り当てられたメモリ内に記憶するための命令をコールするカーネルルーチンと、
前記識別するステップ、前記記憶するステップ、および前記フックするステップを実行するために、前記ユーザモードコンポーネントをロードするための前記命令をコールするユーザルーチンと
を含むことを特徴とする請求項９に記載のコンピュータ実施方法。
【請求項１２】
前記１または複数のファンクションのうちの各ファンクションのための前記単一の命令または命令のセットは、８バイトであり、前記フックするステップは、前記１または複数のファンクションをアトミックにフックするステップを含むことを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項１３】
前記ロケーションに記憶された前記命令は、前記セキュリティエージェントを呼び出すトランポリンであることを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項１４】
前記１または複数のファンクションは、複数のファンクションを含み、前記複数のファンクションはすべて、フックされたときに、同じトランポリンをコールすることを特徴とする請求項１３に記載のコンピュータ実施方法。
【請求項１５】
前記データを受け取るために、前記セキュリティエージェントを呼び出すことは、前記１または複数のファンクションのうちの前記ファンクションに対応する前記セキュリティエージェントのフッキング機能へのリダイレクトを行う、前記セキュリティエージェントのリダイレクト機能を呼び出すことを含むことを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項１６】
前記リダイレクト機能は、コールスタック内のリターンアドレスに基づいて、リダイレクトを行い、前記リターンアドレスは、前記１または複数のファンクションのうちの前記ファンクションと関連付けられていることを特徴とする請求項１５に記載のコンピュータ実施方法。
【請求項１７】
コンピューティングデバイスによって実行されたときに、前記コンピューティングデバイスに、
前記コンピューティングデバイスのオペレーティングシステムによるプロセスのロードの通知を受け取ることと、
前記オペレーティングシステムは、前記プロセスのために制御フロー保護メカニズムの検証機能を利用すると決定することと、
前記決定に応答して、前記制御フロー保護メカニズムをバイパスすることであって、前記検証機能をポイントするポインタを、代替検証機能をポイントするように設定することを含む、バイパスすることと、
前記プロセスによる非同期プロシージャコール（ＡＰＣ）の実行後、前記検証機能をポイントするように前記ポインタをリセットすることと
を含む操作を実行させる、セキュリティエージェントの複数のプログラミング命令が記憶されていることを特徴とする非一時的コンピュータ可読媒体。
【請求項１８】
前記検証機能および前記代替検証機能はともに、前記制御フロー保護メカニズムのファンクションであり、前記制御フロー保護メカニズムは、１または複数のタイプのコンパイラを用いてコンパイルされたプロセスのために前記検証機能を利用し、前記１または複数のタイプのコンパイラを用いてコンパイルされてないプロセスのために前記代替検証機能を利用することを特徴とする請求項１７に記載の非一時的コンピュータ可読媒体。
【請求項１９】
前記代替検証機能は、前記セキュリティエージェントのファンクションであることを特徴とする請求項１７に記載の非一時的コンピュータ可読媒体。
【請求項２０】
前記代替検証機能は、前記ＡＰＣと関連付けられた命令のコールが許可されたことを示す指示を返すことを特徴とする請求項１７に記載の非一時的コンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、ユーザモードコンポーネント注入技法に関する。
【背景技術】
【０００２】
関連出願
本特許出願は、２０１５年８月５日に出願された米国特許正規出願第１４／８１８５２７号の一部継続出願である。出願第１４／８１８５２７号は、その全体が、参照によって本明細書に組み込まれる。
【０００３】
インターネットの使用が、日々の生活のますます大きい部分を形成するようになったのに伴い、システムリソース、データ、およびプライベート情報を盗用または破壊するセキュリティ上の弱点を突く手段が、より一層の問題になっている。政府および企業は、これらのセキュリティ上の弱点を突く手段に関連する侵入および窃盗を防止するために、大量のリソースを注ぎ込んでいる。セキュリティ上の弱点を突く手段は、コンピュータウイルス、ワーム、トロイの木馬、スパイウェア、キーストロークロガー、アドウェア、およびルートキットなど、多くの形態で現れる。これらの弱点を突く手段は、スピアフィッシュ電子メール、クリック可能リンク、文書、実行可能ファイル、またはアーカイブなど、数々のメカニズムで、または数々のメカニズムを通して配布される。セキュリティ上の弱点を突く手段によってもたらされる脅威のいくつかはきわめて深刻であるため、それらは、サイバーテロリズムまたは産業スパイと呼ばれる。
【０００４】
そのような脅威に対する対抗を支援するために、アンチウイルスソフトウェアのベンダは、しばしば、監視されるデバイスのオペレーティングシステムにフックを登録し、あるいは監視されるデバイスのプロセスにおいて実施されるシステムライブラリコンポーネント（例えば、ＷｉｎｄｏｗｓオペレーティングシステムにおけるＮＴＤＬＬコンポーネント、またはＵＮＩＸシステムにおけるｇｌｉｂｃコンポーネント）をフックする。しかしながら、アンチウイルスソフトウェアのベンダは、一般に、ユーザモードで動作し、プロセスにおいて実施されるコンポーネントを、それらのプロセスがロードされるまではフックすることができない。この遅延は、セキュリティ上の弱点を突く手段に、自らをそのようなプロセスに挿入し、アンチウイルスソフトウェアによる検出を困難にする機会を提供する。さらに、３２ビットアプリケーションプロセスにおいて動作するシステムコンポーネントの６４ビットバージョンなど、３２ビットオペレーティングシステムから６４ビットオペレーティングシステムへの進歩などのオペレーティングシステムの進歩が、あるコンポーネントのファンクションをフックするアンチウイルスソフトウェアの能力を妨げることがある。
【０００５】
フッキングプロセスは、困難を伴うこともあり得る。プロセスをフックするコンポーネントは、競合状態に対処しなければならないことがあり、そのようなプロセスにおいてファンクションを安全にフックするために、スレッド一時中断技法を使用することを要求されることがある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】米国特許出願第１３／４９２，６７２号明細書
【図面の簡単な説明】
【０００７】
詳細な説明が、添付の図を参照して行われる。図では、参照番号の一番左の数字は、その参照番号が最初に出現する図を識別する。異なる図における同じ参照番号の使用は、同様または同一のアイテムまたは特徴を示す。
【０００８】
【図１】複数の実行可能コンポーネントおよびメモリ内におけるコンポーネントの記憶ロケーションについての概要を示す図であって、複数の実行可能コンポーネントは、セキュリティエージェントのカーネルモードコンポーネントと、そのセキュリティエージェントのユーザモードコンポーネントと、ユーザモードプロセスとを含む、図である。
【図２】ユーザモードプロセスをフックするために、そのセキュリティエージェントのユーザモードコンポーネントを注入することが可能なセキュリティエージェントのカーネルモードコンポーネントを備えて構成されたコンピューティングデバイスのコンポーネントレベル図である。
【図３】カーネルモードコンポーネントが非同期プロシージャコール（ＡＰＣ）を通じてユーザモードコンポーネントを注入するための例示的なプロセスを示す図である。
【図４】ユーザモードコンポーネントが、ユーザモードプロセスのファンクションと関連付けられたデータを、そのファンクションのフックを通じて受け取り、フックされたデータをカーネルモードコンポーネントに提供するための例示的なプロセスを示す図である。
【図５】ユーザモードプロセスのスラックスペース内に命令を記憶し、記憶された命令をコールするようにファンクションを変更することによって、ユーザモードプロセスのファンクションをフックするための例示的なプロセスを示す図である。
【図６】オペレーティングシステムの制御フロー保護メカニズムをバイパスするための例示的なプロセスを示す図である。
【発明を実施するための形態】
【０００９】
本開示は、一部において、セキュリティエージェントのカーネルモードコンポーネントが、セキュリティエージェントのユーザモードコンポーネントを注入するための技法であって、ユーザモードコンポーネントは、ユーザモードプロセスのコンポーネントの１または複数のファンクションをフックし、フックされたファンクションと関連付けられたデータをカーネルモードコンポーネントに提供する、技法を説明する。ユーザモードプロセスのコンポーネントは、ユーザモードプロセスによってインスタンス化されたシステムライブラリコンポーネントとすることができ、ライブラリは、６４ビットローダ／初期化ライブラリなどであり、コンポーネントは、ＷｉｎｄｏｗｓオペレーティングシステムにおけるＮＴＤＬＬコンポーネントなどである。注入は、非同期プロシージャコール（ＡＰＣ）をビルドし、ユーザモードプロセス実行を引き起こすために、ＡＰＣをオペレーティングシステムのディスパッチャに提供するカーネルモードコンポーネントを必要とすることがある。
【００１０】
実行されたときに、ＡＰＣのカーネルルーチンは、メモリを割り当てるための命令、およびユーザモードコンポーネントをロードするための命令を割り当てられたメモリ内に記憶するための命令をコールする。カーネルルーチンに続いて、ＡＰＣのユーザルーチンは、ユーザモードコンポーネントをロードするための、割り当てられたメモリ内に記憶された命令をコールする。
【００１１】
いくつかの実施では、ＡＰＣの実行は、ＯＳの制御フロー保護メカニズムをバイパスすることを必要とすることがある。カーネルモードコンポーネントは、メカニズムの検証機能をポイントするポインタを、代替検証機能をポイントするように設定することによって、メカニズムをバイパスすることができる。代替検証機能は、例えば、１または複数のコンパイラタイプによってコンパイルされないプロセスのための、メカニズムのファンクションとすることができ、またはユーザモードコンポーネントのファンクションなど、別のコンポーネントのファンクションとすることができる。ＡＰＣの実行後、ユーザモードにあるコンポーネント（例えば、ユーザモードコンポーネント）は、検証機能をポイントするようにポインタをリセットすることができる。
【００１２】
ユーザモードコンポーネントは、ユーザモードプロセス内のスラックスペースを識別し、スラックスペース内に命令（例えば、トランポリン）を記憶し、ユーザモードプロセスのコンポーネントの１または複数のファンクションをフックする。そのようなフックは、アトミックフックとすることができ、各々は、トランポリンを呼び出すために、コンポーネントのファンクション内において単一の機械語サイズの命令または機械語を構成する命令のセット（例えば、６４ビットマシンにおける８バイト命令）を変更する。いくつかの実施では、各々が同じトランポリンをコールする複数のフックされたファンクションが存在することがある。
【００１３】
フックされたファンクションが実行されたとき、変更された命令が、トランポリンをコールし、今度はトランポリンがユーザモードコンポーネントを呼び出し、それは、フックされたファンクションと関連付けられたデータ（例えば、ファンクションの引数）を受け取り、そのデータをカーネルモードコンポーネントに提供する。いくつかの実施では、トランポリンは、ユーザモードコンポーネントのリダイレクト機能を呼び出し、リダイレクト機能は、コールスタックから取り出されたリターンアドレスに基づいて、フックされたファンクションに対応する多数のフッキング機能のうちの１つへのリダイレクトを行う。リターンアドレスは、どのフックされたファンクションがトランポリンをコールしたかを示すことができる。リダイレクト機能によってコールされると、該当するフッキング機能がデータを受け取り、それをカーネルモードコンポーネントに提供する。
【００１４】
したがって、ユーザモードコンポーネント注入およびアトミックフックは、カーネルモードコンポーネントが、ユーザモードプロセスのコンポーネントをフックすることを効果的に可能にする。そのようなフックは、カーネルモードコンポーネントが、ユーザモードメモリ割り当て、ユーザモードにおいてスレッドコンテキストを設定したアクタ、またはカーネルモード内から直接的にフックされることができない任意のシステムコールについての情報を獲得することを可能にすることができる。
【００１５】
本明細書で使用される場合、「ＡＰＣ」は、ＡＰＣ、Ｕｎｉｘ  ＯＳにおいて使用される信号、またはカーネルモードにおいてビルドされ、実行のためにユーザモードプロセスもしくはスレッドに提供される、１もしくは複数の任意のファンクションポインタを意味することができる。
【００１６】
例示的な環境
図１は、複数の実行可能コンポーネントおよびメモリ内におけるコンポーネントの記憶ロケーションについての概要を示しており、複数の実行可能コンポーネントは、セキュリティエージェントのカーネルモードコンポーネントと、そのセキュリティエージェントのユーザモードコンポーネントと、ユーザモードプロセスとを含む。示されるように、オペレーティングシステム（ＯＳ）カーネル１０４およびカーネルモードコンポーネント１０６など、複数のコンポーネントが、コンピューティングデバイスのカーネルモード１０２において動作することができる。また、プロセス１１０およびユーザモードコンポーネント１１２など、複数のコンポーネントが、コンピューティングデバイスのユーザモード１０８において動作することもできる。また、コンピューティングデバイスのメモリ１１４は、プロセス１１０のプロセスコンポーネント１１６など、そのようなコンポーネントのうちの１または複数を記憶することもできる。プロセスコンポーネント１１６は、単一の命令１１８などの異なる命令を有する、１または複数のフックされたファンクションを含む。また、メモリ１１４内のプロセスコンポーネント１１６は、スラックスペース１２０を含み、スラックスペース１２０内のロケーションは、トランポリン１２２を記憶することができ、それは、コールされたときに、ユーザモードコンポーネント１１２のリダイレクト機能１２４を呼び出す。そして今度は、そのリダイレクト機能１２４が、１または複数のフッキング機能１２６のうちのフッキング機能１２６へのリダイレクトを行い、各フッキング機能１２６は、フックされたファンクションの命令１１８と関連付けられる。
【００１７】
図１にさらに示されるように、ＯＳカーネル１０４は、１２８において、プロセス１１０についてのロード要求を受け取ることができる。その後、１３０において、カーネルモードコンポーネント１０６は、ＯＳカーネル１０４から、ロード要求の通知を受け取ることができる。通知の受け取りに応答して、カーネルモードコンポーネント１０６は、１３２において、ＡＰＣをビルドし、ＡＰＣを、実行のためにプロセス１１０のメインスレッドの待ち行列に入れることができる。実行されたときに、ＡＰＣは、メモリを割り当てる命令、その割り当てられたメモリ内にユーザモードコンポーネント１１２をロードするための命令を記憶する命令、ＯＳの制御フロー保護メカニズムの検証ポインタを、代替検証機能をポイントするように１３４において設定する命令、および割り当てられたメモリ内に記憶された命令をコールすることによって、１３６においてユーザモードコンポーネント１１２をロードする命令をコールする。その後、ユーザモードコンポーネント１１２は、プロセスコンポーネント１１６のスラックスペース１２０をスキャンし、トランポリン１２２をスラックスペース１２０内に記憶し、１４０において、（「フックされたファンクション」とも呼ばれる）１または複数のファンクションのための単一の命令または命令のセットをフックして、命令１１８を置換する。
【００１８】
それらの命令１１８の１つが、その後、変更後に実行された場合、それは、１４２において、スラックスペース１２０内に記憶されたトランポリン１２２をコールする。トランポリン１２２は、その後、１４４において、ユーザモードコンポーネント１１２のリダイレクト機能１２４を呼び出す。リダイレクト機能１２４は、その後、１４６において、コールスタックからリターンアドレスを取り出し、そのリターンアドレスに基づいて、フッキング機能１２６へのリダイレクトを行う。フッキング機能１２６は、トランポリン１２２をコールしたフックされたファンクションからデータを受け取り、１４８において、フックされたデータをカーネルモードコンポーネント１０６に提供する。
【００１９】
様々な実施形態では、コンピューティングデバイスは、ＯＳカーネル１０４と、カーネルモードコンポーネント１０６と、プロセス１１０と、ユーザモードコンポーネント１１２と、メモリ１１４とを含むことができる。そのようなコンピューティングデバイスは、サーバもしくはサーバファーム、複数の分散されたサーバファーム、メインフレーム、ワークステーション、パーソナルコンピュータ（ＰＣ）、ラップトップコンピュータ、タブレットコンピュータ、携帯情報端末（ＰＤＡ）、セルラフォン、メディアセンタ、埋め込まれたシステム、または１もしくは複数の他の任意の種類のデバイスとすることができる。複数のコンピューティングデバイス上で実施される場合、ＯＳカーネル１０４、カーネルモードコンポーネント１０６、プロセス１１０、ユーザモードコンポーネント１１２、およびメモリ１１４は、複数のコンピューティングデバイス間に分散されることができる。いくつかの実施では、コンピューティングデバイスは、１または複数のコンピューティングデバイス上で実施される１または複数の仮想マシンを表す。ＯＳカーネル１０４と、カーネルモードコンポーネント１０６と、プロセス１１０と、ユーザモードコンポーネント１１２と、メモリ１１４とを含むコンピューティングデバイスの例は、図２に示されており、その図を参照して以下で説明される。
【００２０】
ＯＳカーネル１０４は、Ｗｉｎｄｏｗｓ（登録商標）ＯＳ、Ｕｎｉｘ  ＯＳ、または他の任意の種類のＯＳなど、任意の種類のＯＳのカーネルとすることができる。そのようなＯＳは、６４ビット以上のＯＳとすることができ、Ｗｉｎｄｏｗｓオペレーティングシステムにおける６４ビットＮＴＤＬＬコンポーネントなど、６４ビットシステムライブラリローダコンポーネントを用いて、３２ビットプロセスおよび６４ビットプロセスの両方をサポートすることができる。ＯＳカーネル１０４は、プロセス１１０などのコンポーネントをロードおよびアンロードするためのロード機能およびアンロード機能を有することができる。ＯＳカーネル１０４は、知られたライブラリコンポーネント（例えば、知られたダイナミックリンクライブラリ（ＤＬＬ））のリストなど、数々のコンピューティングデバイスリストも含む。
【００２１】
さらに、ＯＳは、Ｗｉｎｄｏｗｓ１０（商標）ＯＳによって実施される制御フローガードなど、制御フロー保護メカニズムを実施することができる。そのような制御フローメカニズムは、プロセスのファンクションコール内のアドレスを、そのプロセスのファンクションの開始と関連付けられた知られたアドレスのリストと比較する検証機能を含むことができる。ファンクションコール内のアドレスが、知られたアドレスと一致しない場合、ＯＳは、ファンクションコールを却下することができる。いくつかの実施では、検証機能は、制御フロー保護メカニズムの複数の検証機能のうちの１つとすることができる。ファンクションコールアドレスを知られたアドレスのリストと比較する検証機能は、１または複数の特定のコンパイルタイプのうちの１つを用いてコンパイルされたプロセスのために利用されることができ、本質的に任意のファンクションコールを許可することができる代替検証機能は、特定のコンパイルタイプのいずれを用いてもコンパイルされてないプロセスのために利用されることができる。
【００２２】
カーネルモードコンポーネント１０６は、カーネルレベルセキュリティエージェントのコンポーネントとすることができ、それは、コンピューティングデバイスにおけるアクティビティを監視および記録することができ、アクティビティを分析することができ、アラートおよびイベントを生成し、それらのアラートおよびイベントをリモートセキュリティサービスに提供することができる。カーネルレベルセキュリティエージェントは、リモートセキュリティサービスによってインストールされ、構成可能であることができ、カーネルモードコンポーネント１０６およびカーネルレベルセキュリティエージェントの他のコンポーネントの再構成を受け取り、動作中に適用する。カーネルモードコンポーネント１０６は、カーネルレベルセキュリティエージェントのアーキテクチャ内におけるアクタコンポーネントとすることができ、プロセス１１０をロードすることを求める要求の通知を、ＯＳカーネル１０４のコールバックインターフェースを登録することができる、カーネルレベルセキュリティエージェントのアーキテクチャのイベントソースを介して受け取ることができる。例示的なカーネルレベルセキュリティエージェントは、「Ｋｅｒｎｅｌ−Ｌｅｖｅｌ  Ｓｅｃｕｒｉｔｙ  Ａｇｅｎｔ」と題する、２０１２年６月８日に出願された米国特許出願（特許文献１を参照）においてより詳細に説明されており、それは、２０１５年５月２６日に米国特許番号９,０４３,９０３として発行された。本明細書でさらに説明されるように、カーネルモードコンポーネント１０６は、プロセス１１０をロードすることを求める要求の通知を受け取り、ＡＰＣをビルドし、ＡＰＣをプロセス１１０のメインスレッドの待ち行列に入れ、フックされたデータをユーザモードコンポーネント１１２から受け取る。
【００２３】
いくつかの実施では、プロセス１１０は、アプリケーションまたはユーザモードプラットフォームコンポーネントなど、コンピューティングデバイスの任意の種類のユーザモードプロセスとすることができる。プロセス１１０は、メモリ割り当てまたはスレッドコンテキストの設定など、様々なシステムコールを含む様々な操作を実行することができる。プロセス１１０は、システムコールを実行する目的で、１または複数のシステムライブラリコンポーネントをインスタンス化することもできる。例えば、プロセス１１０が６４ビットプロセスである場合、プロセス１１０は、Ｗｉｎｄｏｗｓオペレーティングシステムにおける６４ビットＮＴ  ＤＬＬをインスタンス化することができる。プロセスが３２ビットプロセスである場合、プロセス１１０は、３２ビットシステムコールライブラリおよび６４ビットシステムコールライブラリの両方をインスタンス化することができる。プロセスコンポーネント１１６は、Ｗｉｎｄｏｗｓオペレーティングシステムにおける６４ビットＮＴ  ＤＬＬなど、そのようなシステムコールライブラリコンポーネントの例とすることができる。プロセスコンポーネント１１６は、ユーザモードメモリ割り当てを実行するためのファンクションなど、１または複数のファンクションを有することができる。これらのファンクションは、機械語を構成する単一の命令１１８または命令のセット（例えば、８バイト命令）など、命令から成ることができる。プロセス１１０は、ロード中に保留されていたＡＰＣ引き渡しを要求し、それらのＡＰＣをオペレーティングシステムに実行させるように構成されることもできる。
【００２４】
様々な実施では、ユーザモードコンポーネント１１２は、セキュリティエージェントの任意の種類のコンポーネントとすることができ、カーネルモードコンポーネント１０６と関連付けられることができる。例えば、ユーザモードコンポーネント１１２は、ＤＬＬなど、ライブラリコンポーネントとすることができる。ユーザモードコンポーネント１１２およびそれをロードするための命令は、メモリ１１４内のいずれかの場所に記憶されることができる。ユーザモードコンポーネント１１２は、名前と関連付けられることもでき、カーネルモードコンポーネント１０６は、そのユーザモードコンポーネント１１２の名前を、ＯＳカーネル１０４によって維持されるライブラリコンポーネント（例えば、Ｗｉｎｄｏｗｓにおける知られたＤＬＬ）のリストに追加することができる。本明細書でさらに言及されるように、ユーザモードコンポーネント１１２は、プロセスコンポーネント１１６内のスラックスペース１２０を識別し、スラックスペース１２０内にトランポリン１２２を記憶し、プロセスコンポーネント１１６のファンクションをフックし、フックされたデータを受け取り、フックされたデータをカーネルモードコンポーネント１０６に提供し、単一の命令１１８をそれの（機械語を構成する１または複数の命令の）変更前の状態に回復させることができる。やはり図示されるように、ユーザモードコンポーネント１１２は、トランポリン１２２によって呼び出されるリダイレクト機能１２４と、１または複数のフッキング機能１２６とを含み、各フッキング機能１２６は、プロセスコンポーネント１１６のフックされたファンクションに対応する。リダイレクト機能１２４は、コールスタックから取り出されたリターンアドレスに基づいて、フッキング機能１２６の１つへのリダイレクトを行い、フッキング機能１２６の１つは、フックされたファンクションからデータを受け取り、それをカーネルモードコンポーネント１０６に提供する。
【００２５】
メモリ１１４は、任意の種類のメモリデバイスのうちのメモリとすることができる。メモリは、かなり大きいアドレス空間（例えば、１２８テラバイト）を有することができる。メモリ１１４の例は、図２に示されており、その図を参照して以下で説明される。
【００２６】
いくつかの実施では、トランポリン１２２は、ユーザモードコンポーネント１１２のリダイレクト機能１２４を呼び出す（例えば、それへのリダイレクトを行い、それをコールし、またはそれのロードを要求する）命令の任意のセットとすることができる。
【００２７】
様々な実施では、ＯＳカーネル１０４は、１２８において、プロセス１１０をロードすることを求めるロード要求を、コンピューティングデバイスのプロセスまたはコンポーネントから受け取ることができる。ロード要求を受け取ると、ＯＳカーネル１０４は、プロセス１１０をロードし始め、ＯＳカーネル１０４のコールバックインターフェースを介して、そのコールバックインターフェースに登録された任意のプロセスまたはコンポーネントに通知を提供することができる。上で言及されたように、カーネルモードコンポーネント１０６は、ユーザモードプロセスをロードすることを求めるロード要求の通知を１３０において受け取るために、ＯＳカーネル１０４のコールバックインターフェースに登録されることができる。したがって、カーネルモードコンポーネント１０６は、プロセス１１０をロードすることを求めるロード要求の通知を受け取ることができる。
【００２８】
１３２において、カーネルモードコンポーネント１０６は、プロセス１１０のメインスレッドにおいて実行するためのＡＰＣをビルドする。プロセスコンポーネント１１６など、与えられたプロセスコンポーネントにおけるメインスレッドのためのＡＰＣをビルドする際、カーネルモードコンポーネント１０６は、ＡＰＣのカーネルルーチンを指定することができる。カーネルルーチンは、メモリを割り当て、割り当てられたメモリ内にユーザモードコンポーネント１１２をロードするための命令を記憶するための、カーネルモードコンポーネント１０６の命令をコールすることができる。さらに、カーネルルーチンは、ＯＳの制御フロー保護メカニズムの検証機能をポイントするポインタを、代替検証機能をポイントするように１３４において設定するための、カーネルモードコンポーネント１０６の命令をコールすることができる。本明細書でさらに詳細に言及されるように、代替検証機能は、制御フロー保護メカニズムのファンクション、ユーザモードコンポーネント１１２のファンクション、または別のモジュールのファンクションとすることができる。代替検証機能は、ＡＰＣのコールなど、ファンクションコールが許可されたことを示す指示を返す。
【００２９】
ＡＰＣのカーネルルーチンを指定することに加えて、カーネルモードコンポーネント１０６は、ユーザルーチンを指定することができる。プロセス１１０内部のＯＳカーネルＡＰＣディスパッチャによって実行されたとき、ユーザルーチンは、ユーザモードコンポーネント１１２をロードするための、割り当てられたメモリ内に記憶された命令をコールすることができる。
【００３０】
いくつかの実施では、ＡＰＣをビルドした後、カーネルモードコンポーネント１０６は、ＡＰＣをメモリ１１４内に記憶し、ＯＳカーネル１０４を介して、ＡＰＣをプロセス１１０のメインスレッドの待ち行列に入れることができる。ロード中、プロセス１１０内のユーザモードローダライブラリコンポーネントは、いずれか保留されているＡＰＣが存在するかどうかをＯＳカーネル１０４に尋ねることができ、カーネルモードコンポーネント１０６によってビルドされたＡＰＣを受け取ることができる。ＡＰＣを受け取ると、ＯＳカーネル１０４は、プロセス１１０内部においてＡＰＣのカーネルルーチンおよびユーザルーチンを実行することができる。様々な実施では、カーネルモードコンポーネント１０６は、カーネルモードコンポーネント１０６の構成によって指定される異なるセキュリティ目的を、ＡＰＣがいつ提供されるか、またはＡＰＣのカーネルルーチンおよびユーザルーチンが実行する方法を制御することによって、達成することができる。いくつかの実施では、ＡＰＣは、プロセス１１０のロードの際、異なる時点において提供されることができる。
【００３１】
ＡＰＣを受け取ると、ユーザモードプロセス１１０のメインスレッドは、ＡＰＣを実行することができ、最初にカーネルルーチンを実行し、次にユーザルーチンを実行する。言及されたように、カーネルルーチンは、カーネルモードコンポーネント１０６の命令をコールする。ユーザルーチンは、カーネルルーチンによって記憶された命令をコールし、それは、１３６において、ユーザモードコンポーネント１１２をロードする。代替的実施では、ユーザルーチンは、単に、ユーザモードコンポーネント１１２をその名前によって識別することができ、識別に成功すると、ユーザモードコンポーネント１１２が知られたＤＬＬのリスト内に含まれる知られたＤＬＬであるかどうかを決定するためのチェックが実行される。カーネルモードコンポーネント１０６は、先に、知られたＤＬＬのリストにユーザモードコンポーネント１１２を追加したので、回答は肯定的なものであり、ユーザモードローダコンポーネントは、ユーザモードコンポーネント１１２をロードする。ユーザモードプロセス１１０内のスレッドは、各ＡＰＣが受け取られるたびに、ＡＰＣ実行を繰り返すことができる。
【００３２】
様々な実施では、ロードされるときに、ユーザモードコンポーネント１１２は、プロセスコンポーネント１１６内のスラックスペース１２０を、１３８において識別するために、最初に、プロセスコンポーネント１１６と関連付けられたデータをスキャンする。ユーザモードコンポーネント１１２は、プロセスコンポーネント１１６のディスク上インスタンスとメモリ内インスタンスとのメモリアドレスを比較することによって、スラックスペース１２０を識別することができる。ユーザモードコンポーネント１１２は、次に、トランポリン１２２を含む命令を、識別されたスラックスペース１２０内のロケーションに記憶することができる。次に、ユーザモードコンポーネント１１２は、１４０において、１または複数のファンクションの各々ごとに、機械語を構成する単一の命令または命令のセット１１８を変更することによって、プロセスコンポーネント１１６の１または複数のファンクションをフックする。そのようなフックは、アトミックフックとすることができ、単一または複数の命令１１８は、各ファンクションのためのものとすることができ、各々は、合計で正確に８バイトであることができ、変更は、８バイトのすべてを、ファンクションコール、およびトランポリン１２２のアドレスで置換することを含むことができる。置換されたバイトは、回復を可能にするために、ユーザモードコンポーネント１１２によって記憶されることができる。命令１１８を変更するために、ユーザモードコンポーネント１１２は、コンピューティングデバイスのプロセッサのアトミック比較およびスワップメカニズムを利用して、命令１１８がカーネルモードコンポーネント１０６によって識別された命令と一致することを検証し、命令の同時変更を防止することができる。
【００３３】
いくつかの実施では、ユーザモードプロセス１１０のロードに続いて、ユーザモードプロセス１１０が、実行することができる。実行中、ユーザモードプロセス１１０は、プロセスコンポーネント１１６の変更された命令１１８を呼び出すことができる。変更された命令１１８は、実行されるときに、１４２において、スラックスペース１２０内のロケーションにあるトランポリン１２２をコールする。トランポリン１２２をコールすると、トランポリン１２２が実行される。いくつかの実施では、プロセスコンポーネント１１６は、複数のフックされたファンクションのための複数の変更された命令１１８を含むことができ、これら複数の変更された命令１１８は、すべてが、同じトランポリン１２２をコールすることができる。コールされたときに、トランポリン１２２は、１４４において、ユーザモードコンポーネント１１２のリダイレクト機能１２４を呼び出すことができる。
【００３４】
リダイレクト機能１２４は、その後、１４６において、トランポリン１２２をコールしたフックされたファンクションに対応するフッキング機能１２６へのリダイレクトを行うことができる。そのようなリダイレクトは、リターンアドレスをコールスタックから取り出し、それをコールスタックから取り除き、リターンアドレスと関連付けられたフッキング機能１２６を呼び出すことを含むことができる。変更された命令１１８が、トランポリン１２２をコールしたので、それら変更された命令１１８のリターンアドレスは、コールスタック内に含まれ、適切なフッキング機能１２６へのリダイレクトを行うために使用されることができる。
【００３５】
フッキング機能１２６は、フックされたファンクションと関連付けられたデータを受け取り、１４８において、データをさらなる処理のためにカーネルモードコンポーネント１０６に提供する。
【００３６】
様々な実施では、ユーザモードコンポーネント１１２は、ユーザモードコンポーネント１１２がアンロードされているときに、命令１１８をそれの／それらの元の状態に回復することができる。ユーザモードコンポーネント１１２は、検証ポインタを、検証機能をポイントするようにリセットすることもできる
【００３７】
例示的なシステム
図２は、ユーザモードプロセスをフックするために、そのセキュリティエージェントのユーザモードコンポーネントを注入することが可能なセキュリティエージェントのカーネルモードコンポーネントを備えて構成されたコンピューティングデバイスのコンポーネントレベル図を示している。示されるように、コンピューティングデバイス２００は、メモリ２０２を備え、それは、ＯＳカーネル２０４と、カーネルモードコンポーネント２０６と、ユーザモードコンポーネント２０８と、アトミックフック２１２、およびトランポリン２１６を記憶するロケーションを含むスラックスペース２１４を受け取る機能を有する、ユーザモードプロセス２１０とを記憶する。また、コンピューティングデバイス２００は、プロセッサ２１８と、着脱可能ストレージ２２０および着脱不能ストレージ２２２と、入力デバイス２２４と、出力デバイス２２６と、他のコンピューティングデバイス２３０と通信するための通信接続２２８とを含む。
【００３８】
様々な実施形態では、メモリ２０２は、（ＲＡＭなど）揮発性、（ＲＯＭ、フラッシュメモリなど）不揮発性、または２つの何らかの組み合わせである。ＯＳカーネル２０４は、図１に関して上で詳細に説明されたＯＳカーネル１０４など、任意の種類のＯＳのカーネルとすることができる。カーネルモードコンポーネント２０６は、図１に関して上で詳細に説明されたカーネルモードコンポーネント１０６の例とすることができる。ユーザモードコンポーネント２０８は、図１に関して上で詳細に説明されたユーザモードコンポーネント１１２の例とすることができる。ユーザモードプロセス２１０は、図１に関して上で詳細に説明されたプロセス１１０の例とすることができる。アトミックフック２１２は、図１に関して上で詳細に説明された、１４０においてユーザモードコンポーネント１１２によってアトミックにフックされるような、機械語を構成する単一の命令または命令のセット１１８の例とすることができる。スラックスペース２１４は、図１に関して上で詳細に説明されたスラックスペース１２０の例とすることができる。トランポリン２１６は、図１に関して上で詳細に説明されたトランポリン１２２の例とすることができる。
【００３９】
いくつかの実施形態では、プロセッサ２１８は、中央処理装置（ＣＰＵ）、グラフィックス処理ユニット（ＧＰＵ）、もしくはＣＰＵとＧＰＵの両方、または当技術分野で知られた他の処理ユニットもしくはコンポーネントである。
【００４０】
コンピューティングデバイス２００は、例えば、磁気ディスク、光ディスク、またはテープなど、追加のデータストレージデバイス（着脱可能および／または着脱不能）も含む。そのような追加のストレージは、図２では、着脱可能ストレージ２２０および着脱不能ストレージ２２２によって示されている。非一時的コンピュータ可読媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなどの情報を記憶するための技術で実施された、揮発性および不揮発性で、着脱可能および着脱不能である、有形な物理的媒体を含むことができる。システムメモリ２０２、着脱可能ストレージ２２０、および着脱不能ストレージ２２２は、すべて、非一時的コンピュータ可読媒体の例である。非一時的コンピュータ可読媒体は、限定されることなく、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリ、もしくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）、もしくは他の光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージ、もしくは他の磁気ストレージデバイス、または所望の情報を記憶するために使用されることができ、コンピューティングデバイス２００によってアクセスされることができる、他の任意の有形な物理的媒体を含む。いずれのそのような非一時的コンピュータ可読媒体も、コンピューティングデバイス２００の一部であることができる。
【００４１】
コンピューティングデバイス２００は、また、キーボード、マウス、タッチセンシティブディスプレイ、音声入力デバイスなどの、入力デバイス２２４と、ディスプレイ、スピーカ、プリンタなどの、出力デバイス２２６とを有する。これらのデバイスは、当技術分野でよく知られており、ここで長々と説明することはしない。
【００４２】
コンピューティングデバイス２００は、コンピューティングデバイス２００が他のコンピューティングデバイス２３０と通信することを可能にする通信接続２２８も含む。
【００４３】
例示的なプロセス
図３〜図６は、例示的なプロセス３００、４００、５００、および６００を示している。これらのプロセスは、論理フローグラフとして説明され、その各操作は、ハードウェア、ソフトウェア、またはそれらの組み合わせで実施されることができる、一連の操作を表す。ソフトウェアの文脈では、操作は、１または複数のプロセッサによって実行されたときに、述べられた操作を実行する、１または複数のコンピュータ可読記憶媒体上に記憶されたコンピュータ実行可能命令を表す。一般に、コンピュータ実行可能命令は、特定の機能を実行し、特定の抽象データ型を実施する、ルーチン、プログラム、オブジェクト、コンポーネント、およびデータ構造などを含む。操作が記述された順序が、限定として解釈されることは意図されておらず、任意の数の記述された操作が、プロセスを実施するために、任意の順序で、および／または並列で、組み合わされることができる。
【００４４】
図３は、非同期プロシージャコール（ＡＰＣ）を通じてユーザモードコンポーネントを注入するための、カーネルモードコンポーネントのための例示的なプロセスを示している。プロセス３００は、３０２において、セキュリティエージェントのカーネルモードコンポーネントによって、ユーザモードプロセスのロードの通知を受け取ることを含む。カーネルモードコンポーネントは、カーネルモードコンポーネントを実施するコンピューティングデバイスのオペレーティングシステムカーネルのコールバックインターフェースから通知を受け取ることができる。
【００４５】
３０４において、カーネルモードコンポーネントは、ユーザモードプロセスをロードしている間に、ユーザモードプロセスのメインスレッドによって実行されるＡＰＣをビルドすることができる。ＡＰＣは、カーネルルーチンおよびユーザルーチンを含むことができる。３０６において、ユーザモードプロセスのメインスレッドは、ＡＰＣを実行する。３０８において、ＡＰＣの実行は、第１に、メモリを割り当てるための、ＡＰＣのカーネルルーチンを呼び出すことを含む。３１０において、ＡＰＣの実行は、第２に、ユーザモードコンポーネントをロードするための命令を、割り当てられたメモリ内に記憶するための、ＡＰＣのカーネルルーチンを呼び出すことを含む。３１２において、ＡＰＣの実行は、第３に、制御フロー保護メカニズムの検証機能をポイントするポインタを、代替検証機能をポイントするように設定することを含む、制御フロー保護メカニズムのバイパスを行うためのＡＰＣのカーネルルーチンを呼び出すことを含む。３１４において、ＡＰＣの実行は、第４に、ＡＰＣのユーザルーチンを呼び出すことを含み、それは、ユーザモードコンポーネントをロードするための、割り当てられたメモリ内に記憶された命令をコールする。ユーザモードコンポーネントは、知られたライブラリコンポーネント（例えば、知られたＤＬＬ）のリスト内に含まれることができる。
【００４６】
３１６において、ユーザモードコンポーネントは、ユーザモードプロセス内のスラックスペースを識別する。
【００４７】
３１８において、ユーザモードコンポーネントは、コールされたときにユーザモードコンポーネントを呼び出すための命令を、識別されたスラックスペース内に記憶する。そのような記憶された命令は、トランポリンとすることができる。いくつかの実施では、ユーザモードコンポーネントの呼び出しは、ユーザモードコンポーネントのリダイレクト機能を呼び出すことを含むことができる。
【００４８】
３２０において、ユーザモードコンポーネントは、その後、プロセスの６４ビットシステムライブラリコンポーネントのファンクションなど、ユーザモードプロセスの１または複数のファンクションをフックする。ファンクションは、ユーザモードメモリ割り当て、ユーザモードにおけるスレッドコンテキストの設定、またはカーネルモードからフックされることができない任意のシステムコールのうちの１または複数と関連付けられることができる。３２２において、フッキングは、アトミックフッキングとすることができ、スラックスペース内に記憶された命令のコールを指定するために、各ファンクションの単一の命令または機械語サイズの命令のセットを変更することを含むことができる。命令は、合計で８バイトとすることができ、プロセッサのアトミック比較およびスワップメカニズムを使用することによって変更されることができる。
【００４９】
図４は、ユーザモードプロセスのファンクションと関連付けられたデータを、そのファンクションのフックを通じて受け取り、フックされたデータをカーネルモードコンポーネントに提供するための、ユーザモードコンポーネントのための例示的なプロセスを示している。プロセス４００は、４０２において、ユーザモードプロセスが、ファンクションの変更された命令を実行することを含み、変更された命令は、フックとしての役割を果たす。いくつかの実施では、ファンクションは、ユーザモードプロセスの６４ビットシステムライブラリコンポーネントのファンクションとすることができる。
【００５０】
４０４において、実行されたときに、変更された命令は、ユーザモードプロセスのスラックスペース内のロケーションに記憶された命令をコールする。上で言及されたように、そのような命令は、トランポリンとすることができる。
【００５１】
４０６において、スラックスペース内に記憶された命令は、セキュリティエージェントのユーザモードコンポーネントのリダイレクト機能を呼び出す。
【００５２】
４０８において、ユーザモードコンポーネントのリダイレクト機能は、ユーザモードコンポーネントのフッキング機能へのリダイレクトを行い、フッキング機能は、フックされたファンクションと関連付けられている。４１０において、リダイレクト機能は、コールスタックから取り出されたリターンアドレスに基づいて、リダイレクトを行い、リターンアドレスは、変更された命令のメモリロケーションと関連付けられている。いくつかの実施では、リダイレクト機能は、リターンアドレスをコールスタックから取り除くことができる。
【００５３】
４１２において、ユーザモードコンポーネントのフッキング機能は、フックされたファンクションと関連付けられたデータを受け取る。
【００５４】
４１４において、ユーザモードコンポーネントは、受け取られたデータを、セキュリティエージェントのカーネルモードコンポーネントに提供する。
【００５５】
４１６において、アンロードされているときに、ユーザモードコンポーネントは、変更された命令を、それの／それらの元の状態に回復する。
【００５６】
図５は、命令をユーザモードプロセスのスラックスペース内に記憶し、記憶された命令をコールするようにファンクションを変更することによって、ユーザモードプロセスのファンクションをフックするための例示的なプロセスを示している。プロセス５００は、５０２において、コンピューティングデバイスによって、フックされるプロセスの１または複数のファンクションを識別することを含む。
【００５７】
５０４において、コンピューティングデバイスは、メモリ内のプロセスのスラックスペース内のロケーションに命令を記憶する。
【００５８】
５０６において、コンピューティングデバイスは、１または複数のファンクションのフックを行い、それは、５０８において、ロケーションに記憶された命令をコールするように、１または複数のファンクションのうちの各ファンクションのための単一の命令または命令のセットを変更することを含む。１または複数のファンクションのうちのファンクションからのコールに応答して、命令が実行されたとき、命令は、そのファンクションと関連付けられたデータを受け取るために、セキュリティエージェントを呼び出す。
【００５９】
図６は、オペレーティングシステムの制御フロー保護メカニズムをバイパスするための例示的なプロセスを示している。プロセス６００は、６０２において、セキュリティエージェントによって（例えば、セキュリティエージェントのカーネルモードコンポーネントによって）、ユーザモードプロセスをロードすることを求める要求の通知を受け取ることを含む。
【００６０】
６０４において、セキュリティエージェントは、オペレーティングシステムが、プロセスのために制御フロー保護メカニズムの検証機能を利用すると決定する。
【００６１】
６０６において、セキュリティエージェントは、制御フロー保護メカニズムをバイパスし、バイパスは、６０８において、検証機能をポイントするポインタを、代替検証機能をポイントするように設定することを含む。いくつかの実施では、検証機能および代替検証機能はともに、制御フロー保護メカニズムのファンクションであり、制御フロー保護メカニズムは、１または複数のタイプのコンパイラを用いてコンパイルされたプロセスのために検証機能を利用し、１または複数のタイプのコンパイラを用いてコンパイルされてないプロセスのために代替検証機能を利用する。他の実施では、代替検証機能は、セキュリティエージェントのファンクションである。いくつかの実施では、コールされたときに、代替検証機能は、ＡＰＣのコールが許可されたことを示す指示を返す。
【００６２】
６１０において、プロセスによる非同期プロシージャコール（ＡＰＣ）の実行後、セキュリティエージェントは、検証機能をポイントするようにポインタをリセットする。
【００６３】
結語
本主題が、構造的特徴および／または方法論的行為に特有な言葉で説明されたが、添付の特許請求の範囲において確定される本主題は、説明された特定の特徴または行為に必ずしも限定されるものではないことが理解されるべきである。むしろ、特定の特徴および行為は、特許請求の範囲を実施する例示的な形態として開示された。
【図１】
2017174426.tif 000003
【図２】
2017174426.tif 000004
【図３】
2017174426.tif 000005
【図４】
2017174426.tif 000006
【図５】
2017174426.tif 000007
【図６】
2017174426.tif 000008
【手続補正書】
【提出日】平成29年6月6日(2017.6.6)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサと、
前記プロセッサに結合されたメモリと、
システムによるユーザモードプロセスのロードの通知を受け取り、前記ユーザモードプロセスのメインスレッドによって実行される非同期プロシージャコール（ＡＰＣ）をビルドし、前記ＡＰＣを前記ユーザモードプロセスの前記メインスレッドの待ち行列に入れるために、前記プロセッサによって操作されるように構成されたカーネルモードコンポーネントと、
前記カーネルモードコンポーネントと関連付けられ、また前記ユーザモードプロセス内のスラックスペースを識別し、ユーザモードコンポーネントを呼び出すための命令を前記スラックスペース内に記憶し、前記ユーザモードプロセスのファンクションをフックするために、前記プロセッサによって操作されるように構成された前記ユーザモードコンポーネントと
を備え、
前記ＡＰＣは、
メモリを割り当てるための命令、および前記ユーザモードコンポーネントをロードするための命令を前記割り当てられたメモリ内に記憶するための命令をコールするカーネルルーチンと、
前記ユーザモードコンポーネントをロードするための前記命令をコールするユーザルーチンと
を含み、
前記ユーザモードコンポーネントは、前記ユーザルーチンに応答してロードされたときに、前記スラックスペース内に記憶された前記命令をコールするように、前記ファンクションと関連付けられた単一の命令または機械語サイズの命令のセットを変更することによって、前記ファンクションをフックし、
前記ファンクションの前記単一の命令または機械語サイズの命令のセットは、実行されたときに、前記コールを実行し、それは、前記ファンクションと関連付けられたデータを受け取り、そのデータを前記カーネルモードコンポーネントに提供するために、前記ユーザモードコンポーネントを呼び出すという結果をもたらす
ことを特徴とするシステム。
【請求項２】
前記ファンクションは、ユーザモードメモリ割り当て、ユーザモードにおけるスレッドコンテキストの設定、またはカーネルモードからフックされることができない任意のシステムコールのうちの１つと関連付けられることを特徴とする請求項１に記載のシステム。
【請求項３】
前記ファンクションは、３２ビットデバイスにおける前記プロセスの３２ビットシステムライブラリコンポーネント、または６４ビットデバイスにおける前記プロセスの６４ビットシステムライブラリコンポーネントのファンクションであることを特徴とする請求項１に記載のシステム。
【請求項４】
フックされるプロセスの１または複数のファンクションを識別するステップと、
メモリ内の前記プロセスのスラックスペース内のロケーションに命令を記憶するステップと、
前記１または複数のファンクションをフックするステップであって、前記ロケーションに記憶された前記命令をコールするように、前記１または複数のファンクションのうちの各ファンクションのための単一の命令または命令のセットを変更することを含む、ステップと
を含み、
前記命令は、前記１または複数のファンクションのうちのファンクションからのコールに応答して実行されたときに、前記１または複数のファンクションのうちの前記ファンクションと関連付けられたデータを受け取るために、セキュリティエージェントを呼び出す
ことを特徴とするコンピュータ実施方法。
【請求項５】
前記プロセスのロードの通知を受け取り、前記通知に応答して、前記識別するステップ、前記記憶するステップ、および前記フックするステップを実行するステップをさらに含むことを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項６】
前記通知を受け取ったことに応答して、前記プロセスの利用可能なスラックスペースを識別するステップであって、前記スラックスペース内に前記ロケーションを含む、ステップをさらに含むことを特徴とする請求項５に記載のコンピュータ実施方法。
【請求項７】
前記通知を受け取ったことに応答して、制御フロー保護メカニズムをバイパスするステップであって、前記制御フロー保護メカニズムの検証機能をポイントするポインタを、代替検証機能をポイントするように設定することを含む、ステップをさらに含むことを特徴とする請求項５に記載のコンピュータ実施方法。
【請求項８】
前記識別するステップ、前記記憶するステップ、および前記フックするステップは、前記セキュリティエージェントのユーザモードコンポーネントによって実行されることを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項９】
前記セキュリティエージェントを呼び出すことは、前記ユーザモードコンポーネントを呼び出すことを含み、前記ユーザモードコンポーネントは、前記１または複数のファンクションのうちの前記ファンクションと関連付けられた前記受け取られたデータを、前記セキュリティエージェントのカーネルモードコンポーネントに提供することを特徴とする請求項８に記載のコンピュータ実施方法。
【請求項１０】
前記ユーザモードコンポーネントによって、アンロード時に元の命令を回復するステップをさらに含むことを特徴とする請求項９に記載のコンピュータ実施方法。
【請求項１１】
前記カーネルモードコンポーネントは、非同期プロシージャコール（ＡＰＣ）をビルドし、前記ＡＰＣは、
前記ユーザモードコンポーネントをロードするための命令を割り当てられたメモリ内に記憶するためにメモリを割り当てる命令をコールするカーネルルーチンと、
前記識別するステップ、前記記憶するステップ、および前記フックするステップを実行するために、前記ユーザモードコンポーネントをロードするための前記命令をコールするユーザルーチンと
を含むことを特徴とする請求項９に記載のコンピュータ実施方法。
【請求項１２】
前記１または複数のファンクションのうちの各ファンクションのための前記単一の命令または命令のセットは、８バイトであり、前記フックするステップは、前記１または複数のファンクションをアトミックにフックするステップを含むことを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項１３】
前記ロケーションに記憶された前記命令は、前記セキュリティエージェントを呼び出すトランポリンであることを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項１４】
前記１または複数のファンクションは、複数のファンクションを含み、前記複数のファンクションはすべて、フックされたときに、同じトランポリンをコールすることを特徴とする請求項１３に記載のコンピュータ実施方法。
【請求項１５】
前記データを受け取るために、前記セキュリティエージェントを呼び出すことは、前記１または複数のファンクションのうちの前記ファンクションに対応する前記セキュリティエージェントのフッキング機能へのリダイレクトを行う、前記セキュリティエージェントのリダイレクト機能を呼び出すことを含むことを特徴とする請求項４に記載のコンピュータ実施方法。
【請求項１６】
前記リダイレクト機能は、コールスタック内のリターンアドレスに基づいて、リダイレクトを行い、前記リターンアドレスは、前記１または複数のファンクションのうちの前記ファンクションと関連付けられていることを特徴とする請求項１５に記載のコンピュータ実施方法。
【請求項１７】
コンピューティングデバイスによって実行されたときに、前記コンピューティングデバイスに、
前記コンピューティングデバイスのオペレーティングシステムによるプロセスのロードの通知を受け取ることと、
前記オペレーティングシステムは、前記プロセスのために制御フロー保護メカニズムの検証機能を利用すると決定することと、
前記決定に応答して、前記制御フロー保護メカニズムをバイパスすることであって、前記検証機能をポイントするポインタを、代替検証機能をポイントするように設定することを含む、バイパスすることと、
前記プロセスによる非同期プロシージャコール（ＡＰＣ）の実行後、前記検証機能をポイントするように前記ポインタをリセットすることと
を含む操作を実行させる、セキュリティエージェントの複数のプログラミング命令が記憶されていることを特徴とする非一時的コンピュータ可読媒体。
【請求項１８】
前記検証機能および前記代替検証機能はともに、前記制御フロー保護メカニズムのファンクションであり、前記制御フロー保護メカニズムは、１または複数のタイプのコンパイラを用いてコンパイルされたプロセスのために前記検証機能を利用し、前記１または複数のタイプのコンパイラを用いてコンパイルされてないプロセスのために前記代替検証機能を利用することを特徴とする請求項１７に記載の非一時的コンピュータ可読媒体。
【請求項１９】
前記代替検証機能は、前記セキュリティエージェントのファンクションであることを特徴とする請求項１７に記載の非一時的コンピュータ可読媒体。
【請求項２０】
前記代替検証機能は、前記ＡＰＣと関連付けられた命令のコールが許可されたことを示す指示を返すことを特徴とする請求項１７に記載の非一時的コンピュータ可読媒体。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００２３
【補正方法】変更
【補正の内容】
【００２３】
いくつかの実施では、プロセス１１０は、アプリケーションまたはユーザモードプラットフォームコンポーネントなど、コンピューティングデバイスの任意の種類のユーザモードプロセスとすることができる。プロセス１１０は、メモリ割り当てまたはスレッドコンテキストの設定など、様々なシステムコールを含む様々な操作を実行することができる。プロセス１１０は、システムコールを実行する目的で、１または複数のシステムライブラリコンポーネントをインスタンス化することもできる。例えば、プロセス１１０が６４ビットプロセスである場合、プロセス１１０は、Ｗｉｎｄｏｗｓオペレーティングシステムにおける６４ビットＮＴ  ＤＬＬをインスタンス化することができる。プロセスが３２ビットプロセスである場合、プロセス１１０は、３２ビットシステムコールライブラリおよび６４ビットシステムコールライブラリの両方をインスタンス化することができる。プロセスコンポーネント１１６は、Ｗｉｎｄｏｗｓオペレーティングシステムにおける６４ビットＮＴ  ＤＬＬなど、そのようなシステムライブラリコンポーネントの例とすることができる。プロセスコンポーネント１１６は、ユーザモードメモリ割り当てを実行するためのファンクションなど、１または複数のファンクションを有することができる。これらのファンクションは、機械語を構成する単一の命令１１８または命令のセット（例えば、８バイト命令）など、命令から成ることができる。プロセス１１０は、ロード中に保留されていたＡＰＣ引き渡しを要求し、それらのＡＰＣをオペレーティングシステムに実行させるように構成されることもできる。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００２８
【補正方法】変更
【補正の内容】
【００２８】
１３２において、カーネルモードコンポーネント１０６は、プロセス１１０のメインスレッドにおいて実行するためのＡＰＣをビルドする。プロセスコンポーネント１１６など、与えられたプロセスコンポーネントにおけるメインスレッドのためのＡＰＣをビルドする際、カーネルモードコンポーネント１０６は、ＡＰＣのカーネルルーチンを指定することができる。カーネルルーチンは、ユーザモードコンポーネント１１２をロードするための命令をその割り当てられたメモリ内に記憶するためにメモリを割り当てるカーネルモードコンポーネント１０６の命令をコールすることができる。さらに、カーネルルーチンは、ＯＳの制御フロー保護メカニズムの検証機能をポイントするポインタを、代替検証機能をポイントするように１３４において設定するための、カーネルモードコンポーネント１０６の命令をコールすることができる。本明細書でさらに詳細に言及されるように、代替検証機能は、制御フロー保護メカニズムのファンクション、ユーザモードコンポーネント１１２のファンクション、または別のモジュールのファンクションとすることができる。代替検証機能は、ＡＰＣのコールなど、ファンクションコールが許可されたことを示す指示を返す。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００３２
【補正方法】変更
【補正の内容】
【００３２】
様々な実施では、ロードされるときに、ユーザモードコンポーネント１１２は、プロセスコンポーネント１１６内のスラックスペース１２０を、１３８において識別するために、最初に、プロセスコンポーネント１１６と関連付けられたデータをスキャンする。ユーザモードコンポーネント１１２は、プロセスコンポーネント１１６のディスク上インスタンスとメモリ内インスタンスとのメモリアドレスを比較することによって、スラックスペース１２０を識別することができる。ユーザモードコンポーネント１１２は、次に、トランポリン１２２を含む命令を、識別されたスラックスペース１２０内のロケーションに記憶することができる。次に、ユーザモードコンポーネント１１２は、１４０において、１または複数のファンクションの各々ごとに、機械語を構成する単一の命令または命令のセット１１８を変更することによって、プロセスコンポーネント１１６の１または複数のファンクションをフックする。そのようなフックは、アトミックフックとすることができ、各ファンクションのための単一または複数の命令１１８は、各々、合計で正確に８バイトであることができ、変更は、８バイトのすべてを、ファンクションコール、およびトランポリン１２２のアドレスで置換することを含むことができる。置換されたバイトは、回復を可能にするために、ユーザモードコンポーネント１１２によって記憶されることができる。命令１１８を変更するために、ユーザモードコンポーネント１１２は、コンピューティングデバイスのプロセッサのアトミック比較およびスワップメカニズムを利用して、命令１１８がカーネルモードコンポーネント１０６によって識別された命令と一致することを検証し、命令の同時変更を防止することができる。
【外国語明細書】
2017174426000001.pdf