(57)【要約】【課題】プログラムの危険度に応じて、サンドボックスと仮想空間を多段化することを可能とした装置、方法、プログラムを提供する。【解決手段】子プロセスの起動時に、プロセス起動ポリシーデータ（１０７）を参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、子プロセス用に、仮想空間とサンドボックスを新たに作るか、又は、親プロセスと同じ仮想空間とサンドボックスを用いるか、を決定する子プロセス起動手段（１０３）を備える。【選択図】図１
2010205186.tif 000002
【特許請求の範囲】
【請求項１】
子プロセスの起動時に、プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
仮想空間を新たに作るか、
親プロセスと同じ仮想空間を用いるか、又は、
通常空間で実行させるか、
を決定する、情報処理方法。
【請求項２】
子プロセスの起動時に、プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
サンドボックスを新たに作るか、
親プロセスと同じサンドボックスを用いるか、又は、
サンドボックス外で実行させるか、
を決定する、情報処理方法。
【請求項３】
ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）フックによって捕捉されたリソースアクセス要求に対して、親プロセスとは独立した仮想空間のリソースを返す、請求項１記載の情報処理方法。
【請求項４】
ＡＰＩフックによって捕捉されたリソースアクセス要求に対して、親プロセスとは異なるサンドボックスポリシーデータを子プロセスに適用し、リソースへのアクセスを制御する請求項２記載の情報処理方法。
【請求項５】
リソースのオープン要求に対して、通常空間のリソースおよび親、先祖プロセスの仮想空間のリソースの実体をコピーオンライトでコピーまたは継承したものを、仮想空間のリソースとしてオープン結果として返す、請求項３記載の情報処理方法。
【請求項６】
リソースの列挙要求に対して、通常空間のリソースおよび親、先祖プロセスの仮想空間のリソースを合成したものを列挙結果として返す請求項３記載の情報処理方法。
【請求項７】
並列的に他のプロセスがリソースのオープン要求を行ったことにより仮想空間間のリソースの実体のコピーオンライトが発生した場合でも、それに影響をうける仮想空間における列挙要求においてリソース列挙結果の整合性が崩れることがないようにする、請求項６記載の情報処理方法。
【請求項８】
仮想リソース列挙において、仮想空間における新規リソース生成やリソース削除が多量に発生しないような前提条件の下、リソースの合成処理時間をＯ（ｎ）のオーダで行う、
請求項６又は７記載の情報処理方法。
【請求項９】
プロセス起動のポリシーを設定したプロセス起動ポリシーデータと、
子プロセスの起動時に、前記プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
仮想空間とサンドボックスを新たに作るか、又は
親プロセスと同じ仮想空間とサンドボックスを用いるか、
を決定する子プロセス起動手段と、
を備えた、情報処理装置。
【請求項１０】
前記子プロセス起動手段は、新たにサンドボックスと仮想空間を作成する場合、仮想空間を動的に作成し、親子関係と、使用するサンドボックスポリシーデータを仮想空間構成記憶部に記録する、請求項９記載の情報処理装置。
【請求項１１】
前記子プロセス起動手段は、起動中の子プロセスにＡＰＩフックを仕掛け、前記子プロセスのサンドボックス識別子記憶部にサンドボックス識別子を記録し、子プロセスを開始させる請求項９記載の情報処理装置。
【請求項１２】
ＡＰＩフックで捕捉されたリソースへのアクセス要求に対し、サンドボックス識別子記憶部で識別されるサンドボックスポリシーデータを検索し、アクセス要求のあったリソースが、アクセスが許可されているか否かをサンドボックスポリシーデータの設定情報にしたがって判定するアクセス制御手段を備えた請求項９乃至１１のいずれか１項に記載の情報処理装置。
【請求項１３】
ＡＰＩフックで捕捉されたリソースオープン要求に対し、前記アクセス制御手段によってオープン要求が許可されたものに関して、仮想化の対象であるか否かを判定した後、前記サンドボックス識別子記憶部で識別される仮想空間構成記憶部の項目を検索し、対応する仮想空間上に実体が作成されたリソースを求め、前記リソース実体又は該実体をコピーしたリソースをオープンする、仮想オープン手段を備えた請求項９乃至１２のいずれか１項に記載の情報処理装置。
【請求項１４】
ＡＰＩフックで捕捉されたリソース列挙の要求に対し、前記アクセス制御手段によって列挙の要求が許可されたものに関し、仮想化の対象であるか否かを判断した後、前記サンドボックス識別子記憶部で識別される仮想空間構成記憶部の項目を検索し、前記仮想空間構成記憶部の親サンドボックス識別子で形成される仮想空間の親子関係を遡りながら、仮想空間上に実体が作られたリソースを列挙する仮想列挙手段を備えた請求項９乃至１３のいずれか１項に記載の情報処理装置。
【請求項１５】
前記仮想列挙手段は、仮想空間上に実体が作られたリソースＲｊ（ｊは０〜Ｎの整数）で列挙された項目ｘが仮想空間ＶＮとしての項目として有効なものであるか否か判定するために、Ｒｊの要素が仮想空間Ｖｋ（ｋはｊからＮの整数）にコピーした状態となっているか否かを判定し、コピーした状態の場合、仮想空間ＶｋのＲｋにコピーされた要素ｘに対応する実体を、仮想空間ＶＮで有効な項目であるものとして、リソース列挙要求の結果として返す、請求項１４記載の情報処理装置。
【請求項１６】
前記子プロセス起動手段は、子プロセスを通常空間においてサンドボックス外で実行させるか決定する請求項９記載の情報処理装置。
【請求項１７】
子プロセスの起動時に、プロセス起動のポリシーを設定したプロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
仮想空間とサンドボックスを新たに作るか、又は
親プロセスと同じ仮想空間とサンドボックスを用いるか、
を決定する子プロセス起動処理をコンピュータに実行させるプログラム。
【請求項１８】
前記子プロセス起動処理は、新たにサンドボックスと仮想空間を作成する場合、仮想空間を動的に作成し、親子関係と、使用するサンドボックスポリシーデータを仮想空間構成記憶部に記録する、請求項１７記載のプログラム。
【請求項１９】
前記子プロセス起動処理は、起動中の子プロセスにＡＰＩフックを仕掛け、前記子プロセスのサンドボックス識別子記憶部にサンドボックス識別子を記録し、子プロセスを開始させる請求項１７記載のプログラム。
【請求項２０】
ＡＰＩフックで捕捉されたリソースへのアクセス要求に対し、サンドボックス識別子記憶部で識別されるサンドボックスポリシーデータを検索し、アクセス要求のあったリソースが、アクセスが許可されているか否かをサンドボックスポリシーデータの設定情報にしたがって判定するアクセス制御処理を前記コンピュータに実行させる請求項１７乃至１９のいずれか１項に記載のプログラム。
【請求項２１】
ＡＰＩフックで捕捉されたリソースオープン要求に対し、前記アクセス制御手段によってオープン要求が許可されたものに関して、仮想化の対象であるか否かを判定した後、前記サンドボックス識別子記憶部で識別される仮想空間構成記憶部の項目を検索し、対応する仮想空間上に実体が作成されたリソースを求め、前記リソース実体又は該実体をコピーしたリソースをオープンする、仮想オープン処理を前記コンピュータに実行させる請求項１７乃至２０のいずれか１項に記載のプログラム。
【請求項２２】
ＡＰＩフックで捕捉されたリソース列挙の要求に対し、前記アクセス制御手段によって列挙の要求が許可されたものに関し、仮想化の対象であるか否かを判断した後、前記サンドボックス識別子記憶部で識別される仮想空間構成記憶部の項目を検索し、前記仮想空間構成記憶部の親サンドボックス識別子で形成される仮想空間の親子関係を遡りながら、仮想空間上に実体が作られたリソースを列挙する仮想列挙処理を前記コンピュータに実行させる請求項１７乃至２０のいずれか１項に記載のプログラム。
【請求項２３】
前記仮想列挙処理は、仮想空間上に実体が作られたリソースＲｊ（ｊは０〜Ｎの整数）で列挙された項目ｘが仮想空間ＶＮとしての項目として有効なものであるか否か判定するために、Ｒｊの要素が仮想空間Ｖｋ（ｋはｊからＮの整数）にコピーした状態となっているか否かを判定し、コピーした状態の場合、仮想空間ＶｋのＲｋにコピーされた要素ｘに対応する実体を、仮想空間ＶＮで有効な項目であるものとして、リソース列挙要求の結果として返す、請求項２２記載のプログラム。
【請求項２４】
前記子プロセス起動処理は、子プロセスを通常空間においてサンドボックス外で実行させるか決定する請求項１７記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理技術に関し、特に、サンドボックスおよび計算機リソースの仮想化に好適な情報処理装置、方法、プログラムに関する。
【背景技術】
【０００２】
サンドボックスおよび計算機リソースの仮想化の技術は、悪意を持ったプログラムを安全な環境に閉じ込めて実行させたり、機密情報を外部に漏洩させることの無いようにプログラムで処理させたりするなどのことがらを実現する技術として、従来から用いられている。例えば、インターネットブラウザ上で動作するＪａｖａＳｃｒｉｐｔ（登録商標）やＡｃｔｉｖｅＸ（登録商標）コントロール、インターネットブラウザからダウンロード、電子メール閲覧ソフトに添付、インスタントメッセージで授受されるなどし、クリック等の動作で実行される、ＥＸＥ実行ファイル、マクロ等を含んだＭｉｃｒｏｓｏｆｔ  Ｏｆｆｉｃｅ（登録商標）の文書ファイル等が悪意を持ったプログラムだったり新型のウィルスを有していたりして、ユーザの計算機を破壊したり重要な情報を外部に漏洩させたりすることをサンドボックスおよび仮想空間の技術は効果的に防ぐことができる。また、ユーザが計算機システム上の機密データをうっかり外部に漏洩させてしまうことに対しても、機密データを扱うプログラム群をサンドボックスおよび仮想空間の中で動かすことで効果的にこれを防止することができる。
【０００３】
従来のサンドボックス／仮想空間システムの一例が特許文献１に記載されている。このような構成を有する従来のサンドボックス／仮想空間システムは、疑わしいファイルを実行するプログラムまたは疑わしいファイルをダウンロードするプログラムのいずれかをサンドボックス仮想マシン上で実行することで、システムのセキュリティを向上させることができるとしている。
【０００４】
特許文献２には、機密モードで実行させるプログラムがアクセスするファイルのパスを書き換えることで、任意のプログラムを通常モード／機密モードで同時に実行させることができるような機密情報の漏洩を防ぐ仮想空間のシステムが記載されている。
【０００５】
特許文献３には、リソースへの書き込み要求のあったリソースをオンデマンドで多重化することで、あらかじめ多重化する部分をアプリケーションに特化して特定すること無くリソースを仮想化して情報漏えいを防ぐシステムが記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特表２００８−５００６５３号公報
【特許文献２】特開２００６−１２７１２７号公報
【特許文献３】特開２００７−２８０２５５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
以下に本発明による関連技術の分析を与える。
【０００８】
ブラウザ上でクリックによってダウンロード／実行される子プログラムは、親プログラムであるインターネットブラウザが動作するのと同じサンドボックスおよび仮想空間内で実行される。しかしながら、危険度がより高いと思われるダウンロードプログラムについては、独立のサンドボックスおよび仮想空間で実行させたいという要求がある。
【０００９】
従来は、多段的なサンドボックスおよび仮想空間を自動的に構成することができなかった。
【００１０】
このため、サンドボックスや仮想空間を別途生成してから、いったんダウンロードしたプログラムを、別途生成したサンドボックスや仮想空間の中で手動で起動し直すといった手順をとるか、あるいは、インターネットブラウザを別のサンドボックス／仮想空間で起動し直し、別のサンドボックス／仮想空間で起動されたインターネットブラウザの中から該当サイトを訪れてプログラムを、ダウンロード／実行するといった手順をとる必要がある。
【００１１】
すなわち、上記した技術においては、サンドボックスや仮想空間を２個以上多段的に作成するということはなんら考慮されていない。２個以上多段的にサンドボックスや仮想空間を作成した時に、リソースをオンデマンドでコピー（多重化）したり継承したりすることについてもなんら考慮されていない。
【００１２】
したがって、本発明の目的は、プログラムの危険度に応じて、サンドボックスと仮想空間を多段化することを可能とした情報処理装置、方法、プログラムを提供することにある。
【課題を解決するための手段】
【００１３】
本発明によれば、子プロセスの起動時に、プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
仮想空間を新たに作るか、
親プロセスと同じ仮想空間を用いるか、又は、
通常空間で実行させるか、
を決定する、情報処理方法が提供される。
【００１４】
本発明によれば、子プロセスの起動時に、プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
サンドボックスを新たに作るか、
親プロセスと同じサンドボックスを用いるか、又は、
サンドボックス外で実行させるか、
を決定する、情報処理方法が提供される。
【００１５】
本発明によれば、プロセス起動のポリシーを設定するプロセス起動ポリシーデータと、
子プロセスの起動時に、前記プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
仮想空間とサンドボックスを新たに作るか、又は
親プロセスと同じ仮想空間とサンドボックスを用いるか、
を決定する子プロセス起動手段と、
を備えた、情報処理装置が提供される。
【００１６】
本発明によれば、子プロセスの起動時に、プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータの設定情報にしたがって、
子プロセス用に、
仮想空間とサンドボックスを新たに作るか、又は
親プロセスと同じ仮想空間とサンドボックスを用いるか、
を決定する子プロセス起動処理をコンピュータに実行させるプログラムが提供される。
【発明の効果】
【００１７】
本発明によれば、プログラムの危険度に応じて、サンドボックスと仮想空間を多段化することを可能としている。
【図面の簡単な説明】
【００１８】
【図１】本発明の一実施例の構成を示す図である。
【図２】本発明の一実施例のプロセス起動ポリシーデータの一例を示す図である。
【図３】本発明の一実施例の仮想空間構成記憶部の一例を示す図である。
【図４】本発明の一実施例の動作を説明する図である。
【図５】本発明の一実施例の全体動作を説明する流れ図である。
【図６】本発明の一実施例の子プロセス駆動手段の動作を説明する流れ図である。
【図７】本発明の一実施例の動作を説明する図である。
【図８】本発明の一実施例の動作を説明する図である。
【図９】本発明の一実施例のアクセス制御手段と仮想Ｏｐｅｎ手段の動作を説明する流れ図である。
【図１０】本発明の一実施例の仮想Ｅｎｕｍ手段の動作を説明する流れ図である。
【図１１】本発明の一実施例の動作を説明する図である。
【図１２】本発明の一実施例の動作を説明する図である。
【発明を実施するための最良の形態】
【００１９】
本発明は、プログラムの危険度に応じて、サンドボックスと仮想空間を多段化することを可能とした装置を提供するものである。
【００２０】
プログラムの危険度に関して、例えば、
・危険性が無いと考えられる安全な一般のプログラム、
・インターネットブラウザや電子メールソフト、インスタントメッセージ等の一般的な危険にさらされると考えられるプログラム、
・インターネットブラウザからダウンロード、電子メールソフトで受信した電子メールに添付、インスタントメッセージで授受する等して得、インターネットブラウザ、電子メールソフト、インスタントメッセージ等からクリック等の動作をもって起動される危険度の非常に高いプログラム、
というように、プログラムの種類や出所により、その潜在的なセキュリティ上の危険度合いは、一般に、さまざまである。
【００２１】
本発明においては、プログラムが別のプログラムを呼び出したときに、それを捕捉し、呼び出された子プログラムに適用するファイルアクセス権やネットワークアクセス権の指定等を含むサンドボックスセキュリティポリシーや子プログラムを実行させるファイルシステム、レジストリ等が仮想化された一個以上の仮想空間を動的に作成し、プログラムの危険度に応じて、新たな仮想化された空間に隔離した状態で、より厳しいセキュリティポリシーを適用して、プログラムを実行させることを可能としている。
【００２２】
子プログラムの呼び出し階層に対して、複数個のサンドボックスおよび仮想空間を動的に多段に構成することを可能としている。
【００２３】
本発明においては、あるサンドボックスおよび仮想空間で動作するプログラムが、別のプログラムを呼び出したとき、
その呼び出しを捕捉し、一個以上の新たなサンドボックスおよび仮想空間を多段的に作って、子プログラムをそのサンドボックスおよび仮想空間で実行させるか否か、
どのようなセキュリティポリシーからなるサンドボックスで子プログラムを実行させるかを、プロセス起動ポリシーデータおよびユーザからの指示等に基づき、動的に判断／選択し、その結果に応じて、新たなサンドボックおよび仮想空間を動的に生成して、子プログラムをスタートさせるような仕組みをサンドボックス自身が有する。
【００２４】
ファイルやレジストリ等のリソースは、仮想空間の多段的な親子関係にしたがって継承する。すなわち、通常空間直下に作られる最初の世代の仮想空間では、通常空間のファイルシステムやレジストリを参照の形で継承する。
【００２５】
また、初回の書き込み時には、自己の仮想空間へとコピーを行い、以後、自己の仮想空間にコピーされたリソースにのみアクセスすることで、通常空間のオリジナルのファイルやレジストリの破壊から、システムを守る。
【００２６】
さらに、子プロセスのために作られる子仮想空間では、通常のファイルシステムやレジストリを同様にして継承したりコピーしたりすることに加え、親仮想空間で作成されたりコピーされたファイル、レジストリを同様にして継承したりコピーしたりする。
【００２７】
このように、多段的に構成された通常空間と、親・先祖仮想空間のリソースが合成されることによって、子仮想空間が形成されることになる。
【００２８】
本発明においては、そのような一個以上の何段階もの合成によって形成される仮想空間のリソースにアクセスするための手段を有する。
【００２９】
本発明においては、プロセス起動のポリシーを設定したプロセス起動ポリシーデータ（１０７）を備え、子プロセスの起動時に、前記プロセス起動ポリシーデータを参照し、前記プロセス起動ポリシーデータ（１０７）の設定情報にしたがって、子プロセス用に、
仮想空間とサンドボックスを新たに作るか、又は親プロセスと同じ仮想空間とサンドボックスを用いるかを決定する子プロセス起動手段（１０３）を備える。本発明において、前記子プロセス起動手段（１０３）は、新たにサンドボックスと仮想空間を作成する場合、仮想空間を動的に作成し、親子関係と、使用するサンドボックスポリシーデータを仮想空間構成記憶部（１０８）に記録するようにしてもよい。本発明において、前記子プロセス起動手段（１０３）は、起動中の子プロセスにＡＰＩフックを仕掛け、前記子プロセスのサンドボックス識別子記憶部（１０２）にサンドボックス識別子を記録し、子プロセスを開始させるようにしてもよい。
【００３０】
本発明において、ＡＰＩフックで捕捉されたリソースへのアクセス要求に対し、サンドボックス識別子記憶部で識別されるサンドボックスポリシーデータを検索し、アクセス要求のあったリソースが、アクセスが許可されているか否かをサンドボックスポリシーデータの設定情報にしたがって判定するアクセス制御手段（１０４）を備える。
【００３１】
本発明において、ＡＰＩフックで捕捉されたリソースオープン要求に対し、前記アクセス制御手段（１０４）によってオープン要求が許可されたものに関して、仮想化の対象であるか否かを判定した後、前記サンドボックス識別子記憶部（１０２）で識別される仮想空間構成記憶部（１０８）の項目を検索し、対応する仮想空間上に実体が作成されたリソースを求め、前記リソース実体、又は、該実体をコピーしたリソースをオープンする、仮想Ｏｐｅｎ（オープン）手段（１０５）を備える。
【００３２】
本発明において、ＡＰＩフックで捕捉されたリソース列挙の要求に対し、前記アクセス制御手段によって列挙の要求が許可されたものに関し、仮想化の対象であるか否かを判断した後、前記サンドボックス識別子記憶部で識別される仮想空間構成記憶部の項目を検索し、前記仮想空間構成記憶部の親サンドボックス識別子で形成される仮想空間の親子関係を遡りながら、仮想空間上に実体が作られたリソースを列挙する仮想列挙手段（１０６）を備える。本発明において、前記仮想列挙手段（１０６）は、仮想空間上に実体が作られたリソースＲｊで列挙された項目ｘが仮想空間ＶＮとしての項目として有効なものであるか否か判定するために、Ｒｊの要素が仮想空間Ｖｋ（ｋはｊからＮの整数）にコピーした状態となっているか否かを判定し、コピーした状態の場合、仮想空間ＶｋのＲｋにコピーされた要素ｘに対応する実体を、仮想空間ＶＮで有効な項目であるものとして、リソース列挙要求の結果として返すようにしてもよい。
【実施例】
【００３３】
次に、本発明の実施例について説明する。図１は、本発明の一実施例の構成を示す図である。図２は、図１のプロセス起動ポリシーデータ１０７のデータ構造の一例を示す図である。図３は、図１の仮想空間構成記憶部１０８の記憶形式と内容の一例を示す図である。
【００３４】
図１を参照すると、本発明の第１の実施例の装置は、
制御対象プログラム（ＥＸＥ）１１７と、
ＡＰＩフック１０１と、
プロセス起動ポリシーデータ１０７と、
仮想空間構成記憶部１０８と、
サンドボックスポリシーデータ１０９と、
システム共有ライブラリ（ＤＬＬ）１１８と、
ＯＳカーネル１１９と、
キーボード１２０とマウス１２１とディスプレイ１２２とネットワークアダプタ１２３等の入出力装置と、
通常空間１１３と、
仮想空間１１０と
を備えている。
【００３５】
ＡＰＩフック１０１は、
サンドボックス識別子記憶部１０２と、
子プロセス起動手段１０３と、
アクセス制御手段１０４と、
仮想Ｏｐｅｎ手段１０５（仮想オープン手段）と、
仮想Ｅｎｕｍ手段１０６（仮想列挙手段）と、を含む。
【００３６】
これらの手段は、それぞれ概略つぎのように動作する。
【００３７】
子プロセス起動手段１０３は、ＡＰＩフック１０１で捕捉された子プロセス起動の要求に対して、親子プログラム名にマッチするプロセス起動ポリシーデータ１０７を検索し、これに基づき、
・サンドボックスと仮想空間を新しく作るか、
・親プロセスと同じサンドボックスと仮想空間を使用するか、
を動的に決定する。
【００３８】
子プロセス起動手段１０３は、新しいサンドボックスと仮想空間を作成する場合、仮想空間１１０を動的に作成し、その親子関係と、使用するサンドボックスポリシーデータ１０９を仮想空間構成記憶部１０８に記録する。
【００３９】
子プロセス起動手段１０３は、起動中の子プロセスにＡＰＩフックを仕掛け、子プロセスのサンドボックス識別子記憶部１０２にサンドボックス識別子を記録し、子プロセスを開始させる。
【００４０】
アクセス制御手段１０４は、ＡＰＩフックで事前に捕捉されたリソースへのアクセス要求に対し、サンドボックス識別子記憶部１０２で識別されるサンドボックスポリシーデータ１０９を検索し、アクセス要求のあったリソースが、アクセスが許可されているか否かをサンドボックスポリシーデータ１０９の設定情報に照らし判定する。アクセスが許可されていない場合はそのアクセス要求を拒否する。
【００４１】
仮想Ｏｐｅｎ手段１０５は、ＡＰＩフック１０１で捕捉されたリソースＯｐｅｎの要求に対し、アクセス制御手段１０４によってＯｐｅｎ要求が許可されたものに関し、仮想化の対象であるか否かを判定した後、サンドボックス識別子記憶部１０２で識別される仮想空間構成記憶部１０８の項目を検索する。
【００４２】
対応する仮想空間ＶＮとしてのリソースの実体を求めるために、仮想空間構成記憶部１０８の親サンドボックス識別子（図３の親サンドボックス識別子１０８ｃ参照）を遡りながら、仮想空間上に実体が作られたリソースＲＮ、ＲＮ−１…Ｒ２、Ｒ１の順にその実体を検索する。
【００４３】
その際、仮想空間上に実体が存在したことのあるリソースＭＮ、ＭＮ−１…Ｍ２、Ｍ１の順に、一度でも、仮想空間Ｖｉに実体が作成されたことがあるか否かをもチェックする。
【００４４】
もし一度でもＭｉに実体が作られたことがあるという記録が存在し、かつＲｉに実体が存在しなければ、そのリソースは存在しないというエラーを結果として返す。
【００４５】
もしＲｉに実体が存在すれば、ｉがＮに等しい場合か、もしくは、書き込みの起きないアクセスの場合であれば、そのＲｉ上の実体をＯｐｅｎする。
【００４６】
もし書き込みのアクセスであった場合、そのＲｉ上の実体を、ＲＮにコピーした後、ＲＮ上のコピーしたリソースをＯｐｅｎする。
【００４７】
仮想Ｅｎｕｍ手段１０６は、ＡＰＩフック１０１で捕捉されたリソースＥｎｕｍ（列挙）の要求に対し、アクセス制御手段１０４によってＥｎｕｍの要求が許可されたものに関し、仮想化の対象であるか否かを判断した後、サンドボックス識別子記憶部１０２で識別される仮想空間構成記憶部１０８の項目を検索する。
【００４８】
対応する仮想空間ＶＮとしての要素列挙（ファイルシステムならディレクトリの子ファイルたちの列挙、レジストリならサブキーたちの列挙）を行うために、仮想空間構成記憶部１０８の親サンドボックス識別子１０８ｃで形成される仮想空間の親子関係を逆順に遡りながら、Ｒ０、Ｒ１、Ｒ２…ＲＮ−１、ＲＮの順にその要素を列挙する。
【００４９】
Ｒｊで列挙された項目ｘが仮想空間ＶＮとしての項目として有効なものであるか否か判定するために、Ｒｊの要素が仮想空間Ｖｋ（ｋ＝ｊ，ｊ＋１，…Ｎ−１，  Ｎ）  にコピーした状態となっているか否かを、図１０のステップ７０６で示す判定式
2010205186.tif 000003
でｋをｊからＮまで順に増やしつつ判定する。
【００５０】
ステップ７０６の判定でＹｅｓの場合、仮想空間ＶｋのＲｋにコピーされた要素ｘに対応する実体を、仮想空間ＶＮで有効な項目であるものとして、リソースＥｎｕｍ要求の結果として返す。
【００５１】
続くリソースＥｎｕｍ要求に対してはコルーチン的に要素列挙の途中の状態から再開して次の列挙値を同様にして求め、返す。
【００５２】
仮想空間１１０は、仮想ファイルシステム１１１と、仮想レジストリ１１２を含む。
【００５３】
通常空間１１３は、ファイルシステム１１４と、レジストリ１１５を含む。
【００５４】
図２を参照すると、プロセス起動ポリシーデータ１０７は、親プログラム名１０７ａ、子プログラム名１０７ｂ、新規フラグ１０７ｃ、ポリシー名１０７ｄを含む。
【００５５】
図３を参照すると、仮想空間構成記憶部１０８は、サンドボックス識別子１０８ａ、ポリシー名１０８ｂ、親サンドボックス識別子１０８ｃを含む。仮想空間名Ｖ１０８ｄ、仮想空間上に実体が作られたリソースの集合名Ｒ１０８ｅ、仮想空間上に実体が存在したことのあるリソースの集合名Ｍ１０８ｆを一エントリとして含む。サンドボックス識別子を基に、機械的な方法で決定しても構わない。
【００５６】
図５は、本発明の一実施例の全体の動作手順を説明する流れ図である。図１及び図５を参照して、本実施例の動作を説明する。制御対象プログラム１１７は要求を発行する（ステップ３０１）。要求種別が制御対象の場合（ステップ３０２のＹｅｓ分岐）、ＡＰＩフックで要求を補足し（ステップ３０２）、要求の種別が子プロセスの起動、リソースのオープン、リソースＥｎｕｍであるかによって、ステップ３０５（子プロセス起動手段）、ステップ３０７、３０８（アクセス制御手段と仮想Ｏｐｅｎ手段）、ステップ３１０、３１１（アクセス制御手段と仮想Ｅｎｕｍ手段）の処理に分岐する。要求種別が制御対でない場合（ステップ３０２のＮｏ分岐）、終了する。
【００５７】
具体例を用いて本実施例の動作を説明する。例えば、プロセス起動ポリシーデータ１０７には、図２のような情報が登録されているものとする。今、図４のように、通常空間Ｎ１１３上で動作するデスクトップシェル２０１からプロセスＸＸＸ２０５とプロセスＡＡＡ２０７が起動され、
サンドボックス識別子がＳａｎｄｂｏｘ１、
ポリシー名がｐｏｌｉｃｙ１、
仮想空間名がＶ１
であるようなサンドボックス２０３／仮想空間Ｖ１１１０ａで、プロセスＸＸＸ２０５とプロセスＡＡＡ２０７が動作しているものとする。
【００５８】
この状態で、プロセスＸＸＸ２０５が子プログラムＺＺＺを起動しようとすると、プロセスＸＸＸ２０５はサンドボックス上で動作中の制御対象プログラムであるため、図５のステップ３０１の処理の流れが開始され、ＡＰＩフック１０１で、子プロセス起動要求が捉えられ（ステップ３０３）、子プロセス起動手段１０３が呼び出される（ステップ３０５）。
【００５９】
ここでＡＰＩフック１０１は、オペレーティングシステムが備える機能をアプリケーションが呼び出そうとした時、その呼び出しを横取り（Ｈｏｏｋ）するような仕掛けのことで、例えばＭｉｃｒｏｓｏｆｔ（登録商標）のＷｉｎｄｏｗｓ（登録商標）のＤＬＬ（Ｄｙｎａｍｉｃ  Ｌｉｎｋ  Ｌｉｂｒａｒｙ）注入を使ったＡＰＩフックやフィルタドライバ、Ｕｎｉｘ（登録商標）やＬｉｎｕｘ（登録商標）におけるプロセストレースやカーネルモジュールによるシステムコールフック等さまざまな方法と技術が知られている。本実施例では、Ｗｉｎｄｏｗｓ（登録商標）のＤＬＬ注入によるＡＰＩフックを例として説明しているがこれに限定されない。
【００６０】
図６は、子プロセス起動手段１０３の処理手順を示す流れ図である。親子プログラム名にマッチするプロセス起動ポリシーデータを探し（ステップ４０１）、プロセス起動ポリシーデータが見つかった場合、新規フラグがＮｅｗの場合、ステップ４０８に分岐して新しい仮想空間とサンドボックスを作る。新規フラグがＣｕｒｒｅｎｔの場合、親プロセスと同じ仮想空間とサンドボックスを使用する。新規フラグがＵｓｅｒの場合、サンドボックスを新たに作るか否かをユーザが選択し、ユーザの好みをプロセス起動ポリシーデータに反映させる。新たにサンドボックスを作る場合、ステップ４０８に分岐し、作らない場合、ステップ４１０に分岐する。ステップ４０９、４１０のあと、子プロセスを生成し（ステップ４１１）、生成した子プロセスのメモリ空間にＡＰＩフックとサンドボックス識別子を埋め込み（ステップ４１２）、子プロセスを開始する（ステップ４１３）。
【００６１】
この具体例においては、子プロセス起動手段１０３は、
親プログラム名が“ＸＸＸ”、
子プログラム名が“ＺＺＺ”
にマッチするような項目をプロセス起動ポリシーデータ１０７から探し（ステップ４００）、
親プログラム名１０７ａが“＊”（ワイルドカード）、
子プログラム名１０７ｂが“ＺＺＺ”
となっている項目が見つかる（ステップ４０１）。
【００６２】
新規フラグ１０７ｃは“Ｃｕｒｒｅｎｔ”であるため（ステップ４０３のＹｅｓ）、親プロセスと同じ仮想空間とサンドボックスを使用するものと決定し（ステップ４１０）、子プロセスＺＺＺ２０６を生成し（ステップ４１１）、生成した子プロセスＺＺＺ２０６のメモリ空間にＡＰＩフックを埋め込むとともに、親プロセスと同じサンドボックス識別子“Ｓａｎｄｂｏｘ１”を、サンドボックス識別子記憶部１０２に埋め込む（ステップ４１２）。しかる後、子プロセスＺＺＺ２０６を開始させる（ステップ４１３）。
【００６３】
以上の処理により、子プロセスＺＺＺ２０６は、親プロセスＸＸＸ２０５と同じサンドボックス２０３／仮想空間Ｖ１１１０ａで動作することとなる（図４参照）。
【００６４】
また、この状態で、プロセスＸＸＸ２０５が子プログラムＹＹＹを起動しようとすると（図４参照）、同様にして子プロセス起動手段１０３が呼び出され（図５のステップ３０５）、
子プロセス起動手段１０３において、
親プログラム名が“ＸＸＸ”、
子プログラム名が“ＹＹＹ”
にマッチするような項目をプロセス起動ポリシーデータ１０７から探す（図６のステップ４００）。最初の項目がそれに一致し、新規フラグ１０７ｃは“Ｎｅｗ”であると判定して（ステップ４０２）、新しい仮想空間Ｖ２１１１０ｂを作り、ポリシー名１０７ｄで“ｐｏｌｉｃｙ１”と、指定されたサンドボックスポリシーデータ１０９を用いてサンドボックス２０９を作る（図６のステップ４０８）。
【００６５】
そして、仮想空間構成記憶部１０８（図３参照）に、項目を一行追加し（２行目のエントリ）、子サンドボックス識別子１０８ａとして新たに採番したサンドボックス識別子“Ｓａｎｄｂｏｘ２”を登録し、
ポリシー名１０８ｂには、ポリシー名１０７ｄで指定された値“ｐｏｌｉｃｙ１”を、
親サンドボックス識別子１０８ｃには、親プロセスのサンドボックス識別子である“Ｓａｎｄｂｏｘ１”を登録する（図３参照）。
【００６６】
仮想空間構成記憶部１０８の２行目のエントリに示すように、
新たに作成した仮想空間Ｖ２１１１０ｂを仮想空間名Ｖ１０８ｄに、
Ｒ２１を仮想空間上に実体が作られたリソースの集合名Ｒ１０８ｅに、
Ｍ２１を仮想空間上に実体が存在したことのあるリソースの集合名Ｍ１０８ｆに登録する（図６のステップ４０９）。
【００６７】
次に子プロセスＹＹＹ２１１を生成し（図６のステップ４１１）、生成した子プロセスＹＹＹ２１１のメモリ空間に、ＡＰＩフックを注入するとともに、図６のステップ４０９で採番したサンドボックス識別子“Ｓａｎｄｂｏｘ２”を、サンドボックス識別子記憶部１０２に埋め込み（図６のステップ４１２）、子プロセスＹＹＹ２１１を開始させる。
【００６８】
以上の処理により、子プロセスＹＹＹ２１１は、新たに生成されたサンドボックス２０９／仮想空間Ｖ２１１１０ｂで動作することとなる（図４参照）。
【００６９】
また、この状態で、プロセスＡＡＡ２０７が子プログラムＢＢＢ２０８を起動しようとすると（図４参照）、同様にして、子プロセス起動手段１０３において、プロセス起動ポリシーデータ１０７を検索し（図６のステップ４００）、
親プログラム名１０７ａが“ＡＡＡ”、
子プログラム名が“＊”（ワイルドカード）
である項目が見つかり（図６のステップ４０１）、新規フラグ１０７ｃが“Ｕｓｅｒ”であると判定され（ステップ４０４）、サンドボックス／仮想空間を新たに作るか否かのユーザによる選択を求める画面が表示される（図６のステップ４０５）。
【００７０】
ユーザによる指示画面では、サンドボックス／仮想空間を新たに作成するか否かの選択、今後もその選択を選ぶか否かの選択をユーザは行うことができる。今後も同じ選択を選ぶとユーザが答えた場合は、そのユーザの好みをプロセス起動ポリシーデータ１０７に反映させる（図６のステップ４０６）。
【００７１】
具体的には、新規フラグ１０７ｃをＮｅｗまたはＣｕｒｒｅｎｔとし、子プログラム名１０７ｂや親プログラム名１０７ａがワイルドカードである場合、特定のプログラム名に限定するような項目をプロセス起動ポリシーデータ１０７に追加登録する。
【００７２】
そして、ユーザからの指示に応じて、親と同じ仮想空間とサンドボックスを使用する（図６のステップ４１０）、又は、新しい仮想空間とサンドボックスを作る（図６のステップ４０８）の処理に分岐する（図６のステップ４０７）。
【００７３】
また、子プロセス起動手段１０３は、新規フラグ１０７ｃにてＮｏｎｅと指定した時は、仮想空間／サンドボックスの外、すなわち、通常空間で子プロセスを実行することができるようにしてもよい（図６では不図示）。
【００７４】
次に、図７に示すように、仮想空間の親子関係が、通常空間Ｎ１１３、仮想空間Ｖ１１１０ａ、仮想空間Ｖ２１１０ｂ、・・・、仮想空間ＶＮ１１０ｄと形成されたときの、リソースＲ０、Ｒ１／Ｍ１、Ｒ２／Ｍ２、…、ＲＮ／ＭＮによって合成される仮想空間Ｖｋにおけるリソースについて、例を用いて説明する。
【００７５】
仮想空間Ｖ１１１０ａは、通常空間Ｎ１１３に存在するリソースＲ０から、仮想空間Ｖ１１１０ａ上に実体が存在したことがあるリソースＭ１を除いた集合Ｒ０−Ｍ１と、
仮想空間Ｖ１１１０ａに現在実体のあるリソースの集合Ｒ１と、
の和集合となる。リソースＭ１は仮想空間Ｖ１１１０ａ上に新規に作られるか、通常空間Ｎ（親空間）からコピーされるか、により、仮想空間Ｖ１１１０ａ上に実体が存在したことがあるリソースである（現在も存在するとは限らない）。
【００７６】
すなわち、仮想空間Ｖ１１１０ａにおいて、親空間である通常空間Ｎ１１３のリソースを継承しつつ、かつて一度でも仮想空間Ｖ１１１０ａに同名のリソースが作られたものの現在は削除され存在しないようなリソースについては、親空間から継承しない。
【００７７】
同様に、仮想空間Ｖ２１１０ｂは、親の親である通常空間Ｎ１１３からのリソース継承、親の仮想空間Ｖ１１１０ａからのリソース継承を、リソースの削除を考慮にいれることで、
Ｖ２＝（Ｒ０−Ｍ１−Ｍ２）∪（Ｒ１−Ｍ２）∪Ｒ２
という集合演算によって求まる。
【００７８】
一般に仮想空間ＶＮ１１０ｄは、
ＶＮ＝（Ｒ０−Ｍ１−Ｍ２−・・・−ＭＮ）∪（Ｒ１−Ｍ２−・・・−ＭＮ）∪（Ｒ２−Ｍ３−・・・−ＭＮ）∪・・・∪（Ｒｋ−Ｍｋ＋１−Ｍｋ＋２−・・・−ＭＮ）∪・・・∪（ＲＮ−１−ＭＮ）∪ＲＮ 
という集合演算によって求まる。
【００７９】
図８は、Ｎ＝２の場合をベン図で表したもので、斜線を施した箇所が仮想空間Ｖ２（＝（Ｒ０−Ｍ１−Ｍ２）∪（Ｒ１−Ｍ２）∪Ｒ２）となる。
【００８０】
図９は、アクセス制御手段１０４、仮想Ｏｐｅｎ手段１０５の動作手順を示す流れ図である。アクセス制御手段１０４はサンドボックス識別子からサンドボックスポリシーデータを探し（ステップ７０１）、アクセス対象リソースｘはアクセスが許可されているか否かを判断し（ステップ７０２）、アクセス不許可の場合、アクセスを拒否する（ステップ７１４）。
【００８１】
仮想Ｏｐｅｎ手段１０５は、アクセス対象リソースｘは仮想化の対象か調べ（ステップ７０３）、仮想化の対象でない場合、Ｒ０上のｘへのアクセスを実行し（ステップ７１５）、仮想化の対象の場合、サンドボックス識別子に対する仮想空間ＶＮを得る（ステップ７０４）。ｘ∈ＲＮの場合、ＲＮ上のｘへのアクセスを実行する（ステップ７１６）。
ｘ∈ＭＮの場合、エラーとなる（ステップ７２１）。ｉ＝Ｎ−１から１まで−１ステップで以下のループ処理を行う。ループ処理において、ｘ∈Ｒｉの場合（ステップ７０８のＹｅｓ分岐）、書き込みアクセスでは（ステップ７１７のＹｅｓ分岐）、ＲｉからＲＮにｘをコピーし、ＲＮ上のｘへのアクセスを実行し（ステップ７１９）、書き込みアクセスでない場合、Ｒｉ上のｘへのアクセスを実行する（ステップ７１８）。ループ処理において、ｘ∈Ｍｉの場合、エラーとなる（ステップ７２１）。ループ処理終了後、ｘ∈Ｒ０の場合（ステップ７１１のＹｅｓ分岐）、書き込みアクセスでは、Ｒ０からＲＮにｘをコピーし、ＲＮ上のｘへのアクセスを実行し（ステップ７２０）、書き込みアクセスでない場合、Ｒ０上のｘへのアクセスを実行する（ステップ７１３）。
【００８２】
例えば図８における（Ｒ０−Ｍ１−Ｍ２）に属するようなリソースａ６０６に対して、仮想空間Ｖ２上で動作する制御対象プログラム１１７が書き込み権限ありのリソースＯｐｅｎの要求を行うと、図９の仮想Ｏｐｅｎ手段１０５の動作手順から、対象リソースａ６０６は、仮想化の対象であり（ステップ７０３）、サンドボックス識別子に対する仮想空間Ｖ２を得たら（ステップ７０４）、
ａ∈Ｒ２では無く（ステップ７０５）、
ａ∈Ｍ２でも無く（ステップ７０６）、
ｉ＝Ｎ−１からｉ＝１までの−１つずつデクリメントするループを開始する（ステップ７０７〜ステップ７１０）。
【００８３】
ａ∈Ｒ１では無く（ステップ７０８）、
ａ∈Ｍ１でも無く（ステップ７０９）、
ｉのループを終了する（ステップ７１０）。
次に、ａ∈Ｒ０と判定し（ステップ７１１）、
書き込み権限ありのアクセスであると判定される（ステップ７１２のＹｅｓ分岐）。
【００８４】
そして、Ｒ０からＲ２にリソースａ６０６（ｘ＝リソースａ６０６）をコピーして、Ｒ２上にコピーしたリソースａ６０７（ｘ）に対して、書き込み権限ありのリソースＯｐｅｎ要求を実行する（ステップ７２０）。
【００８５】
この一連の処理の副作用として、（Ｒ０−Ｍ１−Ｍ２）に属していたリソースａ６０６は、Ｒ０∩（Ｒ２−Ｍ１）に属する形に状態が遷移し、図８のａ６０７（コピーされたａ）となる。
【００８６】
また、図８におけるリソースｂ６０８のように仮想空間Ｖ２上に作成されたりコピーされたりするなどして、かつては存在していたが、現在削除されて存在しないリソースについてリソースＯｐｅｎ要求が行われると、図９に示した仮想Ｏｐｅｎ手段１０５の手順から、
ｂ∈Ｒ２では無く（ステップ７０５）、
ｂ∈Ｍ２と判断され（ステップ７０６）、
リソースｂは仮想空間Ｖ２において存在しないというエラーを返し終了する（ステップ７２１）。
【００８７】
また、図８におけるリソースｃ６０９のように、仮想空間Ｖ１に実体が存在するが、仮想空間Ｖ２には実体が存在しないリソースについて、書き込み権限なしのリソースＯｐｅｎ要求が行われると、図９の仮想Ｏｐｅｎ手段１０５の手順から、
ｃ∈Ｒ２では無く（ステップ７０５）、
ｃ∈Ｍ２では無く（ステップ７０６）、
ループ変数ｉ＝Ｎ−１から１までのループを開始する（ステップ７０７）。
ｃ∈Ｒ１であると判定し（ステップ７０８）、
書き込みの権限は無いため（ステップ７１７のＮｏ分岐）、
リソースＲ１上のリソースｃ６０９（ｘ）へのリソースＯｐｅｎ要求を実行する（ステップ７１８）。書き込みは発生しないため、仮想空間Ｖ２に対してリソースｃ６０９のコピーは行わない。
【００８８】
図１０は、仮想Ｅｎｕｍ手段１０６の処理手順を示す流れ図である。対象リソースｘが仮想化の対象の場合（ステップ７０１のＹｅｓ分岐）、サンドボックス識別子に対する仮想空間ＶＮを得（ステップ７０２）、ステップ７０３〜７１０までのループ変数ｊ＝０〜Ｎまでのループ、ステップ７０４からステップ７０９までの各ｘ（ｘ∈Ｒｊ）に関するループ、ステップ７０５からステップ７０８までのｋ＝ｊからＮまでのループの３重ループを繰り返す。ステップ７０６では、
2010205186.tif 000004
の場合、ｘに対応するＲｋ上の（またはＲｋにコピーされた）要素の実体を列挙値として返し（ステップ７０７）、ｋのループを抜ける。
【００８９】
上記具体例に即してみると、仮想空間Ｖ２のリソースに対して、仮想空間Ｖ２上で動作する制御対象プログラム１１７がリソースＥｎｕｍの要求を行うと、図１０の仮想Ｅｎｕｍ手段１０６の処理手順を見ると、ｊの値を０、１、２、・・・Ｎと増加させるループを開始する（ステップ７０３）。
【００９０】
ｊ＝０の時、Ｒ０の全リソースを列挙するループを開始し、そのリソースをｘとし（ステップ７０４）、ｋの値をｊの値である０から１へと増加させるループを開始し（ステップ７０５）、ｊ＝０、ｋ＝０の時、
ｘ∈Ｒ０∩Ｒ０−Ｍ１−Ｍ２であるか否かを判定する（ステップ７０６）。
もし、真ならば（ステップ７０６のＹｅｓ分岐）、Ｒ０上のこのｘを列挙値として返し（ステップ７０７）、ｋのループを抜けて、ｘのループの続きを行う。
【００９１】
ステップ７０６の判定結果が偽であれば（ステップ７０６のＮｏ分岐）、ｊ＝０、ｋ＝１、ｊ＝０、ｋ＝２、・・・と、ｊ＝０に対してｋをループさせて（ステップ７０５）、ステップ７０６の判定を繰り返す。
【００９２】
すべてのＲ０の要素であるリソースを列挙し終えたら、ｘのループを終了し（ステップ７０９）、ｊをループさせて（ステップ７１０）、以上の処理を繰り返す。
【００９３】
以上の処理をまとめると、図１１、図１２のようになる。
【００９４】
すなわち、Ｒ０の全要素をまず列挙し（ｊ＝０）、それがＲ０∩Ｒ０−Ｍ１−Ｍ２に含まれる時（ｋ＝０／図１１の９０１のエリア）、Ｒ０上のリソースを列挙値として返す。
【００９５】
Ｒ０∩Ｒ１−Ｍ２に含まれる時（ｋ＝１／図１１の９０２のエリア）、Ｒ１上の対応するリソースを列挙値として返す。
【００９６】
Ｒ０∩Ｒ２に含まれる時（ｋ＝２／図１１の９０３のエリア）、Ｒ２上の対応するリソースを列挙値として返す。
【００９７】
次に、Ｒ１の全要素を列挙し（ｊ＝１）、それがＲ１∩Ｒ１−Ｍ２−Ｒ０に含まれる時（ｋ＝１／図１１の９０４のエリア）、Ｒ１上のリソースを列挙値として返す。
【００９８】
Ｒ１∩Ｒ２−Ｒ０に含まれる時（ｋ＝２／図１１の９０５のエリア）はＲ２上の対応するリソースを列挙値として返す。
【００９９】
最後に、Ｒ２の全要素を列挙し（ｊ＝２）、それがＲ２∩Ｒ２−Ｒ０−Ｒ１に含まれる時（ｋ＝２／図１１の９０６のエリア）は、Ｒ２上のリソースを列挙値として返す。以上により仮想空間Ｖ２の全要素を列挙することができる。
【０１００】
別の列挙のやり方として、
（１）Ｒ２、
（２）（Ｒ１−Ｍ２）、
（３）（Ｒ０−Ｍ１−Ｍ２）
を列挙するという方法もある。ただし、この方法は、並行的に他のプロセスが書き込み権限ありのリソースＯｐｅｎ要求を行った結果、図１１の７１９、７２０などの矢印で示される状態遷移が副作用として発生したとき、長いスパン複数回にわたって行われるリソースＥｎｕｍ要求において一貫性を持った列挙を行うことができなくなるという問題がある。
【０１０１】
その理由は、例えば、ある仮想空間Ｖ２で動作するプロセスがリソースＲ２上でＲ２の全要素を列挙中に、仮想空間Ｖ２で動作する他のプロセスが図１１の７２０のようなリソースの状態遷移を伴うリソースＯｐｅｎ要求を行うとＲ２上の要素の数が列挙中に増えてしまうこととなり、一つ一つの要素の列挙操作がたとえそれぞれアトミックであったとしても、Ｒ２の複数の要素をすべて列挙するという操作は数え漏れ等が発生してしまう可能性があるため一般的には正確に動作しなくなってしまうからである。
【０１０２】
一方、仮想Ｅｎｕｍ手段１０６の手順で要素を列挙した場合、たとえ並行的に他のプロセスが、図１１の７２０のようなリソースの状態遷移を伴うリソースＯｐｅｎ要求を行ったとしても、この操作によって、Ｒ０の要素に増減は発生しないため、Ｒ０の全要素を列挙するステップ（ｊ＝０のケース）は影響を受けることが無い。
【０１０３】
Ｒ１の全要素を列挙するステップ（ｊ＝１のケース）においても、並行して動作する仮想空間Ｖ２で動作する他のプロセスによる図１１の７２０や７１０に示される操作によってＲ１の要素に増減は発生しない。
【０１０４】
また、仮想空間Ｖ１で動作する他のプロセスによって生じる９０７、９０８、９０９の矢印で示される状態遷移の副作用によっても、Ｒ０の要素に変動は無く、またＭ２にも変化は生じないので、
Ｒ１∩Ｒ１−Ｍ２−Ｒ０や、
Ｒ１∩Ｒ２−Ｒ０
といった集合に変化は生じない。
【０１０５】
同様に、Ｒ２の全要素を列挙するステップ（ｊ＝２のケース）においても、並行して動作する仮想空間Ｖ２や仮想空間Ｖ１で動作する他のプロセスによる７２０、７１０、９０７、９０８、９０９に示される状態遷移の副作用によって、Ｒ０∪Ｒ１の集合に変化は生じないので、集合Ｒ２−Ｒ０−Ｒ１が影響を受けることは無い。
【０１０６】
よって、もし並行的に動作する他のプロセスが存在していたとしても、正しく列挙を行うことが仮想Ｅｎｕｍ手段１０６の手順では可能である。
【０１０７】
仮想Ｅｎｕｍ手段１０６の手順において問題となってくるのは、集合演算が複雑である点である。
【０１０８】
例えば、Ｒ１上のリソース（９０４および９０５）を列挙するステップにおいて、Ｒ１の先頭から順に要素を列挙している最中に、Ｒ０∩Ｒ１の要素が増加するリソースＯｐｅｎ操作９０７、９０８、９０９によって、Ｒ１の途中のどこかに要素が追加されてしまう可能性がある。このため、Ｒ１∩Ｒ１−Ｍ２−Ｒ０という集合に含まれる要素を正しくすべて数え上げるためには、“−Ｍ２−Ｒ０”の部分を除外するために、毎回Ｒ１の先頭の要素からスキャンし直すということが必要となる。これは、Ｏ（ｎ２）のオーダの計算量がかかってしまうアルゴリズムである。
【０１０９】
しかしながら、仮想空間Ｖ１やＶ２で新規リソースの生成やリソース削除が多量に発生しないような状況においては、図１１の９０４、９０５、９０６などのエリアに属するリソースの数はＲ０に含まれるリソースの数に対して非常に小さいと考えられ、このような前提条件の下では、仮想Ｅｎｕｍ手段１０６におけるリソースの合成処理は全体としてＯ（ｎ）のオーダで実施することができる。
【０１１０】
以下に本実施例の作用効果を説明する。
【０１１１】
（１）本実施例によれば、親プログラムがあるサンドボックスまたは仮想空間で実行されている時に、当該親プログラムが子プログラムを起動した時、設定またはユーザの選択に応じて、当該子プロセスを実行させるためのサンドボックスまたは仮想空間を動的に多段的につくることができる。
【０１１２】
その理由は、ＡＰＩフックが子プロセスの起動を捕捉して、子プロセス起動手段が設定情報またはユーザの選択の指示内容に応じてこれから起動する子プロセスを実行させるサンドボックスまたは仮想空間を動的に作るためである。
【０１１３】
（２）本実施例によれば、リソースへのアクセス制御のポリシーを子プロセスにおいて親プロセスとは異なるものとすることができる。例えばブラウザやメールソフトを緩い制約のかかったサンドボックスポリシーを適用したサンドボックスで実行させる一方、ブラウザ経由でプログラムやファイルをダウンロード／実行したりメールの添付ファイルを実行したりするときには、より厳しいサンドボックスポリシーを適用したサンドボックスで実行させることができることにある。
【０１１４】
その理由は、第１の効果により起動される子プロセスに対して親プロセスとは異なるサンドボックスを新たにつくることができるため、子プロセスに適用されるサンドボックスポリシーデータを、親プロセスとは異なるものにすることができるためである。
【０１１５】
（３）本実施例によれば、子プロセスがリソースへの書き込みを行っても、親プロセスが所属する仮想空間に所属するプロセスではそのリソースへの書き込みは行われないように見せかけるリソースの仮想化を、プロセスの親子関係に応じて多段的に作ることができる。例えばブラウザやメールソフトをある仮想空間で実行させる一方、ブラウザ経由でダウンロード／実行したプログラムやファイル、クリックして実行したメールの添付ファイルプログラムが、ファイル等のリソースへの書き込みを行っても、ブラウザやメールソフトが所属する仮想空間に所属するプロセスや、その他の一般のプロセスにとっては、その書き込みは行われていないものとすることができる。
【０１１６】
その理由は、効果（１）により、起動される子プロセスに対して、親プロセスとは異なる仮想空間を多段的につくることができ、子プロセスに適用される仮想空間においては、通常空間および１個以上の階層からなる仮想空間のリソースの実体をコピーオンライトでコピーまたは継承して子プロセスの仮想空間のリソースを構成することができるためである。
【０１１７】
（４）本実施例によれば、多段的に構成された仮想空間において、仮想化されたリソースの要素の列挙（ファイルシステムにおけるディレクトリの子ファイルたちの列挙、レジストリにおけるサブキーたちの列挙等）を、効果（３）におけるリソースの実体のコピーオンライトが並列的に行われている時にあっても整合性を崩すことなく行うことができ、また複数の仮想空間に存在する全リソースの合成を、新規リソース生成やリソース削除が多量に発生しないような前提条件の下、Ｏ（ｎ）のオーダの処理時間で行うことができることにある。
【０１１８】
その理由は、リソース実体のコピーオンライトの処理の影響を考慮するとリソースの合成にＯ（ｎ２）のオーダの処理時間がかかってしまうような部分が発生することが、上記前提条件の下では極小となるようリソースを列挙していく順序を工夫しているためである。
【０１１９】
（５）本実施例によれば、対象とするアプリケーションソフトウェアの種類によらず汎用的に効果（１）〜（４）が得られる。例えば、インターネットブラウザ、電子メールソフト、インスタントメッセージといったアプリケーションソフトウェアの種類や、そのアプリケーション製造元がどこであるによらずに、効果を得ることができる。
【０１２０】
その理由は、子プロセス起動要求、リソースＯｐｅｎ要求、リソースＥｎｕｍ要求等のオペレーティングシステムが備える機能のレベルに介在し、アプリケーションの種類に依存しないアルゴリズムを使い、多段的なサンドボックスおよび仮想空間を実現しているためである。
【産業上の利用可能性】
【０１２１】
本発明によれば、機密情報の漏洩を防いだり、悪意を持ったプログラムがコンピュータに害を及ぼしたりすることを防ぐために、プログラムを一定の囲いの中に閉じ込めて実行させるためのセキュリティシステムといった用途に適用できる。
【０１２２】
なお、上記の特許文献の各開示を、本書に引用をもって繰り込むものとする。本発明の全開示（請求の範囲を含む）の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の請求の範囲の枠内において種々の開示要素の多様な組み合わせないし選択が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。
【符号の説明】
【０１２３】
１０１  ＡＰＩフック
１０２  サンドボックス識別子記憶部
１０３  子プロセス起動手段
１０４  アクセス制御手段
１０５  仮想Ｏｐｅｎ手段
１０６  仮想Ｅｎｕｍ手段
１０７  プロセス起動ポリシーデータ
１０７ａ  親プログラム名
１０７ｂ  子プログラム名
１０７ｃ  新規フラグ
１０７ｄ  ポリシー名
１０８  仮想空間構成記憶部
１０８ａ  サンドボックス識別子
１０８ｂ  ポリシー名
１０８ｃ  親サンドボックス識別子
１１０  仮想空間
１１１  仮想ファイルシステム
１１２  仮想レジストリ
１１３  通常空間
１１４  ファイルシステム
１１５  レジストリ
１１６  制御対象外プログラム（ＥＸＥ）
１１７  制御対象プログラム（ＥＸＥ）
１１８  システム共有ライブラリ（ＤＬＬ）
１１９  ＯＳカーネル
１２０  キーボード
１２１  マウス
１２２  ディスプレイ
１２３  ネットワークアダプタ
２０１  デスクトップシェル
２０３、２０９  サンドボックス
【図１】
2010205186.tif 000005
【図２】
2010205186.tif 000006
【図３】
2010205186.tif 000007
【図４】
2010205186.tif 000008
【図５】
2010205186.tif 000009
【図６】
2010205186.tif 000010
【図７】
2010205186.tif 000011
【図８】
2010205186.tif 000012
【図９】
2010205186.tif 000013
【図１０】
2010205186.tif 000014
【図１１】
2010205186.tif 000015
【図１２】
2010205186.tif 000016