(57)【要約】      （修正有）【課題】アプリケーションプログラムインタフェースのパラメータのための有効な条件を指定するセキュリティポリシーを実施するための方法およびシステムを提供すること。【解決手段】セキュリティシステム１１０は、セキュリティ仮想マシンの命令セット内で表現されたセキュリティプログラムを実行するセキュリティ仮想マシン１２５を提供する。セキュリティシステム１１０は、セキュリティプログラムをセキュリティ仮想マシン１２５の命令ストア１２８に格納する。セキュリティ実施イベントが発生するとき、セキュリティ仮想マシン１２５は、セキュリティ実施イベントのデータを使用してその命令ストア１２８の命令を実行し、セキュリティポリシーを実施する。【選択図】図１
2005316964.tif 000002
【特許請求の範囲】
【請求項１】
セキュリティポリシーを実施するためのコンピュータシステム内の方法であって、
セキュリティポリシーを提供するステップと、
前記セキュリティポリシーをセキュリティプログラムに、セキュリティ仮想マシンの命令セットに基づいてコンパイルするステップと、
前記セキュリティプログラムを前記セキュリティ仮想マシンの命令ストアにロードするステップと、
セキュリティ実施イベントが発生するとすぐ、前記命令ストアの前記命令を、前記セキュリティ実施イベントのデータに基づいて実行して、前記セキュリティポリシーを実施するステップと
を備えることを特徴とする方法。
【請求項２】
前記セキュリティポリシーはシステムコールのためのセキュリティを指定することを特徴とする請求項１に記載の方法。
【請求項３】
前記セキュリティ実施イベントは、アプリケーションがシステムコールを出すことであることを特徴とする請求項１に記載の方法。
【請求項４】
前記システムコールのパラメータは、前記セキュリティ実施イベントの前記データであることを特徴とする請求項３に記載の方法。
【請求項５】
前記システムコールを出すアプリケーションのプロセスコントロール情報は、前記セキュリティ実施イベントの前記データであることを特徴とする請求項３に記載の方法。
【請求項６】
前記セキュリティプログラムのデータはリテラルデータ構造内に格納されることを特徴とする請求項１に記載の方法。
【請求項７】
命令は、前記リテラルデータ構造内に格納されたリテラルデータへの参照を含むことを特徴とする請求項６に記載の方法。
【請求項８】
前記セキュリティプログラムのデータは動的データ構造内に格納されることを特徴とする請求項１に記載の方法。
【請求項９】
命令は、前記動的データ構造内に格納された動的データへの参照を含むことを特徴とする請求項８に記載の方法。
【請求項１０】
命令は、実行するための次の命令の場所を識別することを特徴とする請求項１に記載の方法。
【請求項１１】
前記セキュリティ仮想マシンは、ブール、整数、文字列およびローバイナリデータ型をサポートすることを特徴とする請求項１に記載の方法。
【請求項１２】
前記セキュリティ仮想マシンは正規表現パターンマッチング比較をサポートすることを特徴とする請求項１に記載の方法。
【請求項１３】
前記セキュリティプログラムの前記実行は、前記セキュリティ実施イベントを処理する方法を指定する出力アクションセットを作成することを特徴とする請求項１に記載の方法。
【請求項１４】
前記命令の前記実行はカーネルモードで実行されることを特徴とする請求項１に記載の方法。
【請求項１５】
命令は、オペレーションコード、パラメータおよび枝分かれフィールドを含むことを特徴とする請求項１に記載の方法。
【請求項１６】
前記枝分かれフィールドは、前記命令の条件が真であると評価するときに次の命令を指定する真の枝分かれフィールド、および、前記命令の前記条件が偽であると評価するときに次の命令を指定する偽の枝分かれフィールドを含むことを特徴とする請求項１５に記載の方法。
【請求項１７】
前記セキュリティ実施はブロックするための挙動を指定することを特徴とする請求項１に記載の方法。
【請求項１８】
アプリケーションがシステムコールをセキュリティポリシーに違反するパラメータと共に出しているときを検出するためのセキュリティ仮想マシンであって、
前記セキュリティポリシーを実装する命令を含む命令ストアと、
前記セキュリティポリシーのデータを含むデータストアと、
システムコールのパラメータを含むパラメータストアと、
前記命令ストアの前記命令を、前記データストアのデータおよび前記パラメータストアのパラメータを使用して実行して、前記システムコールが前記セキュリティポリシーに違反するかどうかを判断するプロセッサエンジンと
を備えることを特徴とするセキュリティ仮想マシン。
【請求項１９】
前記セキュリティポリシーを実装する前記命令は、高水準言語における前記セキュリティポリシーの表現からコンパイルされることを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２０】
前記高水準言語はＸＭＬベースのフォーマットにおけるものであることを特徴とする請求項１９に記載のセキュリティ仮想マシン。
【請求項２１】
前記高水準言語は、条件、および、前記条件が満たされるときに実行するためのアクションに関して、指定されるルールを有することを特徴とする請求項１９に記載のセキュリティ仮想マシン。
【請求項２２】
前記セキュリティ仮想マシンはカーネルモードで実行することを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２３】
システムコールインターセプトコンポーネントは、インターセプトされたシステムコールのパラメータを前記パラメータストア内に格納することを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２４】
プログラムロードコンポーネントは命令を前記命令ストアにロードすることを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２５】
前記命令セットは縮小命令セットであることを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２６】
前記命令を実行するときに使用されるプロセスコントロール情報を格納するための、プロセスコントロール情報ストアを含むことを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２７】
前記データストアは、リテラルデータ構造および動的データ構造を含むことを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２８】
命令は前記データストアへの参照を含むことを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項２９】
各命令は、実行するための次の命令の場所を識別することを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項３０】
前記セキュリティ仮想マシンは、ブール、整数、文字列およびローバイナリデータ型をサポートすることを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項３１】
前記仮想マシンは正規表現パターンマッチング比較をサポートすることを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項３２】
前記命令の前記実行は、前記セキュリティポリシーの実施を処理する方法を指定する出力アクションセットを作成することを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項３３】
命令は、オペレーションコード、パラメータおよび枝分かれフィールドを含むことを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項３４】
前記枝分かれフィールドは、前記命令の条件が真であると評価するときに次の命令を指定する真の枝分かれフィールド、および、前記命令の前記条件が偽であると評価するときに次の命令を指定する偽の枝分かれフィールドを含むことを特徴とする請求項１８に記載のセキュリティ仮想マシン。
【請求項３５】
セキュリティポリシーを実施するための命令を含むコンピュータ可読媒体であって、前記命令はセキュリティ仮想マシンによる実行のためのものであり、前記セキュリティポリシーの高水準言語表現からコンパイルされることを特徴とするコンピュータ可読媒体。
【請求項３６】
前記セキュリティポリシーを実施するために使用されたデータのためのデータストアをさらに含むことを特徴とする請求項３５に記載のコンピュータ可読媒体。
【請求項３７】
前記データストアはリテラルデータおよび動的データを含むことを特徴とする請求項３５に記載のコンピュータ可読媒体。
【請求項３８】
前記命令は再配置可能セキュリティサブプログラムを形成することを特徴とする請求項３５に記載のコンピュータ可読媒体。
【請求項３９】
各命令は、実行するための次の命令を識別することを特徴とする請求項３５に記載のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般に、セキュリティポリシーを実施して、コンピュータプログラムによる望ましくない挙動をブロックすることに関する。
【背景技術】
【０００２】
オペレーティングシステムおよびファイルシステムなど、ソフトウェアシステムは、アプリケーションプログラミングインターフェイスを提供し、これを通じてアプリケーションプログラムはソフトウェアシステムのサービスにアクセスすることができる。アプリケーションプログラムインターフェイスは、指定されたサービスを実行するためのパラメータと共にファンクションを提供することができる。例えば、ファイルシステムは、ファイルを作成するためのファンクション（「システムコール」とも呼ばれる）を有することができる。そのファンクションは、作成されるファイルの、ファイルの場所、ファイル名、ファイルタイプ、ファイルサイズなどを指定するパラメータを有することができる。アプリケーションプログラムは、ファンクションを呼び出すとき、ファンクションのために定義された形式的なパラメータに対応する実際のパラメータを渡す。ファンクションは、実際のパラメータにおいてあるチェックを実行して、それらのパラメータが有効であることを保証することができる。例えば、ファイル作成ファンクションは、指定されたファイルタイプが有効であることを保証することができる。パラメータが有効ではない場合、ファンクションはエラーをアプリケーションプログラムに戻す。
【０００３】
ソフトウェアシステムは、様々な理由のために極めて複雑になる場合がある。ソフトウェアシステムは、そのソフトウェアシステムのすべての以前のバージョンとの後方互換性（ｂａｃｋｗａｒｄ  ｃｏｍｐａｔｉｂｌｅ）を有するようにしようとする場合がある。このような場合、ソフトウェアシステムは、以前のバージョンのアプリケーションプログラムインターフェイスのすべてのファンクションをサポートする必要がある場合がある。新しいファンクションは通常各バージョンに追加されるので、ファンクションの数は大変多くなる場合があり、ファンクションの対話は複雑になる可能性がある。いくつかのソフトウェアシステムにはまた、同じ会社の異なる部門によって、あるいは異なる会社によって開発されたソフトウェアコンポーネントが含まれることもある。これらのコンポーネントの対話もまた非常に複雑になる可能性がある。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ソフトウェアシステムにとって、それらのアプリケーションプログラミングインターフェイスが不注意による誤用または故意による攻撃のいずれに対しても脆弱でないことを保証することは、ますます重要になってきている。ソフトウェアシステムの１つの脆弱性は、そのアプリケーションプログラミングインターフェイスのパラメータを通じたものである場合がある。以前のバージョンのファンクションがより新しいバージョンのファンクションと結合されるとき、また、異なる開発者からのコンポーネントが統合されるとき、ファンクションによって実行された既存のパラメータの妥当性検査は、ファンクションの正しい挙動を保証するために十分でない場合がある。例えば、ある会社によって開発されたファイルシステムのアプリケーションプログラミングインターフェイスが、別の会社によって開発されたファイルサーバーと統合される場合がある。アプリケーションプログラミングインターフェイスの最大ファイルサイズパラメータは、ファイルサーバーによってサポートされたサイズより大きい場合がある。このような場合、アプリケーションプログラミングインターフェイスに適用可能であるファイルサイズは、ファイルサーバーに問題を引き起こす可能性がある。もう１つの例として、システム管理者は、最大ファイルサイズをさらにより制限することを望む場合があるが、システム管理者は、その制限を実施するために使用可能な手段を有していない可能性がある。
【０００５】
セキュリティポリシー、および特に、アプリケーションプログラムインターフェイスのパラメータのための有効な条件を指定するセキュリティポリシーを実施するためのメカニズムを有することが望ましいであろう。
【課題を解決するための手段】
【０００６】
セキュリティポリシーを実施するための方法およびシステムを、セキュリティ仮想マシン（ｓｅｃｕｒｉｔｙ  ｖｉｒｔｕａｌ  ｍａｃｈｉｎｅ）によって提供する。セキュリティ仮想マシンは、プロセッサエンジン、命令ストア、データストアおよび命令ポインタを含む。セキュリティ仮想エンジンは、セキュリティポリシーの高水準言語表現からコンパイルされる中間言語を使用して指定されたセキュリティプログラムを実行する。セキュリティプログラムは命令ストアに、実行のためにロードされる。アプリケーションプログラミングインターフェイスのファンクションの呼び出しなど、セキュリティ実施イベントが発生するとき、セキュリティ実施イベントからのデータはデータストアに格納され、プロセッサエンジンは、命令ストアからのセキュリティプログラムのための命令のフェッチおよび実行を開始する。命令は、セキュリティポリシーを実施するために取られるアクションを、セキュリティ実施イベントのデータに基づいて指定する。
【発明を実施するための最良の形態】
【０００７】
セキュリティ仮想マシンの命令セット内でエンコードされたセキュリティポリシーを実施するためのコンピュータシステムにおける方法およびシステムを提供する。一実施形態では、セキュリティシステムは、セキュリティ仮想マシンの命令セット（すなわち、中間言語）内で表現されたセキュリティプログラムを実行するセキュリティ仮想マシンを提供する。セキュリティシステムは、高水準言語で表現されたセキュリティポリシーを受信し、セキュリティ仮想マシンの中間言語におけるセキュリティポリシーの表現であるセキュリティプログラムを生成する、コンパイラを含むことができる。セキュリティシステムは、セキュリティプログラムをセキュリティ仮想マシンの命令ストアに格納する。セキュリティ実施イベントが発生するとき（すなわち、それがセキュリティポリシーと共にコンパイルすることを保証するためにチェックされる必要があるアクション）、セキュリティ仮想マシンは、セキュリティ実施イベントからのデータを使用してその命令ストアからのセキュリティプログラムのための命令を実行して、セキュリティポリシーを実施する。セキュリティ実施イベントが、ある試行が望ましくない挙動（例えば、オペレーティングシステムの脆弱性を悪用する可能性のあるアクション）を実行するために行われていることを示す場合、セキュリティプログラムはその試行をブロックすることができる。一実施形態では、セキュリティシステムのセキュリティ仮想マシンはオペレーティングシステムのカーネルモードで実行して、アプリケーションおよび外部システムによる、その上でセキュリティシステムが実行中であるコンピュータシステムにとって望ましくない挙動を実行するための試行を、識別および防止する。
【０００８】
一実施形態では、セキュリティシステムは、アプリケーションによってシステムサービス（例えば、ファイルシステムおよびメモリ管理システム）に発行されたシステムコールのパラメータが望ましくない挙動につながる可能性のあるときを識別する。セキュリティポリシーは、システムコールのパラメータに基づく条件、および、条件が満たされるときに取るためのアクションをそれぞれ指定するルールを含む。例えば、あるルールの条件は、ファイル作成システムコールが、１ＧＢより大きいファイルサイズを指定するパラメータと共に発行されるとき、満たされる場合がある。そのルールに関連付けられたアクションを、ファイルの作成をブロックするようにすることができる。高水準言語をＸＭＬベースの言語にすることができ、各ルールをルール、条件およびアクションタグによって識別することができる。高水準言語で表現されたセキュリティポリシーのルールがコンパイルされるとき、各ルールを中間言語の命令に変換して、セキュリティプログラムが形成される。例えば、ルールを一連の命令に変換することができる。システムコールを、ファンクションが「ファイル作成」であることを示す値と比較するもの、ファイルサイズパラメータを、１ＧＢの値を有する定数と比較するもの、および、システムコールをブロックするための指示を出力するものである。
【０００９】
一実施形態では、セキュリティ仮想マシンは、プロセッサエンジン、命令ストア、命令ポインタおよびデータストアを含む。セキュリティ仮想マシンを初期化してセキュリティポリシーを実施するとき、セキュリティシステムは命令ストアに、セキュリティポリシーを実施するセキュリティプログラムをロードする。セキュリティシステムはまた、セキュリティプログラムのデータをデータストアにロードする。システムコールが受信されるとき、セキュリティシステムはシステムコールのパラメータ（システムコールを識別する値を含む）をデータストアに格納する。セキュリティシステムはまた、システムコールを発行したプロセスのプロセスコントロール情報をデータストアに格納することもできる。セキュリティシステムは、セキュリティプログラムの開始命令をポイントするように、命令ポインタを初期化する。プロセッサエンジンはセキュリティプログラムを、命令ポインタによってポイントされた開始命令をフェッチおよび実行することによって開始する。実行される各命令は、実行されるべき次の命令をポイントするように、命令ポインタを修正する。命令はデータストアのデータを参照して、セキュリティポリシーを実施する。セキュリティプログラムの実行は、セキュリティポリシーを実施するために取られるべきであるアクション（例えば、システムコールのブロック）を指定する出力アクションセットを生成する。
【００１０】
一実施形態では、セキュリティポリシーは、そのパラメータがチェックされるべきである各システムコールのためのサブポリシーを備えることができる。セキュリティシステムは各サブポリシーを別々のセキュリティサブプログラムにコンパイルすることができ、これらの別々のセキュリティサブプログラムを他のセキュリティサブプログラムとは無関係に命令ストアにロードすることができる。各サブポリシーは単一のシステムコールのためのセキュリティ実施に対応する可能性がある。セキュリティシステムは、命令ストア内の開始命令ポインタへ、および、対応するセキュリティサブプログラムのデータストア内のデータへの開始データポインタへの、各システムコールのマッピングを維持することができる。システムコールにおいてセキュリティポリシーを実施するとき、セキュリティシステムは、命令ポインタを対応する開始命令ポインタに、データポインタを対応する開始データポインタに初期化する。セキュリティサブプログラムは、命令ポインタおよびデータポインタに関連する命令およびデータ参照技術を使用することができる。このようにして、各セキュリティサブプログラムの命令およびデータは再配置可能である。以下の説明では、単一のセキュリティプログラムは、各システムコールをデコードし、そのシステムコールを処理するために適切な命令場所にジャンプすることによって、すべてのシステムコールを処理する。この説明するシステムを各システムコールのためのサブプログラムをサポートするように適合させることができることは、当業者には理解されよう。
【００１１】
図１は、一実施形態のセキュリティシステムのコンポーネントを例示するブロック図である。セキュリティシステムには、ユーザーモード１００で実行するいくつかのコンポーネント、および、カーネルモード１２０で実行する他のコンポーネントが含まれる。ポリシーコンパイラ１０２はユーザーモードで実行して、ポリシーストア１０３のセキュリティポリシーを、セキュリティ仮想マシンによって実行可能であるセキュリティプログラムにコンパイルする、コンポーネントである。カーネルモードコンポーネントには、システムコールインターセプトコンポーネント１２１、プログラムロードコンポーネント１２２、およびセキュリティ仮想マシン１２５が含まれる。セキュリティ仮想マシンには、命令ポインタ１２６、プロセッサエンジン１２７、命令ストア１２８およびデータストア１２９が含まれる。プログラムロードコンポーネントは、ポリシーコンパイラによってコンパイルされたセキュリティプログラムを、セキュリティ仮想マシンの命令ストアにロードし、プログラムデータをデータストアに格納し、開始命令ポインタを設定する。システムコールインターセプトコンポーネントは、アプリケーションプログラム１０１によって発行されたシステムコールをインターセプトし、各システムコールのパラメータ、および、アプリケーションプログラムのプロセスコントロール情報をデータストアに格納する。システムコールをインターセプトし、そのパラメータを格納した後、システムコールインターセプトコンポーネントはプロセッサエンジンに、命令ストアのセキュリティプログラムを実行するように命令する。プロセッサエンジンはセキュリティプログラムを、命令ポインタによってポイントされた命令をフェッチすること、および、命令によって指定されたオペレーションを実行することによって、実行する。オペレーションには、セキュリティポリシーを実施するために取られるべきアクションをデータストアの出力アクションセットに格納することが含まれる。セキュリティプログラムの実行が完了した上で、システムコールインターセプトコンポーネントは、出力アクションセットのアクションを実行する。
【００１２】
セキュリティシステムが実装されるコンピューティングデバイスには、中央処理装置、メモリ、入力デバイス（例えば、キーボードおよびポインティングデバイス）、出力デバイス（例えば、表示デバイス）、およびストレージデバイス（例えば、ディスクドライブ）を含めることができる。メモリおよびストレージデバイスは、セキュリティシステムを実装する命令を含むことができるコンピュータ可読媒体である。加えて、データ構造およびメッセージ構造を、通信リンク上の信号など、データ送信媒体を介して格納または送信することができる。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、またはポイントツーポイントのダイアルアップ接続など、様々な通信リンクを使用することができる。
【００１３】
図１は、セキュリティシステムを実装することができる適切なオペレーティング環境の一実施例を例示する。このオペレーティング環境は、適切なオペレーティング環境の一実施例でしかなく、セキュリティシステムの使用または機能性の範囲についてのいかなる限定をも示唆するように意図されない。使用のために適切である可能性のある他の周知のコンピューティングシステム、環境および構成には、パーソナルコンピュータ、サーバーコンピュータ、ハンドヘルドまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースシステム、プログラマブルコンシューマエレクトロニクス、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれる。
【００１４】
セキュリティシステムを一般に、プログラムモジュールなど、１つまたは複数のコンピュータまたは他のデバイスによって実行されるコンピュータ実行可能命令に関連して説明することができる。一般に、プログラムモジュールには、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれ、これらは特定のタスクを実行するか、あるいは特定の抽象データ型を実装する。通常、プログラムモジュールの機能性を、様々な実施形態において望まれるように結合または分散させることができる。
【００１５】
図２は、一実施形態のデータストアのデータ構造を例示するブロック図である。データストアは、リテラルデータ構造２０１、動的データ構造２１１、システムコールパラメータデータ構造２２１、プロセスコントロールブロックデータ構造２３１、およびアクション出力セット２４１を含む。リテラルデータ構造は、リテラルデータテーブル２０２およびリテラルデータストア２０３を含む。リテラルデータテーブルは、リテラルデータストア内に格納されたリテラルデータを参照する固定サイズのエントリを含む。「リテラルデータ」は、現在ロードされているセキュリティポリシーの存続の間に一定であるセキュリティプログラムのデータを指す。リテラルデータは、新しいセキュリティポリシーをロードすることによってのみ変更することができる。動的データ構造は、リテラルデータ構造と類似の編成を有するが、「リテラルデータ」ではなく「動的」データを格納する。「動的データ」は、新しいセキュリティポリシーをロードすることなく修正することができる、セキュリティプログラムのデータを指す。例えば、動的データには、セキュリティポリシーを免除されるアプリケーションの名前が含まれる場合がある。リテラルおよび動的データテーブルの各エントリは、対応するデータストア内のデータをポイントする。リテラルおよび動的データストアのデータは、自己記述型フォーマットで表現される。そのフォーマットには、データ型およびデータサイズ情報が含まれる。一実施形態では、セキュリティ仮想マシンは、ブール、整数、文字列およびローバイナリ（「ブロブ」とも呼ばれる）のデータ型を、整数、文字列およびブロブのアレイに加えてサポートする。命令はリテラルおよび動的データを、リテラルおよび動的テーブルへのインデックスを使用して参照する。命令を実行するとき、セキュリティ仮想マシンは、リテラルおよび動的テーブルへのインデックスを、インデックス付きエントリを検索すること、およびその値を、リテラルまたは動的データストア内のデータ項目の開始へのポインタとして使用することによって、間接参照（ｄｅｒｅｆｅｒｅｎｃｅ）する。データは自己記述型であるので、データの型およびサイズを決定することができる。システムコールパラメータデータ構造には、文字列テーブル２２２、整数テーブル２２３、およびローバイナリテーブル２２４が含まれる。システムコールのパラメータは、それらのデータ型に従ってこれらのテーブル内に格納される。プロセスコントロールブロックデータ構造は、セキュリティ仮想マシンにとって使用可能であるプロセスコントロール情報の各部分のためのエントリを含むテーブルである。一実施形態では、プロセスコントロール情報には、アプリケーション識別子およびスレッド識別子が含まれる。アクション出力セットを、セキュリティプログラムの実行中に生成され、システムコールにおいてセキュリティポリシーを実施するために実行されるべきアクションを指示する、アクションフラグのセットにすることができる。アクションには、システムコールをブロックすること、およびユーザーに通知することが含まれる可能性がある。
【００１６】
図３は、一実施形態のセキュリティ仮想マシンの命令のレイアウトを例示する図である。各命令は、オペレーションフィールド３１０、パラメータ１フィールド３２０、真の枝分かれフィールド３３０、偽の枝分かれフィールド３４０、およびパラメータ２フィールド３５０を含む。パラメータ１フィールドは、システムコールに関連付けられたデータ（すなわち、システムコールデータ構造内またはプロセスコントロールデータ構造内に格納されたもの）、および、セキュリティプログラムに関連付けられたパラメータ２フィールド参照データ（すなわち、リテラルまたは動的データ構造内に格納された即時データまたはデータ）を参照する。オペレーションフィールドは、パラメータ２記述子３１１（「ｍ」）およびオペレーションコード３１２を含む。パラメータ２記述子は、パラメータ２を解釈する方法を指定する。パラメータ２（ｐ２とも呼ぶ）は、即時データ、動的データへの参照、またはリテラルデータへの参照を含むことができる。参照が指定されるとき、セキュリティ仮想マシンは、命令のオペレーションを実行する前にパラメータ２を間接参照する。オペレーションコードは以下でより詳細に定義するように、命令のオペレーションを識別する。パラメータ１フィールドは、パラメータ１記述子３２１（「ｓ」）およびインデックス３２２を含む。パラメータ１記述子は、パラメータ１がシステムコールパラメータを参照するか、プロセスコントロール情報を参照するかを指示する。パラメータ１記述子がシステムコールパラメータを指示する場合、インデックスの高位のビットは、システムコールパラメータデータ構造の文字列テーブルがインデックス付けされるべきであるか、整数テーブルがインデックス付けされるべきであるか、ローバイナリテーブルがインデックス付けされるべきであるかを指定し、下位のビットはテーブルのインデックス付きエントリを指示する。パラメータ１記述子がプロセスコントロール情報を指示する場合、インデックスは特定のプロセスコントロール情報を指示する。真の枝分かれフィールドおよび偽の枝分かれフィールドは、この命令の条件コードが真であると評価するか偽であると評価するかに応じて、実行するための次の命令を指定するオフセットを含む。オフセットは、実行されるべき次の命令をポイントするために、現在の命令ポインタに追加される。
【００１７】
表１および２は、一実施形態のセキュリティ仮想マシンの命令を例示する。命令を、データにおいてテストを実行するもの、および、テストを行わないものとして分類することができる。表１は非テスト命令を例示する。
【００１８】
【表１】
2005316964.tif 000003
【００１９】
表２はテスト命令を例示する。パターン命令は２つの文字列を比較するための正規表現を定義することができ、正規表現は、ファイル名のワイルドカード型の比較（例えば、「＊．ＤＡＴ」）に対して有用である。
【００２０】
【表２】
2005316964.tif 000004
【００２１】
図４は、一実施形態のプログラムロードコンポーネントの処理を例示する流れ図である。コンポーネントは、セキュリティプログラムがセキュリティ仮想マシンにロードされるべきであるとき、呼び出される。セキュリティプログラムは、仮想命令、リテラルデータブロック、および動的データブロックを含む。リテラルデータブロックは、リテラルデータテーブルの情報と、その後に続くリテラルデータストアの情報を含む。コンポーネントはリテラルデータブロックを、開始場所で開始してリテラルストアにコピーする。次いで、コンポーネントは、その基本場所をリテラルデータテーブル内の各オフセットに追加して、オフセットをポインタに変換する。コンポーネントは動的データブロックを、類似の方法で処理する。仮想命令は、リテラルストアおよび動的ストアの開始に対する複数のオフセットを含む。ブロック４０１で、コンポーネントはリテラルストア内の開始場所を識別し、その開始場所で開始して、セキュリティプログラムのリテラルデータブロックをコピーする。ブロック４０２で、コンポーネントは開始場所をリテラルデータテーブルの各オフセットに追加して、セキュリティプログラムのオフセットをポインタに変換する。ブロック４０３で、コンポーネントは動的ストア内の開始場所を識別し、その開始場所で開始して、セキュリティプログラムの動的データブロックをコピーする。ブロック４０４で、コンポーネントは開始場所を動的データテーブルの各オフセットに追加して、セキュリティプログラムのオフセットをポインタに変換する。ブロック４０５で、コンポーネントはセキュリティプログラムの仮想命令を命令ストアにコピーし、次いでコンパイルする。
【００２２】
図５は、一実施形態のシステムコールインターセプトコンポーネントの処理を例示する流れ図である。コンポーネントは、システムコールがインターセプトされるときに呼び出される。コンポーネントはシステムコールパラメータデータ構造およびプロセスコントロールデータ構造を初期化し、次いでセキュリティ仮想マシンを開始する。コンポーネントはまた、命令の命令ポインタを提供して、実行を開始して、システムコールを処理することもできる。セキュリティサブプログラムが使用されるとき、コンポーネントは開始命令ポインタへの、および開始データポインタへのシステムコールの、そのシステムコールのためのリテラルおよび動的データ構造へのマッピングを有することができる。プログラムロードコンポーネントを複数回コールして、異なるシステムコールを処理するために、セキュリティプログラムの異なるサブプログラムをロードすることができる。命令およびデータはオフセットベースであるので、命令およびデータを、命令ストアおよびデータ構造の次に使用可能な場所に格納することができる。ブロック５０１で、コンポーネントは、現在の命令ポインタ（ｉｐとも呼ぶ）をセキュリティプログラムの開始命令ポインタに設定し、アクション出力セットを初期状態（例えば、空）にリセットする。ブロック５０２〜５０４で、コンポーネントは、システムコールのパラメータをシステムコールパラメータデータ構造に格納しながらループする。ブロック５０２で、コンポーネントはシステムコールの次のパラメータを選択する。判断ブロック５０３で、システムコールのすべてのパラメータがすでに選択されている場合、コンポーネントはブロック５０５に続き、そうでなければコンポーネントはブロック５０４に続く。ブロック５０４で、コンポーネントは、選択されたパラメータをシステムコールパラメータデータ構造の適切なテーブル内に格納し、次いでブロック５０２にループして、システムコールの次のパラメータを選択する。ブロック５０５〜５０７で、コンポーネントは、文字列プロセスコントロール情報をプロセスコントロールデータ構造に格納しながらループする。ブロック５０５で、コンポーネントは、システムコールを出したプロセスについての次のプロセスコントロール情報を選択する。判断ブロック５０６で、すべてのプロセスコントロール情報がすでに選択されている場合、コンポーネントはブロック５０８に続き、そうでなければコンポーネントはブロック５０７に続く。ブロック５０７で、コンポーネントは、選択されたプロセスコントロール（ｐｃとも呼ぶ）情報をプロセスコントロールデータ構造内に格納し、次いでブロック５０５にループして、次のプロセスコントロール情報を選択する。代替として、内部プロセスコントロールデータ構造を使用および初期化するのではなく、セキュリティシステムはプロセスコントロール情報を、必要とされるときにプロセスコントロールブロックから直接検索することができる。プロセスコントロールブロックは、プロセスが作成されるとき、オペレーティングシステムによって作成されることは、当業者には理解されよう。ブロック５０８で、コンポーネントはセキュリティ仮想マシン（ｖｍとも呼ぶ）を起動して、セキュリティポリシーを、インターセプトされたシステムコール上で実施する。セキュリティ仮想マシンによるセキュリティプログラムの実行が完了した上で、コンポーネントはアクション出力セットのアクションを実行する。
【００２３】
図６は、一実施形態のセキュリティ仮想マシンのプロセッサエンジンの処理を例示する流れ図である。プロセッサエンジンはシステムコールパラメータデータ構造を、インターセプトされたシステムコールに基づいて初期化し、セキュリティ仮想マシンを起動し、出力アクションセットのアクションを実行する。ブロック６０１〜６０７で、プロセッサエンジンは、命令ストア内に格納されたセキュリティプログラムの命令をロードおよび実行しながら、停止命令が実行されるまでループする。一実施形態では、セキュリティポリシーは、ルールの条件が満たされるときは常に他のルールはテストされないことを定義することができる。ブロック６０１で、プロセッサエンジンは、現在の命令ポインタによってポイントされた命令をフェッチする。ブロック６０２で、プロセッサエンジンはコンポーネントを呼び出して、パラメータ１およびパラメータ２を間接参照する。判断ブロック６０３で、命令のオペレーションコードがテストオペレーションである場合、プロセッサエンジンはブロック６０４に続く。命令のオペレーションコードが非テストオペレーションである場合（停止オペレーションを除く）、プロセッサエンジンはブロック６０８に続く。命令のオペレーションコードが停止オペレーションである場合、プロセッサエンジンはブロック６０９に続く。ブロック６０４で、プロセッサエンジンは評価テストコンポーネントを呼び出して、テストオペレーションが真であると評価するか、偽であると評価するかを判断する。呼び出されたコンポーネントは、条件コードフラグを真または偽にセットする。判断ブロック６０５で、条件コードが真である場合、プロセッサエンジンはブロック６０７に続き、そうでなければプロセッサエンジンはブロック６０６に続く。ブロック６０６で、プロセッサエンジンは偽の枝分かれフィールドのオフセットを現在の命令ポインタに追加し、次いでブロック６０１にループして、次の命令をフェッチする。ブロック６０７で、プロセッサエンジンは真の枝分かれフィールドのオフセットを現在の命令ポインタに追加し、次いでブロック６０１にループして、次の命令をフェッチする。ブロック６０８で、プロセッサエンジンは非テスト実行コンポーネントを呼び出し、次いでブロック６０１にループして、次の命令をフェッチする。非テスト実行コンポーネントは命令のオペレーションを実行し、現在の命令ポインタを、実行されるべき次の命令をポイントするようにセットする。非テスト実行コンポーネントは命令の真の枝分かれのオフセット（または、ジャンプ命令の場合、パラメータ２）を命令ポインタに追加する。ブロック６０９で、コンポーネントは停止命令を実行し、次いで完了する。
【００２４】
図７は、一実施形態のセキュリティ仮想マシンの間接参照コンポーネントの処理を例示する流れ図である。このコンポーネントは、フェッチされた命令のパラメータ１およびパラメータ２を間接参照する。ブロック７０１〜７０８で、コンポーネントはパラメータ１を間接参照する。判断ブロック７０１で、パラメータ１が、パラメータ１記述子によって指示されたシステムコールパラメータである場合、コンポーネントはブロック７０３に続き、そうでなければコンポーネントはブロック７０２に続く。ブロック７０２で、コンポーネントは、間接参照されたパラメータ１を、パラメータ１のインデックスによって指定されたプロセスコントロール情報にセットし、次いでブロック７０９に続く。判断ブロック７０３で、パラメータ１のインデックスが、システムコールパラメータが整数であることを指示する場合、コンポーネントはブロック７０４に続き、そうでなければコンポーネントはブロック７０５に続く。ブロック７０４で、コンポーネントは間接参照されたパラメータ１を、インデックスによって指定された整数にセットし、ブロック７０９に続く。判断ブロック７０５で、パラメータ１のインデックスが、システムコールパラメータが文字列であることを指示する場合、コンポーネントはブロック７０６に続き、そうでなければコンポーネントはブロック７０７に続く。ブロック７０６で、コンポーネントは間接参照されたパラメータ１を、インデックスによって指定された文字列にセットし、ブロック７０９に続く。判断ブロック７０７で、パラメータ１のインデックスが、システムコールパラメータがローバイナリであることを指示する場合、コンポーネントはブロック７０８に続き、そうでなければエラーが発生している。ブロック７０８で、コンポーネントは間接参照されたパラメータ１を、インデックスによって指定されたローバイナリにセットし、ブロック７０９に続く。ブロック７０９〜７１４で、コンポーネントはパラメータ２を間接参照する。判断ブロック７０９で、パラメータ２記述子が即時データを指示する場合、コンポーネントはブロック７１０に続き、そうでなければコンポーネントはブロック７１１に続く。ブロック７１０で、コンポーネントは間接参照されたパラメータ２を、フェッチされた命令内のパラメータ２の値にセットし、次いで戻る。判断ブロック７１１で、パラメータ２記述子がリテラルデータを指示する場合、コンポーネントはブロック７１２に続き、そうでなければコンポーネントはブロック７１３に続く。ブロック７１２で、コンポーネントは間接参照されたパラメータ２を、フェッチされた命令内のパラメータ２によって指定されたリテラルデータにセットし、次いで戻る。判断ブロック７１３で、パラメータ２記述子が動的データを指示する場合、コンポーネントはブロック７１４に続き、そうでなければエラーが発生している。ブロック７１４で、コンポーネントは間接参照されたパラメータ２を、フェッチされた命令内のパラメータ２によって指定された動的データにセットし、次いで戻る。
【００２５】
図８は、一実施形態のセキュリティ仮想マシンの評価テストコンポーネントの処理を例示する流れ図である。コンポーネントはロードされた命令のオペレーションコードをデコードし、そのオペレーションコードのテストを実施するためにコンポーネントを呼び出す。呼び出されたコンポーネントは条件コードを真または偽にセットする。判断ブロック８０１〜８０３で、コンポーネントは、ロードされた命令のオペレーションコードをデコードする。ブロック８０４〜８０６で、コンポーネントは、デコードされたオペレーションコードを実装するためのコンポーネントを呼び出し、次いで戻る。
【００２６】
図９は、一実施形態のセキュリティ仮想マシンのテストコンポーネントの処理を例示する流れ図である。テストコンポーネントは、テストオペレーションコードを実装する。ブロック９０１で、コンポーネントは条件コードを、間接参照されたパラメータ２の値にセットし、次いで戻る。
【００２７】
図１０は、一実施形態のセキュリティ仮想マシンの文字列マッチコンポーネントの処理を例示する流れ図である。コンポーネントは、間接参照されたパラメータ１が間接参照されたパラメータ２とマッチするかどうかを判断する。一実施形態では、セキュリティ仮想マシンはパターンマッチングを使用することができる。例えば、パラメータは「ワイルドカード」指定またはより一般には正規表現を含むことができる。判断ブロック１００１で、パラメータ１およびパラメータ２の長さがマッチする場合、コンポーネントはブロック１００３に続き、そうでなければこれらの間接参照されたパラメータはマッチすることができず、コンポーネントはブロック１００２に続く。ブロック１００２で、コンポーネントは条件コードを偽にセットし、次いで戻る。ブロック１００３〜１００６で、コンポーネントは、これらの間接参照されたパラメータの文字列の各文字をチェックしながらループする。ブロック１００３で、コンポーネントは各文字列の次の文字を選択する。判断ブロック１００４で、文字列のすべての文字がすでに選択されている場合、コンポーネントはブロック１００８に続き、そうでなければコンポーネントはブロック１００５に続く。ブロック１００５で、コンポーネントは選択された文字を正規化する。例えば、コンポーネントは各文字を小文字にして、ケースインセンシティブ比較（ｃａｓｅ  ｉｎｓｅｎｓｉｔｉｖｅ  ｃｏｍｐａｒｉｓｏｎ）を実施することができる。判断ブロック１００６で、選択された文字がマッチする場合、コンポーネントはブロック１００３にループして、文字列の次の文字を選択し、そうでなければコンポーネントはブロック１００７に続く。ブロック１００７で、コンポーネントは条件コード（ｃｃとも呼ぶ）を偽にセットし、次いで戻る。ブロック１００８で、文字列のすべての文字はマッチし、コンポーネントは条件コードを真にセットし、次いで戻る。
【００２８】
図１１は、一実施形態のセキュリティ仮想マシンの非テストコンポーネントの処理を例示する流れ図である。コンポーネントは、フェッチされた命令の非テストオペレーションコードのオペレーションを実行し、これには、現在の命令ポインタを、実行するための次の命令をポイントするようにセットすることが含まれる。判断ブロック１１０１で、オペレーションコードがアクションオペレーションである場合、コンポーネントはブロック１１０２に続き、そうでなければコンポーネントはブロック１１０３に続く。ブロック１１０２で、コンポーネントはフェッチされた命令のパラメータ２をアクション出力セットに追加し、次いでブロック１１０７に続く。判断ブロック１１０３で、オペレーションコードがリセットオペレーションである場合、コンポーネントはブロック１１０４に続き、そうでなければコンポーネントはブロック１１０５に続く。ブロック１１０４で、コンポーネントはアクション出力セットをクリアし、次いでブロック１１０７に続く。判断ブロック１１０５で、オペレーションコードがジャンプオペレーションである場合、コンポーネントは１１０６に続き、そうでなければコンポーネントはさらなるオペレーションコードをデコードし続ける。ブロック１１０６で、コンポーネントはパラメータ２を現在の命令ポインタに追加し、次いで戻る。ブロック１１０７で、コンポーネントは真の枝分かれフィールド（ｔｂとも呼ぶ）の値を現在の命令ポインタに追加し、次いで戻る。
【００２９】
セキュリティシステムの特定の実施形態を本明細書で例示のために説明したが、様々な修正を、本発明の精神および範囲から逸脱することなく行うことができることは、当業者には理解されよう。セキュリティ仮想マシンを使用するセキュリティシステムを使用して、幅広い種類のセキュリティポリシーを実施することができることは、当業者には理解されよう。例えば、セキュリティシステムを使用して、ネットワークを介して受信されたメッセージ、トランザクションプロセッサによって受信されたトランザクション、および、より一般には、アプリケーションプログラミングインターフェイスを提供するいかなるアプリケーションものセキュリティを実施することができる。したがって、本発明は、添付の特許請求の範囲による以外には限定されない。
【図面の簡単な説明】
【００３０】
【図１】一実施形態のセキュリティシステムのコンポーネントを例示するブロック図である。
【図２】一実施形態のデータストアのデータ構造を例示するブロック図である。
【図３】一実施形態のセキュリティ仮想マシンの命令のレイアウトを例示する図である。
【図４】一実施形態のプログラムロードコンポーネントの処理を例示する流れ図である。
【図５】一実施形態のシステムコールインターセプトコンポーネントの処理を例示する流れ図である。
【図６】一実施形態のセキュリティ仮想マシンのプロセッサエンジンの処理を例示する流れ図である。
【図７】一実施形態のセキュリティ仮想マシンの間接参照コンポーネントの処理を例示する流れ図である。
【図８】一実施形態のセキュリティ仮想マシンの評価テストコンポーネントの処理を例示する流れ図である。
【図９】一実施形態のセキュリティ仮想マシンのテストコンポーネントの処理を例示する流れ図である。
【図１０】一実施形態のセキュリティ仮想マシンの文字列マッチコンポーネントの処理を例示する流れ図である。
【図１１】一実施形態のセキュリティ仮想マシンの非テストコンポーネントの処理を例示する流れ図である。
【符号の説明】
【００３１】
１００  ユーザーモード
１０１  アプリケーション
１０２  ポリシーコンパイラ
１０３  ポリシーストア
１１０  セキュリティシステム
１２０  カーネルモード
１２１  システムコールインターセプト
１２２  プログラムロード
１２７  プロセッサエンジン
１２８  命令ストア
１２９  データストア
２０２  リテラルデータテーブル
２０３  リテラルデータストア
２１１  動的データテーブル
２２１  システムコールパラメータ
２２２  文字列テーブル
２２３  整数テーブル
２２４  ローバイナリテーブル
２３１  プロセスコントロールブロックテーブル
２４１  アクション出力セット
【図１】
2005316964.tif 000005
【図２】
2005316964.tif 000006
【図３】
2005316964.tif 000007
【図４】
2005316964.tif 000008
【図５】
2005316964.tif 000009
【図６】
2005316964.tif 000010
【図７】
2005316964.tif 000011
【図８】
2005316964.tif 000012
【図９】
2005316964.tif 000013
【図１０】
2005316964.tif 000014
【図１１】
2005316964.tif 000015