(57)【要約】【課題】スタック領域における、特に関数への引数、ローカル変数の改変を、市販されているコンパイラで作ったプログラムで検知でき、さらに、メモリ故障等による改変の検出も実施可能なコンピュータメモリにおけるスタック領域のデータの保護方法を提供することが課題である。【解決手段】スタック領域２８に記憶するデータの複製、またはデータが大きい場合にハッシュ値（ｃｒｃ）を同時にスタック領域２８に保存し、プログラムの実施時、記憶したデータまたはハッシュ値（ｃｒｃ）と、複製データまたは再計算したハッシュ値（ｃｒｃ）とを比較し、両者が異なっていたとき、プログラムの実行を中止し、スタック領域に記憶したデータに異常があることをユーザに通知するようにした。【選択図】  図２
2010198147.tif 000002
【特許請求の範囲】
【請求項１】
プログラムによりコンピュータメモリにおけるスタック領域に、関数への引数、関数の戻り番地、フレームポインタ保存値、ローカル変数、汎用レジスタ保存値の各データを保存するための領域を確保し、前記プログラムを実施するとき、前記スタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、を含むいずれかにより生じたデータ破損による前記プログラムの暴走を含む異常事態を生じないようにした、コンピュータメモリにおけるスタック領域のデータの保護方法であって、
前記スタック領域に記憶するデータの複製、またはデータが大きい場合にハッシュ値（ｃｒｃ）を同時に保存し、前記プログラムの実施時、前記記憶したデータまたはハッシュ値（ｃｒｃ）と、複製データまたは再計算したハッシュ値（ｃｒｃ）とを比較し、両者が異なっていたとき、前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とするコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項２】
前記スタック領域における関数への引数の記憶領域に関数への引数とその複製を同時に記憶し、前記関数の実行後、前記関数への引数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項１に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項３】
前記関数への引数が複数有る場合、前記関数への引数とその複製とを、関数への全引数、その全複製の順に記憶するか、または関数への第１の引数、その関数への第１の引数の複製、関数への第２の引数、その関数への第２の引数の複製、の順で複数データを同様に対にして記憶させることを特徴とする請求項２に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項４】
前記スタック領域における関数への引数の記憶領域に関数への引数とそのハッシュ値（ｃｒｃ）とを同時に記憶し、前記関数の実行後、前記関数への引数のハッシュ値（ｃｒｃ）を再計算して前記記憶させたハッシュ値（ｃｒｃ）と再計算結果とを比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項１に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項５】
前記スタック領域における関数への引数の記憶領域に記憶する関数への引数のハッシュ値（ｃｒｃ）の複製をさらに記憶させ、前記関数の実行後、前記関数への引数のハッシュ値（ｃｒｃ）を再計算し、前記記憶させたハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）と前記再計算結果とを比較し、前記再計算結果とハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項４に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項６】
前記スタック領域におけるローカル変数領域にローカル変数とその複製とを記憶し、前記ローカル変数の計算毎に前記ローカル変数領域に計算結果のローカル変数とその複製とを格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項１に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項７】
前記ローカル変数が複数有る場合、前記ローカル変数とその複製とを、全ローカル変数、その全ローカル変数の複製の順に記憶するか、または第１のローカル変数、その第１のローカル変数の複製、第２のローカル変数、その第２のローカル変数の複製、の順で複数データを対にして並べて記憶させることを特徴とする請求項６に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項８】
前記スタック領域におけるローカル変数領域にローカル変数とそのハッシュ値（ｃｒｃ）とを記憶し、前記ローカル変数の計算毎に計算結果とローカル変数のハッシュ値（ｃｒｃ）を再計算して格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値（ｃｒｃ）を再計算して記憶されたハッシュ値（ｃｒｃ）と比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項１に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項９】
前記ローカル変数とそのハッシュ値（ｃｒｃ）とを記憶する領域にさらにローカル変数のハッシュ値（ｃｒｃ）の複製を記憶する領域を確保し、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ローカル変数のハッシュ値（ｃｒｃ）とその複製の領域に計算結果のハッシュ値（ｃｒｃ）を再計算して格納し、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値（ｃｒｃ）を再計算して前記記憶させたハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）と比較し、前記再計算結果と記憶されたハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項８に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項１０】
前記スタック領域における関数への引数領域に関数への引数とその複製とを同時に記憶すると共に、前記ローカル変数領域にローカル変数とそのハッシュ値（ｃｒｃ）とを記憶して、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ハッシュ値（ｃｒｃ）の記憶領域に計算結果のハッシュ値（ｃｒｃ）を計算して格納し、前記関数の実行後に前記関数への引数とその複製とを比較すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値（ｃｒｃ）を再計算して記憶されたハッシュ値（ｃｒｃ）と比較し、それぞれの比較結果のいずれかが異なっていた場合に前記プログラムの実行を中止して、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項１に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項１１】
前記スタック領域に記憶するデータの複製、または複製データが大きい場合に記憶するハッシュ値（ｃｒｃ）は、ビット反転させたデータを用いることを特徴とする請求項１乃至１０のいずれかに記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項１２】
ガスタービンによる発電システムにおける、コンピュータを用いた制御装置の安全制御システムに用いられていることを特徴とする、請求項１乃至１１のいずれかに記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータメモリにおけるスタック領域のデータの保護方法に係り、特に、火力発電所のガスタービンにおける安全システムなど、もしプログラムが暴走した場合は大きな事故を起こす可能性のあるシステムにおける、メモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、悪意のあるプログラム（ウィルス）が紛れ込んでデータを壊した、など、万が一の不測の事態を含む、異常事態においてもスタックメモリ上のデータを保護できるようにした、コンピュータメモリにおけるスタック領域のデータの保護方法に関するものである。
【背景技術】
【０００２】
火力発電所におけるタービン制御／保護システムなど、大規模プラントのシステムにおいては、もし何らかの理由でソフトが暴走した場合は例えばガスタービンの破損など、重大事故を起こす可能性があるため、メモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、悪意のあるプログラム（ウィルス）が紛れ込んでデータを壊した、など、万が一の不測の事態を含むデータ異常が生じた場合、緊急停止を含む、常に安全側に動作するようシステムを構築する必要があり、例えば安全規格ＩＥＣ６１５０８などにもそういった方策を講じることが定められている。
【０００３】
メモリの特定ビットが壊れるようなことは滅多に生じないが、起こった場合は原因がなかなか特定できず、そのままにしておくと重大事故に繋がる可能性がある。また、火力発電所におけるガスタービンの安全システムなどは大規模なプログラムになるため、通常、複数のプログラムマによって作られるが、それぞれのプログラマが使用するアドレスを振り分けたにもかかわらず、特定のプログラマが間違えたアドレスを使ってしまったりすると、他のプログラマの作ったデータを上書きする可能性がある。こういったプログラムミスは、通常はデバグによって発見されることが多いが、たまたまデバグで発見されなかったりすると、プログラムの暴走が生じる。
【０００４】
また、悪意のあるプログラム（ウィルス）については近年、バッファオーバーフローの問題が取りざたされ、それに対する対策が種々提案されている。このバッファオーバーフローは、確保したバッファサイズ以上のデータが入力されてデータがあふれることで、バッファ以外の領域のデータを上書きしてしまうため、多くの場合プログラムは暴走する。しかし、関数の戻り番地を改ざんするなど、入力データを巧妙に細工することで、バッファオーバーフロー発生時に任意のコード（コンピュータ・ウィルス）を実行させることができ、悪意あるプログラム（ウィルス）による攻撃（スタックスマッシング）の対象となっている。
【０００５】
すなわちパソコン等の汎用計算機システムや、制御装置等のプロセッサを搭載した組込みシステムにおける、主にＣ言語等で構築したプログラムにおいては、「スタックとして使う」という宣言をして、図１０（Ａ）に示したように一時的に、関数への引数３８、関数の戻り番地３６、フレームポインタ保存値３４、ローカル変数３２、汎用レジスタ保存値３０の、５つのデータを保存するためのスタック領域２８を確保することが行われている。この図１０（Ａ）において、「スタック進行方向」として示した矢印はスタックの成長方向であり、「アドレス上位方向」として示した矢印はバッファの成長方向で、バッファは下位アドレスから上位アドレスに成長する。
【０００６】
そのためバッファオーバーフローが生じると、フレームポインタ保存値３４、関数の戻り番地３６、関数への引数３８、の順で上書きされる。そのため、悪意を持った攻撃者が図１０（Ｂ）に示したようにローカル変数に攻撃コード５０を書き込み、関数の戻り番地５２を攻撃コードの先頭アドレスで上書きすると、関数終了後は呼び出し元関数ではなくて攻撃コード５０に制御が移り、悪意のあるプログラムを実行させることができるようになる。
【０００７】
このようなバッファオーバーフローによるスタックスマッシングに対する防衛手段としては、図１０（Ｃ）に示したようなカナリア法や、図１０（Ｄ）に示したような直接検査法などが提案されている。図１０（Ｃ）に示したカナリア法は、保護したい、例えば戻り番地３６のデータの前に特定パターンの値からなるカナリア６０と呼ばれるデータを書き込み、バッファオーバーフローが発生した際に、関数の戻り番地３６と共にこのカナリア６０の値も一緒に改ざんされるであろうことを前提とし、カナリアの改ざんを検知してデータ改ざんを検知する方式である。
【０００８】
また図１０（Ｄ）に示した直接検査方法は、関数のエントリでスタック上の関数の戻り番地３６を、動的に確保可能なメモリの領域であるヒープ領域６２やキャッシュメモリ等の他のメモリ領域に退避しておき、関数から復帰する直前に、戻り番地が改ざんされていないかを退避しておいた値と比較することで検知する方式である。
【０００９】
こういったバッファオーバーフローを原因とするスタックスマッシング攻撃を防止するための技術としては、この他に、例えば特許文献１に同様な技術が開示されている。この特許文献１においては、コンピュータシステムが使用するメモリ装置における、プログラムを実行する際の関数呼び出し後におけるメモリパターンとして、実行中の関数の呼び出し元へのリターンアドレスを格納する領域と、この実行中の関数の呼び出し元へのプレヴィアス・フレームポインタを格納する領域と、このリターンアドレスを格納する領域とこのプレヴィアス・フレームポインタを格納する領域との後方に位置し、ローカル変数を格納する領域とを備え、このローカル変数を格納する領域は、このローカル変数を格納する領域に配列が格納されている場合に、この配列よりも前に、実行中の関数のリターン処理において破壊されていないかどうかを確認する対象である、乱数や攻撃者が知ることのできない任意の値からなるガード変数を格納し、スタック上のバッファオーバーフローを原因とするスタックスマッシング攻撃を防止するようにしている。
【００１０】
また、非特許文献１、２には、今までさまざまなバッファオーバフロー防御システムが提案されてきたが、それらの方法の多くはバッファオーバフロー発生の有無の検知を行うのみで、変数の完全性の検証を行っていなかったため、こういったバッファオーバフロー発生の有無の検知だけでは防ぎきれない変数の完全性の検証が必要となる攻撃が存在することに鑑み、変数の完全性を保証するシステムが提案されている。
【００１１】
まず非特許文献１のシステムでは、バッファオーバフローが発生する前に、戻りアドレスや関数ポインタなど、プログラムの制御が奪われる原因となる脆弱な変数について、検証対象ポインタが指しているデータをブロック単位で区切り、ブロック内のデータを計算処理して作成したハッシュ値と呼ばれるチェック符号、検証するデータの長さ、検証するデーダヘのアドレスなどからなる検証子と呼ばれるものを作成し、バッファオーバフローが発生した可能性がある後に、検証対象ポインタが指しているデータのハッシュ値、もしくは検証対象ポインタが指している実データの検証を行うことで、データの改ざんの検知を行うようにしている。また、改ざんが検出された変数については改ざんを改ざん前に戻し、バッファオーバフローの発生による影響を無効化することも可能としている。
【００１２】
また非特許文献２では、バイナリプログラムの書換えによってバッファオーバーフローの発生を検知し、攻撃を防ぐために、関数の入口及び出口で戻り番地を退避・検査できるよう、呼出し規約及びコンパイラ出力コードパターシ情報を利用したバッファオーバーフロー脆弱性への対策が示されている。この非特許文献２の方法では、従来の対策手法がソースコードを利用するものが多く、ソフトウェア開発者向けであったのに対し、バイナリプログラムを用いることでソースコードにアクセスできないソフトウェア利用者でも適用可能にしている。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００１−２１６１６１号公報
【非特許文献】
【００１４】
【非特許文献１】長野  文昭他３名      「データ改ざん検出によるバッファオーバフロー検知システムの提案」        情報処理学会 ２００５−ＣＳＥＣ３３  ｐｐ８１−８６（２００５）
【００１５】
【非特許文献２】山川  高明、他１名      「バイナリプログラムの書き換えによるバッファオーバーフロー検出の一手法」        情報処理学会 ２００７−ＣＳＥＣ−３９  ｐｐ８１−６６（２００７）
【発明の概要】
【発明が解決しようとする課題】
【００１６】
しかしながら、前記した図１０（Ｃ）に示したカナリア法や、図１０（Ｄ）に示した直接検査法、及び特許文献１の方法は、主たる目的が関数の戻り番地の改ざん検知にあり、関数への引数、フレームポインタ保存値、ローカル変数、汎用レジスタ保存値の領域の改ざんや、前記したメモリ故障等による改変の検出に対する仕組みを持っていない。また、市販されているコンパイラでは必ずしも実施できず、アセンブラで記述する必要があって、一般的とは言い難い。
【００１７】
非特許文献１、２に示された技術は、ハッシュ値や検証するデータの長さ、検証するデーダヘのアドレスなどからなる検証子と呼ばれるものを作成したり、バイナリプログラムの書換えにより関数の入口及び出口で戻り番地を退避・検査できるようにすることで、バッファオーバフロー防御システムを構築しているが、これらもメモリ故障等による改変の検出に対する仕組みを持っていない。またバイナリプログラムの書換えには制約がある。
【００１８】
そのため本発明においては、スタック領域における、特に関数への引数、ローカル変数の改変を、市販されているコンパイラで作ったプログラムで検知でき、さらに、メモリ故障等による改変の検出も実施可能なコンピュータメモリにおけるスタック領域のデータの保護方法を提供することが課題である。
【課題を解決するための手段】
【００１９】
上記課題を解決するため本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法は、
プログラムによりコンピュータメモリにおけるスタック領域に、関数への引数、関数の戻り番地、フレームポインタ保存値、ローカル変数、汎用レジスタ保存値の各データを保存するための領域を確保し、前記プログラムを実施するとき、前記スタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、を含むいずれかにより生じたデータ破損による前記プログラムの暴走を含む異常事態を生じないようにした、コンピュータメモリにおけるスタック領域のデータの保護方法であって、
前記スタック領域に記憶するデータの複製、またはデータが大きい場合にハッシュ値（ｃｒｃ）を同時に保存し、前記プログラムの実施時、前記記憶したデータまたはハッシュ値（ｃｒｃ）と、複製データまたは再計算したハッシュ値（ｃｒｃ）とを比較し、両者が異なっていたとき、前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする。
【００２０】
このように、スタック領域に記憶するデータの複製を記憶させる、またはデータが大きい場合にハッシュ値（ｃｒｃ）を算出して記憶させること、さらに、プログラムの実施時に記憶したデータまたはハッシュ値（ｃｒｃ）と、複製データまたは再計算したハッシュ値（ｃｒｃ）とを比較することは、市販されているコンパイラで作ったプログラムにそのような指示を行うだけで実施できる。そのため、比較結果が異なっていたとき、プログラムの実行を中止してスタック領域に記憶したデータに異常があることをユーザに通知すれば、異常事態が起こる前にその発生を防止でき、非常に簡単な方法でスタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、などで生じたデータ破損を検知できる、コンピュータメモリにおけるスタック領域のデータの保護方法を提供することができる。
【００２１】
そして、前記スタック領域における関数への引数の記憶領域に関数への引数とその複製を同時に記憶し、前記関数の実行後、前記関数への引数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、関数への引数は通常それほど多くないからメモリ領域を多く使用することもなく、簡単にデータ異常を検出することができる。
【００２２】
さらにその際、前記関数への引数が複数有る場合、前記関数への引数とその複製とを、関数への全引数、その全複製の順に記憶するか、または関数への第１の引数、その関数への第１の引数の複製、関数への第２の引数、その関数への第２の引数の複製、の順で複数データを同様に対にして記憶させることで、関数への第１の引数、その関数への第１の引数の複製、関数への第２の引数、その関数への第２の引数の複製、……とした場合には、例えば複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、の場合、壊された引数が関数への第１の引数、その関数への第１の引数の複製程度で止まっていた場合、他の引数から修復することも可能となる。
【００２３】
また、前記スタック領域における関数への引数の記憶領域に関数への引数とそのハッシュ値（ｃｒｃ）とを同時に記憶し、前記関数の実行後、前記関数への引数のハッシュ値（ｃｒｃ）を再計算して前記記憶させたハッシュ値（ｃｒｃ）と再計算結果とを比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、関数への引数が多くてデータ量が多くなる場合、複製を作ることでメモリ領域を圧迫するが、このようにハッシュ値（ｃｒｃ）を用いることで少ないメモリ容量で同様な効果を得ることができる。
【００２４】
さらにその際、前記スタック領域における関数への引数の記憶領域に記憶する関数への引数のハッシュ値（ｃｒｃ）の複製をさらに記憶させ、前記関数の実行後、前記関数への引数のハッシュ値（ｃｒｃ）を再計算し、前記記憶させたハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）と前記再計算結果とを比較し、前記再計算結果とハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、ハッシュ値の複製をさらに記憶させれば、より、確実にデータ異常を検出することができる。
【００２５】
そして、前記スタック領域におけるローカル変数領域にローカル変数とその複製とを記憶し、前記ローカル変数の計算毎に前記ローカル変数領域に計算結果のローカル変数とその複製とを格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、悪意のあるプログラムによるデータの破損は通常、ローカル変数の領域から行われることが多いから、このようにローカル変数を複製し、比較することで、こういった悪意のあるプログラムによるデータの破損を確実に検出することができる。
【００２６】
さらにこの場合、前記ローカル変数が複数有る場合、前記ローカル変数とその複製とを、全ローカル変数、その全ローカル変数の複製の順に記憶するか、または第１のローカル変数、その第１のローカル変数の複製、第２のローカル変数、その第２のローカル変数の複製、の順で複数データを対にして並べて記憶させることで、引数の場合と同様、壊されたローカル変数が第１のローカル変数、その第１のローカル変数の複製程度で止まっていた場合、他のローカル変数から修復することも可能となる。
【００２７】
また、前記スタック領域におけるローカル変数領域にローカル変数とそのハッシュ値（ｃｒｃ）とを記憶し、前記ローカル変数の計算毎に計算結果とローカル変数のハッシュ値（ｃｒｃ）を再計算して格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値（ｃｒｃ）を再計算して記憶されたハッシュ値（ｃｒｃ）と比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、ローカル変数のデータ量が多くなる場合、複製を作ることでメモリ領域を圧迫するが、このようにハッシュ値（ｃｒｃ）を用いることで少ないメモリ容量で同様な効果を得ることができる。
【００２８】
そしてその際、前記ローカル変数とそのハッシュ値（ｃｒｃ）とを記憶する領域にさらにローカル変数のハッシュ値（ｃｒｃ）の複製を記憶する領域を確保し、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ローカル変数のハッシュ値（ｃｒｃ）とその複製の領域に計算結果のハッシュ値（ｃｒｃ）を再計算して格納し、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値（ｃｒｃ）を再計算して前記記憶させたハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）と比較し、前記再計算結果と記憶されたハッシュ値（ｃｒｃ）と複製ハッシュ値（ｃｒｃ）との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、ハッシュ値の複製をさらに記憶させれば、より、確実にデータ異常を検出することができる。
【００２９】
そして、前記スタック領域における関数への引数領域に関数への引数とその複製とを同時に記憶すると共に、前記ローカル変数領域にローカル変数とそのハッシュ値（ｃｒｃ）とを記憶して、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ハッシュ値（ｃｒｃ）の記憶領域に計算結果のハッシュ値（ｃｒｃ）を計算して格納し、前記関数の実行後に前記関数への引数とその複製とを比較すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値（ｃｒｃ）を再計算して記憶されたハッシュ値（ｃｒｃ）と比較し、それぞれの比較結果のいずれかが異なっていた場合に前記プログラムの実行を中止して、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、関数への引数は通常データ量がそれほど大きくなく、ローカル変数は大きなものがあるがハッシュ値（ｃｒｃ）とすることでデータ量が小さくでき、関数への引数とローカル変数との異常を一度に検出でき、さらにスタック領域のデータの保護を確実に行うことができる。
【００３０】
また、前記スタック領域に記憶するデータの複製、または複製データが大きい場合に記憶するハッシュ値（ｃｒｃ）は、ビット反転させたデータを用いることで、スタック領域における特定ビットの故障の場合、故障ビットは反転されないから確実に故障ビットがあることを検出することができる。
【００３１】
そして、このようなコンピュータメモリにおけるスタック領域のデータの保護方法を、ガスタービンによる発電システムにおける、コンピュータを用いた制御装置の安全制御システムに用いることで、メモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、悪意のあるプログラム（ウィルス）が紛れ込んでデータを壊した、など、万が一の不測の事態を含むデータ異常があっても、重大事故を起こす前に緊急停止を含む、常に安全側に動作するシステムを構築することができる。
【発明の効果】
【００３２】
以上記載のごとく本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法は、市販されているコンパイラで作ったプログラムにおける、プログラムを記憶するメモリが万が一壊れた場合でも、また、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、などで生じたデータ破損も簡単に、確実に検出でき、例えばプラントを動かす大事なプログラムなどにおいても、プログラム暴走による重大事故を未然に防ぐことができる。
【図面の簡単な説明】
【００３３】
【図１】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法を組み込んだコントローラを有する、火力発電所のガスタービンにおけるコントロールシステムの概略説明図である。
【図２】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例１のフロー図である。
【図３】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例１を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）は変形例である。
【図４】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２のフロー図である。
【図５】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）は変形例である。
【図６】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例３のフロー図である。
【図７】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例３を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）は変形例である。
【図８】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例４のフロー図である。
【図９】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例４を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）は変形例である。
【図１０】（Ａ）はスタック領域の構成例、（Ｂ）はバッファオーバーフローを用いたスタックスマッシングにより、データがどのように書き換えられるかを説明するための図、（Ｃ）、（Ｄ）は従来のスタックスマッシングに対する防御方法を説明するための図で、（Ｃ）はカナリア法、（Ｄ）は直接検査方法である。
【発明を実施するための形態】
【００３４】
以下、図面を参照して本発明の好適な実施例を例示的に詳しく説明する。但しこの実施例に記載されている構成部品の寸法、材質、形状、その相対的配置等は特に特定的な記載がない限りはこの発明の範囲をそれに限定する趣旨ではなく、単なる説明例に過ぎない。
【００３５】
図１は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法を組み込んだコントローラを有する、火力発電所のガスタービンにおけるコントロールシステムの概略説明図である。なお、以下の説明では、本発明を図１に示したガスタービンのコントロールシステムに組み込んだ場合を例に説明するが、本発明はガスタービンだけに限らず、蒸気タービンのコントロールシステムにも適用できることは当業者なら自明である。
【００３６】
図中、１０はガスタービン、１２はこのガスタービン１０で駆動される発電機、１３はガスタービン１０の回転数をピックアップする回転数センサ、１４はガスタービン１０のコントロールバルブ１６を開閉し、ガスタービン１０の場合は燃料流量を、蒸気タービンの場合は蒸気の流量を回転数に応じて制御してガスタービン１０（あるいは蒸気タービン）を制御し、発電機１２の発電量を制御するためのバルブ制御装置、１９は蒸気若しくは燃料を遮断するためのシャットオフバルブ、２１はそれぞれの弁（バルブ）を遮断するためのトリップバルブ、１５は回転数センサ１３からの信号を受け、オーバースピードを検知してトリップバルブ２１を制御し、タービンをトリップさせる保護装置としての回転数入力装置、１７はセンサやバルブに代表されるアクチュエータの信号を、コントロール・コンピュータ１８とやり取りするための入出力装置、１８はこのバルブ制御装置１４に制御指示を送るコントロールコンピュータの概略図で、２０はデータ処理装置（ＣＰＵ）、２２は制御プログラム２４、その他のデータなどを記憶している記憶装置、２６はデータ処理装置２０がプログラムを実行するためのメインメモリ装置で、その中にスタック２８の領域が確保される。
【００３７】
そして、データ処理装置（ＣＰＵ）２０は記憶装置２２に記憶された制御プログラム２４を読み出し、メインメモリ装置２６に記憶させて制御プログラム２４の制御の元、バルブ制御装置１４に指示してコントロールバルブ１６を制御し、発電機１２の発電量などを制御するが、その際、データ処理装置（ＣＰＵ）２０が確保したスタック領域２８に、前記したように汎用レジスタ保存値３０、ローカル変数３２、フレームポインタ保存値３４、関数の戻り番地３６、関数への引数３８などを記憶させる。
【００３８】
しかし前記したように、このスタック領域２８におけるメモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、前記図１０で説明したように、悪意のあるプログラム（ウィルス）が紛れ込んでデータを壊した、などによりデータが壊されたり悪意のあるプログラムが実行された場合、制御プログラム２４が暴走したり悪意のあるプログラムにより、燃料をガスタービン１０に送り続け、ガスタービン１０を破損させたりする大きな事故を起こす可能性があり、このようなことが生じないようにスタック領域のデータの保護を行うのが本発明の目的である。
【００３９】
すなわち本発明においては、図１に１８で示したようなコンピュータにおける、メインメモリ装置２６に確保したスタック領域２８に、汎用レジスタ保存値３０、ローカル変数３２、フレームポインタ保存値３４、関数の戻り番地３６、関数への引数３８を記憶する領域を確保し、制御プログラム２４を実施するにあたり、記憶するデータの複製、またはデータが大きい場合にハッシュ値（ｃｒｃ）を同時に保存し、プログラムの実施時、記憶したデータまたはハッシュ値（ｃｒｃ）と複製データまたは再計算したハッシュ値（ｃｒｃ）とを比較し、両者が異なっていたとき、制御プログラム２４の実行を中止し、スタック２８領域に記憶したデータに異常があることをユーザに通知すると共に、ＣＰＵ例外を発生させ、システムを完全に停止させるエラー処理を行うようにして、常に安全側に動作するようシステムを構築するものである。
【実施例１】
【００４０】
図２は、このような本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例１のフロー図、図３は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例１を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）はその変形例である。
【００４１】
本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の第１の実施例においては、前記図１０で説明したスタック領域２８における、関数への引数２８、関数の戻り番地３６、フレームポインタ保存値３４、ローカル変数３２、汎用レジスタ保存値３０の、５つのデータを保存するための領域のデータのうち、関数への引数２８を関数コールする際に複製して渡し、関数のエントリにあたって複製した引数同士を比較して、不一致を検出した場合にデータ処理装置（ＣＰＵ）２０によりＣＰＵ例外を発生させて、システムを安全に停止する等のエラー処理を行うものである。
【００４２】
すなわち、例えばａ、ｂ、ｃという関数への引数２８がある場合、通常は図３（Ａ）に示したように、スタック領域２８の関数への引き数の領域３８に、このａ、ｂ、ｃを順に３８ａ、３８ｂ、３８ｃの領域に記憶する。それに対して本発明では、図３（Ｂ）に示したように、この引数ａ、ｂ、ｃをコピーし、それがＡ、Ｂ、Ｃであるとすると、このＡ、Ｂ、Ｃも引き数の領域における領域３８ａ、３８ｂ、３８ｃの後に３８Ａ、３８Ｂ、３８Ｃとして示した領域に順に記憶するものである。
【００４３】
そして関数の実行前とか実行後、もともと領域３８ａ、３８ｂ、３８ｃに記憶した引き数ａ、ｂ、ｃと、領域３８Ａ、３８Ｂ、３８Ｃにコピーした引数Ａ、Ｂ、Ｃとを比較し、不一致を検出した際には前記したようにデータ処理装置（ＣＰＵ）２０がＣＰＵ例外を発生させ、図１のシステムを安全に停止する等のエラー処理を行う。この比較は、相手が正しいデータを送ってきているかどうかを検知するのであれば自分が計算して答えを出したときにチェックするが、完璧を期すのであれば関数を使う前、使った後、もチェックを実施する。しかしチェック回数が増えると時間がかかるため、プログラムの重要度に応じてチェック時期を定める。
【００４４】
なお、複製した引数Ａ、Ｂ、Ｃは、図３（Ｃ）に示したように順番を入れ替え、３８ａ、３８Ａ、３８ｂ、３８Ｂ、３８ｃ、３８Ｃのようにオリジナルと複製を対になるように記憶しても良く、さらに複製を２つ以上としても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまうが、対として記憶した場合、例えば３８ａ、３８Ａ、の領域だけが壊された場合、３８ｂ、３８Ｂ、３８ｃ、３８Ｃの領域に記憶された内容で修復が可能な場合もある。また、そのままコピーするのではなく、複製データはビット反転するようにしても良い。このようにビット反転すると、メモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。
【００４５】
このように引数を複製し、２つ以上持たせることで、前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合も複製データは異なったものとなるから、容易にデータ異常を検出でき、しかも、単に引数の複製を作るだけであるから市販されているコンパイラで作ったプログラムで実施することができる。また、引数の値を改変しない場合は、関数のエントリだけでなく、関数の復帰時にもチェックすることで、この領域を前記図１０（Ｃ）で説明したカナリア的に扱うことが可能となり、スタック領域上での引数データの改変だけでなく、レジスタに割り当てられて渡された引数データの改変も検出できる。
【００４６】
図２は、このような考え方に従った、本発明になるコンピュータメモリ装置２６におけるスタック領域２８のデータの保護方法の実施例１のフロー図である。この図２におけるステップＳ１０で処理がスタートすると、データ処理装置（ＣＰＵ）２０はステップＳ１２で関数コール時に引数の複製データを生成して引数に渡し、図３（Ｂ）、（Ｃ）に示したように、スタック領域２８における領域３８ａ、３８ｂ、３８ｃ、３８Ａ、３８Ｂ、３８Ｃまたは３８ａ、３８Ａ、３８ｂ、３８Ｂ、３８ｃ、３８Ｃに記憶する。そしてデータ処理装置（ＣＰＵ）２０はステップＳ１４で、処理の終了時など、関数のエントリでオリジナルの実引数ａ、ｂ、ｃと複製した引数Ａ、Ｂ、Ｃとを比較する。
【００４７】
そしてデータ処理装置（ＣＰＵ）２０は、ステップＳ１６でこの実引数と複製した引数が一致しているかどうかを判断し、一致している場合はステップＳ２０に進んで終了し、不一致の場合はステップＳ１８でＣＰＵ例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【実施例２】
【００４８】
図４は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２のフロー図、図５は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）はその変形例である。
【００４９】
前記図２、図３で説明した実施例１の方法では、引数が増えた場合、複製にメモリ領域を消費してしまう。そのため本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２は、ハッシュ値（ＣＲＣ：Cyclic Redundancy Check）と称する、データ伝送の分野でデータが正しく伝わっているかどうかをチェックするためのエラー検出・訂正方式のデータを使う。このハッシュ値は、データをブロック単位に区切り、ブロック内のデータを計算処理して作成したチェック符号であり、単に複製を作るより小さなデータとすることができる。そしてデータ伝送の分野では、データを送るときにこのハッシュ値（ｃｒｃ）を付けて送信し、受信側でデータとハッシュ値（ｃｒｃ）の関連が正常かどうかを確認することで異常を検出するが、本発明ではこれを、データが改ざんされていないかどうかのチェックのために使う。
【００５０】
すなわち、例えば図５（Ａ）に示したようにａ、ｂ、ｃという関数への引数があるとすると、通常は前記図３で説明したように、スタック２８の領域３８ａ、３８ｂ、３８ｃで示したスタック領域の関数への引き数の領域に、順にこのａ、ｂ、ｃを記憶する。それに対して本発明では、図５（Ｂ）に示したように、この引数ａ、ｂ、ｃのハッシュ値（ｃｒｃ）を付加し、これを領域３８ｃｒｃに記憶するのである。
【００５１】
そして関数の実行前とか実行後、もともとの引き数ａ、ｂ、ｃのハッシュ値（ｃｒｃ）と再計算したハッシュ値（ｃｒｃ）とを比較し、不一致を検出した際にはＣＰＵ例外を発生させ、システムを安全に停止する等のエラー処理を行う。この比較は、相手が正しいデータを送ってきているかどうかを検知するのであれば自分が計算して答えを出したときにチェックするが、完璧を期すのであれば関数を使う前、使った後にもチェックを実施するとよい。しかしチェック回数が増えると時間がかかるため、プログラムの重要度に応じてチェック時期を定める。
【００５２】
なお、ハッシュ値（ｃｒｃ）は、図５（Ｃ）に示したように、さらにハッシュ値（ｃｒｃ）の複製（ＣＲＣ）を記憶するようにしてもよく、さらに複製を２つ以上としても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまう。また複製を、前記したようにビット反転するようにしても良い。このようにビット反転するとメモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。また、ハッシュ値（ｃｒｃ）は計算方法がわからないと算出できないから、ハッシュ値（ｃｒｃ）と共にこのハッシュ値（ｃｒｃ）を計算するための関数ｆｃｒｃを引数として添付しても良い。
【００５３】
このように引数にハッシュ値（ｃｒｃ）を付加することで、前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合もハッシュ値（ｃｒｃ）は当初の値とは異なったものとなるから、容易にデータ異常を検出でき、しかも、単にハッシュ値（ｃｒｃ）の計算指示を入れるだけであるから市販されているコンパイラで作ったプログラムで実施することができる。また、引数の値を改変しない場合は、関数のエントリだけでなく、関数の復帰時にもチェックすることで、この領域をカナリア的に扱うことが可能となり、スタック領域上での引数データの改変だけでなく、レジスタに割り当てられて渡された引数データの改変も検出できる。
【００５４】
図４は、このような考え方に従った、本発明になるコンピュータメモリ装置２６におけるスタック領域２８のデータの保護方法の実施例２のフロー図である。この図４における
ステップＳ２２で処理がスタートすると、データ処理装置（ＣＰＵ）２０はステップＳ２４で関数コール時に全引数のハッシュ値（ｃｒｃ）を計算し、図５（Ｂ）、（Ｃ）に示したように、スタック領域２８におけるこの値を関数への引数３８ａ、３８ｂ、３８ｃと共に３８ｃｒｃに記憶する。
【００５５】
そしてデータ処理装置（ＣＰＵ）２０はステップＳ２６で、処理終了時など、関数のエントリでオリジナルの実引数のハッシュ値（ｃｒｃ）を再計算する。そしてステップＳ２８でデータ処理装置（ＣＰＵ）２０は、この領域３８ｃｒｃに記憶しているハッシュ値（ｃｒｃ）と再計算したハッシュ値（ｃｒｃ）とが一致しているかどうかを判断し、一致している場合はステップＳ３２に進んで終了し、不一致の場合はステップＳ３０でＣＰＵ例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【実施例３】
【００５６】
図６は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例３のフロー図、図７は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）はその変形例である。
【００５７】
以上説明してきた、実施例１、２の本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法では、呼び出し側で引数を渡してやって異常を検知するためのものであったが、この図６、図７に示した実施例３では、ローカル変数が計算中に壊れていないかを自主的に自分自身でチェックするもので、自分の中で使うデータ領域を２つ用意し、計算するたびに２つの領域に同じデータを書き込み、使うときに常に２つを比較してチェックするものである。
【００５８】
すなわち図７（Ａ）に示したように、例えばｐ、ｑ、ｒというローカル変数があるとすると、通常はスタック領域のローカル変数３２の領域に、これらの変数を収納する領域３２ｐ、３２ｑ、３２ｒに順にｐ、ｑ、ｒとして記憶する。そして計算のたびにこれを読み出し、また、計算結果を格納する。それに対して本発明では、図７（Ｂ）に示したように、このｐ、ｑ、ｒというローカル変数の複製Ｐ、Ｑ、Ｒを格納する領域３２Ｐ、３２Ｑ、３２Ｒを確保し、計算のたびに領域３２ｐ、３２ｑ、３２ｒと３２Ｐ、３２Ｑ、３２Ｒに、ｐ、ｑ、ｒと複製Ｐ、Ｑ、Ｒとをその都度保存し、かつ、その都度これらｐ、ｑ、ｒとＰ、Ｑ、Ｒとを比較して、不一致を検出した際にデータ処理装置（ＣＰＵ）２０がＣＰＵ例外を発生させ、システムを安全に停止する等のエラー処理を行う。
【００５９】
なお、ローカル変数ｐ、ｑ、ｒのコピーＰ、Ｑ、Ｒは、図７（Ｃ）に示したように、順番を入れ替え、領域３２ｐ、３２Ｐ、３２ｑ、３２Ｑ、３２ｒ、３２Ｒのようにしてそれぞれの計算結果を対になるように記憶しても良く、さらに複製を２つ以上としても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまうが、対として記憶した場合、例えば３２ａ、３２Ａ、の領域だけが壊された場合、３２ｂ、３２Ｂ、３２ｃ、３２Ｃの領域に記憶された内容で修復が可能な場合もある。また、そのままコピーするのではなく、ローカル変数の複製したＰ、Ｑ、Ｒデータをビット反転するようにしても良い。このようにビット反転すると、メモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。
【００６０】
このようにローカル変数を複製した記憶領域を設け、計算毎にそれぞれの領域に記憶させて比較することで、前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合もローカル変数の値は元の値と複製の値が異なってくるから、容易にデータ異常を検出でき、しかも、単にローカル変数をコピーして比較するだけであるから、市販されているコンパイラで作ったプログラムで実施することができる。
【００６１】
図６は、このような考え方に従った、本発明になるコンピュータメモリ装置２６におけるスタック領域２８のデータの保護方法の実施例３のフロー図である。この図６におけるステップＳ３４で処理がスタートすると、データ処理装置（ＣＰＵ）２０はステップＳ３６で関数のエントリでローカル変数ｐ、ｑ、ｒの複製した変数Ｐ、Ｑ、Ｒをローカルメモリ３２の領域３２ｐ、３２ｑ、３２ｒと３２Ｐ、３２Ｑ、３２Ｒ上に置く。そしてステップＳ３８で、ローカル変数ｐ、ｑ、ｒの内容を初期化／変更するたびに、複製用の変数の領域３２Ｐ、３２Ｑ、３２に同じ値を格納する。
【００６２】
そしてデータ処理装置（ＣＰＵ）２０はステップＳ４０で、変数の内容を参照するたび、若しくは、関数から復帰する直前等の予め決めておいたチェックポイントで、領域３２ｐ、３２ｑ、３２ｒと３２Ｐ、３２Ｑ、３２Ｒに記憶されている値を比較する。そしてデータ処理装置（ＣＰＵ）２０は、ステップＳ４２でローカル変数ｐ、ｑ、ｒと複製した変数Ｐ、Ｑ、Ｒとが一致しているかどうかを判断し、一致している場合はステップＳ４６に進んで終了し、不一致の場合はステップＳ４４でＣＰＵ例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【実施例４】
【００６３】
図８は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例４のフロー図、図９は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例２を説明するための図で、（Ａ）は従来のスタック領域の状態、（Ｂ）は本発明の方法を用いた状態、（Ｃ）はその変形例である。
【００６４】
この実施例４は、先に説明した実施例２と同様、ローカル変数のうち、値を全く（もしくは頻繁に）変更せず、サイズが大きいデータに関してそのハッシュ値（ｃｒｃ）を計算し、それをローカル変数と共にスタック領域上に記憶し、ローカル変数が計算中に壊れていないかを自主的に自分自身でチェックするもので、ローカル変数の領域３２ｐ、３２ｑ、３２ｒ以外にハッシュ値（ｃｒｃ）を記憶する領域３２ｃｒｃを用意し、ｐ、ｑ、ｒの値を変更するたびにｐ、ｑ、ｒのハッシュ値（ｃｒｃ）を再算出して両者を比較してチェックするものである。
【００６５】
すなわち図９に示したように、例えばｐ、ｑ、ｒというローカル変数があるとすると、通常は図９（Ａ）のようにスタック領域のローカル変数領域３２に、これらの変数を収納する領域を順に３２ｐ、３２ｑ、３２ｒとして確保する。そして計算のたびに変数ｐ、ｑ、ｒを読み出し、また、計算結果を領域３２ｐ、３２ｑ、３２ｒに格納する。それに対して本発明では、図９（Ｂ）に示したように、このｐ、ｑ、ｒというローカル変数のハッシュ値（ｃｒｃ）を格納する領域３２ｃｒｃを確保し、ｐ、ｑ、ｒの値を変更するたびにｐ、ｑ、ｒのハッシュ値（ｃｒｃ）を再算出して、この領域３２ｃｒｃに記憶されているハッシュ値（ｃｒｃ）と比較し、不一致を検出した際にはＣＰＵ例外を発生させ、システムを安全に停止する等のエラー処理を行う。
【００６６】
なお、ローカル変数ｐ、ｑ、ｒのハッシュ値（ｃｒｃ）は、図７（Ｃ）に示したようにさらにハッシュ値（ｃｒｃ）の複製ハッシュ値（ＣＲＣ）を記憶させる領域３２ＣＲＣを用意し、２つの領域に記憶させても良く、さらに複製を２つ以上の領域に記憶させるようにしても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまう。また複製ハッシュ値（ＣＲＣ）については、前記したのと同様ビット反転するようにしても良い。このようにビット反転すると、メモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。また、ハッシュ値（ｃｒｃ）は計算方法がわからないと算出できないから、ハッシュ値（ｃｒｃ）と共にこのハッシュ値（ｃｒｃ）を計算するための関数ｆｃｒｃをローカル変数として記憶させても良い。
【００６７】
このようにローカル変数のハッシュ値（ｃｒｃ）を記憶させることで、少ないメモリ領域で前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合もローカル変数のハッシュ値（ｃｒｃ）と再計算したハッシュ値（ｃｒｃ）とは値が異なってくるから、容易にデータ異常を検出でき、しかも、単にローカル変数のハッシュ値（ｃｒｃ）算出するだけであるから、市販されているコンパイラで作ったプログラムで実施することができる。
【００６８】
図８は、このような考え方に従った、本発明になるコンピュータメモリ装置２６におけるスタック領域２８のデータの保護方法の実施例４のフロー図である。この図８におけるステップＳ５０で処理がスタートすると、データ処理装置（ＣＰＵ）２０はステップＳ５２で関数のエントリでローカル変数ｐ、ｑ、ｒのハッシュ値（ｃｒｃ）を計算し、領域３２ｃｒｃに置く。そしてステップＳ５４で、ローカル変数ｐ、ｑ、ｒの内容を初期化／変更するたびにローカル変数ｐ、ｑ、ｒのハッシュ値（ｃｒｃ）の値を再計算して領域３２ｃｒｃに置き直す。
【００６９】
そしてデータ処理装置（ＣＰＵ）２０はステップＳ５６で、変数の内容を参照するたび、若しくは、関数から復帰する直前等の予め決めておいたチェックポイントで、ローカル変数ｐ、ｑ、ｒのハッシュ値（ｃｒｃ）を再計算し、領域３２ｃｒｃに格納しておいた値と比較する。その結果、ステップＳ５８でローカル変数ｐ、ｑ、ｒの領域３２ｃｒｃに記憶したハッシュ値（ｃｒｃ）と再計算結果とが一致しているかどうかを判断し、一致している場合はステップＳ６２に進んで終了し、不一致の場合はステップＳ６０でＣＰＵ例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【００７０】
このように、スタック領域２８に記憶するデータの複製を記憶させる、またはデータが大きい場合にハッシュ値（ｃｒｃ）を算出して記憶させること、さらに、プログラムの実施時に記憶したデータまたはハッシュ値（ｃｒｃ）と、複製データまたは再計算したハッシュ値（ｃｒｃ）とを比較することは、市販されているコンパイラで作ったプログラムにそのような指示を行うだけで実施できる。そのため、比較結果が異なっていたとき、プログラムの実行を中止してスタック領域に記憶したデータに異常があることをユーザに通知すれば、異常事態が起こる前にその発生を防止でき、非常に簡単な方法でスタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、などで生じたデータ破損を検知できる、コンピュータメモリにおけるスタック領域のデータの保護方法を提供することができる。
【００７１】
なお、以上の説明では、スタックメモリ上の引数とローカル変数を別々にデータ保護する場合を例に説明してきたが、例えば実施例１で説明した関数への引数２８を関数コールする際に複製して渡し、関数のエントリにあたって複製した引数同士を比較して、不一致を検出した場合にデータ処理装置（ＣＰＵ）２０によりＣＰＵ例外を発生させる方法、及び実施例４で説明したローカル変数の領域３２ｐ、３２ｑ、３２ｒ以外にハッシュ値（ｃｒｃ）を記憶する領域３２ｃｒｃを用意し、計算するたびにハッシュ値（ｃｒｃ）を再算出して両者を比較してチェックする方法とを併用すると、関数への引数は通常データ量がそれほど大きくなく、ローカル変数は大きなものがあるがハッシュ値（ｃｒｃ）とすることでデータ量が小さくできるから、関数への引数とローカル変数の異常とを一度に検出でき、さらにスタック領域２８のデータの保護を確実に行うことができる。またこれは、実施例２と実施例３を組み合わせた場合も同様である。
【産業上の利用可能性】
【００７２】
本発明によれば、スタック領域における、特に関数への引数、ローカル変数の改変を、市販されているコンパイラで作ったプログラムで検知でき、さらに、メモリ故障等による改変の検出も実施可能であるから、特に、火力発電所のガスタービンにおける安全システムなど、もしプログラムが暴走した場合は大きな事故を起こす可能性のあるシステムにおける、コンピュータメモリにおけるスタック領域のデータの保護方法として好適である。
【符号の説明】
【００７３】
１０  ガスタービン（もしくは、蒸気タービン）
１２  発電機
１３  回転数センサ
１４  バルブ制御装置
１５  回転数入力装置
１６  コントロールバルブ
１７  入出力装置
１８  コントロールコンピュータ
１９  シャットオフバルブ
２０  データ処理装置（ＣＰＵ）
２１  トリップバルブ
２２  記憶装置
２４  制御プログラム
２６  メインメモリ装置
２８  スタック領域
３０  汎用レジスタ保存値
３２  ローカル変数
３４  フレームポインタ保存値
３６  関数の戻り番地
３８  関数への引数
５０  攻撃コード
５２  関数の戻り番地
６０  カナリア
６２  ヒープ領域
【図１】
2010198147.tif 000003
【図２】
2010198147.tif 000004
【図３】
2010198147.tif 000005
【図４】
2010198147.tif 000006
【図５】
2010198147.tif 000007
【図６】
2010198147.tif 000008
【図７】
2010198147.tif 000009
【図８】
2010198147.tif 000010
【図９】
2010198147.tif 000011
【図１０】
2010198147.tif 000012