(57)【要約】【課題】効率良くプログラムの改ざんを検知することができるプログラム実行装置を提供する。【解決手段】プログラム実行装置１１は、実行するプログラムを、プログラムの命令列によって分割した単位であるページ毎に蓄積する１次記憶手段１３と、実行中のプログラムが特権プログラムの機能を呼び出したことを検出する特権プログラム機能呼び出し検出手段１６と、特権プログラム機能呼び出し検出手段１６により検出が行われた場合、１次記憶手段１３に蓄積されている実行中のページの改ざんの有無を検証するメッセージダイジェスト検証手段１５とを備える。【選択図】図１
2006053787.tif 000002
【特許請求の範囲】
【請求項１】
実行するプログラムを、プログラムの命令列によって分割した単位であるページ毎に蓄積する１次記憶手段と、
実行中の前記プログラムが特権プログラムの機能を呼び出したことを検出する特権プログラム機能呼び出し検出手段と、
前記特権プログラム機能呼び出し検出手段により検出が行われた場合、前記１次記憶手段に蓄積されている実行中のページの改ざんの有無を検証する検証手段と
を備えることを特徴とするプログラム実行装置。
【請求項２】
前記プログラムの実行前に、前記ページ毎のメッセージダイジェストを予め蓄積するメッセージダイジェスト蓄積手段を更に備え、
前記検証手段は、前記１次記憶手段に蓄積されたページのメッセージダイジェストを計算し、前記メッセージダイジェスト蓄積手段に蓄積されたメッセージダイジェストと比較することにより、改ざんの有無を検証することを特徴とする請求項１に記載のプログラム実行装置。
【請求項３】
前記プログラムの実行が開始されてから所定の時間間隔で、時間の経過を通知するタイマ手段を更に備え、
前記検証手段は、前記タイマ手段から通知があった場合、前記１次記憶手段に蓄積されている実行中のページの改ざんの有無を検証することを特徴とする請求項１又は２に記載のプログラム実行装置。
【請求項４】
前記プログラムが実行されたときの関数呼び出しの履歴を蓄積する関数呼び出し履歴蓄積手段とを更に備え、
前記検証手段は、前記関数呼び出し履歴蓄積手段に蓄積されているページの改ざんの有無を検証することを特徴とする請求項１〜３のいずれか１項に記載のプログラム実行装置。
【請求項５】
前記検証手段は、予め定められた時間内に既に検証を行ったページについては、改ざんの有無を検証しないことを特徴とする請求項１〜４のいずれか１項に記載のプログラム実行装置。
【請求項６】
前記１次記憶手段は、前記ページ毎にフラグを有し、
前記認証手段は、前記フラグの値に応じて、ページの改ざんの有無を検証することを特徴とする請求項１〜５のいずれか１項に記載のプログラム実行装置。
【請求項７】
前記プログラム単体の負荷、あるいはプログラム実行装置全体の負荷を計測する負荷計測手段を更に備え、
前記検証手段は、前記負荷計測手段によって計測された負荷が高い場合、プログラム実行中は検証すべきプログラムのページを記録し、前記負荷計測手段によって計測された負荷が低くなったときに、ページの改ざんの有無を検証することを特徴とする請求項１〜６のいずれか１項に記載のプログラム実行装置。
【請求項８】
実行するプログラムを、プログラムの命令列によって分割した単位であるページ毎に蓄積するステップと、
実行中の前記プログラムが特権プログラムの機能を呼び出したことを検出するステップと、
前記検出するステップにより検出が行われた場合、前記蓄積されている実行中のページの改ざんの有無を検証するステップと
を含むことを特徴とするプログラム実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム実行装置及びプログラム実行方法に関する。
【背景技術】
【０００２】
ユーザがネットワークを経由してダウンロードしたプログラムを実行する場合、プログラムを実行する装置やその装置の利用者に危害を及ぼす可能性がないことを確認する必要がある。ここで、「危害」とは、許可されていない装置内の個人情報をプログラムが不正に閲覧したり、その情報をプログラムの実行装置外に送出したり、装置自体を停止させてしまったりすることである。
【０００３】
従来、このような危害が及ぶことがないように、図２５に示すようなプログラムの安全性を検証する方法が開示されている（例えば、特許文献１参照）。図２５において、プログラム作成システム３０１は、プログラム３０２及びプログラムの実行に必要なリソースや権限を列挙したアクセス制御リスト（以下、「ＡＣＬ」という。）３０３を作成する。次に、プログラム作成システム３０１は、これらをプログラム作成者とプログラム実行者双方が信頼する認証機関３０４へ送付し、証明機関３０４は、プログラム、ＡＣＬそれぞれに署名を施し、プログラム作成システム３０１へ返送する。プログラム作成システム３０１は、このように作成したプログラム、ＡＣＬ及びそれぞれの署名をサーバ３０５に蓄積する。
【０００４】
プログラム実行装置３０６は、サーバ３０５より、プログラム３０７、ＡＣＬ３０８及びそれぞれの署名をダウンロードする。そして、プログラムの実行を開始する際、検証手段３０９は、プログラムの署名が信頼する証明機関によるものであるか否か検証する。この署名の検証は、公開鍵暗号等の技術を用い、予め証明機関３０４の公開鍵を入手しておくことで容易に可能である（例えば、非特許文献１参照）。署名検証により、プログラムに施された署名が証明機関３０４のものであると判断できれば、プログラム実行装置３０６はプログラム３０７を実行し、そうでなければ実行を拒絶することで、安全性を確保する。
【０００５】
しかし、プログラムに信頼する証明機関による署名が施されていても、バッファオーバーフローのような脆弱性がプログラムに存在した場合、悪意あるデータがプログラムに入力されれば、データ入力者がプログラム実行装置に任意の動作を行わせることが可能な場合あり、危険である（例えば、非特許文献２参照）。
【０００６】
具体的には、特許文献１において示される方法で署名を施されたプログラムをサーバ（プログラム実行装置）上で実行し、インターネットを介した顧客からの入力データに応じて、商品を販売するサービスを提供する場合を想定する。非特許文献２に示すような脆弱性がプログラムに存在した場合、本来商品の名前が入力として期待されるデータに、非特許文献２が示すような巧妙に仕組まれたプログラムを挿入することで、悪意のある顧客は動作中のプログラムを改ざんし、サーバ上にある他の顧客の個人情報を盗むことが可能となる場合がある。
【０００７】
この問題を解決する方法として、プログラムの実行を一旦開始した後も、動的にプログラムが改ざんされているか否か検証を行い、改ざんが検出されれば、その段階で実行を停止する方法が開示されている（例えば、非特許文献３参照）。
【０００８】
プログラム全体が改ざんされているか否かを検証するには時間を要するため、非特許文献３では、プログラム全体ではなく、プログラムの命令列を分割し、その分割単位（以下、「ページ」という。）が２次記憶手段から１次記憶手段へ複製される度に、各ページが改ざんされているか否かを検証する。
【０００９】
より詳細に説明すると、図２６に示すように、一般にパーソナルコンピュータやワークステーション等のプログラム実行装置１１１は、高価であるが高速に読み書き可能な小容量の１次記憶手段１１３と、安価で低速な大容量の２次記憶手段１１４とを有し、これらに記憶されたデータに対し、計算手段１１２を用いて演算を繰り返すことでプログラムを実行する。そのため、実行していないプログラムは２次記憶手段１１４に蓄積しておき、プログラムを実行する際に１次記憶手段１１３に複製し、この上でプログラムを実行する。
【００１０】
１次記憶装置手段１１３の容量は、一般に小さいため、この複製の管理単位はプログラム全体ではなく、プログラムの命令列を分割したページ単位で行う。図２６に示す例では、実行しようとするプログラムＡはページ１〜４の４ページ、１次記憶手段１１３のページ格納領域は３つあるものとする。
【００１１】
又、プログラムＡの各ページについては、メッセージダイジェストが予め計算されているものとする。各ページは、プログラムの一部、即ち計算手段１１２の命令列であることから、バイト列とみなすことができ、各ページのメッセージダイジェストは、ＳＨＡ−１やＲＳＡといった一般的な一方向性関数により作成される（例えば、非特許文献１参照）。
【００１２】
各プログラムのページのメッセージダイジェスト１１４ａ、１１４ｂ、１１４ｃ、１１４ｄは、２次記憶手段１１４に蓄積されており、プログラムＡを実行する際に２次記憶手段１１４からメッセージダイジェスト蓄積手段１１７へ複製する。メッセージダイジェスト蓄積手段１１７は、実行中のプログラムからは読み書きできない記憶手段とする。
【００１３】
プログラム実行装置１１１は、メッセージダイジェストを複製した後、プログラムＡを実行するが、実行順序は図２７に示すように時刻ｔ、ｔ＋１、ｔ＋２、ｔ＋３、ｔ＋４、ｔ＋５にはそれぞれページ１、ページ２、ページ３、ページ１、ページ２、ページ４の順で進み、以後ページ１に戻って繰り返すこととし、図２７ではｔ＋８までの様子を記述している。
【００１４】
プログラム実行装置１１１は、計算手段１１２を用いて、必要に応じて２次記憶手段１１４からプログラムＡのページを１次記憶手段１１３へ複製しつつ、プログラムＡの実行を進めるが、１次記憶装置１１３のページ格納領域は限られているので、空きがなくなると古いものから順に上書きされる。時刻ｔ、ｔ＋１、ｔ＋２、ｔ＋３、ｔ＋４、ｔ＋５の一次記憶手段１１３の内容は、図２７に示すとおりである。
【００１５】
非特許文献２に開示する方法は、２次記憶手段１１４から１次記憶手段１１３にプログラムＡのページを複製するタイミングにおいて、各ページが改ざんされているか否か、プログラムページのメッセージダイジェストを用いて検証する方法である。図２７の例では、時刻ｔにページ１、時刻ｔ＋１にページ２、時刻ｔ＋２及び時刻ｔ＋８にページ３、時刻ｔ＋５にページ４が改ざんされているか否か検証を行う。
【００１６】
改ざんされているか否かの検証は、メッセージダイジェスト検証手段１１５が、１次記憶手段１１３に蓄積されるプログラムのページについて再度メッセージダイジェストを計算し、これがメッセージダイジェスト蓄積手段１１７に蓄積されているメッセージダイジェストと一致するか否かにより行う。一致していれば改ざんはなかったと判定し、不一致の場合は、プログラムが改ざんされたと判断する。
【００１７】
又、当該プログラム実行装置１１１において実行される他のプログラムが改ざんされ、そのプログラムにより２次記憶手段１１４に蓄積されたプログラムＡのページが改ざんされたとしても、各ページのメッセージダイジェストが安全なメッセージダイジェスト蓄積手段１１７に複製されていることから、改ざんを検出することが可能となる。
【特許文献１】特開平１０−８３３１０号公報
【非特許文献１】Applied Cryptgraphy, second edition, Bruce Schneier, 1996, John Wiley&Sons, ISBN 0-71-11709-9
【非特許文献２】”A Comparison of Public available Tools for Dynamic Buffer Overflow Prevention”, John Wilander and Marian Kamkar, NDSS 2003
【非特許文献３】”A virtual Machine Introspection Based Architecture for intrusion detection”, Tal Garfinkel, Mendel Rosenblum, NDSS 2003
【発明の開示】
【発明が解決しようとする課題】
【００１８】
しかしながら、上述した非特許文献３に開示される技術では、プログラムを実行している間、頻繁に実行されているページは１次記憶手段１１３に常に複製されており、２次記憶手段１１４から複製される機会がないため、プログラムが改ざんされているか否かの検証が行えないという問題点があった。例えば、図２７において、常に１次記憶手段１１３に存在するプログラムのページ、即ちページ１やページ２に脆弱性があった場合、各ページが改ざんされているか否かを検証する機会が少ないため、ページ１やページ２を改ざんされても検知することが困難である。
【００１９】
そこで、本発明は、上記の課題に鑑み、効率良くプログラムの改ざんを検知することができるプログラム実行装置及びプログラム実行方法を提供することを目的とする。
【課題を解決するための手段】
【００２０】
上記目的を達成するため、本発明の第１の特徴は、（イ）実行するプログラムを、プログラムの命令列によって分割した単位であるページ毎に蓄積する１次記憶手段と、（ロ）実行中のプログラムが特権プログラムの機能を呼び出したことを検出する特権プログラム機能呼び出し検出手段と、（ハ）特権プログラム機能呼び出し検出手段により検出が行われた場合、１次記憶手段に蓄積されている実行中のページの改ざんの有無を検証する検証手段とを備えるプログラム実行装置であることを要旨とする。ここで「特権プログラム」とは、プログラム実行装置におけるプログラムの実行を管理するためのプログラム（システムコール）である。
【００２１】
第１の特徴に係るプログラム実行装置によると、特権プログラムが呼び出されたときに改ざんの有無を検証するため、効率良くプログラムの改ざんを検知することができる。
【００２２】
又、第１の特徴に係るプログラム実行装置は、プログラムの実行前に、ページ毎のメッセージダイジェストを予め蓄積するメッセージダイジェスト蓄積手段を更に備え、検証手段は、１次記憶手段に蓄積されたページのメッセージダイジェストを計算し、メッセージダイジェスト蓄積手段に蓄積されたメッセージダイジェストと比較することにより、改ざんの有無を検証してもよい。このプログラム実行装置によると、メッセージダイジェスト（ハッシュ値）を用いて改ざんの有無を検証することができる。
【００２３】
又、第１の特徴に係るプログラム実行装置は、プログラムの実行が開始されてから所定の時間間隔で、時間の経過を通知するタイマ手段を更に備え、検証手段は、タイマ手段から通知があった場合、１次記憶手段に蓄積されている実行中のページの改ざんの有無を検証してもよい。このプログラム実行装置によると、改ざんの有無を検証する頻度が増し、より確実に改ざんを検知することができる。
【００２４】
又、第１の特徴に係るプログラム実行装置は、プログラムが実行されたときの関数呼び出しの履歴を蓄積する関数呼び出し履歴蓄積手段とを更に備え、検証手段は、関数呼び出し履歴蓄積手段に蓄積されているページの改ざんの有無を検証してもよい。このプログラム実行装置によると、共通関数などから特権プログラム機能を呼び出した場合でも、プログラムの改ざんを検知することができる。
【００２５】
又、第１の特徴に係るプログラム実行装置の検証手段は、予め定められた時間内に既に検証を行ったページについては、改ざんの有無を検証しなくてもよい。このプログラム実行装置によると、改ざん検証の回数を減らすことができ、高速にプログラム実行を行いつつ、改ざんの検知を行うことができる。
【００２６】
又、第１の特徴に係るプログラム実行装置において、１次記憶手段は、ページ毎にフラグを有し、認証手段は、フラグの値に応じて、ページの改ざんの有無を検証してもよい。このプログラム実行装置によると、改ざん検証を行うページを任意に指定することができ、改ざん検証の回数を減らすことができる。
【００２７】
又、第１の特徴に係るプログラム実行装置は、プログラム単体の負荷、あるいはプログラム実行装置全体の負荷を計測する負荷計測手段を更に備え、検証手段は、負荷計測手段によって計測された負荷が高い場合、プログラム実行中は検証すべきプログラムのページを記録し、負荷計測手段によって計測された負荷が低くなったときに、ページの改ざんの有無を検証してもよい。このプログラム実行装置によると、低い負荷のときにプログラムの改ざん検証を行うことができ、プログラム本来の実行速度を維持することができる。
【００２８】
本発明の第２の特徴は、実行するプログラムを、プログラムの命令列によって分割した単位であるページ毎に蓄積するステップと、実行中のプログラムが特権プログラムの機能を呼び出したことを検出するステップと、前記検出するステップにより検出が行われた場合、前記蓄積されている実行中のページの改ざんの有無を検証するステップとを含むプログラム実行方法であることを要旨とする。
【００２９】
第２の特徴に係るプログラム実行方法によると、特権プログラムが呼び出されたときに改ざんの有無を検証するため、効率良くプログラムの改ざんを検知することができる。
【発明の効果】
【００３０】
本発明によると、効率良くプログラムの改ざんを検知するプログラム実行装置及びプログラム実行方法を提供することができる。
【発明を実施するための最良の形態】
【００３１】
次に、図面を参照して、本発明の第１〜第５の実施の形態を説明する。以下の図面の記載において、同一又は類似の部分には、同一又は類似の符号を付している。ただし、図面は模式的なものであることに留意すべきである。
【００３２】
＜第１の実施の形態＞
（プログラム実行装置）
第１の実施の形態に係るプログラム実行装置１１は、図１に示すように、計算手段１２と、１次記憶手段１３と、２次記憶手段１４と、メッセージダイジェスト検証手段１５と、特権プログラム機能呼び出し検出手段１６と、メッセージダイジェスト蓄積手段１７と、入出力手段１８とを備える。尚、図１では、各構成手段（計算手段１２、１次記憶手段１３、２次記憶手段１４、メッセージダイジェスト検証手段１５、特権プログラム機能呼び出し検出手段１６、メッセージダイジェスト蓄積手段１７、入出力手段１８）が１つの場合を例示しているが、これらの構成手段は複数あっても良いことは勿論である。
【００３３】
まず、第１の実施の形態に係るプログラム実行装置１１が実行するプログラムＡ１４１について、説明する。
【００３４】
プログラムＡは、図２に示すように、計算手段１２に与える命令列１４１ａと、命令列を分割したページ毎に与えられるメッセージダイジェスト１４１ｂと、ページ毎のメッセージダイジェストへの署名１４１ｃより構成される。ページ毎のメッセージダイジェストは、第１の実施の形態では、プログラム配布時に予め用意されるものとするが、２次記憶手段１４上に蓄積される間は作成されず、１次記憶手段１３に複製するときやプログラム起動時に一括して作成してもよい。この場合、ページ毎のメッセージダイジェストへの署名１４１ｃは存在しないとするか、又は、プログラム命令列全体に対する署名を有してもよい。あるいは、プログラムによって予め用意したり、１次記憶手段１３に複製するときに用意したり選択できるようにしてもよい。
【００３５】
図２の例では、プログラムＡの命令列１４１ａは、４つのページに分割され、それぞれのページに対してメッセージダイジェストＨ１、Ｈ２、Ｈ３、Ｈ４を有している。命令列の分割単位は、第１の実施の形態では、１次記憶手段１３と２次記憶手段１４との間で複製を管理する単位とするが、メッセージダイジェストの計算を行う単位は必ずしもこれに一致する必要はない。例えば、図３に示すように、１次記憶手段１３と２次記憶手段１４との間の複製を管理する単位の半分でメッセージダイジェストの計算を行うようにしてもよい。
【００３６】
各ページのメッセージダイジェストを計算する方法は幾通りもあるが、例えば、図４に示すように、プログラムの各ページをＮ個のワード列（ここでは６４ｂｉｔとする）で表現（Ｂ0、Ｂ1、Ｂ2、…、Ｂn）し、各ページのメッセージダイジェストを計算する。具体的には、Ｘ，Ｖを初期化し（ステップＳ１０１）、Ｎ個のワード列がすべて関数Ｈ（ｘ）によって計算されるまで繰り返す（ステップＳ１０２〜１０４）。ここで、関数Ｈ（ｘ）は、ＳＨＡ−１やＭＤ５のような一般的な一方向性関数やｘ＝Ｈ（ｘ）となるような関数を用いればよい。
【００３７】
又、ページ毎のメッセージダイジェストへの署名を算出する方法は幾通りもあるが、例えば、図５に示すように、プログラムの各ページのメッセージダイジェストＶ0、Ｖ1、Ｖ2、…、Ｖnから署名を算出する。具体的には、Ｘ，Ｖを初期化し（ステップＳ２０１）、Ｎ個のメッセージダイジェストがすべて関数Ｈ（ｘ）によって計算されるまで繰り返す（ステップＳ２０２〜２０４）。そして、関数Ｓ（ｘ，ｋ）によって、署名を算出する（ステップＳ２０５）。ここで、関数Ｓ（ｘ，ｋ）は、ＲＳＡ暗号等の一般的な公開鍵暗号を用いて実現すればよい。ステップＳ２０５において、公開鍵暗号の計算に必要な鍵Ｋsはプログラムを作成した者の秘密鍵を用いることとし、プログラムがプログラム実行装置の外部で作成された場合は、署名は予めプログラムの作成者により作成されているものとする。尚、２次記憶手段１４上のプログラムに、改ざんのおそれがない場合は、署名は省略することも可能である。
【００３８】
次に、図１に示す第１の実施の形態に係るプログラム実行装置１１の各構成手段について、詳細に説明する。
【００３９】
計算手段１２は、２次記憶手段１４に蓄積されたプログラムＡ１４１を１次記憶手段１３のプログラム格納領域１３１へ複製する。又、計算手段１２は、ページに分割された実行可能な命令列よりなるプログラムＡ１４１を実行し、１次記憶手段１３や２次記憶手段１４の内容を四則演算等により更新する。又、計算手段１２は、特権プログラム機能呼び出し手段１６から特権プログラムが呼び出されたことを通知された場合、メッセージダイジェスト検証手段１５に、その旨を通知する。更に、計算手段１２は、メッセージダイジェスト検証手段１５から検証結果を受信し、検証結果に基づいて、プログラムの実行を停止する。尚、計算手段１２は、実行するプログラムに署名が添付されている場合、プログラムを複製する前に署名の検証を行う。
【００４０】
１次記憶手段１３は、２次記憶手段１４に蓄積されたプログラムの一部又は全部を複製し、蓄積する。１次記憶手段１３は、１つ又は複数のプログラムの複製を蓄積するためのプログラム格納領域１３１と、特権プログラム１３２とを有する。又、１次記憶手段１３は、２次記憶手段１４に比べ、高速に読み書きできることが求められることから、例えば、ＲＡＭなどのデバイスを用いることが望ましい。
【００４１】
第１の実施の形態に係るプログラム格納領域１３１は、例えば、図６に示すように、１つのプログラムに対し、３つのプログラムのページを格納するページ格納領域１３１ａを有する。
【００４２】
２次記憶手段１４は、１つ又は複数のプログラムを蓄積する。２次記憶手段１４は、より多くのプログラムを蓄積することが望まれるため、ハードディスクやフラッシュメモリなど比較的安価なデバイスを用いて実現することが望ましい。
【００４３】
メッセージダイジェスト蓄積手段１７は、プログラムを実行する前に当該プログラムの各メッセージダイジェストを蓄積する。又、メッセージダイジェスト蓄積手段１７は、図１に示すように、他の構成手段と独立した構成としてもよく、特権プログラムの機能として１次記憶手段１３や２次記憶手段１４上に実装してもよいが、特権プログラム以外のプログラムからは読み書きできない記憶空間としておく必要がある。
【００４４】
特権プログラム機能呼び出し検出手段１６は、特権プログラムが呼び出されたことを検出する。プログラムＡ１４１等の通常のプログラムは、ファイルへのアクセス等、高度で複雑な処理は特権プログラムに処理を依頼し、処理結果を特権プログラムから受け取ることにより処理を実現する。特権プログラム機能呼び出し検出手段１６は、このように特権プログラムが呼び出されたタイミングを検出し、計算手段１２へ通知する。そして、計算手段１２は、メッセージダイジェスト検証手段１５へ特権プログラムが呼び出されたことを通知する。
【００４５】
メッセージダイジェスト検証手段１５は、特権プログラムが呼び出された場合、１次記憶手段１３上にあるプログラムのページのメッセージダイジェストを計算し、予めメッセージダイジェスト蓄積手段１７に蓄積された当該プログラムのページのメッセージダイジェストと比較する。メッセージダイジェスト検証手段１５は、比較結果が一致すれば、プログラムの改ざんがないことを、比較結果が異なれば、プログラムの改ざんがあったことを計算手段１２に通知する。図１では、メッセージダイジェスト検証手段１５は、独立した構成とするが、特権プログラムの機能として実現してもよい。
【００４６】
入出力手段１８は、データの入力あるいは出力を行う。入力手段としては、キーボード、マウス等の機器などが用いられ、フロッピーディスク（登録商標）装置、ＣＤ−ＲＯＭ装置、ＤＶＤ装置等も含む。入力手段から入力操作が行われると対応するキー情報や位置情報が計算手段１２に伝達される。又、出力手段としては、モニタなどの画面が用いられ、液晶表示装置（ＬＣＤ）、発光ダイオード（ＬＥＤ）パネル、エレクトロルミネッセンス（ＥＬ）パネル等が使用可能である。又、入出力手段１８は、インターネットなどを介して外部との通信を行う通信手段として機能してもよい。この場合、入出力手段１８は、プログラムＡや後に詳述する署名の検証時に必要な公開鍵をインターネットを介してダウンロードすることができる。
【００４７】
又、第１の実施の形態に係るプログラム実行装置１１は、処理制御装置（ＣＰＵ）を有し、計算手段１２、メッセージダイジェスト検証手段１５、特権機能プログラム呼び出し検出手段１６などをモジュールとしてＣＰＵに内蔵する構成とすることができる。これらのモジュールは、パーソナルコンピュータ等の汎用コンピュータにおいて、所定のプログラム言語を利用するための専用プログラムを実行することにより実現することができる。
【００４８】
又、図示していないが、プログラム実行装置１１は、計算処理、メッセージダイジェスト検証処理、特権プログラム機能呼び出し検出処理などを処理制御装置（ＣＰＵ）に実行させるためのプログラムを蓄積するプログラム保持部を備えてもよい。プログラム保持部は、例えば、ＲＡＭ、ＲＯＭ、ハードディスク、フレキシブルディスク、コンパクトディスク、ＩＣチップ、カセットテープなどの記録媒体である。このような記録媒体によれば、プログラムの蓄積、運搬、販売などを容易に行うことができる。
【００４９】
（プログラム実行方法）
次に、第１の実施の形態に係るプログラム実行方法について、説明する。ここでは、プログラムＡ１４１を実行する。
【００５０】
まず、プログラムＡをＣ言語で記述したものを図７に示す。図７（ａ）は、プログラムＡのコード、即ち、関数main、funcA、funcBの定義を含む。又、図７（ａ）の中の関数funcBは、libcなどの共通ライブラリに含まれる関数とし、図７（ｂ）にその定義を示す。これらをコンパイルし、プログラム実行装置１１の計算手段１２で実行可能な命令列に変換し、ページに分割した例を図８に示す。
【００５１】
図８では、最左列にアドレスを、中央列にラベルを、最右列に命令列の一部を記述している。最左列のアドレスは、プログラム内における命令の格納順を表し、ラベルはJUMP命令等の制御命令の指定のために便宜上付しているプログラムの位置情報である。命令列の一部について、以下に説明する。
【００５２】
CALL命令は、指定された関数を呼び出して実行することを意味し、RET命令により元の実行位置に戻ることとする。INTR命令は、特権プログラムの機能呼び出しを行うことを示し、JUMP命令は、指定されたアドレス（ラベル）へプログラムの実行を移すものとする。尚、ここでは、説明を簡便にするため、条件分岐をＣ言語のまま記述するが、一般的なプログラム実行装置の条件分岐命令などに変換することは容易に可能である。
【００５３】
図７及び図８に示したプログラムＡを実行することを例にとり、以下に、プログラム実行方法について図９〜図１２を用いて説明する。
【００５４】
まず、プログラム実行装置１１の計算手段１２は、２次記憶手段１４よりプログラムＡを検索して、実行を開始する。このとき、第１の実施の形態では、プログラムＡに署名が添付されていることから、図９のステップＳ３０１において、計算手段１２は、署名の検証を行う。
【００５５】
具体的には、図１０に示すように、Ｘ，Ｖを初期化し（ステップＳ４０１）、Ｎ個のメッセージダイジェストがすべて関数Ｈ（ｘ）によって計算されるまで繰り返す（ステップＳ４０２〜４０４）。そして、関数Ｄ（ｘ，ｙ）を計算し、メッセージダイジェストＶと一致するか否か判断する（ステップＳ４０５）。ここで、関数Ｄ（ｘ，ｙ）は公開鍵暗号等で利用する復号化関数であり、図５に示すＳ（ｘ，ｙ）と対になるものを利用すればよい。ステップＳ４０５における関数Ｄ（ｘ，ｙ）の引数Ｋpは、署名者、この場合はプログラム作成者の公開鍵であり、予め取得しておくことが望ましい。これは、プログラム実行装置１１に対し、外部との通信が可能な入出力手段を負荷し、検証時にこの入出力手段を通じて取得することも可能である。署名が正しければ、図９のステップＳ３０２へ進み、正しくない場合は、ステップＳ４０６へ進み、プログラムの実行を停止する。
【００５６】
次に、図９のステップＳ３０２において、計算手段１２は、２次記憶手段１４に蓄積されたプログラムＡ１４１を１次記憶手段１３のプログラム格納領域１３１へ複製する。又、計算手段１２は、プログラムＡ１４１に含まれるメッセージダイジェストをメッセージダイジェスト蓄積手段１７へ複製する。
【００５７】
プログラムＡは、図７及び図８に示す命令列となっていることから、計算手段１２は、プログラムをページ１、ページ２、ページ４、ページ１、ページ２、ページ３の順に実行していき、以後これを繰り返す。プログラム１１は、初めてページ１の命令列を実行するとき、まず、ページ１の内容を２次記憶手段１４から１次記憶手段１３へ複製する。１次記憶手段１３には複数のプログラム格納領域が存在するが、その特定はプログラム実行時に各プログラムを一意に識別するＩＤを付与することなどにより、容易に可能である。
【００５８】
プログラムの複製は、具体的には、図１１に示すように、プログラム格納領域１３１のページ格納領域に空きがあるか否か判断する（ステップＳ５０１）。空きがある場合は、空いているページ格納領域にページを複製し（ステップＳ５０２）、空きがない場合は、最も古く利用されたページ格納領域の内容を消去し、上書きする（ステップＳ５０３）。
【００５９】
次に、図９のステップＳ３０３において、計算手段１２は、プログラムＡを実行する。
【００６０】
次に、図９のステップＳ３０４において、特権プログラム呼び出し検出手段１６は、特権プログラムが呼び出されたか否か検出する。例えば、２次記憶手段１４から１次記憶手段１３への複製は、特権プログラムの機能として実現することも可能である。この場合、複製時に、特権プログラム機能呼び出し検出手段１６は、特権プログラム機能呼び出しを検出する。特権プログラム機能が呼び出された場合は、ステップＳ３０５へ進み、呼び出されなかった場合は、ステップＳ３０２へ戻る。
【００６１】
次に、ステップＳ３０５において、特権プログラム機能呼び出し手段１６から特権プログラム機能の呼び出しの通知を受けた計算手段１２は、一旦プログラムＡの実行を停止する。
【００６２】
そして、ステップＳ３０６において、計算手段１２から通知を受けたメッセージダイジェスト検証手段１５は、メッセージダイジェストの計算を行う。
【００６３】
具体的には、図１２に示すように、メッセージダイジェスト検証手段１５は、１次記憶手段１３上のページに対するメッセージダイジェストＶ’を計算し（ステップＳ６０１）、メッセージダイジェスト蓄積手段１７に蓄積されたメッセージダイジェストＶを取得する（ステップＳ６０２）。そして、メッセージダイジェストＶ’とメッセージダイジェストＶとを比較し（ステップＳ６０３）、異なる場合は、改ざんがあったとして、プログラムの実行を停止する（ステップＳ３０４）。メッセージダイジェストＶ’とメッセージダイジェストＶとが一致する場合は、改ざんはなかったとして、図９のステップＳ３０７へ進む。
【００６４】
そして、プログラムが終了するまでステップＳ３０２〜３０６を繰り返す。
【００６５】
以下、図７及び図８に示すプログラムＡを続けて実行した場合の動作について、詳細に説明する。
【００６６】
ページ１内のプログラムの実行を進めると、特権プログラムの機能呼び出し（図８の２０１）が存在することから、プログラム実行装置１１は、プログラムＡの実行中、特権プログラムの機能呼び出しを行う。特権プログラム機能呼び出し検出手段１６がこれを検出すると、プログラム実行装置１１は、一旦プログラムＡの実行を停止し、１次記憶手段１３上にあるプログラムＡのページ１の複製を用いてメッセージダイジェストの計算を行う。プログラムＡの実行を停止する際に、計算手段１２は、プログラムＡの実行中のアドレスを記憶しておけば、計算手段１２は、検証すべきページがページ１であることを容易に知り得、メッセージダイジェストの計算が可能である。
【００６７】
ページ１が改ざんされていれば、プログラム実行装置１１はプログラムＡの実行を停止するが、改ざんが検知されなければ実行を進める。
【００６８】
プログラム実行装置１１は、プログラムＡの実行を更に進めると、図８の関数funcAを呼び出す（図８の２０３）。関数funcAのはページ２にあることから、プログラム実行装置１１は、ページ２を２次記憶手段１４より図１１に示す手順に従って、１次記憶手段１３に複製し、関数funcAの命令列を実行する。
【００６９】
関数funcAの実行中、再度特権プログラム機能の呼び出しを行う（図８の２０２）。このとき、プログラム実行装置１１は、ページ２に関してもメッセージダイジェスト検証手段１５を用いてページが改ざんされているか否か検証を行う。
【００７０】
プログラム実行装置１１は、更にプログラムＡの実行を進めると、関数funcBを呼び出し、ページ４に実行を移すため、ページ４を２次記憶手段１４より複製する。関数funcBの中にも特権プログラム機能呼び出し（図８の２０４）があることから、プログラム実行装置１１はこれを実行する。特権プログラム機能呼び出し検出手段１６により、特権プログラム機能呼び出しを検出したプログラム実行装置１１は、ページ４が改ざんされているか否かの検証を行う。
【００７１】
プログラム実行装置１１は、プログラムＡの実行中、関数funcBの処理が終わると、RET命令（図８の２０５）により、関数funcAに実行を移す。条件分岐のための設定を行った後、JUMP命令で実行を移し、RET命令により関数funcAも終了して、ページ１に実行を移す（図８の２０７）。
【００７２】
このとき、funcAはページ２に、mainはページ１にあるため、１次記憶手段１３上にあるプログラム格納領域にあるページは、古い順にページ１、ページ２、ページ４となる。
【００７３】
関数funcAの終了後、JUMP命令（図８の２０７）によりプログラムの実行は、図８の２０１から２０７の間を繰り返す。よって、プログラム実行装置１１は、再び関数funcAの実行を行う。
【００７４】
関数funcAの実行は、前回の実行から条件判定の値が異なるため、特権プログラム機能の呼び出し（図８の２０２）の後、条件判定により、関数funcCを呼び出す。関数funcCはページ３にあるため、２次記憶手段１４より１次記憶手段１３に図１１に示す手順によって複製するが、既に１次記憶手段１３の格納領域はいっぱいのため、一番古く利用されたページ４の複製を廃棄し、ページ格納領域３にページ３を複製する。
【００７５】
関数funcCも特権プログラムの機能呼び出しを呼び出すことから、このときにページ４が改ざんされているか検証を行う。
【００７６】
以後、ページ１、ページ２、ページ４、ページ１、ページ２、ページ３の順でプログラムの実行を繰り返す。
【００７７】
（作用及び効果）
第１の実施の形態に係るプログラム実行装置及びプログラム実行方法によると、特権プログラムが呼び出されたときに改ざんの有無を検証するため、効率良くプログラムの改ざんを検知することができる。
【００７８】
又、第１の実施の形態に係るプログラム実行装置及びプログラム実行方法によると、メッセージダイジェスト（ハッシュ値）を用いて改ざんの有無を検証することができる。
【００７９】
又、第１の実施の形態に係るプログラム実行装置及びプログラム実行方法によると、１次記憶手段１３と２次記憶手段１４との間のプログラムの複製の管理単位より、改ざん検証を行う単位（メッセージダイジェストの計算を行う単位）を小さくすることができる。このような構成によると、１次記憶手段１３と２次記憶手段１４との間の複製の手間を省くことができ、高速にプログラム実行を行いつつ、改ざんの検知を行うことができる。
【００８０】
＜第２の実施の形態＞
第２の実施の形態では、第１の実施の形態において説明した特権プログラム機能呼び出し検出手段だけでなく、周期的な時間の経過を通知可能なタイマ手段からの通知に基づいて、プログラムが改ざんされているか否かの検証を行う。
【００８１】
（プログラム実行装置）
第２の実施の形態に係るプログラム実行装置１１は、図１３に示すように、計算手段１２と、１次記憶手段１３と、２次記憶手段１４と、メッセージダイジェスト検証手段１５と、特権プログラム機能呼び出し検出手段１６と、メッセージダイジェスト蓄積手段１７と、入出力手段１８と、タイマ手段１９とを備える。
【００８２】
タイマ手段１９は、プログラムの実行が開始されてから所定の時間間隔で、時間の経過を計算手段１２へ通知する。所定の時間は、プログラムの実行開始時に設定されてもよく、プログラム実行装置１１を起動したときに設定されてもよい。
【００８３】
計算手段１２は、タイマ手段１９から通知を受ける度に、メッセージダイジェスト検証手段１５へ所定の時間が経過したことを通知する。
【００８４】
メッセージダイジェスト検証手段１５は、特権プログラムが呼び出された場合、あるいは、所定の時間が経過した場合、１次記憶手段１３上にあるプログラムのページのメッセージダイジェストを計算し、予めメッセージダイジェスト蓄積手段１７に蓄積された当該プログラムのページのメッセージダイジェストと比較する。メッセージダイジェスト検証手段１５は、比較結果が一致すれば、プログラムの改ざんがないことを、比較結果が異なれば、プログラムの改ざんがあったことを計算手段１２に通知する。
【００８５】
計算手段のその他の動作、１次記憶手段１３、２次記憶手段１４、メッセージダイジェスト検証手段１５のその他の動作、特権プログラム機能呼び出し検出手段１６、メッセージダイジェスト蓄積手段１７、入出力手段１８については、第１の実施の形態と同様であるので、ここでは説明を省略する。
【００８６】
（プログラム実行方法）
次に、第２の実施の形態に係るプログラム実行方法について、図１４を用いて説明する。
【００８７】
まず、ステップＳ７０１〜Ｓ７０３については、図９のステップＳ３０１〜３０３と同様であるので、ここでは説明を省略する。
【００８８】
ステップＳ７０４において、特権プログラム呼び出し検出手段１６は、特権プログラムが呼び出されたか否か検出する。そして、タイマ手段１９は、一定時間が経過したか否か検出する。特権プログラム機能の呼び出し、あるいは、一定時間が経過した場合、ステップＳ７０５へ進み、どちらにも該当しない場合は、ステップＳ７０２へ戻る。
【００８９】
ステップＳ７０５〜７０７については、図９のステップＳ３０５〜３０７と同様であるので、ここでは説明を省略する。
【００９０】
（作用及び効果）
第２の実施の形態に係るプログラム実行装置１１及びプログラム実行方法によると、タイマ手段１９を備えることにより、第１の実施の形態よりプログラムが改ざんされたか否か検証を行う頻度が増し、より確実に改ざんを検知することができる。
【００９１】
＜第３の実施の形態＞
第１の実施の形態では、特権プログラム機能を呼び出したページしかページの改ざん検証を行わないが、第３の実施の形態では、関数呼び出し履歴蓄積手段に蓄積されたページについても改ざん検証を行う。
【００９２】
（プログラム実行装置）
第３の実施の形態に係るプログラム装置１１は、図１５に示すように、計算手段１２と、１次記憶手段１３と、２次記憶手段１４と、メッセージダイジェスト検証手段１５と、特権プログラム機能呼び出し検出手段１６と、メッセージダイジェスト蓄積手段１７と、入出力手段１８と、関数呼び出し履歴蓄積手段２０とを備える。
【００９３】
関数呼び出し履歴蓄積手段２０は、プログラムが実行されたときの関数呼び出しの履歴を蓄積する。一般にプログラムの実行を行う際、このような関数呼び出しの履歴は、プログラム毎にスタックと呼ばれるデータ構造として１次記憶手段１３上に蓄積されることから、関数呼び出し履歴蓄積手段２０は、このようなデータ構造で代用することも可能である。
【００９４】
第３の実施の形態では、このスタックを用いて関数呼び出し履歴蓄積手段２０を実現する例を、図１６を用いて説明する。
【００９５】
プログラム実行装置１１は、プログラムを実行中、新たな関数を呼び出す度に、フレームと呼ばれるデータ構造をスタックに積み上げ、関数の実行が終了すると、スタックからフレームの内容を消去することを繰り返す。この操作は、最後に積み上げたフレームからしか消去できないラストインファーストアウトの形式で行う。図１６では、スタック中にフレーム２０ａとフレーム２０ｂの２つのフレームが積み上げられている例を示している。フレームの中には関数実行中のみ参照可能な局所変数を格納する局所変数領域と、一段前のフレームのスタック上の位置を示すオールドベースポインタと、関数呼び出し元のプログラムの実行位置を表す戻り先アドレスと、関数の呼び出しの際に与える引数を格納する引数領域が含まれる。関数呼び出し時におけるスタックの動作については、非特許文献２に詳しい。
【００９６】
スタックのフレームに含まれる構成要素のうち、戻り先アドレスは関数を呼び出す際の呼び出し元の実行位置を示す。
【００９７】
例えば、プログラム実行装置１１が、図７及び図８に示すプログラムを実行中であるとすると、図１６のスタックの構成例は、フレーム２０ａが図８の２０３の位置で関数funcAを呼び出したときに作成されるフレームであり、フレーム２０ｂが図８の２０２の位置で関数funcBを呼び出したときに作成されるフレームであることを表す。よって、それぞれの戻り先アドレスには、0x00400300、0x00407000が入る。
【００９８】
この戻り先アドレスから呼び出し元プログラムのページを特定する方法は幾通りもあるが、例えば、プログラムのページの大きさを固定長としておき、戻り先アドレスの下位アドレスを０とすれば、ページの先頭アドレスに一致することから、容易に特定可能である。
【００９９】
ここでは、下位６ビットを０として扱うようにすれば、0x00400300、0x00407000は、0x00400000、0x00404000となり、ページ１、ページ２の先頭アドレスに一致する。第３の実施の形態では、このように関数の呼び出し元のページに変換したものを、関数呼び出し履歴蓄積手段として扱う。
【０１００】
図１７に、図７及び図８に示すプログラムを実施したときの関数呼び出し履歴蓄積手段２０の蓄積内容を示す。
【０１０１】
ページの改ざん検知は、第１の実施の形態では、特権プログラム機能を呼び出したページしか行わないが、第３の実施の形態では、関数呼び出し履歴蓄積手段２０に含まれるページも改ざん検知を行う。即ち、メッセージダイジェスト検証手段１５は、関数呼び出し履歴蓄積手段２０に蓄積されているページの改ざんの有無を検証する。この場合、例えば、図８の２０２の位置において、特権プログラム機能の呼び出しが含まれなかった場合、第１の実施の形態では、ページ２の改ざんを検知することができないが、第３の実施の形態では、図８の２０２の位置において、関数呼び出し履歴蓄積手段２０にページ２が含まれるため、ページの検証を行うことが可能である。
【０１０２】
計算手段１２、１次記憶手段１３、２次記憶手段１４、メッセージダイジェスト検証手段１５のその他の動作、特権プログラム機能呼び出し検出手段１６、メッセージダイジェスト蓄積手段１７、入出力手段１８については、第１の実施の形態と同様であるので、ここでは説明を省略する。
【０１０３】
（プログラム実行方法）
次に、第３の実施の形態に係るプログラム実行方法について、図９及び図１８を用いて説明する。
【０１０４】
第３の実施の形態に係るプログラム実行方法は、図９に示す第１の実施の形態に係るプログラム実行方法と、メッセージダイジェストの計算（ステップＳ３０６）の詳細のみが異なる。
【０１０５】
メッセージダイジェストの計算の詳細は、図１８に示すように、メッセージダイジェスト検証手段１５は、関数呼び出し履歴蓄積手段２０上のページに対するメッセージダイジェストＶ’を計算し（ステップＳ８０１）、メッセージダイジェスト蓄積手段１７に蓄積されたメッセージダイジェストＶを取得する（ステップＳ８０２）。そして、メッセージダイジェストＶ’とメッセージダイジェストＶとを比較し（ステップＳ８０３）、異なる場合は、改ざんがあったとして、プログラムの実行を停止する（ステップＳ８０４）。メッセージダイジェストＶ’とメッセージダイジェストＶとが一致する場合は、改ざんはなかったとして、図９のステップＳ３０７へ進む。
【０１０６】
第３の実施の形態において、図９のステップＳ３０６以外のステップは、第１の実施の形態と同様であるので、ここでは説明を省略する。
【０１０７】
（作用及び効果）
第３の実施の形態に係るプログラム実行装置１１及びプログラム実行方法によると、関数呼び出し履歴蓄積手段２０を備えることにより、共通関数などから特権プログラムの機能を呼び出した場合でも、プログラムの改ざんを検知することができる。
【０１０８】
＜第４の実施の形態＞
第４の実施の形態では、メッセージダイジェスト蓄積手段が、検証が行われた時刻を蓄積することにより、一定の時刻が経過していない場合は、メッセージダイジェストを再計算しない。
【０１０９】
（プログラム実行装置）
第４の実施の形態に係るプログラム装置１１は、図１に示すように、計算手段１２と、１次記憶手段１３と、２次記憶手段１４と、メッセージダイジェスト検証手段１５と、特権プログラム機能呼び出し検出手段１６と、メッセージダイジェスト蓄積手段１７と、入出力手段１８とを備える。
【０１１０】
メッセージダイジェスト蓄積手段１７は、図１９に示すように、メッセージダイジェスト１７ａ、各ページが検証された時刻１７ｂ、検証を行うか否かを判定するしきい値１７ｃとを備える。
【０１１１】
計算手段１２は、現在時刻と検証時刻１７ｂとの差が、検証時刻しきいい値１７ｃより大きい場合のみ、メッセージダイジェスト検証手段１５に、改ざん検知の検証を行う通知を行う。
【０１１２】
メッセージダイジェスト検証手段１５は、予め定められた時間内に既に検証を行ったページについては、改ざんの有無を検証しない。
【０１１３】
例えば、現在の時刻がＴであり、ページ１において特権プログラム機能呼び出しが行われたとする。ページ１が最後に改ざんされたか否かを検証した時刻はＴ１であることから、現在時刻との差分Ｔ−Ｔ１が検証時刻しきい値１７ｃより小さければ、１次記憶手段１３にあるページ１のメッセージダイジェストを再計算する必要はないと判断する。このようにすれば特権プログラム機能の呼び出しを検出した際に、ページが改ざんされたか否かを検証する必要がない。
【０１１４】
又、検証時刻しきい値１７ｃの値は、プログラム実行装置１１の負荷が高いときは大きく、負荷が小さいときは小さく動的に変更することも可能である。
【０１１５】
計算手段１２のその他の動作、１次記憶手段１３、２次記憶手段１４、メッセージダイジェスト検証手段１５のその他の動作、特権プログラム機能呼び出し検出手段１６、入出力手段１８については、第１の実施の形態と同様であるので、ここでは説明を省略する。
【０１１６】
（プログラム実行方法）
次に、第４の実施の形態に係るプログラム実行方法について、図９及び図２０を用いて説明する。
【０１１７】
第４の実施の形態に係るプログラム実行方法は、図９に示す第１の実施の形態に係るプログラム実行方法と、メッセージダイジェストの計算（ステップＳ３０６）の詳細のみが異なる。
【０１１８】
メッセージダイジェストの計算の詳細は、図２０に示すように、まず、計算手段１２は、特権プログラム機能の呼び出しが検出されたページの検証時刻が検証時刻しきい値より大きいか判断する（ステップＳ９０１）。そして、小さい場合は、改ざん検知を行わず、図９のステップＳ３０７へ進む。大きい場合は、メッセージダイジェスト検証手段１５は、該当するページに対するメッセージダイジェストＶ’を計算し（ステップＳ９０２）、メッセージダイジェスト蓄積手段１７に蓄積されたメッセージダイジェストＶを取得する（ステップＳ９０３）。そして、メッセージダイジェストＶ’とメッセージダイジェストＶとを比較し（ステップＳ９０４）、異なる場合は、改ざんがあったとして、プログラムの実行を停止する（ステップＳ９０５）。メッセージダイジェストＶ’とメッセージダイジェストＶとが一致する場合は、改ざんはなかったとして、図９のステップＳ３０７へ進む。
【０１１９】
第４の実施の形態において、図９のステップＳ３０６以外のステップは、第１の実施の形態と同様であるので、ここでは説明を省略する。
【０１２０】
（作用及び効果）
第４の実施の形態に係るプログラム実行装置１１及びプログラム実行方法によると、メッセージダイジェスト蓄積手段１７が検証時刻１７ｂ及び検証時刻しきい値１７を備え、現在時刻と検証時刻との差が検証時刻しきい値より大きい場合のみ、改ざんの検知を行う。このように、特権プログラム機能の呼び出しを検出した場合にすべて必ずページが改ざんされたか否かを検証するわけではないため、検証を行う回数を減らすことができ、高速にプログラム実行を行いつつ、改ざんの検知を行うことができる。
【０１２１】
＜第５の実施の形態＞
第５の実施の形態では、プログラムＡに記述された改ざん検証を行うか否かのフラグ及び負荷に応じて、ページの改ざん検証を行う。
【０１２２】
（プログラム実行装置）
第５の実施の形態に係るプログラム装置１１は、図２１に示すように、計算手段１２と、１次記憶手段１３と、２次記憶手段１４と、メッセージダイジェスト検証手段１５と、特権プログラム機能呼び出し検出手段１６と、メッセージダイジェスト蓄積手段１７と、入出力手段１８と、負荷計測手段２１とを備える。
【０１２３】
負荷計測手段２１は、改ざん検証を行うプログラム単体の負荷、プログラム実行装置１１全体の負荷のいずれか、あるは、両方を計測する。負荷の計測には、様々な方法があるが、例えば、単位時間あたりに計算手段１２が実行する命令の数やプログラム実行装置１１で実行中のプログラムの数などを用いればよい。
【０１２４】
プログラムＡ１４１は、図２２に示すように、計算手段１２に与える命令列１４１ａと、命令列を分割したページ毎に与えられるメッセージダイジェスト１４１ｂと、ページ毎のメッセージダイジェストへの署名１４１ｃと、改ざん検証を行うか否かを示すフラグ１４１ｄとにより構成される。このように、プログラム作成者はプログラムの各ページに対し、フラグ１４１ｄをプログラムに記しておくこととし、「○」が検証を行う、「×」が検証を行わないと解釈する。このフラグ１４１ｄの記述は、プログラム作成者が手動で行ってもよく、ページ当たりの特権プログラム機能の呼び出しの数が、一定の値より大きければ検するなど自動で行ってもよい。
【０１２５】
１次記憶手段１３上のプログラム格納領域１３１は、図２３に示すように、ページ格納領域１３１ａ毎にフラグ１３１ｂを有する。計算手段１２が２次記憶手段１４から１次記憶手段１３へページを複製するとき、プログラムＡ１４１のフラグ１４１ｄの値をプログラム格納領域１３１のフラグ１３１ｂへに複製する。
【０１２６】
計算手段１２は、特権プログラム機能の呼び出しが検出された際、フラグ１３１ｂの値を確認して、改ざん検証を行うべきという情報が記述してあれば、メッセージダイジェスト検証手段１５へ改ざん検証を行うことを通知する。
【０１２７】
メッセージダイジェスト検証手段１５は、フラグ１３１ｂの値に応じて、ページの改ざんの有無を検証する。
【０１２８】
又、フラグが「○」である場合、すぐに検証を行うとし、「×」である場合、負荷計測手段２１によって計測された負荷が高い場合、あとで検証を行うとしてもよい。この場合、負荷が下がってきたときに、ページが改ざんされたか否かの検証を行うとする。
【０１２９】
即ち、メッセージダイジェスト検証手段１５は、負荷計測手段２１によって計測された負荷が高い場合、プログラム実行中は検証すべきプログラムのページを記録しておき、負荷計測手段２１によって計測された負荷が低くなったときに、まとめて改ざんの検証を行う。
【０１３０】
計算手段１２のその他の動作、２次記憶手段１４、メッセージダイジェスト検証手段１５のその他の動作、特権プログラム機能呼び出し検出手段１６、入出力手段１８については、第１の実施の形態と同様であるので、ここでは説明を省略する。
【０１３１】
（プログラム実行方法）
次に、第５の実施の形態に係るプログラム実行方法について、図９及び図２４を用いて説明する。
【０１３２】
第５の実施の形態に係るプログラム実行方法は、図９に示す第１の実施の形態に係るプログラム実行方法と、メッセージダイジェストの計算（ステップＳ３０６）の詳細のみが異なる。
【０１３３】
メッセージダイジェストの計算の詳細は、図２４に示すように、まず、負荷計測手段２１は、プログラムの負荷やプログラム実行装置１１の負荷を計測する（ステップＳ１００１）。計算手段１２は、プログラム格納領域１３１のフラグ１３１ｂと負荷計測手段２１に応じて、改ざん検知を行うか否か判断する（ステップＳ１００２）。そして、改ざん検知を行う場合、メッセージダイジェスト検証手段１５は、該当するページに対するメッセージダイジェストＶ’を計算し（ステップＳ１００２）、メッセージダイジェスト蓄積手段１７に蓄積されたメッセージダイジェストＶを取得する（ステップＳ１００３）。そして、メッセージダイジェストＶ’とメッセージダイジェストＶとを比較し（ステップＳ１００４）、異なる場合は、改ざんがあったとして、プログラムの実行を停止する（ステップＳ１００５）。メッセージダイジェストＶ’とメッセージダイジェストＶとが一致する場合は、改ざんはなかったとして、図９のステップＳ３０７へ進む。
【０１３４】
第５の実施の形態において、図９のステップＳ３０６以外のステップは、第１の実施の形態と同様であるので、ここでは説明を省略する。
【０１３５】
（作用及び効果）
第５の実施の形態に係るプログラム実行装置１１及びプログラム実行方法によると、フラグ及び負荷に応じて、改ざんの検知を行うか否か判断する。
【０１３６】
即ち、第５の実施の形態に係るプログラム実行装置１１及びプログラム実行方法は、ページ毎に有するフラグの値に応じて、ページの改ざんの有無を検証することができる。このため、改ざん検証を行うページを任意に指定することができ、改ざん検証の回数を減らすことができる。
【０１３７】
又、第５の実施の形態に係るプログラム実行装置１１及びプログラム実行方法は、負荷計測手段によって計測された負荷が高い場合、プログラム実行中は検証すべきプログラムのページを記録し、負荷計測手段によって計測された負荷が低くなったときに、ページの改ざんの有無を検証することができる。このため、低い負荷のときにプログラムの改ざん検証を行うことができ、プログラム本来の実行速度を維持することができる。
【０１３８】
（その他の実施形態）
本発明は上記の実施形態によって記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施形態、実施例及び運用技術が明らかとなろう。
【０１３９】
例えば、第１〜第５の実施の形態に係るプログラム実行装置において、検証手段として、メッセージダイジェストを用いた検証を行ったが、検証方法はこれに限られるわけではなく、通常、プログラムの改ざん検証に用いられる方法を適宜選択することができる。
【０１４０】
例えば、計算手段１２、メッセージダイジェスト検証手段１５、特権プログラム機能呼び出し検出手段１６をモジュールとして一つのＣＰＵに備えてもよいと説明したが、それぞれ異なるＣＰＵに備えられ、異なる装置としてもよい。その場合、複数の装置間をバスなどで接続するものとする。
【０１４１】
このように、本発明はここでは記載していない様々な実施形態等を含むことは勿論である。従って、本発明の技術的範囲は上記の説明から妥当な特許請求の範囲に係る発明特定事項によってのみ定められるものである。
【図面の簡単な説明】
【０１４２】
【図１】第１の実施の形態に係るプログラム実行装置の構成ブロック図である。
【図２】第１の実施の形態に係るプログラムＡの構成を示す図である（その１）。
【図３】第１の実施の形態に係るプログラムＡの構成を示す図である（その２）。
【図４】メッセージダイジェストを求める一例を示すフローチャートである。
【図５】署名を算出する一例を示すフローチャートである。
【図６】第１の実施の形態に係るプログラム格納領域の構成を示す図である。
【図７】第１の実施の形態に係るプログラムＡのコードである。
【図８】第１の実施の形態に係るプログラムＡのコードがメモリ上に配置された図である。
【図９】第１の実施の形態に係るプログラム実行方法を示すフローチャートである。
【図１０】第１の実施の形態に係る署名の検証方法（図９のステップＳ３０１）の詳細を示すフローチャートである。
【図１１】第１の実施の形態に係るプログラムの複製方法（図９のステップＳ３０２）の詳細を示すフローチャートである。
【図１２】第１の実施の形態に係るメッセージダイジェストの計算方法（図９のステップＳ３０６）の詳細を示すフローチャートである。
【図１３】第２の実施の形態に係るプログラム実行装置の構成ブロック図である。
【図１４】第２の実施の形態に係るプログラム実行方法を示すフローチャートである。
【図１５】第３の実施の形態に係るプログラム実行装置の構成ブロック図である。
【図１６】第３の実施の形態に係る関数呼び出し履歴蓄積手段の構成を示す図である。
【図１７】第３の実施の形態に係る関数呼び出し履歴蓄積手段に蓄積されるページを示す図である。
【図１８】第３の実施の形態に係るメッセージダイジェストの計算方法（図９のステップＳ３０６）の詳細を示すフローチャートである。
【図１９】第４の実施の形態に係るプログラム実行装置のメッセージダイジェスト蓄積手段の構成を示す図である。
【図２０】第４の実施の形態に係るメッセージダイジェストの計算方法（図９のステップＳ３０６）の詳細を示すフローチャートである。
【図２１】第５の実施の形態に係るプログラム実行装置の構成ブロック図である。
【図２２】第５の実施形態に係るプログラムＡの構成を示す図である。
【図２３】第５の実施形態に係るプログラム格納領域の構成を示す図である。
【図２４】第５の実施の形態に係るメッセージダイジェストの計算方法（図９のステップＳ３０６）の詳細を示すフローチャートである。
【図２５】従来のプログラム実行方法を説明するための図である。
【図２６】従来のプログラム実行装置の構成ブロック図である。
【図２７】従来のプログラム実行方法におけるプログラムの実行タイミングを表す図である。
【符号の説明】
【０１４３】
１１…プログラム実行装置
１２…計算手段
１３…１次記憶手段
１４…２次記憶手段
１５…メッセージダイジェスト検証手段
１６…特権プログラム機能呼び出し検出手段
１７…メッセージダイジェスト蓄積手段
１８…入出力手段
１９…タイマ手段
２０…関数呼び出し履歴蓄積手段
２１…負荷計測手段
【図１】
2006053787.tif 000003
【図２】
2006053787.tif 000004
【図３】
2006053787.tif 000005
【図４】
2006053787.tif 000006
【図５】
2006053787.tif 000007
【図６】
2006053787.tif 000008
【図７】
2006053787.tif 000009
【図８】
2006053787.tif 000010
【図９】
2006053787.tif 000011
【図１０】
2006053787.tif 000012
【図１１】
2006053787.tif 000013
【図１２】
2006053787.tif 000014
【図１３】
2006053787.tif 000015
【図１４】
2006053787.tif 000016
【図１５】
2006053787.tif 000017
【図１６】
2006053787.tif 000018
【図１７】
2006053787.tif 000019
【図１８】
2006053787.tif 000020
【図１９】
2006053787.tif 000021
【図２０】
2006053787.tif 000022
【図２１】
2006053787.tif 000023
【図２２】
2006053787.tif 000024
【図２３】
2006053787.tif 000025
【図２４】
2006053787.tif 000026
【図２５】
2006053787.tif 000027
【図２６】
2006053787.tif 000028
【図２７】
2006053787.tif 000029