(57)【要約】      （修正有）【課題】複数のシステムコールの組（許容集合）を、複数回、用いて検出・判断するので、不正プログラムの誤検出を増やすことなく、その見逃しを低減した、より高精度の監視を実現することができる。【解決手段】監視対象であるＡＰを、サーバ計算機システムにおける処理フェーズ、経過時間その他経時的要素に分割し、処理フェーズ毎（時間セグメント毎）に、許容集合を作成する手段を設ける。こうして各許容集合を小さくしておく。  監視対象プログラムの処理フェーズが変動することに合わせて、各フェーズ毎に用意された許容集合を用いて、ＯＳが、システムコールの列の実行を監視する。つまり、複数の許容集合を取り替えながら、監視対象のＡＰの実行を監視する。より具体的には、監視対象プログラムに起因する特定のシステムコールによって、監視対象のＡＰの処理フェーズが変動して行くことを、ＯＳに通知する（同期をとる）。【選択図】  図１４
2006330864.tif 000002
【特許請求の範囲】
【請求項１】
サーバ計算機と、
該サーバ計算機からアクセス可能なデータ格納手段と、
前記サーバ計算機を制御するオペレーティングシステムと、
前記サーバ計算機上で前記オペレーティングシステムの制御下に実行されるアプリケーションプログラムとを備えたサーバ計算機システムの制御方法であって、
前記アプリケーションプログラムの発行するシステムコールの列を監視して、予定されたシステムコールの列から成る判定表を用いて、当該予定されたシステムコールの列以外の列が検出された場合に、当該システムコールの列の実行を中止するものにおいて、
前記アプリケーションプログラムの発行するシステムコールの列を、処理のフェーズ毎に予め複数の判定表に分けて、各判定表に、それぞれ予定されたシステムコールの列を格納しておき、
前記オペレーティングシステムは、前記アプリケーションプログラムの発行するシステムコールの列と、第１の判定表に有るシステムコールの列とを対比し、
前記オペレーティングシステムは、特定のシステムコールを契機に、前記アプリケーションプログラムの発行するシステムコールの列と、第２の判定表に有るシステムコールの列とを対比し、
それぞれの対比において、前記予定されたシステムコールの列以外の列が検出された場合に、当該システムコールの列の実行を中止することを特徴とする、サーバ計算機システムの制御方法。
【請求項２】
請求項１記載のサーバ計算機システムの制御方法において、
前記特定のシステムコールは、専用のシステムコールであるサーバ計算機システムの制御方法。
【請求項３】
請求項２記載のサーバ計算機システムの制御方法において、
前記専用のシステムコールは、前記アプリケーションプログラムのソースプログラムに対して、明示的に挿入された呼び出し処理によって為されるサーバ計算機システムの制御方法。
【請求項４】
請求項２記載のサーバ計算機システムの制御方法において、
前記専用のシステムコールは、前記アプリケーションプログラムの実行プログラムに対して、呼び出しのための命令列を挿入しておくことによって為されるサーバ計算機システムの制御方法。
【請求項５】
請求項４記載のサーバ計算機システムの制御方法において、
前記実行プログラムに対する呼び出しのための命令列の挿入は、該実行プログラムのローディングの際に為されるサーバ計算機システムの制御方法。
【請求項６】
請求項１記載のサーバ計算機システムの制御方法において、
前記特定のシステムコールは、前記アプリケーションプログラムに対して、予め定めたシステムコールの種別とアドレスにより特定されるシステムコールである、サーバ計算機システムの制御方法。
【請求項７】
請求項１記載のサーバ計算機システムの制御方法において、
前記アプリケーションプログラムは、アクセスの受付を開始するときに、前記特定のシステムコールを発行するサーバ計算機システムの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、サーバ計算機システムに侵入した又はウイルス感染による、不正なプログラムを検出する技術に係り、特に、プログラムの動作を監視して、不正プログラム、ウイルス感染して発症したプログラムその他不具合のあるプログラムを検出する技術に関する。
【背景技術】
【０００２】
インターネットに接続されたサーバ計算機システムにおいては、動作中のアプリケーションプログラムは、インターネットを介した様々なアクセスに曝されている。これらのアクセスには、本来のサービスを要求するものだけでなく、アプリケーションプログラムの無防備な箇所から侵入し、サーバ計算機システムに有る、任意のプログラムを制御し動作させようとする、不正目的のアクセスもある。
かかる不正なアクセスには、１）攻撃プログラムが実行形式のモジュールをアプリケーションプログラムに侵入させ、このモジュールプログラムがサーバ計算機システムにおいて不正を働くもの、２）電子メール等に添付された不正プログラムのファイルを実行することで、サーバ計算機システムにおいて、不正プログラムが不正動作を起こすもの等がある。
【０００３】
不正なアクセスが成功すると、侵入を受けたサーバ計算機システムでは、本来のアプリケーションとは異なるプログラム（不正プログラム）が実行されることになる。
不正プログラムの実行によって生ずる、プログラムの振舞いの違いを検出する技術として非特許文献１がある。このような検出システムの課題は、検出・判断の誤りが生じやすいことである。つまり、実際には正常動作であるにもかかわらず、異常と判断してしまう誤検出、逆に、実際には異常な動作であるにも関わらず、正常と判断し不正を検出できないという見逃しが頻出する。
特許文献１では、複数のシステムコールの実行状況を統計的に監視することが行われている。例えば、一万回を越えるような、多数のシステムコールの内容を統計処理して正常時と異なる指標が算出されたとき、異常発生と判断している。このような手法では、指標に異常を認める閾値の設定が難しい。僅かな差異を検出できるよう閾値を厳しく設定すると、誤検出の確率が高まる。多少の誤差を許容するよう閾値を緩やかに設定すれば、不正アクセスを見逃す恐れが高まる。
【０００４】
判断の安全のため、ある程度の誤検出を容認し、見逃しを低減するという運用も想定される。しかし、何の不正もないのに本来の処理を実行できないのでは、一般ユーザの納得は得られない。特に、オペレーティングシステム（ＯＳ）のようなプラットフォームプログラムにおいては、「使用可能なこと（ユーザビリティ）」は、必要不可欠な条件と考えられる。
ＯＳから見たときのアプリケーションの振舞いは、ＯＳに対するサービス要求、つまりシステムコールの列として観測される。
いわゆるアクセス制御は、サービス要求の内容（システムコールの列）と、あらかじめ与えられたアクセス制限情報に基づいて、個々のサービス要求の実行可否を判断するものである。この制御方法では、あらかじめ実行が禁じられているシステムコールを実行しようとすれば、これを不正な侵入として検出できる。
【０００５】
誤検出の低減につき非特許文献２が、１つの解決方法を示している。ここに示される、より厳密な振舞い監視技術では、監視対象のプログラムが連続的に実行する数個のシステムコールの列を監視対象とする。
その監視対象プログラムが、特定のシステムコールの列を発生させないことから、特定のシステムコールの列の出現は、異常であると判断する。逆に、出現する予定のシステムコールの列ならば、その実行を許す。
【０００６】
このような振舞い監視方法では、監視対象のプログラムが実行する予定のシステムコールの列に関し、完全な情報の入手・利用が難しいという課題がある。対症療法として、監視対象プログラムを動作させたときに観測されるシステムコールの列に基づいて、実行可能性のある許容列のリストを作成することである。かかる対症療法では、通常は、全ての許容列の収集は困難であるから、正常な動作であってもリストの許容列とは異なる動作をするシステムコールの列を、ウイルスの侵入として誤検出してしまうことになる。
非特許文献２では、監視対象プログラムのソースコード、実行コードを静的に分析し、リストの許容列の完全化を図っている。なお、振舞い監視において不正動作の見逃しを低減させることは、通常は、誤検出の低減とトレードオフの関係にある。
【０００７】
【特許文献１】米国特許６,６８１,３３１号
【非特許文献１】S.Forrest 他著 「Self-Nonself Discrimination in a Computer」Proceedings of the IEEE Symposium on Research in Security and Privacy, pp.202-212（1994）
【非特許文献２】D.Wagner 他著 「Intrusion Detection via Static Analysis」Proceedings of the IEEE Symposium on Research in Security and Privacy, pp.156-168（2001）
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明の目的は、プログラムの不正な振る舞いの誤検出率を低く保ったまま、その見逃しの低減を図ることである。
【課題を解決するための手段】
【０００９】
監視対象であるアプリケーションプログラムを、サーバ計算機システムにおける処理フェーズ、経過時間その他経時的要素に分割し、処理フェーズ毎（時間セグメント毎）に、許容集合を作成する手段を設ける。こうして各許容集合を小さくしておく（図１４）。
ここで「許容集合」とは「許容列」の集合をいい、「許容列」とは、許容するシステムコールの列をいい、「許容する」とは、出現する予定のシステムコールの列の実行を許すことをいう。
【００１０】
監視対象プログラムの処理フェーズが変動することに合わせて、各フェーズ毎に用意された許容集合を用いて、ＯＳが、システムコールの列の実行を監視する。つまり、複数の許容集合を取り替えながら、監視対象のアプリケーションプログラムの実行を監視する。
より具体的には、監視対象プログラムに起因する特定のシステムコールによって、監視対象のアプリケーションプログラムの処理フェーズが変動して行くことを、ＯＳに通知する（同期をとる）。
処理フェーズの切替の同期をとるため、ａ）アプリケーションプログラムからＯＳに対し明示的にフェーズの切替を要求する、専用のシステムコールを設けるか、又は、ｂ）一般のシステムコールから、あるタイミングでの特定のシステムコールを、フェーズの切替の「合図」（同期信号）として用いる。より具体的には、ソースコードレベルで設定・選択する方法、実行可能コードに専用のシステムコールをパッチなどの形で埋め込む方法、切替えの合図となるシステムコールをＯＳが峻別する手段を実行可能コードに設ける方法を用いる。
なお、処理フェーズの切替点の選定には、高度のプログラム分析技術が必要である。従来の許容集合を用いた監視モデルと、本発明の許容集合を用いた監視モデルの対比を図１４に示す。従来、見逃していた不正システムコールの列を、本発明により検出できる。
【発明の効果】
【００１１】
本発明によれば、複数のシステムコールの組（許容集合）を、複数回、用いて検出・判断するので、不正プログラムの誤検出を増やすことなく、その見逃しを低減した、より高精度の監視を実現することができる。
【発明を実施するための最良の形態】
【００１２】
監視対象であるアプリケーションプログラムのシステムコール、アプリケーションプログラムの処理フェーズの切替に関する完全な情報を事前に持つこと、並びに、処理フェーズの切替時点で許容集合を十分小さくとること、かつ、切替点を挟んだ許容集合の共通部分を十分小さくすること、となるようアプリケーションプログラムのフェーズ切替点を適切に設定することが望ましい。
また、システムコールの判定処理を軽快に実行しても、サーバの性能が大きく低下することのないよう、余裕のあるハードウエア資源に本発明方法を適用することが望ましい。
【実施例１】
【００１３】
図１は、本発明を適用したサーバシステムの構成を示している。
サーバ計算機システム１００にはプロセッサ１１０が搭載され、また外部記憶装置１２０が接続されている。ＯＳ１３０はアプリケーションプログラム１５０の走行を制御している。アプリケーションプログラム１５０は必要に応じてシステムコール１６０を発行し、ＯＳ１３０のサービスを要求する。
ＯＳ１３０は、システムコール１６０で要求されたサービスの実行が妥当であるか否かをシステムコール審査モジュール１４０において判断している。システムコール審査モジュール１４０では、要求されたシステムコール１６０に関する情報、及び、予めメモリ上に展開された判定表１４１、１４２、１４３にある情報を用いて、システムコールの妥当性を判断する。
判定表１４１、１４２、１４３は、あらかじめアプリケーションプログラム１５０を分析することによって、各フェーズ（図８）毎に得られている判定情報１２１、１２１、１２３を元に、それぞれ作成されている。判定情報１２１、１２２、１２３はアプリケーションプログラム１５０の実行開始前に、外部記憶装置１２０に格納されている。
【００１４】
図２は、複数のシステムコールの組合せから為る、プログラムの１断片の例を示している。判定情報Ａ１２１（図１）、判定情報Ｂ１２２、判定情報Ｃ１２３（図示せず）は、このようなプログラムのフローから、連続的に実行される可能性のあるシステムコールの列（ここでは、２つのシステムコールからなるシステムコールの対）を抽出したもので構成される。
文字が書き込まれた大きな白丸２１０〜２１４、２６０〜２５２は、システムコールの発行箇所を示している。また黒丸２２０、２２１、２７０、２７１は条件分岐の分岐点と合流点を表している。小さい白丸２３０はプロシージャコールを表している。
プログラムは制御フロー２００に従って実行される。システムコールＡ２１０の後に分岐２２０があり、システムコールＢ２１１を実行する場合と、システムコールＣ２１２、Ｄ２１３を実行する場合がある例を示している。この場合、一対のシステムコールの列として、（Ａ、Ｂ）および（Ａ、Ｃ）を抽出する。連続する３つのシステムコールを抽出すれば、それぞれ、（Ａ、Ｂ、Ｘ）、（Ａ、Ｃ、Ｄ）となる。
システムコールＢ２１１の後にプロシージャコールがあり、その先でシステムコールＸ２５０が実行されるから、システムコールの列（Ｂ，Ｘ）が抽出される。システムコールＹ２６１、あるいはシステムコールＺ２６２を実行した後、呼出し点２３０に戻り、システムコールＥ２１４を実行するから、システムコール列（Ｙ，Ｅ）、および（Ｚ，Ｅ）が抽出される。
【００１５】
図３には、このようにして、抽出したシステムコールの列をリストアップしてある。
図４は、図３の情報を外部記憶装置１２０に判定情報Ａ１２１〜判定情報Ｃ１２３として格納する際の、データ形式の一例を示している。判定情報４００は、1つのシステムコール番号４１０に対し、一行のエントリを持ち、各エントリは、システムコール番号フィールド４２０、およびこのシステムコールに引き続く実行が許容されるシステムコールの番号フィールド４２１、４２２、…からなる。図４は、各行のエントリを同じ長さで示すが、後続する許容システムコールの個数に応じて、エントリの長さを増加してもよい。
【００１６】
図５は、判定情報Ａ１２１〜判定情報Ｃ１２３を、メモリ上に展開した判定表Ａ１４１〜判定表Ｃ１４３（１４３は図示せず）の詳細を示す概念図である。
プロセス制御ブロック５９０には、現在の判定表のアドレスフィールドを示す、現判定表アドレス５９１があり、実行中のアプリケーションプログラム１５０（図１）に関する判定表１４１を指している。プロセス制御ブロック５９０には、前システムコール番号フィールド５９２があり、直近に、このプロセスが実行したシステムコールの番号を記録しておくことができるようになっている。
複数の判定表Ａ１４１、判定表Ｂ１４２、図示しない判定表Ｃ１４３があり、それぞれ、アプリケーションプログラム１５０（図１）の複数の実行フェーズ（図８）に対応している。判定表Ａ１４１の次判定表アドレスフィールド５２０は、第２の判定表Ｂ１４２を指している。また各判定表には判定表識別子フィールド５１０があり、判定表の制御に利用することができる。判定表Ａ１４１には、先頭判定エントリの列５３０があり、先頭判定エントリ５４０が並んでいる。
【００１７】
図６は、先頭の判定エントリ５４０、判定エントリ６５０の構造を示している。
一つのシステムコールに関する判定エントリは、先頭の判定エントリ５４０から始まるリストをなしており、次判定エントリアドレスフィールド６４２には判定エントリ６５０が連なっている。先頭の判定エントリ５４０には、許容する後続システムコール番号フィールド６４１がある。６４１には、前システムコール番号５９２（図５）に示される、現在のシステムコールに引き続いた実行が許されるシステムコールの番号が格納されている。さらに、先頭の判定エントリ５４０には、判定表切替制御情報フィールド６４３があり、これは後述する判定表の切り替え処理の制御に使用する。
【００１８】
図７は、アプリケーションプログラム１５０（図１）において、システムコールが発行された時の、システムコール審査モジュール１４０における、システムコール審査処理７００の概要を示すフローチャートである。
ステップ７１０では、現判定表アドレス５９１（図５）と前システムコール番号５９２から、最後のシステムコールに対応する、先頭の判定エントリのアドレスを求める。これは、現在の判定表Ａ１４１の先頭の判定エントリの列から、前システムコール番号５９２をインデックスとして求めることができる。こうして、先頭の判定エントリ５４０（図６）が求められた。
【００１９】
ステップ７２０では、今回、正常な又は不正のプログラムからＯＳに対して発行されたシステムコールの番号が、求めた判定エントリ５４０の許容する後続システムコール番号と一致するか否かを調べる。一致すれば、許容されたシステムコールと判定でき（ＹＥＳ）、ステップ７３０に進む。
ステップ７３０では、現在処理中のシステムコールの番号を、前システムコール番号フィールド５９２に格納し、以下、正常に戻る。
【００２０】
一方、ステップ７２０で実行中のシステムコールが許容されることが確認できなかった場合（ＮＯ）は、次の判定エントリについて調べる。即ち、ステップ７４０で次判定エントリアドレスフィールド６４２がゼロか否かを調べ、ゼロでない（ＮＯ）ならば、その値が次の判定エントリのアドレスであるから（ステップ７６０）、その値を用いて、ステップ７２０以下を繰り返す。
ステップ７４０において、最後の判定エントリによっても実行中のシステムコールが許容されないのであれば（ＹＥＳ）、異常なシステムコール列を検出したということであるから、ステップ７５０に進み、異常検出時の処理を行う。例えば、発生した異常をセキュリティログに記録し、実行中のプロセスを停止させ、資源を解放する。
【００２１】
図８は、アプリケーションプログラム１５０が、処理フェーズの切り替え時にＯＳに対してフェーズの切り替えを通知する処理８００を例示したフローチャートである。
ステップ８１０はアプリケーションプログラムにおける初期設定フェーズにおける処理を示している。例えば、作業用メモリの確保、通信路の確保、必要なファイルのオープンなどの処理である。
ステップ８２０では初期設定フェーズ８１０の終了を受けて、フェーズ切り替え通知を行う。
ステップ８３０では、アプリケーションプログラムのサービスフェーズの処理が行われる。具体的な処理はサーバ計算機システムによって様々である。典型的には、初期設定フェーズで用意した資源を利用した処理であり、新たな通信路の確保は少なく、ファイルの読み書きが多い。
ステップ８４０では、サービスフェーズ８３０を離れ、終了フェーズ８５０に入る前に、フェーズ切り替えを通知する。
ステップ８５０の終了フェーズでは、確保したメモリの解放および、ファイルや通信路のクローズ処理などを行う。
【００２２】
処理フェーズの切り替え通知８２０、および８４０は、アプリケーションプログラムからＯＳへのインタフェースを介して為され、具体的にはシステムコールを媒介として実現する。
このシステムコールとして、専用のものを用いることができる。この場合、アプリケーションプログラムが稼動中に専用システムコールを発行できるよう、明示的な通知専用のシステムコールをソースプログラムに作成しておく。
また、アプリケーションプログラムの実行ファイルに対して、該当する場所に、専用システムコールを埋め込んでも良い。
前者の方法では、実行フェーズの切り替わり点の同定が容易であるという長所があるが、実行ファイルとして配布されたアプリケーションプログラムに対して適用することができないという短所がある。後者では、配布後のアプリケーションプログラムに対しても適用できるという長所があるが、フェーズの切り替わり点の同定を行わなければならない。
専用のシステムコールを用いる方法では、このシステムコールのときだけ、フェーズ切り替えを意識した処理をすれば良い。後述の専用システムコールを用いない方法に比べ、制御が容易となり性能も低下しない利点がある。更に、専用システムコールに引数を加えることによって、より細かい制御が可能となる。例えば、フェーズＡからフェーズＢだけでなくフェーズＣに遷移する可能性がある場合、プログラム中から遷移先のフェーズを引数によって指定することが可能となる。
【００２３】
専用システムコールを用いずに、処理フェーズの切替をＯＳが知るための方法は、アプリケーションプログラムが本来、実行するシステムコールのうち、処理フェーズの切替のタイミングにあるシステムコールの種類、発行アドレス等の情報を予め調べてＯＳに与えておき、ＯＳがシステムコールの実行時に、該当するシステムコールであることを判定し、フェーズを切り替える方法である。
この方法では、アプリケーションプログラムを変更する必要がないという長所があるが、実行時にＯＳが該当するシステムコールであるか否かを判定するためのオーバヘッドが生ずるという短所がある。また、どのシステムコールがフェーズの切り替わりのタイミングに有るかを予め同定しなければならない。これには、アプリケーションプログラムに対して専用システムコールを埋め込む方法における課題と同じ手間がかかる。
【００２４】
図９は、ステップ８２０（図８）やステップ８４０における、専用システムコールによる、処理フェーズの切替通知に対する、ＯＳの処理９００を示したフローチャートである。
ステップ９１０では、フェーズ切り替え通知の妥当性をチェックする。アプリケーションプログラムが、不正な攻撃を受けて不正侵入が為されたとき、フェーズ切り替え処理を攻撃プログラムに恣意的に実行されると、保護のレベルが低下する恐れがある。そのため、切り替え通知を発行したときのアプリケーションプログラムの状態をチェックして安全性を確認する。これは、事前調査しておいた正常状態に関する情報と、通知時の実際の状態が一致することを確認することによって判断する。
状態としては、例えば、通知時のスタックの状態がある。スタックを調べるとプログラムのサブルーチンの呼び出しアドレスの列がわかり、それが事前調査しておいたものと一致することを確かめればよい。ここで述べた事前調査情報は、判定情報Ａ１２１〜判定情報Ｃ１２３と一緒に、ストレージ１２０上に格納しておくことが、管理上、有利である。
【００２５】
ステップ９１０におけるチェックの結果、正当性が確認されれば（ＹＥＳ）、ステップ９３０で、判定表の変更を行う。どの判定表に切り替えるかを決定する必要があるが、ここでは予め定めておいた順番に従って、現在の判定表の次の判定表に切り替えるものとする。図５では、判定表Ａ１４１と判定表Ｂ１４２はこの順番に従って、複数の判定表を連ねて管理されている。これまで使用していた判定表は判定表Ａ１４１であり、プロセス管理ブロック内から指定されていることは、既述の通りである。
次の判定表は、判定表Ｂ１４２（図５）であり、既述の通り、判定表Ａ１４１の内部からポインタにより指定されている。判定表切り替え処理９３０は、判定表Ｂ１４２のアドレスを判定表Ａ１４１の次判定表アドレスフィールド５３０から取り出し、プロセス管理ブロック５９０の現判定表アドレスフィールド５９１に格納することによって達成される。以上で切り替え処理は正常に戻る。
ステップ９１０において、通知が正当でないと判断された場合には、ステップ９２０に進み、不正通知処理を実行する。不正通知実行処理としては、当該プロセスの停止、解放処理を行う。
【００２６】
図１０は、ステップ８２０（図８）およびステップ８４０において、専用システムコールに変更先フェーズを示す引数を指定するようにした場合の、処理フェーズの切替通知に対する、ＯＳの処理１０００を示したフローチャートである。
通知の正当性チェック処理ステップ１０１０は、ステップ９１０と同様である。判定表切り替え処理ステップ１０３０は、変更先指定の影響を受ける部分である。図５において、判定表Ａ１４１、判定表Ｂ１４２は、それぞれ、判定表識別子フィールド５１０をもっている。先頭判定表アドレスフィールド５９３と各判定表の次判定表アドレスフィールド５２０によって構成される判定表のチェインをたどりながら、指定された変更先に対応する判定表を各判定表の判定表識別子フィールド５１０を調べながら探索する。これにより、次に使用すべき判定表を選ぶことができる。判定表が選択されたならば、そのアドレスを現判定表アドレスフィールド５９１に格納する。判定表が選択できなかった場合はエラーであるから、アプリケーションプログラムを強制終了させる。
【００２７】
図１１は、専用のシステムコールを用いずに、既存のシステムコールのうち特定のシステムコールの発行時に、ＯＳが処理フェーズの切替を判定する場合の、切り替え判定処理１１００を示したフローチャートである。この処理はシステムコール処理の一部として実行される。
あるシステムコールが切り替え処理の契機であることは、システムコールの種類、およびそのシステムコールを発行したときのアプリケーションプロセスの状態、たとえば、スタック上に残るシステムコールを要求したアプリケーションプログラム内のアドレスにより定義され、その条件を確認したならば、ＯＳは切り替え処理を実行するようにする。
図６の先頭の判定エントリ５４０は、システムコールの種類ごとに存在する。切り替えの契機となるシステムコールの先頭の判定エントリ５４０の判定表切り替え制御情報フィールド６４３には、その種類のシステムコールが切り替えの契機となるシステムコールであることを表す対象フラグ６６１、およびシステムコールを呼び出す際のアプリケーションプログラム内のアドレス情報６６２を格納しておく。これらはＯＳの初期設定時にＯＳに対する指定情報として与えられている。実行時にはこれらの情報に基づいて切り替えの契機であるか否かを判定する。
切り替え判定処理１１００（図１１）において、ステップ１１１０では、処理中のシステムコールが特定のシステムコールであることを、対象フラグ６６１（図６）を参照して判定する。対象でない（ＮＯ）ときは、そのままリターンする。対象である（ＹＥＳ）ときはステップ１１２０に進み、そのシステムコールがフェーズ切り替えのシステムコールであるか否かを、システムコールの呼び出しアドレスとあらかじめ登録されたアドレス情報６６２（図６）を比較して判定する。対象でなければ（ＮＯ）リターンする。対象ならば（ＹＥＳ）、ステップ１１３０にて判定表を切り替える。これは現判定表アドレスフィールド５９１（図５）に新しく選択した判定表Ｂ１４２のアドレスを格納することにより実行される。その後、リターンする。
【００２８】
図１２は、与えられたアプリケーションプログラムから、そのプログラムの処理フェーズの切替点を設定するまでの情報フローを示すブロック図である。
アプリケーションプログラムに関する情報として、ソースコード１２１０、実行コード１２１１、付加情報１２１２、人手情報１２１３がある。これらを入力としてフェーズ分析処理１２００ではアプリケーションプログラムのフェーズの遷移を分析し、フェーズ切り替え点情報１２３０を出力する。これを入力として、フェーズ切り替え点設定処理１２４０では、アプリケーションプログラムやＯＳの制御情報にフェーズ切り替え点情報を反映し、アプリケーションプログラム実行時にＯＳがアプリケーションプログラムの遷移を知ることができるようにする。
ソースコード１２１０は、サーバのソースコードの他、アプリケーションプログラムが呼び出すライブラリのソースコードが含まれる。一般にソースコードを利用する方が、詳細かつ正確に分析できるが、通常の運用ではソースコードが利用可能であることは少ない。ソースコードが利用不可である場合は、代替として実行コード１２１１を利用することができる。一般に実行コードの分析はソースコードの分析よりも困難であり、また機械命令の仕様などプラットフォーム特有の知識が必要であるが、利用者は必ず使用可能であるという有利点がある。やはり、アプリケーションプログラムのものだけでなく、呼び出されるライブラリの実行コードも入力に含める。これらの他に、以前に分析しておいた情報の一部などを付加情報１２１２として利用して、処理時間を短縮したり、あるいは、分析の補助となるような情報を人手で追加して、分析結果をより正確とする。人手情報１２１３は、パラメータファイルの形で与える他、ソースコード中にいわゆるディレクティブとして挿入することができる。付加情報としては、ライブラリに関する分析情報がある。
【００２９】
図１３を用いて、プログラムの断片を模式的に現し、フェーズ分析処理１２００（図１２）で行う処理について説明する。
プロセッサが入口点１３１０に制御を移すと、引き続いて順次命令列Ａ１３１１を実行する。順次命令列とは、その中には分岐命令はなく、またいずれかの分岐命令によって、この中の命令に制御が移ることもない命令列をいう。プログラムの制御は、順次命令列Ａを出ると分岐点１３１２に遭遇する。分岐点としては、一般の条件分岐の他、サブルーチンの呼び出し、あるいはサブルーチンからのリターンなど、順次的な命令実行が途切れる点を全て含める。分岐点１３１２から、入口点１３２０又は入口点１３３０に制御が移る。
入口点１３２０に続いて順次命令列Ｂ１３２１が実行され、分岐点１３２２において、入口点１３５０への分岐の可能性がある。同様に、入口点１３３０からは順次命令列Ｃ１３３１を実行し、分岐点１３３２において、入口点１３５０への分岐が生じている。
分岐点１３３２で分岐しなかった場合は、順次命令列Ｄ１３４１を実行し、分岐点１３４２において、入口点１３６０への分岐が生じている。
一方、入口点１３５０に続いて、順次命令列Ｅが実行される。この後、入口点１３６０があるため、順次命令列Ｅはここで処理を終了する。
【００３０】
以上のようにして、実行されるプログラム全体を、分岐点又は入口点で挟まれた順次命令列に分解し、それらの隣接する実行順序情報を抽出する。抽出した順次命令列間の隣接する実行順序情報から、順次命令列間の実行順序を求めることができる。順次命令列の実行順序を考慮すると、順次命令列の集合から実行可能性のあるシステムコール列の集合（許容集合）が得られる。
特定の順次命令列Ｓを指定すると、それに対して、その順次命令列よりも後に実行する可能性のある順次命令列の集合（後半と呼ぶ）が定まり、さら後半より前に実行される可能性のある順次命令列の集合（前半と呼ぶ）が得られる。これらは共通部分を持つことがありうる。前半、および後半から、それぞれの許容集合が得られる。
前半の許容集合の元の個数をＢ（Ｓ）、後半の許容集合の個数をＡ（Ｓ）とする。理論的には、Ｂ（Ｓ）とＡ（Ｓ）が同時に最も小さくなるようなＳがフェーズの切れ目としてはふさわしいものと考えられる。それ以前と以後で最も条件の厳しい監視が行われるからである。
また、前半の許容集合と後半の許容集合の共通部分が小さい方が、フェーズの切れ目とするには望ましい。なぜならその前後で使用されるシステムコールの種類が大きく変わるということであるから、処理の性格が変わると考えられるからであり、そうでない場合は、前後の許容集合の類似性が増し、許容集合の交換の効果が小さいと考えられるからである。
【００３１】
一般にはこのような順次命令列が見出せないこともありうる。その場合に備えて、適当な選択基準を設定する、又は、人手による調整により、フェーズの切れ目の順次命令列を定めればよい。例えば、後半のリスクが高いと判断するならば、後半の許容集合を小さくするように選択することが考えられる。以上では前半と後半の２つにフェーズ分けしたが、同様の処理により、例えば、前半をさらに分割することも考えられる。この場合、フェーズは３つになり、２つの切り替え点が指定されたことになる。
【００３２】
処理フェーズの切替点設定処理１２４０（図１２）では、実行時の制御方法に依拠して、為すべき処理が異なる。まず、フェーズ切り替え通知専用システムコールをソースコードに埋め込む場合には、アプリケーションプログラムの該当箇所に、このシステムコールを発行する処理を挿入する。またフェーズ切り替え通知専用システムコールを実行ファイルに埋め込む場合は、アプリケーションプログラムの実行ファイルの該当する箇所に該当するコードを埋め込む。これは、パッチを入れる要領で実行すればよい。実行ファイルの静的な変更を避けたい場合は、アプリケーションプログラムのローディング時に、該当するコードをメモリ上で埋め込むようにすることができる。
一方、一般のシステムコールをフェーズ切り替えの契機とする場合には、契機となる特定のシステムコールを、他のシステムコール（他の場所から発行される同一のシステムコール番号を有するシステムコールを含む）と識別するための情報を、判定情報Ａ１２１〜判定情報Ｃ１２３の一部として、記憶媒体１２０上に格納しておく必要がある。
【産業上の利用可能性】
【００３３】
本発明は、プログラムの振舞いの異常監視の強化に好適である。
【図面の簡単な説明】
【００３４】
【図１】本発明を適用したサーバ計算機システムの構成を示す図である。
【図２】複数のシステムコールの組合せから為る、プログラムの１断片の実行例を示す図である。
【図３】抽出して得られたシステムコールの列を示した図である。
【図４】システムコール列を外部記憶装置１２０に判定情報Ａ１２１〜判定情報Ｃ１２３として格納する際の、データ形式の一例を示した図である。
【図５】メモリ上に展開した判定表のデータ形式を示す図である。
【図６】判定エントリのデータ構造を示す図である。
【図７】システムコール審査モジュール１４０における、システムコール審査処理７００の概要を示すフローチャートである。
【図８】アプリケーションプログラム１５０における、処理フェーズの切り替えを通知するフローチャートである。
【図９】専用システムコールによるフェーズ切り替え通知に対する、ＯＳの処理９００を示したフローチャートである。
【図１０】専用システムコールに変更先フェーズを示す引数を指定するようにした場合の、フェーズ切り替え通知に対する、ＯＳの処理１０００を示したフローチャートである。
【図１１】既存システムコールを利用したフェーズ切り替え処理のフローチャートである。
【図１２】アプリケーションプログラムにおけるフェーズ切り替え点を抽出するブロック線図である。
【図１３】順次命令列の抽出により、フェーズ分析処理を説明する、プログラムの断片の模式図である。
【図１４】従来の許容集合を用いた監視モデルと、本発明の許容集合を用いた監視モデルとを比較する説明図である。
【符号の説明】
【００３５】
１００    サーバ計算機システム
１３０    オペレーティングシステム（ＯＳ）
１５０    アプリケーションプログラム
１２１、１２２、１２３    ストレージ上の判定情報Ａ〜Ｃ
１４１、１４２、１４３    メモリ上の判定表Ａ〜Ｃ
２００    アプリケーションプログラムの処理の断片
３００    許容情報の内容の例
４００    判定情報における許容情報
５９０    プロセス制御ブロック
５４０    先頭の判定エントリ
６５０    後続の判定エントリ
７００    システムコール審査処理
８００    サーバの処理
９００、１０００    フェーズ切り替え処理
１１００    切り替え判定処理
１２００    フェーズ分析処理
【図１】
2006330864.tif 000003
【図２】
2006330864.tif 000004
【図３】
2006330864.tif 000005
【図４】
2006330864.tif 000006
【図５】
2006330864.tif 000007
【図６】
2006330864.tif 000008
【図７】
2006330864.tif 000009
【図８】
2006330864.tif 000010
【図９】
2006330864.tif 000011
【図１０】
2006330864.tif 000012
【図１１】
2006330864.tif 000013
【図１２】
2006330864.tif 000014
【図１３】
2006330864.tif 000015
【図１４】
2006330864.tif 000016