(57)【要約】【課題】プログラムの意味情報に基づく高度なリソースアクセス制御と、バイパスを防止する強固な安全性とを両立するアクセス制御装置を提供する。【解決手段】プログラムによる制御対象リソース３０へのアクセスを制御するアクセス制御装置１０は、プログラムからの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数から発行されたリソースアクセス要求であることを特定する識別情報を生成する関数アクセス検出部１２と、プログラムから制御対象リソース３０に対するアクセス要求を取得し、識別情報に基づいて、リソースアクセスの可否を判定するリソースアクセス制御部１４とを備える。【選択図】図２
2006252477.tif 000002
【特許請求の範囲】
【請求項１】
プログラムによる制御対象リソースへのアクセスを制御するアクセス制御装置であって、
プログラムからの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数から発行されたアクセス要求を特定する識別情報を生成する関数アクセス検出部と、
前記プログラムから前記制御対象リソースに対するアクセス要求を取得し、前記識別情報に基づいて、前記アクセス要求の可否を判定するリソースアクセス制御部と
を備えることを特徴とするアクセス制御装置。
【請求項２】
前記制御対象関数の呼出し元プロセスの情報を取得し、関数許可用アクセス制御規則に基づいて、前記制御対象関数の呼出しの可否を判定する関数アクセス制御部をさらに備え、
前記関数アクセス検出部は，呼出しが許可された場合に、前記識別情報を生成することを特徴とする請求項１に記載のアクセス制御装置。
【請求項３】
前記制御対象関数の呼出しを検出した場合、予め規定された処理を実行する追加処理部を更に備えることを特徴とする請求項２に記載のアクセス制御装置。
【請求項４】
予め規定された処理を実行する追加処理部を更に備え、
前記関数アクセス制御部は、前記追加処理部が予め規定された処理を実行した場合、前記制御対象関数の呼出しを許可することを特徴とする請求項２に記載のアクセス制御装置。
【請求項５】
前記リソースアクセス制御部は、前記識別情報に加え、リソース許可用アクセス制御規則に基づいて、前記システムコールのアクセスの可否を判定し、
前記リソース許可用アクセス制御規則には、所定の前記制御対象関数を介した前記制御対象リソースへのアクセスを制御する規則が記述されていることを特徴とする請求項１〜４のいずれか１項に記載のアクセス制御装置。
【請求項６】
前記関数アクセス検出部は、前記制御対象関数の呼出しを通知するために設けられた通知命令を取得することで、前記制御対象関数に対する呼出しを検出し、
前記通知命令には、前記識別情報、あるいは、前記識別情報の生成に必要な情報が含まれることを特徴とする請求項１〜５のいずれか１項に記載のアクセス制御装置。
【請求項７】
前記関数アクセス検出部は、前記通知命令が前記制御対象関数から発行されていることを確認した場合、前記識別情報を生成することを特徴とする請求項６に記載のアクセス制御装置。
【請求項８】
前記関数アクセス検出部は、前記制御対象関数が呼び出された場合に、前記制御対象関数の関数名をスタックに積み、前記制御対象関数の呼出し元プロセスに処理が戻る場合に、前記制御対象関数の関数名をスタックから取り除き、前記スタックに格納された情報を前記識別情報として生成し、
前記リソースアクセス制御部は、前記制御対象関数の関数名が前記スタックに積まれているか否かで、前記リソースアクセス要求の可否を判定することを特徴とする請求項１〜７のいずれか１項に記載のアクセス制御装置。
【請求項９】
前記関数アクセス検出部は、前記制御対象関数の実行コードの実メモリ上の格納アドレス範囲を算出し、前記格納アドレス範囲を前記識別情報として生成し、
前記リソースアクセス制御部は、プロセスのプログラムカウンタを参照し、前記リソースアクセス要求を発行した命令コードの格納アドレスが、前記格納アドレス範囲にあるか否かで、前記リソースアクセス要求の可否を判定することを特徴とする請求項１〜８のいずれか１項に記載のアクセス制御装置。
【請求項１０】
プログラムによる制御対象リソースへのアクセスを制御するアクセス制御方法であって、
プログラムからの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数からのアクセス要求を特定する識別情報を生成するステップと、
前記プログラムから前記制御対象リソースに対するアクセス要求を取得し、前記識別情報に基づいて、前記アクセス要求の可否を判定するステップと
を含むことを特徴とするアクセス制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムによる制御対象リソースへのアクセスを制御するアクセス制御装置及びアクセス制御方法に関する。
【背景技術】
【０００２】
プログラムをネットワーク経由で入手し、パーソナルコンピュータやＰＤＡ、携帯電話で実行する利用形態が普及している。このような利用形態は、必要なアプリケーションを迅速に取得可能とすることによって利用者の利便性を高める効果がある。一方、ネットワークを介して流通するプログラムコードの中には、システムの破壊や不正操作を目的とした悪意のあるコードや、システムリソースの乱用や動作障害などを引き起こす欠陥のあるコードがある。ダウンロードアプリケーションの利用拡大に伴い、利用者の利便性を確保し、プログラム実行の安全性を確保することは緊急の課題であり、悪意や欠陥のあるコード（不正コード）による被害を防止する機構が重要度を増している。
【０００３】
不正コードによる被害を防止する機構として、サンドボックスと呼ばれる、リソースへのアクセスを制限したプログラムコードの実行環境がある。サンドボックスは、セキュリティポリシーと呼ばれるアクセス制御規則に従って、サンドボックス上で実行されるプログラムコード（サンドボックスされたコード）からのファイルやネットワーク等に対するアクセスを制御するアクセス制御機能を備える。ここで、サンドボックスによる安全性を確保するためには、サンドボックスされたコードが、アクセス制御処理をバイパスし、リソースに直接アクセスすることを防ぐことが必要になる。
【０００４】
アクセス制御のバイパスを防ぐ強固な方法として、システムコールフックを利用したサンドボックスがある。システムコールは、プログラムコードがファイルやネットワーク等のリソースにアクセスする際に、オペレーティングシステム（ＯＳ）に対して発行する要求である。システムコールを経由せずに計算機のリソースを操作することは困難であるため、システムコールを仲介（以下において、「フック」という。）し、アクセス制御処理を付加することで、バイパスが困難となる（例えば、非特許文献１参照。）。
【０００５】
しかしながら、システムコールはＯＳの低レベルインタフェースであり、ＯＳがフックしたシステムコールの情報からプログラムの意味情報を取得するのは困難である。このため、システムコールフックによるアクセス制御では、プログラムの意味情報を考慮した制御・処理が困難であるという課題がある。プログラムの意味情報が入手できない場合、低レベルのインタフェースに即してアクセス制御規則を設定する必要があり、システムに関する深い知識と手間が必要になるという問題がある。また、「プログラムインストールをバックアップや履歴の取得を条件に許可する」といった条件付許可などプログラムの意味情報に基づく柔軟なアクセス規則をシステムコールレベルで記述することは、困難であるという問題もある。
【０００６】
意味情報が取得できないことに起因する課題は、ライブラリ関数呼出しのフックを利用したサンドボックスで解決可能である。制御対象の関数を含むライブラリをサンドボックスへのフック処理を含むライブラリに置き換える実現方法等がある（例えば、非特許文献２参照）。これにより、高い抽象度を持つインタフェースに即してアクセス制御処理を追加することが可能になり、意味情報に基づく多様なアクセス規則を効率的に設定できるようになる。
【非特許文献１】Using Kernel Hypervisors to Secure Applications, in Proceedings of the Annual Computer Security Application Conference,1997
【非特許文献２】DITools：Application-Level Support for Dynamic Extension and Flexible Composition, in Proceedings of 2000 USENIX Annual Technical Conference, 2000
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、ライブラリ関数呼出しのフックだけに依存するサンドボックスでは、システムコールを直接発行するというバイパス攻撃を防ぐことはできず、安全性に重大な課題がある。
【０００８】
そこで、本発明は、上記の課題に鑑み、プログラムの意味情報に基づく高度なリソースアクセス制御と、バイパスを防止する強固な安全性とを両立するアクセス制御装置及びアクセス制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するため、本発明の第１の特徴は、プログラムによる制御対象リソースへのアクセスを制御するアクセス制御装置であって、（ａ）プログラムからの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数から発行されたアクセス要求を特定する識別情報を生成する関数アクセス検出部と、（ｂ）プログラムから制御対象リソースに対するアクセス要求を取得し、識別情報に基づいて、前記アクセス要求の可否を判定するリソースリソースアクセス制御部とを備えるアクセス制御装置であることを要旨とする。
【００１０】
第１の特徴に係るアクセス制御装置によると、識別情報によって制御対象関数呼出し情報を低レベルのリソースアクセス要求に対するアクセス制御に反映することが可能となり、関数呼出し単位のアクセス制御による高い抽象度と低レベルリソースアクセス要求単位のアクセス制御による強固な安全性を両立可能となる。これにより、プログラムの意味情報に基づく多様なアクセス規則を効率的に記述できるようになり、多機能なプログラムを安全に実行することが可能となる。
【００１１】
又、第１の特徴に係るアクセス制御装置のアクセス制御部は、制御対象関数の呼出し元プロセスの情報を取得し、関数許可用アクセス制御規則に基づいて、制御対象関数の呼出しの可否を判定する関数アクセス制御部を更に備え、前記アクセス関数検出部は、呼出しが許可された場合に、識別情報を生成してもよい。
【００１２】
このアクセス制御装置によると、不正な制御対象関数の呼出しを拒否することができる。
【００１３】
又、上述のアクセス制御装置において、制御対象関数の呼出しを検出した場合、予め規定された処理を実行する追加処理部を更に備えてもよい。又、上述のアクセス制御装置において、予め規定された処理を実行する追加処理部を更に備え、関数アクセス制御部は、追加処理部が予め規定された処理を実行した場合、前記制御対象関数の呼出しを許可してもよい。
【００１４】
このアクセス制御装置によると、制御対象関数呼出しをフックし、予め規定した処理を挿入することが可能になる。これにより、例えば、バックアップの取得や履歴の取得等の、処理の実行を条件とした高度なアクセス制御規則を実装可能となり、アプリケーションやシステムの多様な要件に対応することが可能となる。
【００１５】
又、第１の特徴に係るアクセス制御装置のリソースリソースアクセス制御部は、識別情報に加え、リソース許可用アクセス制御規則に基づいて、システムコールのアクセスの可否を判定し、リソース許可用アクセス制御規則には、所定の制御対象関数を介した前記制御対象リソースへのアクセスを制御する規則が記述されていてもよい。
【００１６】
このアクセス制御装置によると、特定リソースへのアクセスについて特定関数の使用を義務付けることが可能になる。これにより、信頼された関数を介してのみ特定リソースへのアクセスを許可することができ、プログラム実行の安全性を高めることができる。
【００１７】
又、第１の特徴に係るアクセス制御装置の関数アクセス検出部は、制御対象関数の呼出しを通知するために設けられた通知命令を取得することで、制御対象関数に対する呼出しを検出し、通知命令には、識別情報、あるいは、識別情報の生成に必要な情報が含まれてもよい。
【００１８】
このアクセス制御装置によると、当該通知命令をフックすることで制御対象関数呼出しを検出して、通知命令の引数に含まれる識別情報もしくは識別情報を生成するための関連情報を取得することができ、関数呼出し検出を簡易な処理で実現することが可能となる。これにより、本アクセス制御装置の処理コストや実装コストを削減することができる。
【００１９】
又、上述のアクセス制御装置の関数アクセス検出部は、通知命令が制御対象関数から発行されていることを確認した場合、識別情報を生成してもよい。
【００２０】
このアクセス制御装置によると、例えば、プログラムがリソースに不正アクセスするために偽って制御対象関数呼出しを通知する命令を発行した場合に、それを検出することが可能になる。これにより、プログラム実行の安全性をさらに高めることができる。
【００２１】
又、第１の特徴に係るアクセス制御装置の関数アクセス検出部は、制御対象関数が呼び出された場合に関数名をスタックに積み、制御対象関数が戻る場合に関数名をスタックから取り除き、スタックに格納された情報を識別情報として生成し、リソースリソースアクセス制御部は、制御対象関数の関数名がスタックに積まれているか否かで、アクセス要求の可否を判定してもよい。
【００２２】
このアクセス制御装置によると、制御対象関数が更に関数を呼び出した場合においても、関数の呼出し履歴がスタック情報に含まれるため、制御対象関数及びその配下の関数を介したリソースアクセスを識別することが可能になる。
【００２３】
又、第１の特徴に係るアクセス制御装置の関数アクセス検出部は、制御対象関数の実行コードの実メモリ上の格納アドレス範囲を算出し、格納アドレス範囲を識別情報として生成し、リソースリソースアクセス制御部は、プロセスのプログラムカウンタを参照し、システムコールを発行した命令コードの格納アドレスが、格納アドレス範囲にあるか否かで、アクセス要求の可否を判定してもよい。
【００２４】
このアクセス制御装置によると、関数の実行コードが配置されたメモリアドレス範囲に基づき、制御対象リソースへのアクセス要求が制御対象関数から発行されたものかどうかを検証することが可能になる。
【００２５】
本発明の第２の特徴は、プログラムによる制御対象リソースへのアクセスを制御するアクセス制御方法であって、（ａ）プログラムからの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数からのアクセス要求を特定する識別情報を生成するステップと、（ｂ）プログラムから制御対象リソースに対するアクセス要求を取得し、識別情報に基づいて、アクセス要求の可否を判定するステップとを含むアクセス制御方法であることを要旨とする。
【００２６】
第２の特徴に係るアクセス制御方法によると、識別情報によって制御対象関数呼出し情報を低レベルのリソースアクセス要求に対するアクセス制御に反映することが可能となり、関数呼出し単位のアクセス制御による高い抽象度と低レベルリソースアクセス要求単位のアクセス制御による強固な安全性を両立可能となる。これにより、プログラムの意味情報に基づく多様なアクセス規則を効率的に記述できるようになり、多機能なプログラムを安全に実行することが可能となる。
【発明の効果】
【００２７】
本発明によると、プログラムの意味情報に基づく高度なリソースアクセス制御と、バイパスを防止する強固な安全性とを両立するアクセス制御装置及びアクセス制御方法を提供することができる。
【発明を実施するための最良の形態】
【００２８】
次に、図面を参照して、本発明の実施の形態を説明する。以下の図面の記載において、同一又は類似の部分には、同一又は類似の符号を付している。ただし、図面は模式的なものであることに留意すべきである。
【００２９】
（アクセス制御装置）
図１は、本発明の実施形態に係るアプリケーションプログラム配布及び実行システムの形態を示す図である。本システムにおいて、パーソナルコンピュータやＰＤＡ、携帯電話などの計算機１００は、Ｗｅｂブラウザやメールクライアント、ゲーム等の様々なプログラムを実行する。ここで、計算機１００が実行するプログラムには、計算機１００の出荷時にインストールされているもの、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ等の記録媒体４００からコピーしたもの、ネットワーク２００や基地局５００を介して、アプリケーションダウンロードサーバ３００からダウンロードしたもの等が含まれ、信頼度や品質が異なる。
【００３０】
本実施形態に係る計算機１００は、図２に示すように、アクセス制御装置１０を備えることにより、不正なプログラムからユーザデータやシステムファイル、ネットワーク等の制御対象リソース３０を保護する。具体的には、アクセス制御装置１０は、各システムコール（例えば、open()、write()）による制御対象リソース３０へのアクセスを制御する。
【００３１】
アクセス制御装置１０は、プログラム７０がカーネル２０に対して発行するシステムコールを取得し、予め設定された関数アクセス検出部１２及びリソースアクセス制御部１４に転送するフック部１１と、プログラム７０からの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数から発行されたアクセス要求であることを特定する識別情報を生成する関数アクセス検出部１２と、制御対象関数の呼出し元プロセスの情報を取得し、関数許可用アクセス制御規則に基づいて、制御対象関数の呼出しの可否を判定する関数アクセス制御部１５と、プログラム７０から制御対象リソース３０に対するアクセス要求を取得し、識別情報に基づいて、アクセス要求の可否を判定するリソースアクセス制御部１４と、関数アクセス検出部１２が制御対象関数の呼出しを許可した場合、予め規定された処理を実行する追加処理部１３とを備える。
【００３２】
図２では、プログラム実行コード４０に複数の関数呼出しが含まれ、func_1()、func_2()を制御対象関数とする。又、func_1()実行コード５０、func_2()実行コード６０の最初には、関数呼出しをアクセス制御装置１０（カーネル２０）に通知するための通知命令（以下において、「関数呼出し通知用のシステムコール」という。）であるnotify()があり、制御対象関数（func_1()、func_2()）に処理が移ると、notify()が発行される。
【００３３】
システムコールnotify()の引数には、制御対象関数名等、制御対象関数から発行されるシステムコールをカーネル２０が特定する際に必要となる識別情報もしくは識別情報を生成するための関連情報が設定される。例えば、関数実行コードのメモリ上の格納アドレスや格納アドレスを算出するための仮のアドレス、スタックに積まれた情報等を識別情報として利用可能である。識別情報については、後に詳述する。
【００３４】
次に、アクセス制御装置１０の各処理部について、詳細に説明する。
【００３５】
フック部１１は、関数呼出し通知用のシステムコールnotify()を取得し、関数アクセス検出部１２に転送する。又、フック部１１は、制御対象リソース３０へのアクセスを要求するシステムコールを、リソースアクセス制御部１４に転送する。
【００３６】
関数アクセス検出部１２は、プログラム７０からの制御対象関数に対する呼出しを検出し、当該検出した制御対象関数から発行されたシステムコールであることを特定する識別情報を生成する。
【００３７】
例えば、関数アクセス検出部１２は、システムコールnotify()の引数から、制御対象関数名と制御対象関数呼出し元プロセス（例えば、プログラム実行コード４０）の情報を取得し、関数許可用アクセス制御規則に基づき、制御対象関数の呼出しの可否を判断する。ここで、「関数許可用アクセス制御規則」には、呼出しを許可する制御対象関数か否かが記述されている。
【００３８】
又、関数アクセス検出部１２は、呼出し可否の判断に先立ち、関数呼出し通知用システムコールnotify()が、不正に呼び出されていないか否か検証し、システムコールnotify()が当該制御対象関数から発行されていることが確認した場合のみ処理を継続することも可能である。具体的な確認方法について、後に詳述する。
【００３９】
関数アクセス制御部１５は、制御対象関数の関数名と制御対象関数の呼出し元プロセスの情報とを取得し、関数許可用アクセス制御規則に基づいて、制御対象関数の呼出しの可否を判定する。そして、関数アクセス検出部１２は、呼出しが許可された場合に、識別情報を生成する 
追加処理部１３は、関数アクセス制御部１５が制御対象関数の呼出しを許可した場合、予め規定された処理を実行する。ここで、上述の「関数許可用アクセス制御規則」には、特定処理を条件に関数呼出しを許可する条件付許可規則が記述されていてもよい。条件付き許可の場合、関数アクセス検出部１２は、追加処理部１３に処理を移し、条件として記述された処理を実行する。
【００４０】
条件に設定される処理としては、例えば、関数呼出しに伴うリソースへのアクセス履歴の記録（ログ）や、制御対象リソース３０のバックアップ取得等がある。
【００４１】
又、追加処理部１３は、予め規定された処理を実行し、関数アクセス制御部１５は、前記追加処理部が予め規定された処理を実行した場合、制御対象関数の呼出しを許可してもよい。
【００４２】
又、関数呼出しが許可された場合、関数アクセス検出部１２は、関数呼出し通知用システムコール引数の情報とカーネル２０から取得可能な情報の一方または両方を利用して、当該関数からのシステムコール発行を検出する際に必要となる識別情報を生成する。
【００４３】
リソースアクセス制御部１４は、プログラム７０から制御対象リソース３０に対するアクセス要求を取得し、関数アクセス検出部１２が生成した識別情報及びリソース許可用アクセス制御規則に基づいて、システムコールのアクセスの可否を判定する。ここで、「リソースアクセス制御規則」には、図３に示すように、制御対象リソース３０の情報、アクセス要求元のプログラム７０の情報、関数アクセス検出部１２が生成する識別情報、許可動作の組で記述された規則が記述されている。制御する規則としては、所定の制御対象関数のみが所定の制御対象リソース３０にアクセス可能であることや、所定の制御対象関数のみが所定の制御対象リソース３０に拒否されることなどが挙げられる。例えば、リソースアクセス制御規則には、計算機１００の出荷時からインストールされているプログラムからのシステムコールは無条件で許可するが、ダウンロードされたプログラムについては識別情報によって特定されるシステムコールのみ許可するという規則を記述できる。この場合、リソースアクセス制御部１４は、ダウンロードプログラムについては、関数で呼出しが許可された関数を介してのみ、制御対象リソース３０にアクセスを許可する。
【００４４】
（アクセス制御方法）
次に、本実施形態に係るアクセス制御方法について、図４を用いて説明する。
【００４５】
まず、前提として、図５に示すように、プログラムソースをコンパイルすることにより、プログラムオブジェクトファイルが生成され、プログラム実行ファイル上にアプリケーションプログラム実行コードが配置されていることとする。又、スタティックリンクライブラリとリンクすることにより、本実施形態に係る制御対象関数であるfunc_1()、func_2()の実行コードがプログラム実行ファイル上に配置される。その他、プログラム実行ファイル上には、各実行コードの配置情報が示された再配置情報や、共有ライブラリを動的にリンクするための情報であるダイナミック情報等が配置される。これらをロードすることにより、実メモリアドレス上に、アプリケーションプログラム実行コード、func_1()実行コード、func_2()実行コードが配置される。尚、共有ライブラリとリンクすることにより、ライブラリオブジェクトであるfunc_3()実行コードが配置されてもよい。
【００４６】
図４のステップＳ１０１において、フック部１１は、制御対象関数の呼出しを通知するために設けられた通知命令（例えば、関数呼出し通知用のシステムコールnotify()）を取得する。そして、フック部１１は、通知命令を関数アクセス検出部１２に転送する。
【００４７】
次に、ステップＳ１０２において、関数アクセス検出部１２は、プログラムから制御対象関数に対する呼出しを検出する。
【００４８】
そして、ステップＳ１０３において、関数アクセス検出部１２は、関数呼出し通知用システムコールnotify()が、不正に呼び出されていないか否か検証する。例えば、プログラムカウンタの参照等により、システムコールnotify()発行元のメモリアドレスを取得し、システムコール引数から特定される制御対象関数の格納アドレス範囲に合致するかどうかを検証することによって、確認することができる。制御対象関数の格納アドレスは、例えば、図５に示すように、プログラム実行コードのヘッダ領域に関数オブジェクトへのオフセットを記述し、プログラムの配置先アドレスにオフセットを加算することによって、func_1()オフセットアドレスやfunc_2()オフセットアドレスを算出することができる。
【００４９】
又、制御対象関数（func_3( )）が共有ライブラリに含まれる場合は、図６に示す手順により、notifyシステムコールの発行元を検証することが可能である。ライブラリ中にnotifyシステムコールの発行関数を含め、制御対象関数からライブラリ内のnotifyシステムコール発行関数を呼び出すこととする。関数アクセス検出部１２では、共有ライブラリが配置されたアドレス範囲を示すアドレス解決テーブルを管理しており、notifyシステムコールの発行元アドレスが、上記アドレス範囲内にあるかを判定することができる。
【００５０】
関数呼出し通知用システムコールnotify()が適正である場合は、ステップＳ１０４へ進み、適正でない場合は、ステップＳ１１１へ進み、関数呼出し通知用システムコールnotify()が適正でないことを表示するエラー処理などを行い、処理を終了する。
【００５１】
次に、ステップＳ１０４において、関数アクセス検出部１２は、システムコールnotify()の引数から、制御対象関数名と制御対象関数呼出し元プロセス（例えば、プログラム実行コード４０）の情報を取得し、関数許可用アクセス制御規則に基づき、制御対象関数の呼出しの可否を判断する。呼出しを許可する場合は、ステップＳ１０５へ進み、許可しない場合は、ステップＳ１１へ進み、制御対象関数呼出しの権限が無い等のメッセージを表示するエラー処理を行い、処理を終了する。
【００５２】
次に、ステップＳ１０５において、関数アクセス検出部１２は、関数許可用アクセス制御規則には、特定処理を条件に関数呼出しを許可する条件付許可規則が記述されている否か判断する。条件付の許可である場合は、ステップＳ１０６へ進み、条件付の許可でない場合は、ステップＳ１０７へ進む。
【００５３】
次に、ステップＳ１０６において、追加処理部１３は、条件として記述された処理を実行する。
【００５４】
次に、ステップＳ１０７において、関数アクセス検出部１２は、当該検出した制御対象関数から発行されたシステムコールであることを特定する識別情報を生成する。
【００５５】
例えば、関数アクセス検出部１２は、制御対象関数が呼び出された場合に、制御対象関数の関数名をスタックに積み、制御対象関数の呼出し元プロセスに処理が戻る場合に、制御対象関数の関数名をスタックから取り除き、スタックに格納された情報を識別情報として生成する。具体的には、図７に示すように、引数に制御対象関数の関数名が含まれた、関数呼出し通知用システムコール（notify1()）の受信時に関数名（func_1()、func_2()）をスタック情報に積み、関数戻り通知用システムコール（notify2( )）の受信時に関数名（func_1()、func_2()）をスタック情報から取り除くという手順で、識別情報を作成することができる。
【００５６】
更に、関数アクセス検出部１２は、通知命令取得時のプログラムの実行中コードのメモリアドレスが、関数オブジェクトファイルの格納範囲に含まれている場合のみ、通知命令から取得した制御対象関数名をスタックに積んでもよい。
【００５７】
又、他に、関数アクセス検出部１２は、制御対象関数の実行コードの実メモリ上の格納アドレス範囲を算出し、格納アドレス範囲を識別情報として生成してもよい。具体的には、図４に示すように、関数呼出し通知用システムコールの引数に、関数実行コードのアドレスオフセットとサイズが設定されている場合、プログラム実行コードのロードされた実メモリアドレスを取得し、オフセットとサイズを加算することにより関数実行コードの実メモリ上の格納アドレス範囲を算出する。そして、算出した格納アドレス範囲を識別情報として生成する。尚、関数呼出し通知用システムコールの引数に、直接、メモリアドレス範囲が含まれていてもよい。
【００５８】
更に、関数呼出し通知用システムコールの引数に、制御対象関数の実行コードの仮のメモリアドレス範囲が含まれてもよい。この場合、関数アクセス検出部１２は、仮のメモリアドレス範囲から実行コードが配置された実メモリアドレス範囲を求め、実メモリアドレス範囲を識別情報として生成する。実メモリアドレス範囲を求める方法としては、例えば、仮のメモリアドレス範囲は、関数呼出し通知用システムコールの実行コードから制御対象関数の最後の実行コードのアドレスオフセットであるとし、関数アクセス検出部１２は、関数呼出し通知用システムコールの受信時の実行中コードのメモリアドレスに上記アドレスオフセットを加算することにより、実メモリアドレス範囲を求めることができる。
【００５９】
又、上記スタック情報とアドレス範囲を組み合わせて識別情報とすることも可能である。例えば、スタックに積まれた関数情報と関数実行コードのアドレス範囲を対応付けて識別情報を作成することができる。
【００６０】
次に、ステップＳ１０８において、フック部１１は、システムコール（例えば、open()、write()）を取得し，システムコール引数を参照して制御対象リソース３０に対するアクセス要求を検出する。そして、フック部１１は、制御対象リソース３０へのアクセス要求をリソースアクセス制御部１４に転送する。
【００６１】
次に、ステップＳ１０９において、リソースアクセス制御部１４は、関数アクセス検出部１２が生成した識別情報に基づいて、システムコールのアクセスの可否を判定する。許可する場合は、ステップＳ１１０へ進み、制御対象リソース３０へのアクセスを許可する。一方、許可しない場合は、ステップＳ１１２へ進み、リソースへのアクセス権限がないことを表示するエラー処理などを行い、制御対象リソース３０へのアクセスを拒否する。図２では、func_1()実行コード５０、func_2()実行コード６０に含まれるシステムコールopen()、write（）は、リソースアクセス制御部１４によって、制御対象リソース３０へのアクセスを許可されているが、プログラム実行コード４０に含まれるシステムコールopen()は、リソースアクセス制御部１４によって、アクセスを拒否されている。
【００６２】
又、アクセス可否の判定方法としては、例えば、識別情報としてスタックに格納された情報を用いる場合、リソースアクセス制御部１４は、制御対象関数の関数名がスタックに積まれているか否かで、システムコールのアクセスの可否を判定する（積まれている場合はシステムコールを許可する）。
【００６３】
又、識別情報として格納アドレス範囲を用いている場合、リソースアクセス制御部１４は、プロセスのプログラムカウンタを参照し、システムコールを発行した命令コードの格納アドレスが、格納アドレス範囲にあるか否かで、システムコールのアクセスの可否を判定する。
【００６４】
又、識別情報として上記スタック情報とアドレス範囲を組み合わせた情報を用いる場合、リソースアクセス制御部１４は、制御対象関数がスタックに積まれていることと、システムコールを発行した命令コードの格納アドレスが関数実行コードの格納アドレス範囲内に収まっていることを検証し、両条件が満たされる場合はシステムコールを許可するという判定処理を行う。
【００６５】
尚、以上の説明においてフック部１１、関数アクセス検出部１２、及びリソースアクセス制御部１４の動作を単一のフロー図を利用して説明したが、関数アクセス検出部１２とリソースアクセス制御部１４は別個のモジュールとして動作することが可能である。
【００６６】
（作用及び効果）
本実施形態に係るアクセス制御装置１０及びアクセス制御方法によると、検出した制御対象関数から発行されたシステムコールであることを特定する識別情報を生成し、この識別情報に基づいて、リソースへのアクセスの可否を判定することにより、識別情報によって制御対象関数呼出し情報を低レベルのリソースアクセス要求に対するアクセス制御に反映することが可能となり、関数呼出し単位のアクセス制御による高い抽象度と低レベルリソースアクセス要求単位のアクセス制御による強固な安全性を両立可能となる。これにより、プログラムの意味情報に基づく多様なアクセス規則を効率的に記述できるようになり、多機能なプログラムを安全に実行することが可能となる。
【００６７】
又、関数アクセス制御部１５は、制御対象関数の関数名と制御対象関数の呼出し元プロセスの情報とを取得し、関数許可用アクセス制御規則に基づいて、制御対象関数の呼出しの可否を判定する。そして、関数アクセス制御部１２は、呼出しが許可された場合に、識別情報を生成することができる。このため、不正な制御対象関数の呼出しを拒否することができる。
【００６８】
又、本実施形態に係るアクセス制御装置１０及びアクセス制御方法によると、制御対象関数の呼出しを許可した場合、予め規定された処理を実行することができる。あるいは、予め規定された処理を実行した場合、制御対象関数の呼出しを許可することができる。このため、制御対象関数呼出しをフックし、予め規定した処理を挿入することが可能になる。これにより、例えば、バックアップの取得や履歴の取得等の、処理の実行を条件とした高度なアクセス制御規則を実装可能となり、アプリケーションやシステムの多様な要件に対応することが可能となる。
【００６９】
又、リソースアクセス制御部１４は、識別情報に加え、リソース許可用アクセス制御規則に基づいて、システムコールのアクセスの可否を判定することができる。このため、特定リソースへのアクセスについて特定関数の使用を義務付けることが可能になる。これにより、信頼された関数を介してのみ特定リソースへのアクセスを許可することができ、プログラム実行の安全性を高めることができる。
【００７０】
又、関数アクセス検出部１２は、制御対象関数の呼出しを通知するために設けられた通知命令（例えば、notify()）を取得することで、制御対象関数に対する呼出しを検出することができる。このため、当該通知命令をフックすることで制御対象関数呼出しを検出して、通知命令の引数に含まれる識別情報もしくは識別情報を生成するための関連情報を取得することができ、関数呼出し検出を簡易な処理で実現することが可能となる。これにより、本アクセス制御装置及び方法の処理コストや実装コストを削減することができる。
【００７１】
又、関数アクセス検出部１２は、上記通知命令が制御対象関数から発行されていることを確認した場合、識別情報を生成することができる。このため、例えば、プログラムがリソースに不正アクセスするために偽って制御対象関数呼出しを通知する命令を発行した場合に、それを検出することが可能になる。これにより、プログラム実行の安全性をさらに高めることができる。
【００７２】
又、関数アクセス検出部１２は、スタックに格納された情報を識別情報として生成し、リソースアクセス制御部１４は、制御対象関数の関数名がスタックに積まれているか否かで、システムコールによるリソースアクセスの可否を判定することができる。このため、制御対象関数が更に関数を呼び出した場合においても、関数の呼出し履歴がスタック情報に含まれるため、制御対象関数及びその配下の関数を介したリソースアクセスを識別することが可能になる。
【００７３】
又、上記通知命令は制御対象関数名を含み、関数アクセス検出部１２は、通知命令から取得した関数名をスタックに積むことができる。このように、当該通知命令をフックすることで制御対象関数呼出しを検出して関数名を取得することができ、関数呼出し検出を簡易な処理で実現することが可能となる。これにより、本アクセス制御装置及び方法の処理コストや実装コストを削減することができる。
【００７４】
又、関数アクセス検出部１２は、通知命令取得時のプログラムの実行中コードのメモリアドレスが、関数オブジェクトファイルの格納範囲に含まれている場合のみ、通知命令から取得した制御対象関数名をスタックに積んでもよい。これにより、通知命令が、プログラムヘッダに記述されたオブジェクト格納範囲から発行されているかどうかを検証することが可能になる。例えば、プログラムがリソースに不正アクセスするために偽って制御対象関数呼出を通知する命令を発行した場合に、それを検出することが可能になる。このため、プログラム実行の安全性をさらに高めることができる。
【００７５】
又、関数アクセス検出部１２は、制御対象関数の実行コードの実メモリ上の格納アドレス範囲を算出し、格納アドレス範囲を識別情報として生成し、リソースアクセス制御部１４は、プロセスのプログラムカウンタを参照し、システムコールを発行した命令コードの格納アドレスが、格納アドレス範囲にあるか否かで、システムコールのアクセスの可否を判定することができる。このため、関数の実行コードが配置されたメモリアドレス範囲に基づき、制御対象リソースへのアクセス要求が制御対象関数から発行されたものかどうかを検証することが可能になる。
【００７６】
又、上記通知命令は、制御対象関数の実行コードのメモリアドレス範囲を含み、関数アクセス検出部１２は、通知命令から取得したメモリアドレス範囲を識別情報として生成してもよい。このように、当該通知命令をフックすることで制御対象関数呼出しを検出してメモリアドレス範囲を取得することができ、制御対象関数呼出し検出を簡易な処理で実現することが可能となる。これにより、本アクセス制御装置及び方法の処理コストや実装コストを削減することができる。
【００７７】
又、上記通知命令は、制御対象関数の実行コードの仮のメモリアドレス範囲を含み、関数アクセス検出部１２は、仮のメモリアドレス範囲から実行コードが配置された実メモリアドレス範囲を求め、実メモリアドレス範囲を識別情報として生成してもよい。このように、通知命令に含まれる仮のメモリアドレス範囲から関数の実行コードが格納される実メモリアドレス範囲を算出することができる。これにより、プログラム実行コード生成時に実メモリアドレス範囲を導出できない場合においても、本アクセス制御装置及び方法を利用することができる。
【００７８】
又、仮のメモリアドレス範囲を、関数呼出し通知用システムコールの実行コードから制御対象関数の最後の実行コードのアドレスオフセットであるとし、関数アクセス検出部１２は、関数呼出し通知用システムコールの受信時の実行中コードのメモリアドレスに上記アドレスオフセットを加算することにより、実メモリアドレス範囲を求めてもよい。このように、通知命令に含まれる仮のメモリアドレス範囲から関数の実行コードが格納される実メモリアドレス範囲を算出することができる。これにより、プログラム実行コード生成時に実メモリアドレス範囲を導出できない場合においても、本アクセス制御装置及び方法を利用することができる。
【００７９】
（その他の実施形態）
本発明は上記の実施形態によって記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施形態、実施例及び運用技術が明らかとなろう。
【００８０】
例えば、図２では、アクセス制御装置１０をオペレーティングシステムのカーネル２０内部に実装する構成をとっているが、アクセス制御装置１０は他の場所に実装されてもよいことは勿論である。
【００８１】
又、上記の実施形態において、システムコールからのアクセス要求の可否について判定することと説明しているが、システムコールに限らず、その他のプログラムからのアクセス要求であっても、本発明は適用可能である。
【００８２】
このように、本発明はここでは記載していない様々な実施形態等を含むことは勿論である。従って、本発明の技術的範囲は上記の説明から妥当な特許請求の範囲に係る発明特定事項によってのみ定められるものである。
【図面の簡単な説明】
【００８３】
【図１】本実施形態に係るアクセス制御装置を利用するシステムを説明するための図である。
【図２】本実施形態に係るアクセス制御装置の構成ブロック図である。
【図３】本実施形態に係るリソースアクセス制御規則の一例である。
【図４】本実施形態に係るアクセス制御方法を示すフローチャートである。
【図５】本実施形態に係るプログラムをロードした状態を説明するための図である。
【図６】関数呼出し通知用システムコールの発行元を検証することを説明するための図である。
【図７】本実施形態に係るアクセス制御装置のスタック情報を説明するための図である。
【符号の説明】
【００８４】
１０…アクセス制御装置
１１…フック部
１２…関数アクセス検出部
１３…追加処理部
１４…リソースアクセス制御部
１５…関数アクセス制御部
２０…カーネル
３０…制御対象リソース
４０、５０、６０…実行コード
７０…プログラム
１００…計算機
２００…ネットワーク
３００…アプリケーションダウンロードサーバ
４００…記録媒体
５００…基地局
【図１】
2006252477.tif 000003
【図２】
2006252477.tif 000004
【図３】
2006252477.tif 000005
【図４】
2006252477.tif 000006
【図５】
2006252477.tif 000007
【図６】
2006252477.tif 000008
【図７】
2006252477.tif 000009