(57)【要約】      （修正有）【課題】動的な記憶領域に対する改竄を検出できるようにする。【解決手段】プログラムコードに係る処理の実行に伴って変更され得る情報を記憶する動的な記憶領域２０２ｂに記憶されたアドレス情報を参照し、静的な記憶領域２０２ａに記憶された情報に基づく制御に移行する場合に、第２の改竄検出部２０４により動的な記憶領域から参照したアドレス情報が静的記憶領域の範囲内を指定するものであるか否かをチェックする.参照したアドレス情報が静的記憶領域の範囲内を指定するものでなければ、動的な記憶領域に記憶されたアドレス情報に対して改竄が行われたと判断し、簡単なアドレス情報の比較のみで動的な記憶領域に記憶された情報に対する改竄を容易に検出できるようにする。【選択図】  図２
2006106956.tif 000002
【特許請求の範囲】
【請求項１】
少なくともプログラムコードを含む当該プログラムコードに係る処理を実行する前に確定した情報が記憶され当該情報の改竄が定期的に検査される静的記憶領域と、プログラムコードに係る処理の実行に伴って変更され得る情報が記憶される動的記憶領域とを有する記憶手段と、
上記記憶手段における静的記憶領域の範囲を示すアドレス情報を記憶する領域情報記憶手段と、
上記動的記憶領域に記憶されたアドレス情報を参照して、上記静的記憶領域に記憶された情報に基づく処理を実行する場合に、上記動的記憶領域から参照したアドレス情報が上記領域情報記憶手段に記憶されたアドレス情報で示される静的記憶領域の範囲内を指定するものであるか否かを判定し、上記動的記憶領域に記憶された情報の改竄を検出する検出手段とを備えることを特徴とするソフトウェアの改竄検出装置。
【請求項２】
上記検出手段は、上記動的記憶領域から参照したアドレス情報と、上記領域情報記憶手段に記憶されたアドレス情報とを比較する比較手段と、
上記比較手段による比較結果に基づいて、上記動的記憶領域から参照したアドレス情報が上記静的記憶領域の範囲内を指定するものであるか否かを判定する判定手段とを備えることを特徴とする請求項１記載のソフトウェアの改竄検出装置。
【請求項３】
上記動的記憶領域に記憶されたアドレス情報は、上記プログラムコードに係る分岐処理における分岐先アドレス及び復帰処理における復帰アドレスの少なくとも一方であることを特徴とする請求項１又は２記載のソフトウェアの改竄検出装置。
【請求項４】
上記プログラムコードに係る分岐処理又は復帰処理を実行する前に、上記動的記憶領域に記憶されたアドレス情報を参照して、当該アドレス情報が上記静的記憶領域の範囲内を指定するものであるか否かを判定することを特徴とする請求項３記載のソフトウェアの改竄検出装置。
【請求項５】
少なくともプログラムコードを含む当該プログラムコードに係る処理を実行する前に確定した情報が記憶され当該情報の改竄が定期的に検査される静的記憶領域と、プログラムコードに係る処理の実行に伴って変更され得る情報が記憶される動的記憶領域とを有する記憶部を備える情報処理システムでのソフトウェアの改竄検出方法であって、
上記動的記憶領域に記憶されたアドレス情報を参照して、上記静的記憶領域に記憶された情報に基づく処理を実行する場合に、上記動的記憶領域から参照したアドレス情報が、上記静的記憶領域の範囲を示すアドレス情報により予め規定した静的記憶領域の範囲内を指定するものであるか否かを判定する判定工程と、
上記判定工程での判定結果に基づいて、上記動的記憶領域に記憶された情報の改竄を検出する検出工程とを有することを特徴とするソフトウェアの改竄検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの改竄検出技術に関し、例えばＰＣ（パーソナル・コンピュータ）等の仕様が公開された計算機システムに用いて好適なものである。
【背景技術】
【０００２】
従来、一般的なソフトウェア製品において、プログラムやデータ等の権利保護が必要な場合、プログラムやデータを難読化したり暗号化したりするなどして権利の保護を図っている。しかし、ＰＣ環境に見られるように、ユーザーが様々なツールを用いてソフトウェアの改竄を容易に行える環境下では、上述したような権利保護手法は単なる時間稼ぎに過ぎない面がある。例えば、プログラムやデータを暗号化しても、ソフトウェアで復号化することから暗号強度に意味はない。
【０００３】
ソフトウェアの改竄等の不正を検出する、あるいは防止する技術が求められており、ハードウェアを併用した改竄検出手法が有効である。これは、予め用意した正解との比較を行う外部ハードウェアを搭載し、この外部ハードウェアを用いてプログラムやデータ等が改竄されていないか監視する手法である。
【０００４】
また、コンピュータウィルスに対するウィルス診断機能をソフトウェアであるオブジェクトプログラム自身の中に生成し、オブジェクトプログラム自身でウィルス感染によるオブジェクトプログラムの改竄を検出するようにしたものがある（例えば、特許文献１参照。）。
【０００５】
【特許文献１】特開平７−１４６７８８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述のようにハードウェアを用いて改竄を防止する場合には、実行時に確定するデータ・コード以外の改竄は検出して防止することができるが、実行時に確定するデータ・コードの改竄は検出及び防止が困難であるという問題があった。言い換えれば、コンパイル時に確定するプログラムコードや固定データ等の静的な記憶領域に対する改竄は容易に防止できるが、実行時（実行開始時や実行中）に作成されるデータ等の動的にデータが変更される記憶領域に対する改竄は防止することが非常に困難であった。
【０００７】
例えば、ＣＰＵが実行するプログラムコード列は、ユーザー空間に展開される主プログラム以外に、実行時にリンクされるプログラムコード（ダイナミックリンクライブラリ：ＤＬＬ）、実行時にスタックやヒープに確保される関数へのポインタ（クラスなどのインスタンスを含む。）、及びデータ領域にある関数ポインタの影響を受けながら順次実行される１次元の列として考えられ、この列から逸脱することはない。
【０００８】
しかし、この列のいかなるところにおいても、プログラムやデータ等の改竄により攻撃者が用意したプログラムコードへ分岐して、攻撃者にとって必要な処理の追加や不要な処理のスキップ（不要な処理を飛ばす）等の処理を行った後、再び正規のルートに戻るといったバイパスを作成することができる。上述したように、ハードウェアを併用することで実行前に確定しているデータ・コード、つまり静的なメモリ領域のデータ・コードは保護することができるが、これだけの保護では十分でない。スタックやヒープに展開される、いわゆるクラスのインスタンス等に含まれる関数へのポインタは実行時に確定するものであり、例えばインスタンスの個数もメモリ位置も動的な記憶領域に記憶されるデータであり外部から簡単に特定できるものではない。そのため、上述した従来の手法でチェックすることは困難であり、仮に行ったとしても非常に効率が悪く、スタックやヒープにおける関数ポインタ等の動的な記憶領域におけるデータを改竄してバイパスされうるおそれがある。
【０００９】
本発明は、このような問題に鑑みてなされたものであり、動的な記憶領域に対する改竄を検出できるようにすることを目的とする。
【課題を解決するための手段】
【００１０】
本発明のソフトウェアの改竄検出装置は、プログラムコードに係る処理の実行前に確定した情報が記憶され当該情報の改竄が定期的に検査される静的記憶領域及び処理の実行に伴って変更される情報が記憶される動的記憶領域を有する記憶手段と、静的記憶領域の範囲を示すアドレス情報を記憶する領域情報記憶手段と、動的記憶領域に記憶されたアドレス情報を参照して、静的記憶領域に記憶された情報に基づく処理を実行する場合に、動的記憶領域から参照したアドレス情報が静的記憶領域の範囲内を指定するものであるか否かを判定することで情報の改竄を検出する検出手段とを備える。
【００１１】
上記構成によれば、分岐処理や復帰処理等の制御処理を行うために参照する動的記憶領域に記憶されているアドレス情報が静的記憶領域の範囲内を指定するものであるか否かをチェックすることで、動的記憶領域に記憶されているアドレス情報の改竄を検出可能になる。参照したアドレス情報が静的記憶領域の範囲内を指定するものでなければ、動的記憶領域に記憶されたアドレス情報に対して改竄が行われたことが検出できる。
【発明の効果】
【００１２】
本発明によれば、処理の実行に伴って変更され得る情報を記憶する動的記憶領域に記憶されたアドレス情報を参照して、処理の実行前に確定している情報を記憶する静的記憶領域に記憶された情報に基づく処理を実行する場合に、動的記憶領域から参照したアドレス情報が静的記憶領域の範囲内を指定するものであるか否かを判定する。これにより、動的記憶領域から参照したアドレス情報が静的記憶領域の範囲内を指定するものでない場合には、動的記憶領域に記憶されたアドレス情報に対する改竄が行われたことを検出することができる。したがって、簡単なアドレス情報の比較のみで動的記憶領域に記憶された情報に対する改竄を検出し情報の改竄を防止することが可能となる。
【発明を実施するための最良の形態】
【００１３】
以下、本発明の実施形態を図面に基づいて説明する。
図１は、本発明の実施形態による改竄検出装置を適用した計算機システム１００のハードウェア構成例を示すブロック図である。
【００１４】
本実施形態における計算機システム１００は、図１に示すように、ＣＰＵ１０１と、ＲＯＭ１０２と、ＲＡＭ１０３と、キーボード（ＫＢ）１０９のキーボードコントローラ（ＫＢＣ）１０５と、表示部としてのＣＲＴディスプレイ（ＣＲＴ）１１０のＣＲＴコントローラ（ＣＲＴＣ）１０６と、ハードディスク（ＨＤ）１１１及びフレキシブルディスク（ＦＤ）１１２のディスクコントローラ（ＤＫＣ）１０７と、ネットワークインタフェースカード（ＮＩＣ）１０８と、改竄検出装置（ＤＴＣ）１１４とが、システムバス１０４を介して互いに通信可能に接続された構成としている。
【００１５】
ＣＰＵ１０１は、ＲＯＭ１０２あるいはＨＤ１１１に記憶されたソフトウェア（プログラム）、あるいはＦＤ１１２より供給されるソフトウェア（プログラム）を実行することで、システムバス１０４に接続された各構成部を総括的に制御し、実行するソフトウェアに基づく所望の機能を実現する。すなわち、ＣＰＵ１０１は、所望の機能を実現するための処理プログラムを、ＲＯＭ１０２、あるいはＨＤ１１１、あるいはＦＤ１１２から読み出して実行することで、要求される動作を実現するための制御を行う。
【００１６】
ＲＡＭ１０３は、ＣＰＵ１０１の主メモリあるいはワークエリア等として機能する。ＲＡＭ１０３は、後述するようにプログラムコードや固定データが記憶され、かつ改竄検出装置（ＤＴＣ）１１４により定期的にデータ改竄の有無が検出される静的な記憶（メモリ）領域と、実行時に確定するデータが記憶される動的な記憶（メモリ）領域とからなる。
【００１７】
ＫＢＣ１０５は、ＫＢ１０９や図示していないポインティングデバイス等からの指示入力を制御する。ＣＲＴＣ１０６は、ＣＲＴ１１０の表示を制御する。ＤＫＣ１０７は、ブートプログラム、種々のアプリケーション、ユーザファイル、ネットワーク管理プログラム、および処理プログラム等を記憶するＨＤ１１１およびＦＤ１１２とのアクセスを制御する。ＮＩＣ１０８はネットワーク１１３上の他の装置と双方向にデータをやりとりするためのものである。
【００１８】
改竄検出装置（ＤＴＣ）１１４は、ＲＡＭ１０３等においてＲＯＭ１０２、ＨＤ１１１、あるいはＦＤ１１２からロードされたプログラムコードや固定データが記憶される静的な記憶領域（例えば、ユーザプログラム領域）に記憶されたデータを定期的に調べて改竄が行われたか否かを検出する。この改竄検出装置１１４としては、ハードウェアにより静的な記憶領域を定期的にチェックする公知の改竄検出機構を適用すれば良い。
【００１９】
図２（Ａ）は、図１に示した計算機システムの機能構成例を示すブロック図である。なお、図２（Ａ）においては、計算機システムにて改竄検出を実現するための主要的特徴部のみを図示している。
【００２０】
図２（Ａ）において、処理実行部２０１は、メモリ２０２にロードされたプログラムコードを読み出して実行し、所望の動作を実現するための制御等を行う。処理実行部２０１は、プログラムコードを実行する際、必要に応じてメモリ２０２に記憶されているデータを参照する。メモリ２０２は、静的な記憶領域２０２ａと動的な記憶領域２０２ｂとからなり、静的な記憶領域２０２ａにはロードされたプログラムコードや当該プログラムコードの実行時に不変の固定データが記憶され、動的な記憶領域２０２ｂにはプログラムコードの実行に際して変更されうるデータ（例えば、スタックやヒープにおけるデータ）が記憶される。
【００２１】
第１の改竄検出部２０３は、図１に示した改竄検出装置１１４に相当するものであり、ハードウェアにより構成され、メモリ２０２内の静的な記憶領域２０２ａに記憶されたデータ（プログラムコードを含む。）を定期的に調べて改竄が行われたか否かを検出する。具体的には、第１の改竄検出部２０３は、静的な記憶領域２０２ａに記憶されたデータが正しいもの（改竄が行われていないもの）であるか否かを判定するための正解データを外部あるいは内部に保持しておき、静的な記憶領域２０２ａに記憶されたデータと正解データとを比較し改竄の有無を判定する。
【００２２】
このようにして、第１の改竄検出部２０３により定期的なチェックを行い、ユーザプログラム領域等を含むメモリ２０２内の静的な記憶領域２０２ａに対しては不正を行えないようにしておく。したがって、不正なバイパスコードは、正規の（プログラム）コードが存在するメモリ空間（静的な記憶領域２０２ａ）には確保することができない。
なお、第１の改竄検出部２０３は、判定の結果、静的な記憶領域２０２ａに記憶されたデータが改竄されていると判定した場合には、処理実行部２０１や外部に通知するようにしても良い。
【００２３】
第２の改竄検出部２０４は、メモリ２０２内の動的な記憶領域２０２ｂに記憶されたデータに対して改竄が行われたか否かを検出するものであり、アドレス比較部２０５、判定部２０６、及び検出情報記憶部２０７を有する。
【００２４】
アドレス比較部２０５は、処理実行部２０１によるプログラムコード実行中の、例えば復帰処理や分岐処理等において、動的な記憶領域２０２ｂに記憶されているデータを参照して静的な記憶領域２０２ａに復帰あるいは分岐する際、復帰先あるいは分岐先として指定されるアドレスと静的領域情報記憶部２０８に記憶されているアドレス情報とを比較する。静的領域情報記憶部２０８には、メモリ２０２における静的な記憶領域２０２ａの領域範囲を示すアドレス情報（例えば、領域のスタートアドレスとエンドアドレス）が予め記憶されている。
【００２５】
つまり、アドレス比較部２０５は、動的な記憶領域２０２ｂに記憶されているデータに基づいて処理を行った後、静的な記憶領域２０２ａに記憶されているデータに基づいて処理を行うようにする場合に、静的領域情報記憶部２０８に記憶されている静的な記憶領域２０２ａの範囲を示すアドレス値と復帰先あるいは分岐先として指定されるアドレスとを比較する。
【００２６】
判定部２０６は、アドレス比較部２０５での比較結果に基づいて、動的な記憶領域２０２ｂに記憶されているデータに対して改竄等の不正が行われたか否かを判定する。具体的には、判定部２０６は、アドレス比較部２０５での比較結果、復帰先あるいは分岐先として指定されるアドレスが静的な記憶領域２０２ａの範囲に含まれない場合には、動的な記憶領域２０２ｂのデータに対して改竄が行われたと判定する。
【００２７】
検出情報記憶部２０７は、判定部２０６にて動的な記憶領域２０２ｂのデータに対して改竄等の不正が行われたと判定した場合に、例えば不正が行われた箇所や不正の内容等の不正に係る情報を記憶する。検出情報記憶部２０７に記憶した不正に係る情報は、外部から読み出し可能である。したがって、検出情報記憶部２０７に記憶した不正に係る情報を解析することにより、検出した不正に対する対策を施すことができる。
【００２８】
なお、判定部２０６にて動的な記憶領域２０２ｂのデータに対して改竄等の不正が行われたと判定した場合に直ちに不正に対する対策を施すようにしても良いが、検出情報記憶部２０７に不正に係る情報を記憶しておき、後から検出した不正に対する対策を施すことにより、どの動作で不正が検出されたかを不正を行ったものに特定されることを防止することができ、より高い改竄防止効果を期待することができる。
【００２９】
なお、図２（Ａ）においては、メモリ２０２が静的な記憶領域２０２ａと動的な記憶領域２０２ｂとからなる、つまり、静的な記憶領域２０２ａと動的な記憶領域２０２ｂとのいずれもが連続した１つの領域で構成される場合を一例として示しているが、メモリにおける領域の分割は任意であり、例えば図２（Ｂ）に示すように、複数の静的な記憶領域２０９ａ、２０９ｃ、２０９ｅと複数の動的な記憶領域２０９ｂ、２０９ｄ、２０９ｆとにメモリ２０９が領域分割されていても良い。
【００３０】
図２（Ｂ）に示すようにメモリ２０９の領域を分割した場合には、第１の改竄検出部２０３により静的な記憶領域２０９ａ、２０９ｃ、２０９ｅに対する改竄の有無を検出し、第２の改竄検出部２０４により動的な記憶領域２０９ｂ、２０９ｄ、２０９ｆに対する改竄の有無を検出する。このとき、静的領域情報記憶部２０８には、各静的な記憶領域２０９ａ、２０９ｃ、２０９ｅを示すアドレス情報をテーブル等により記憶する。
【００３１】
次に、上述した本実施形態による改竄検出装置を適用した計算機システムの動作を、具定例を挙げて説明する。なお、以下の説明において、「保護された領域」は、第１の改竄検出部２０３によりデータ（プログラムコードを含む。）が定期的に調べられ改竄の検出が行われるメモリ２０２内の静的な記憶領域であり、上述したように当該領域内には不正なバイパスコード（不正コード）を確保することはできない。一方、「保護されていない領域」は、第２の改竄検出部２０３によりデータ改竄の検出が行われるメモリ２０２内の動的な記憶領域である。
【００３２】
（動作例１）
図３及び図４は、本実施形態における計算機システムの具体的な動作例を説明するための図である。
【００３３】
例えば、図３（Ａ）に示すように、処理Ａを実行し（ステップＳ１）、その後分岐処理１にてポインタ（変数の関数ポインタ、クラスのインスタンス内の仮想関数テーブルへのポインタ）等のアドレス値Ｐ１を参照して分岐・制御を行い（ステップＳ２）、処理Ｂを実行する（ステップＳ３）場合を考える。ステップＳ１〜Ｓ３の処理Ａ、分岐処理１、及び処理Ｂは、保護された領域内のプログラムコード及びデータに基づいて実行される。また、分岐処理１にて参照するアドレス値Ｐ１は、プログラムが動作しながら生成される、つまり動的に生成されるものであり、保護されていない領域に記憶されている。
【００３４】
図３（Ａ）に示したような処理を実行させる場合、従来技術によれば、保護されていない領域に挿入した不正コード列Ｃ１を読み出すためのアドレス値（不正コード列Ｃ１が記憶されているアドレス値）を、分岐処理１にて参照するアドレス値Ｐ１に指定し、不正コードＣ１に処理Ｂに係る分岐先アドレスを指定することで、図３（Ｂ）に示すように処理Ａ→分岐処理１→不正コード→処理Ｂと処理を実行させ、処理Ｂの実行前に不正コードＣ１に応じた処理を実行させることが可能である。
【００３５】
本実施形態における計算機システムでは、図３（Ａ）に示したような処理を処理実行部２０１にて実行させる場合、図４に示すようにして処理を実行する。
まず、ステップＳ１にて保護された領域内のプログラムコード及びデータに基づいて処理Ａを実行する。
【００３６】
次に、ステップＳ２での分岐処理１により保護された領域内のコード列から分岐する場合、ステップＳ２の前段であるステップＳ１Ａにて、第２の改竄検出部２０４により分岐先を示すアドレス値Ｐ１に係る認証を行う。すなわち、ステップＳ１Ａにて、第２の改竄検出部２０４が分岐先を示すアドレス値Ｐ１を評価し、分岐先が保護された領域内であるか否かを判定する。
【００３７】
具体的には、ステップＳ１Ａにて、アドレス比較部２０５が分岐先のアドレス値Ｐ１を参照し、それを静的領域情報記憶部２０８に記憶された静的な記憶領域２０２ａの範囲を示すアドレス情報と比較する。比較の結果、アドレス値Ｐ１が静的な記憶領域２０２ａの範囲内である場合には、判定部２０６は改竄が行われていないと判定する。一方、アドレス値Ｐ１が静的な記憶領域２０２ａの範囲内でない場合には、判定部２０６はアドレス値Ｐ１に対して改竄が行われたと判定し、不正に係る情報を検出情報記憶部２０７に格納する。
【００３８】
その後、ステップＳ２での分岐処理１にて、アドレス値Ｐ１を参照して分岐処理を実行し、さらに不正コードＣ１、及びステップＳ３での処理Ｂを順次実行する。
【００３９】
（動作例２）
図５及び図６は、本実施形態における計算機システムの他の具体的な動作例を説明するための図である。
【００４０】
図５（Ａ）に示すように、処理Ａを実行し（ステップＳ１１）、その後分岐処理１にてアドレス値Ｐ１１を参照して処理Ｂに分岐し（ステップＳ１２）、処理Ｂを実行する（ステップＳ１３）。さらに、処理Ｂを実行した後、復帰処理１にてアドレス値Ｐ１２を参照して処理Ｃに復帰し（ステップＳ１４）、処理Ｃを実行する（ステップＳ１５）場合を考える。ステップＳ１１〜Ｓ１５の処理Ａ、分岐処理１、処理Ｂ、復帰処理１、及び処理Ｃは、保護された領域内のプログラムコード及びデータに基づいて実行され、かつ分岐処理１にて参照するアドレス値Ｐ１１は、保護された領域に記憶される。一方、復帰処理１にて参照するアドレス値Ｐ１２は、プログラムが動作しながら動的に生成されるものであり、保護されていない領域（スタック）に記憶される。
【００４１】
図５（Ａ）に示したような処理を実行させる場合、従来技術によれば、保護されていない領域に挿入した不正コード列Ｃ１１が記憶されているアドレス値を、復帰処理１にて参照するアドレス値Ｐ１２に指定し、不正コードＣ１１に処理Ｃに係る復帰先アドレスを指定することで、図５（Ｂ）に示すように、復帰処理１にて処理Ｃの実行前に不正コードＣ１１に応じた処理を実行させることが可能である。
【００４２】
本実施形態における計算機システムでは、図５（Ａ）に示したような処理を処理実行部２０１にて実行させる場合、図６に示すようにして処理を実行する。
まず、ステップＳ１１にて保護された領域内のプログラムコード及びデータに基づいて処理Ａを実行する。次に、ステップＳ１２での分岐処理１にて、保護された領域に記憶されているアドレス値Ｐ１１を参照して分岐処理を実行し、ステップＳ１３にて処理Ｂを実行する。
【００４３】
続いて、ステップＳ１４での復帰処理１により保護された領域外のアドレス値Ｐ１２を参照して復帰する場合、ステップＳ１４の前段であるステップＳ１３Ａにて、第２の改竄検出部２０４により復帰先を示すアドレス値Ｐ１２に係る認証を行う。ステップＳ１３Ａでの処理は、上述した図５のステップＳ１Ａと同様に、第２の改竄検出部２０４が復帰先を示すアドレス値Ｐ１２を評価し、復帰先が保護された領域内であるか否かを判定する。
【００４４】
その後、ステップＳ１４での復帰処理１にて、アドレス値Ｐ１２を参照して復帰処理を実行し、さらに不正コードＣ１１、及びステップＳ１５での処理Ｃを順次実行する。
【００４５】
なお、動作例１、２において、保護されていない領域に記憶されているアドレス値に対する改竄を検出したら直ちに不正に対する対策（処理の停止等）を行うようにしても良いが、上述したように参照したアドレス値に従って不正コードＣ１、Ｃ１１を実行し、後から検出した不正に対する対策を施すことにより、どの動作で不正が検出されたかを不正を行ったものに特定されることを防止することができ、より高い改竄防止効果を期待することができる。また、動作例１、２においては、分岐処理及び復帰処理を一例として示したが、スタック、ヒープ、コールスタック等の保護されていない領域に記憶された任意の情報を参照して保護された領域に記憶されたプログラムコード及びデータに基づく制御（処理）に移行する任意の処理に適用可能である。
【００４６】
以上、説明したように本実施形態によれば、実行時には既に確定しているプログラムコードや固定データが記憶されるメモリ２０２内の静的な記憶領域（保護された領域）２０２ａについては第１の改竄検出部２０３が定期的に改竄の有無をチェックする。また、スタックやヒープに展開される分岐アドレスや復帰アドレスなどの実行時に変更され得るデータが記憶されるメモリ２０２内の動的な記憶領域（保護されていない領域）２０２ｂについては、動的な記憶領域２０２ｂに記憶されているアドレスを参照して、静的な記憶領域２０２ａに記憶されたプログラムコード及びデータに基づく制御処理を実行するときに、第２の改竄検出部２０４が動的な記憶領域２０２ｂから取得したアドレスが静的な記憶領域の範囲内を指定するものか否か判定し改竄の有無をチェックする。
【００４７】
これにより、メモリ２０２内の動的な記憶領域２０２ｂから参照したアドレスが静的な記憶領域２０２ａの範囲内を指定するものでない場合には、動的な記憶領域２０２ｂに記憶されたアドレスに対する改竄が行われたことを検出することができ、静的な記憶領域２０２ａに対する改竄の有無に加え、簡単なアドレスの比較のみで動的な記憶領域２０２ｂに対する改竄を検出し情報の改竄を防止することができる。
【００４８】
また、保護されていない領域に存在するコードからは、保護された領域内の関数等のコードを直接呼び出せないようにしても良い。具体的には、保護された領域内の関数の入り口でコールスタックを読み出し、読み出したアドレスが保護された領域外、つまり保護されていない領域を指定するものである場合には不正であるとみなす。これにより、保護されていない領域に存在する不正コードから、保護された領域内のコードが呼び出されることを防止することが可能となる。
【００４９】
また、他のソフトウェア・アプリケーション等と共有可能なように、プログラムコードの実行時に動的にリンクされるダイナミックリンクライブラリ（ＤＬＬ）を利用する場合には、改竄や不正が予め防止されているセキュアなＤＬＬであれば、それに制御を移す際に、正規のものであることを認証した後に制御を移すようにすれば、改竄や不正が行われることを防止することが可能である。ＤＬＬが正規のものであることは、例えばハッシュ等を用いて予め保護された領域内に記憶した正解データと比較することで確認することができる。
【００５０】
一方、セキュアでないＤＬＬの場合には、ＤＬＬを利用する場合に予め静的にリンク（スタティックリンク）しておき保護された領域に含めてしまったり、認証部を設けて安全が確認されたＤＬＬの複製を保護された領域内に作成して（他のアプリケーションが使用する場合、同じコードではあるが別なＤＬＬとなるようにして）使用したり、ＤＬＬ内で不正コードにバイパスされても影響が及ばないように適切な処理を行ってから制御を移すようにしたりすれば、改竄や不正が行われることを防止することが可能である。
【００５１】
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化のほんの一例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。
本発明の諸態様を付記として以下に示す。
【００５２】
（付記１）
少なくともプログラムコードを含む当該プログラムコードに係る処理を実行する前に確定した情報が記憶され当該情報の改竄が定期的に検査される静的記憶領域と、プログラムコードに係る処理の実行に伴って変更され得る情報が記憶される動的記憶領域とを有する記憶手段と、
上記記憶手段における静的記憶領域の範囲を示すアドレス情報を記憶する領域情報記憶手段と、
上記動的記憶領域に記憶されたアドレス情報を参照して、上記静的記憶領域に記憶された情報に基づく処理を実行する場合に、上記動的記憶領域から参照したアドレス情報が上記領域情報記憶手段に記憶されたアドレス情報で示される静的記憶領域の範囲内を指定するものであるか否かを判定し、上記動的記憶領域に記憶された情報の改竄を検出する検出手段とを備えることを特徴とするソフトウェアの改竄検出装置。
（付記２）
上記検出手段は、上記動的記憶領域に記憶された情報の改竄を検出した場合に、当該検出した改竄に係る情報をさらに記憶することを特徴とする付記１記載のソフトウェアの改竄検出装置。
（付記３）
上記検出手段は、上記動的記憶領域から参照したアドレス情報と、上記領域情報記憶手段に記憶されたアドレス情報とを比較する比較手段と、
上記比較手段による比較結果に基づいて、上記動的記憶領域から参照したアドレス情報が上記静的記憶領域の範囲内を指定するものであるか否かを判定する判定手段とを備えることを特徴とする付記１又は２記載のソフトウェアの改竄検出装置。
（付記４）
上記動的記憶領域に記憶されたアドレス情報は、上記プログラムコードに係る分岐処理における分岐先アドレス及び復帰処理における復帰アドレスの少なくとも一方であることを特徴とする付記１〜３の何れか１項に記載のソフトウェアの改竄検出装置。
（付記５）
上記プログラムコードに係る分岐処理又は復帰処理を実行する前に、上記動的記憶領域に記憶されたアドレス情報を参照して、当該アドレス情報が上記静的記憶領域の範囲内を指定するものであるか否かを判定することを特徴とする付記４記載のソフトウェアの改竄検出装置。
（付記６）
上記記憶手段における静的記憶領域及び動的記憶領域の少なくとも一方が、複数かつ各々が連続した領域であることを特徴とする付記１〜５の何れか１項に記載のソフトウェアの改竄検出装置。
（付記７）
少なくともプログラムコードを含む当該プログラムコードに係る処理を実行する前に確定した情報が記憶され当該情報の改竄が定期的に検査される静的記憶領域と、プログラムコードに係る処理の実行に伴って変更され得る情報が記憶される動的記憶領域とを有する記憶部を備える情報処理システムでのソフトウェアの改竄検出方法であって、
上記動的記憶領域に記憶されたアドレス情報を参照して、上記静的記憶領域に記憶された情報に基づく処理を実行する場合に、上記動的記憶領域から参照したアドレス情報が、上記静的記憶領域の範囲を示すアドレス情報により予め規定した静的記憶領域の範囲内を指定するものであるか否かを判定する判定工程と、
上記判定工程での判定結果に基づいて、上記動的記憶領域に記憶された情報の改竄を検出する検出工程とを有することを特徴とするソフトウェアの改竄検出方法。
（付記８）
上記検出工程にて、上記動的記憶領域に記憶された情報の改竄を検出した場合に、当該検出した改竄に係る情報を記憶部に記憶する検出情報記憶工程をさらに有することを特徴とする付記７記載のソフトウェアの改竄検出方法。
【図面の簡単な説明】
【００５３】
【図１】本実施形態による改竄検出装置を適用した計算機システムのハードウェア構成例を示すブロック図である。
【図２】本実施形態における計算機システムの機能構成例を示すブロック図である。
【図３】本実施形態における計算機システムの具体的な動作例を説明するための図である。
【図４】本実施形態における計算機システムの具体的な動作例を説明するための図である。
【図５】本実施形態における計算機システムの他の具体的な動作例を説明するための図である。
【図６】本実施形態における計算機システムの他の具体的な動作例を説明するための図である。
【符号の説明】
【００５４】
１００  計算機システム
１０１  ＣＰＵ
１０２  ＲＯＭ
１０３  ＲＡＭ
１０４  システムバス
１１４  改竄検出装置
２０１  処理実行部
２０２  メモリ
２０２ａ  静的な記憶領域
２０２ｂ  動的な記憶領域
２０３  第１の改竄検出部
２０４  第２の改竄検出部
２０５  アドレス比較部
２０６  判定部
２０７  検出情報記憶部
２０８  静的領域情報記憶部
【図１】
2006106956.tif 000003
【図２】
2006106956.tif 000004
【図３】
2006106956.tif 000005
【図４】
2006106956.tif 000006
【図５】
2006106956.tif 000007
【図６】
2006106956.tif 000008