説明

コンピュータメモリにおけるスタック領域のデータの保護方法

【課題】スタック領域における、特に関数への引数、ローカル変数の改変を、市販されているコンパイラで作ったプログラムで検知でき、さらに、メモリ故障等による改変の検出も実施可能なコンピュータメモリにおけるスタック領域のデータの保護方法を提供することが課題である。
【解決手段】スタック領域28に記憶するデータの複製、またはデータが大きい場合にハッシュ値(crc)を同時にスタック領域28に保存し、プログラムの実施時、記憶したデータまたはハッシュ値(crc)と、複製データまたは再計算したハッシュ値(crc)とを比較し、両者が異なっていたとき、プログラムの実行を中止し、スタック領域に記憶したデータに異常があることをユーザに通知するようにした。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータメモリにおけるスタック領域のデータの保護方法に係り、特に、火力発電所のガスタービンにおける安全システムなど、もしプログラムが暴走した場合は大きな事故を起こす可能性のあるシステムにおける、メモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、悪意のあるプログラム(ウィルス)が紛れ込んでデータを壊した、など、万が一の不測の事態を含む、異常事態においてもスタックメモリ上のデータを保護できるようにした、コンピュータメモリにおけるスタック領域のデータの保護方法に関するものである。
【背景技術】
【0002】
火力発電所におけるタービン制御/保護システムなど、大規模プラントのシステムにおいては、もし何らかの理由でソフトが暴走した場合は例えばガスタービンの破損など、重大事故を起こす可能性があるため、メモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、悪意のあるプログラム(ウィルス)が紛れ込んでデータを壊した、など、万が一の不測の事態を含むデータ異常が生じた場合、緊急停止を含む、常に安全側に動作するようシステムを構築する必要があり、例えば安全規格IEC61508などにもそういった方策を講じることが定められている。
【0003】
メモリの特定ビットが壊れるようなことは滅多に生じないが、起こった場合は原因がなかなか特定できず、そのままにしておくと重大事故に繋がる可能性がある。また、火力発電所におけるガスタービンの安全システムなどは大規模なプログラムになるため、通常、複数のプログラムマによって作られるが、それぞれのプログラマが使用するアドレスを振り分けたにもかかわらず、特定のプログラマが間違えたアドレスを使ってしまったりすると、他のプログラマの作ったデータを上書きする可能性がある。こういったプログラムミスは、通常はデバグによって発見されることが多いが、たまたまデバグで発見されなかったりすると、プログラムの暴走が生じる。
【0004】
また、悪意のあるプログラム(ウィルス)については近年、バッファオーバーフローの問題が取りざたされ、それに対する対策が種々提案されている。このバッファオーバーフローは、確保したバッファサイズ以上のデータが入力されてデータがあふれることで、バッファ以外の領域のデータを上書きしてしまうため、多くの場合プログラムは暴走する。しかし、関数の戻り番地を改ざんするなど、入力データを巧妙に細工することで、バッファオーバーフロー発生時に任意のコード(コンピュータ・ウィルス)を実行させることができ、悪意あるプログラム(ウィルス)による攻撃(スタックスマッシング)の対象となっている。
【0005】
すなわちパソコン等の汎用計算機システムや、制御装置等のプロセッサを搭載した組込みシステムにおける、主にC言語等で構築したプログラムにおいては、「スタックとして使う」という宣言をして、図10(A)に示したように一時的に、関数への引数38、関数の戻り番地36、フレームポインタ保存値34、ローカル変数32、汎用レジスタ保存値30の、5つのデータを保存するためのスタック領域28を確保することが行われている。この図10(A)において、「スタック進行方向」として示した矢印はスタックの成長方向であり、「アドレス上位方向」として示した矢印はバッファの成長方向で、バッファは下位アドレスから上位アドレスに成長する。
【0006】
そのためバッファオーバーフローが生じると、フレームポインタ保存値34、関数の戻り番地36、関数への引数38、の順で上書きされる。そのため、悪意を持った攻撃者が図10(B)に示したようにローカル変数に攻撃コード50を書き込み、関数の戻り番地52を攻撃コードの先頭アドレスで上書きすると、関数終了後は呼び出し元関数ではなくて攻撃コード50に制御が移り、悪意のあるプログラムを実行させることができるようになる。
【0007】
このようなバッファオーバーフローによるスタックスマッシングに対する防衛手段としては、図10(C)に示したようなカナリア法や、図10(D)に示したような直接検査法などが提案されている。図10(C)に示したカナリア法は、保護したい、例えば戻り番地36のデータの前に特定パターンの値からなるカナリア60と呼ばれるデータを書き込み、バッファオーバーフローが発生した際に、関数の戻り番地36と共にこのカナリア60の値も一緒に改ざんされるであろうことを前提とし、カナリアの改ざんを検知してデータ改ざんを検知する方式である。
【0008】
また図10(D)に示した直接検査方法は、関数のエントリでスタック上の関数の戻り番地36を、動的に確保可能なメモリの領域であるヒープ領域62やキャッシュメモリ等の他のメモリ領域に退避しておき、関数から復帰する直前に、戻り番地が改ざんされていないかを退避しておいた値と比較することで検知する方式である。
【0009】
こういったバッファオーバーフローを原因とするスタックスマッシング攻撃を防止するための技術としては、この他に、例えば特許文献1に同様な技術が開示されている。この特許文献1においては、コンピュータシステムが使用するメモリ装置における、プログラムを実行する際の関数呼び出し後におけるメモリパターンとして、実行中の関数の呼び出し元へのリターンアドレスを格納する領域と、この実行中の関数の呼び出し元へのプレヴィアス・フレームポインタを格納する領域と、このリターンアドレスを格納する領域とこのプレヴィアス・フレームポインタを格納する領域との後方に位置し、ローカル変数を格納する領域とを備え、このローカル変数を格納する領域は、このローカル変数を格納する領域に配列が格納されている場合に、この配列よりも前に、実行中の関数のリターン処理において破壊されていないかどうかを確認する対象である、乱数や攻撃者が知ることのできない任意の値からなるガード変数を格納し、スタック上のバッファオーバーフローを原因とするスタックスマッシング攻撃を防止するようにしている。
【0010】
また、非特許文献1、2には、今までさまざまなバッファオーバフロー防御システムが提案されてきたが、それらの方法の多くはバッファオーバフロー発生の有無の検知を行うのみで、変数の完全性の検証を行っていなかったため、こういったバッファオーバフロー発生の有無の検知だけでは防ぎきれない変数の完全性の検証が必要となる攻撃が存在することに鑑み、変数の完全性を保証するシステムが提案されている。
【0011】
まず非特許文献1のシステムでは、バッファオーバフローが発生する前に、戻りアドレスや関数ポインタなど、プログラムの制御が奪われる原因となる脆弱な変数について、検証対象ポインタが指しているデータをブロック単位で区切り、ブロック内のデータを計算処理して作成したハッシュ値と呼ばれるチェック符号、検証するデータの長さ、検証するデーダヘのアドレスなどからなる検証子と呼ばれるものを作成し、バッファオーバフローが発生した可能性がある後に、検証対象ポインタが指しているデータのハッシュ値、もしくは検証対象ポインタが指している実データの検証を行うことで、データの改ざんの検知を行うようにしている。また、改ざんが検出された変数については改ざんを改ざん前に戻し、バッファオーバフローの発生による影響を無効化することも可能としている。
【0012】
また非特許文献2では、バイナリプログラムの書換えによってバッファオーバーフローの発生を検知し、攻撃を防ぐために、関数の入口及び出口で戻り番地を退避・検査できるよう、呼出し規約及びコンパイラ出力コードパターシ情報を利用したバッファオーバーフロー脆弱性への対策が示されている。この非特許文献2の方法では、従来の対策手法がソースコードを利用するものが多く、ソフトウェア開発者向けであったのに対し、バイナリプログラムを用いることでソースコードにアクセスできないソフトウェア利用者でも適用可能にしている。
【先行技術文献】
【特許文献】
【0013】
【特許文献1】特開2001−216161号公報
【非特許文献】
【0014】
【非特許文献1】長野 文昭他3名 「データ改ざん検出によるバッファオーバフロー検知システムの提案」 情報処理学会 2005−CSEC33 pp81−86(2005)
【0015】
【非特許文献2】山川 高明、他1名 「バイナリプログラムの書き換えによるバッファオーバーフロー検出の一手法」 情報処理学会 2007−CSEC−39 pp81−66(2007)
【発明の概要】
【発明が解決しようとする課題】
【0016】
しかしながら、前記した図10(C)に示したカナリア法や、図10(D)に示した直接検査法、及び特許文献1の方法は、主たる目的が関数の戻り番地の改ざん検知にあり、関数への引数、フレームポインタ保存値、ローカル変数、汎用レジスタ保存値の領域の改ざんや、前記したメモリ故障等による改変の検出に対する仕組みを持っていない。また、市販されているコンパイラでは必ずしも実施できず、アセンブラで記述する必要があって、一般的とは言い難い。
【0017】
非特許文献1、2に示された技術は、ハッシュ値や検証するデータの長さ、検証するデーダヘのアドレスなどからなる検証子と呼ばれるものを作成したり、バイナリプログラムの書換えにより関数の入口及び出口で戻り番地を退避・検査できるようにすることで、バッファオーバフロー防御システムを構築しているが、これらもメモリ故障等による改変の検出に対する仕組みを持っていない。またバイナリプログラムの書換えには制約がある。
【0018】
そのため本発明においては、スタック領域における、特に関数への引数、ローカル変数の改変を、市販されているコンパイラで作ったプログラムで検知でき、さらに、メモリ故障等による改変の検出も実施可能なコンピュータメモリにおけるスタック領域のデータの保護方法を提供することが課題である。
【課題を解決するための手段】
【0019】
上記課題を解決するため本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法は、
プログラムによりコンピュータメモリにおけるスタック領域に、関数への引数、関数の戻り番地、フレームポインタ保存値、ローカル変数、汎用レジスタ保存値の各データを保存するための領域を確保し、前記プログラムを実施するとき、前記スタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、を含むいずれかにより生じたデータ破損による前記プログラムの暴走を含む異常事態を生じないようにした、コンピュータメモリにおけるスタック領域のデータの保護方法であって、
前記スタック領域に記憶するデータの複製、またはデータが大きい場合にハッシュ値(crc)を同時に保存し、前記プログラムの実施時、前記記憶したデータまたはハッシュ値(crc)と、複製データまたは再計算したハッシュ値(crc)とを比較し、両者が異なっていたとき、前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする。
【0020】
このように、スタック領域に記憶するデータの複製を記憶させる、またはデータが大きい場合にハッシュ値(crc)を算出して記憶させること、さらに、プログラムの実施時に記憶したデータまたはハッシュ値(crc)と、複製データまたは再計算したハッシュ値(crc)とを比較することは、市販されているコンパイラで作ったプログラムにそのような指示を行うだけで実施できる。そのため、比較結果が異なっていたとき、プログラムの実行を中止してスタック領域に記憶したデータに異常があることをユーザに通知すれば、異常事態が起こる前にその発生を防止でき、非常に簡単な方法でスタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、などで生じたデータ破損を検知できる、コンピュータメモリにおけるスタック領域のデータの保護方法を提供することができる。
【0021】
そして、前記スタック領域における関数への引数の記憶領域に関数への引数とその複製を同時に記憶し、前記関数の実行後、前記関数への引数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、関数への引数は通常それほど多くないからメモリ領域を多く使用することもなく、簡単にデータ異常を検出することができる。
【0022】
さらにその際、前記関数への引数が複数有る場合、前記関数への引数とその複製とを、関数への全引数、その全複製の順に記憶するか、または関数への第1の引数、その関数への第1の引数の複製、関数への第2の引数、その関数への第2の引数の複製、の順で複数データを同様に対にして記憶させることで、関数への第1の引数、その関数への第1の引数の複製、関数への第2の引数、その関数への第2の引数の複製、……とした場合には、例えば複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、の場合、壊された引数が関数への第1の引数、その関数への第1の引数の複製程度で止まっていた場合、他の引数から修復することも可能となる。
【0023】
また、前記スタック領域における関数への引数の記憶領域に関数への引数とそのハッシュ値(crc)とを同時に記憶し、前記関数の実行後、前記関数への引数のハッシュ値(crc)を再計算して前記記憶させたハッシュ値(crc)と再計算結果とを比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、関数への引数が多くてデータ量が多くなる場合、複製を作ることでメモリ領域を圧迫するが、このようにハッシュ値(crc)を用いることで少ないメモリ容量で同様な効果を得ることができる。
【0024】
さらにその際、前記スタック領域における関数への引数の記憶領域に記憶する関数への引数のハッシュ値(crc)の複製をさらに記憶させ、前記関数の実行後、前記関数への引数のハッシュ値(crc)を再計算し、前記記憶させたハッシュ値(crc)と複製ハッシュ値(crc)と前記再計算結果とを比較し、前記再計算結果とハッシュ値(crc)と複製ハッシュ値(crc)との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、ハッシュ値の複製をさらに記憶させれば、より、確実にデータ異常を検出することができる。
【0025】
そして、前記スタック領域におけるローカル変数領域にローカル変数とその複製とを記憶し、前記ローカル変数の計算毎に前記ローカル変数領域に計算結果のローカル変数とその複製とを格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、悪意のあるプログラムによるデータの破損は通常、ローカル変数の領域から行われることが多いから、このようにローカル変数を複製し、比較することで、こういった悪意のあるプログラムによるデータの破損を確実に検出することができる。
【0026】
さらにこの場合、前記ローカル変数が複数有る場合、前記ローカル変数とその複製とを、全ローカル変数、その全ローカル変数の複製の順に記憶するか、または第1のローカル変数、その第1のローカル変数の複製、第2のローカル変数、その第2のローカル変数の複製、の順で複数データを対にして並べて記憶させることで、引数の場合と同様、壊されたローカル変数が第1のローカル変数、その第1のローカル変数の複製程度で止まっていた場合、他のローカル変数から修復することも可能となる。
【0027】
また、前記スタック領域におけるローカル変数領域にローカル変数とそのハッシュ値(crc)とを記憶し、前記ローカル変数の計算毎に計算結果とローカル変数のハッシュ値(crc)を再計算して格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値(crc)を再計算して記憶されたハッシュ値(crc)と比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、ローカル変数のデータ量が多くなる場合、複製を作ることでメモリ領域を圧迫するが、このようにハッシュ値(crc)を用いることで少ないメモリ容量で同様な効果を得ることができる。
【0028】
そしてその際、前記ローカル変数とそのハッシュ値(crc)とを記憶する領域にさらにローカル変数のハッシュ値(crc)の複製を記憶する領域を確保し、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ローカル変数のハッシュ値(crc)とその複製の領域に計算結果のハッシュ値(crc)を再計算して格納し、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値(crc)を再計算して前記記憶させたハッシュ値(crc)と複製ハッシュ値(crc)と比較し、前記再計算結果と記憶されたハッシュ値(crc)と複製ハッシュ値(crc)との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、ハッシュ値の複製をさらに記憶させれば、より、確実にデータ異常を検出することができる。
【0029】
そして、前記スタック領域における関数への引数領域に関数への引数とその複製とを同時に記憶すると共に、前記ローカル変数領域にローカル変数とそのハッシュ値(crc)とを記憶して、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ハッシュ値(crc)の記憶領域に計算結果のハッシュ値(crc)を計算して格納し、前記関数の実行後に前記関数への引数とその複製とを比較すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値(crc)を再計算して記憶されたハッシュ値(crc)と比較し、それぞれの比較結果のいずれかが異なっていた場合に前記プログラムの実行を中止して、前記スタック領域に記憶したデータに異常があることをユーザに通知することで、関数への引数は通常データ量がそれほど大きくなく、ローカル変数は大きなものがあるがハッシュ値(crc)とすることでデータ量が小さくでき、関数への引数とローカル変数との異常を一度に検出でき、さらにスタック領域のデータの保護を確実に行うことができる。
【0030】
また、前記スタック領域に記憶するデータの複製、または複製データが大きい場合に記憶するハッシュ値(crc)は、ビット反転させたデータを用いることで、スタック領域における特定ビットの故障の場合、故障ビットは反転されないから確実に故障ビットがあることを検出することができる。
【0031】
そして、このようなコンピュータメモリにおけるスタック領域のデータの保護方法を、ガスタービンによる発電システムにおける、コンピュータを用いた制御装置の安全制御システムに用いることで、メモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、悪意のあるプログラム(ウィルス)が紛れ込んでデータを壊した、など、万が一の不測の事態を含むデータ異常があっても、重大事故を起こす前に緊急停止を含む、常に安全側に動作するシステムを構築することができる。
【発明の効果】
【0032】
以上記載のごとく本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法は、市販されているコンパイラで作ったプログラムにおける、プログラムを記憶するメモリが万が一壊れた場合でも、また、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、などで生じたデータ破損も簡単に、確実に検出でき、例えばプラントを動かす大事なプログラムなどにおいても、プログラム暴走による重大事故を未然に防ぐことができる。
【図面の簡単な説明】
【0033】
【図1】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法を組み込んだコントローラを有する、火力発電所のガスタービンにおけるコントロールシステムの概略説明図である。
【図2】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例1のフロー図である。
【図3】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例1を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)は変形例である。
【図4】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2のフロー図である。
【図5】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)は変形例である。
【図6】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例3のフロー図である。
【図7】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例3を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)は変形例である。
【図8】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例4のフロー図である。
【図9】本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例4を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)は変形例である。
【図10】(A)はスタック領域の構成例、(B)はバッファオーバーフローを用いたスタックスマッシングにより、データがどのように書き換えられるかを説明するための図、(C)、(D)は従来のスタックスマッシングに対する防御方法を説明するための図で、(C)はカナリア法、(D)は直接検査方法である。
【発明を実施するための形態】
【0034】
以下、図面を参照して本発明の好適な実施例を例示的に詳しく説明する。但しこの実施例に記載されている構成部品の寸法、材質、形状、その相対的配置等は特に特定的な記載がない限りはこの発明の範囲をそれに限定する趣旨ではなく、単なる説明例に過ぎない。
【0035】
図1は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法を組み込んだコントローラを有する、火力発電所のガスタービンにおけるコントロールシステムの概略説明図である。なお、以下の説明では、本発明を図1に示したガスタービンのコントロールシステムに組み込んだ場合を例に説明するが、本発明はガスタービンだけに限らず、蒸気タービンのコントロールシステムにも適用できることは当業者なら自明である。
【0036】
図中、10はガスタービン、12はこのガスタービン10で駆動される発電機、13はガスタービン10の回転数をピックアップする回転数センサ、14はガスタービン10のコントロールバルブ16を開閉し、ガスタービン10の場合は燃料流量を、蒸気タービンの場合は蒸気の流量を回転数に応じて制御してガスタービン10(あるいは蒸気タービン)を制御し、発電機12の発電量を制御するためのバルブ制御装置、19は蒸気若しくは燃料を遮断するためのシャットオフバルブ、21はそれぞれの弁(バルブ)を遮断するためのトリップバルブ、15は回転数センサ13からの信号を受け、オーバースピードを検知してトリップバルブ21を制御し、タービンをトリップさせる保護装置としての回転数入力装置、17はセンサやバルブに代表されるアクチュエータの信号を、コントロール・コンピュータ18とやり取りするための入出力装置、18はこのバルブ制御装置14に制御指示を送るコントロールコンピュータの概略図で、20はデータ処理装置(CPU)、22は制御プログラム24、その他のデータなどを記憶している記憶装置、26はデータ処理装置20がプログラムを実行するためのメインメモリ装置で、その中にスタック28の領域が確保される。
【0037】
そして、データ処理装置(CPU)20は記憶装置22に記憶された制御プログラム24を読み出し、メインメモリ装置26に記憶させて制御プログラム24の制御の元、バルブ制御装置14に指示してコントロールバルブ16を制御し、発電機12の発電量などを制御するが、その際、データ処理装置(CPU)20が確保したスタック領域28に、前記したように汎用レジスタ保存値30、ローカル変数32、フレームポインタ保存値34、関数の戻り番地36、関数への引数38などを記憶させる。
【0038】
しかし前記したように、このスタック領域28におけるメモリの特定ビットが壊れた、プログラムミスがあってデータが壊れた、前記図10で説明したように、悪意のあるプログラム(ウィルス)が紛れ込んでデータを壊した、などによりデータが壊されたり悪意のあるプログラムが実行された場合、制御プログラム24が暴走したり悪意のあるプログラムにより、燃料をガスタービン10に送り続け、ガスタービン10を破損させたりする大きな事故を起こす可能性があり、このようなことが生じないようにスタック領域のデータの保護を行うのが本発明の目的である。
【0039】
すなわち本発明においては、図1に18で示したようなコンピュータにおける、メインメモリ装置26に確保したスタック領域28に、汎用レジスタ保存値30、ローカル変数32、フレームポインタ保存値34、関数の戻り番地36、関数への引数38を記憶する領域を確保し、制御プログラム24を実施するにあたり、記憶するデータの複製、またはデータが大きい場合にハッシュ値(crc)を同時に保存し、プログラムの実施時、記憶したデータまたはハッシュ値(crc)と複製データまたは再計算したハッシュ値(crc)とを比較し、両者が異なっていたとき、制御プログラム24の実行を中止し、スタック28領域に記憶したデータに異常があることをユーザに通知すると共に、CPU例外を発生させ、システムを完全に停止させるエラー処理を行うようにして、常に安全側に動作するようシステムを構築するものである。
【実施例1】
【0040】
図2は、このような本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例1のフロー図、図3は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例1を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)はその変形例である。
【0041】
本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の第1の実施例においては、前記図10で説明したスタック領域28における、関数への引数28、関数の戻り番地36、フレームポインタ保存値34、ローカル変数32、汎用レジスタ保存値30の、5つのデータを保存するための領域のデータのうち、関数への引数28を関数コールする際に複製して渡し、関数のエントリにあたって複製した引数同士を比較して、不一致を検出した場合にデータ処理装置(CPU)20によりCPU例外を発生させて、システムを安全に停止する等のエラー処理を行うものである。
【0042】
すなわち、例えばa、b、cという関数への引数28がある場合、通常は図3(A)に示したように、スタック領域28の関数への引き数の領域38に、このa、b、cを順に38a、38b、38cの領域に記憶する。それに対して本発明では、図3(B)に示したように、この引数a、b、cをコピーし、それがA、B、Cであるとすると、このA、B、Cも引き数の領域における領域38a、38b、38cの後に38A、38B、38Cとして示した領域に順に記憶するものである。
【0043】
そして関数の実行前とか実行後、もともと領域38a、38b、38cに記憶した引き数a、b、cと、領域38A、38B、38Cにコピーした引数A、B、Cとを比較し、不一致を検出した際には前記したようにデータ処理装置(CPU)20がCPU例外を発生させ、図1のシステムを安全に停止する等のエラー処理を行う。この比較は、相手が正しいデータを送ってきているかどうかを検知するのであれば自分が計算して答えを出したときにチェックするが、完璧を期すのであれば関数を使う前、使った後、もチェックを実施する。しかしチェック回数が増えると時間がかかるため、プログラムの重要度に応じてチェック時期を定める。
【0044】
なお、複製した引数A、B、Cは、図3(C)に示したように順番を入れ替え、38a、38A、38b、38B、38c、38Cのようにオリジナルと複製を対になるように記憶しても良く、さらに複製を2つ以上としても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまうが、対として記憶した場合、例えば38a、38A、の領域だけが壊された場合、38b、38B、38c、38Cの領域に記憶された内容で修復が可能な場合もある。また、そのままコピーするのではなく、複製データはビット反転するようにしても良い。このようにビット反転すると、メモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。
【0045】
このように引数を複製し、2つ以上持たせることで、前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合も複製データは異なったものとなるから、容易にデータ異常を検出でき、しかも、単に引数の複製を作るだけであるから市販されているコンパイラで作ったプログラムで実施することができる。また、引数の値を改変しない場合は、関数のエントリだけでなく、関数の復帰時にもチェックすることで、この領域を前記図10(C)で説明したカナリア的に扱うことが可能となり、スタック領域上での引数データの改変だけでなく、レジスタに割り当てられて渡された引数データの改変も検出できる。
【0046】
図2は、このような考え方に従った、本発明になるコンピュータメモリ装置26におけるスタック領域28のデータの保護方法の実施例1のフロー図である。この図2におけるステップS10で処理がスタートすると、データ処理装置(CPU)20はステップS12で関数コール時に引数の複製データを生成して引数に渡し、図3(B)、(C)に示したように、スタック領域28における領域38a、38b、38c、38A、38B、38Cまたは38a、38A、38b、38B、38c、38Cに記憶する。そしてデータ処理装置(CPU)20はステップS14で、処理の終了時など、関数のエントリでオリジナルの実引数a、b、cと複製した引数A、B、Cとを比較する。
【0047】
そしてデータ処理装置(CPU)20は、ステップS16でこの実引数と複製した引数が一致しているかどうかを判断し、一致している場合はステップS20に進んで終了し、不一致の場合はステップS18でCPU例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【実施例2】
【0048】
図4は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2のフロー図、図5は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)はその変形例である。
【0049】
前記図2、図3で説明した実施例1の方法では、引数が増えた場合、複製にメモリ領域を消費してしまう。そのため本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2は、ハッシュ値(CRC:Cyclic Redundancy Check)と称する、データ伝送の分野でデータが正しく伝わっているかどうかをチェックするためのエラー検出・訂正方式のデータを使う。このハッシュ値は、データをブロック単位に区切り、ブロック内のデータを計算処理して作成したチェック符号であり、単に複製を作るより小さなデータとすることができる。そしてデータ伝送の分野では、データを送るときにこのハッシュ値(crc)を付けて送信し、受信側でデータとハッシュ値(crc)の関連が正常かどうかを確認することで異常を検出するが、本発明ではこれを、データが改ざんされていないかどうかのチェックのために使う。
【0050】
すなわち、例えば図5(A)に示したようにa、b、cという関数への引数があるとすると、通常は前記図3で説明したように、スタック28の領域38a、38b、38cで示したスタック領域の関数への引き数の領域に、順にこのa、b、cを記憶する。それに対して本発明では、図5(B)に示したように、この引数a、b、cのハッシュ値(crc)を付加し、これを領域38crcに記憶するのである。
【0051】
そして関数の実行前とか実行後、もともとの引き数a、b、cのハッシュ値(crc)と再計算したハッシュ値(crc)とを比較し、不一致を検出した際にはCPU例外を発生させ、システムを安全に停止する等のエラー処理を行う。この比較は、相手が正しいデータを送ってきているかどうかを検知するのであれば自分が計算して答えを出したときにチェックするが、完璧を期すのであれば関数を使う前、使った後にもチェックを実施するとよい。しかしチェック回数が増えると時間がかかるため、プログラムの重要度に応じてチェック時期を定める。
【0052】
なお、ハッシュ値(crc)は、図5(C)に示したように、さらにハッシュ値(crc)の複製(CRC)を記憶するようにしてもよく、さらに複製を2つ以上としても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまう。また複製を、前記したようにビット反転するようにしても良い。このようにビット反転するとメモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。また、ハッシュ値(crc)は計算方法がわからないと算出できないから、ハッシュ値(crc)と共にこのハッシュ値(crc)を計算するための関数fcrcを引数として添付しても良い。
【0053】
このように引数にハッシュ値(crc)を付加することで、前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合もハッシュ値(crc)は当初の値とは異なったものとなるから、容易にデータ異常を検出でき、しかも、単にハッシュ値(crc)の計算指示を入れるだけであるから市販されているコンパイラで作ったプログラムで実施することができる。また、引数の値を改変しない場合は、関数のエントリだけでなく、関数の復帰時にもチェックすることで、この領域をカナリア的に扱うことが可能となり、スタック領域上での引数データの改変だけでなく、レジスタに割り当てられて渡された引数データの改変も検出できる。
【0054】
図4は、このような考え方に従った、本発明になるコンピュータメモリ装置26におけるスタック領域28のデータの保護方法の実施例2のフロー図である。この図4における
ステップS22で処理がスタートすると、データ処理装置(CPU)20はステップS24で関数コール時に全引数のハッシュ値(crc)を計算し、図5(B)、(C)に示したように、スタック領域28におけるこの値を関数への引数38a、38b、38cと共に38crcに記憶する。
【0055】
そしてデータ処理装置(CPU)20はステップS26で、処理終了時など、関数のエントリでオリジナルの実引数のハッシュ値(crc)を再計算する。そしてステップS28でデータ処理装置(CPU)20は、この領域38crcに記憶しているハッシュ値(crc)と再計算したハッシュ値(crc)とが一致しているかどうかを判断し、一致している場合はステップS32に進んで終了し、不一致の場合はステップS30でCPU例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【実施例3】
【0056】
図6は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例3のフロー図、図7は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)はその変形例である。
【0057】
以上説明してきた、実施例1、2の本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法では、呼び出し側で引数を渡してやって異常を検知するためのものであったが、この図6、図7に示した実施例3では、ローカル変数が計算中に壊れていないかを自主的に自分自身でチェックするもので、自分の中で使うデータ領域を2つ用意し、計算するたびに2つの領域に同じデータを書き込み、使うときに常に2つを比較してチェックするものである。
【0058】
すなわち図7(A)に示したように、例えばp、q、rというローカル変数があるとすると、通常はスタック領域のローカル変数32の領域に、これらの変数を収納する領域32p、32q、32rに順にp、q、rとして記憶する。そして計算のたびにこれを読み出し、また、計算結果を格納する。それに対して本発明では、図7(B)に示したように、このp、q、rというローカル変数の複製P、Q、Rを格納する領域32P、32Q、32Rを確保し、計算のたびに領域32p、32q、32rと32P、32Q、32Rに、p、q、rと複製P、Q、Rとをその都度保存し、かつ、その都度これらp、q、rとP、Q、Rとを比較して、不一致を検出した際にデータ処理装置(CPU)20がCPU例外を発生させ、システムを安全に停止する等のエラー処理を行う。
【0059】
なお、ローカル変数p、q、rのコピーP、Q、Rは、図7(C)に示したように、順番を入れ替え、領域32p、32P、32q、32Q、32r、32Rのようにしてそれぞれの計算結果を対になるように記憶しても良く、さらに複製を2つ以上としても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまうが、対として記憶した場合、例えば32a、32A、の領域だけが壊された場合、32b、32B、32c、32Cの領域に記憶された内容で修復が可能な場合もある。また、そのままコピーするのではなく、ローカル変数の複製したP、Q、Rデータをビット反転するようにしても良い。このようにビット反転すると、メモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。
【0060】
このようにローカル変数を複製した記憶領域を設け、計算毎にそれぞれの領域に記憶させて比較することで、前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合もローカル変数の値は元の値と複製の値が異なってくるから、容易にデータ異常を検出でき、しかも、単にローカル変数をコピーして比較するだけであるから、市販されているコンパイラで作ったプログラムで実施することができる。
【0061】
図6は、このような考え方に従った、本発明になるコンピュータメモリ装置26におけるスタック領域28のデータの保護方法の実施例3のフロー図である。この図6におけるステップS34で処理がスタートすると、データ処理装置(CPU)20はステップS36で関数のエントリでローカル変数p、q、rの複製した変数P、Q、Rをローカルメモリ32の領域32p、32q、32rと32P、32Q、32R上に置く。そしてステップS38で、ローカル変数p、q、rの内容を初期化/変更するたびに、複製用の変数の領域32P、32Q、32に同じ値を格納する。
【0062】
そしてデータ処理装置(CPU)20はステップS40で、変数の内容を参照するたび、若しくは、関数から復帰する直前等の予め決めておいたチェックポイントで、領域32p、32q、32rと32P、32Q、32Rに記憶されている値を比較する。そしてデータ処理装置(CPU)20は、ステップS42でローカル変数p、q、rと複製した変数P、Q、Rとが一致しているかどうかを判断し、一致している場合はステップS46に進んで終了し、不一致の場合はステップS44でCPU例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【実施例4】
【0063】
図8は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例4のフロー図、図9は、本発明になるコンピュータメモリにおけるスタック領域のデータの保護方法の実施例2を説明するための図で、(A)は従来のスタック領域の状態、(B)は本発明の方法を用いた状態、(C)はその変形例である。
【0064】
この実施例4は、先に説明した実施例2と同様、ローカル変数のうち、値を全く(もしくは頻繁に)変更せず、サイズが大きいデータに関してそのハッシュ値(crc)を計算し、それをローカル変数と共にスタック領域上に記憶し、ローカル変数が計算中に壊れていないかを自主的に自分自身でチェックするもので、ローカル変数の領域32p、32q、32r以外にハッシュ値(crc)を記憶する領域32crcを用意し、p、q、rの値を変更するたびにp、q、rのハッシュ値(crc)を再算出して両者を比較してチェックするものである。
【0065】
すなわち図9に示したように、例えばp、q、rというローカル変数があるとすると、通常は図9(A)のようにスタック領域のローカル変数領域32に、これらの変数を収納する領域を順に32p、32q、32rとして確保する。そして計算のたびに変数p、q、rを読み出し、また、計算結果を領域32p、32q、32rに格納する。それに対して本発明では、図9(B)に示したように、このp、q、rというローカル変数のハッシュ値(crc)を格納する領域32crcを確保し、p、q、rの値を変更するたびにp、q、rのハッシュ値(crc)を再算出して、この領域32crcに記憶されているハッシュ値(crc)と比較し、不一致を検出した際にはCPU例外を発生させ、システムを安全に停止する等のエラー処理を行う。
【0066】
なお、ローカル変数p、q、rのハッシュ値(crc)は、図7(C)に示したようにさらにハッシュ値(crc)の複製ハッシュ値(CRC)を記憶させる領域32CRCを用意し、2つの領域に記憶させても良く、さらに複製を2つ以上の領域に記憶させるようにしても良い。この場合、スタック領域を消費することと、処理時間がそれだけかかってしまう。また複製ハッシュ値(CRC)については、前記したのと同様ビット反転するようにしても良い。このようにビット反転すると、メモリ故障によって特定のビットだけが壊れたような場合、その壊れたところがビット反転されないから異常が生じていることが容易に判明する。また、ハッシュ値(crc)は計算方法がわからないと算出できないから、ハッシュ値(crc)と共にこのハッシュ値(crc)を計算するための関数fcrcをローカル変数として記憶させても良い。
【0067】
このようにローカル変数のハッシュ値(crc)を記憶させることで、少ないメモリ領域で前記したメモリ故障によって特定のビットだけが壊れた、間違えたアドレスを使ってしまった、スタックスマッシング攻撃があったなど、そのいずれの場合もローカル変数のハッシュ値(crc)と再計算したハッシュ値(crc)とは値が異なってくるから、容易にデータ異常を検出でき、しかも、単にローカル変数のハッシュ値(crc)算出するだけであるから、市販されているコンパイラで作ったプログラムで実施することができる。
【0068】
図8は、このような考え方に従った、本発明になるコンピュータメモリ装置26におけるスタック領域28のデータの保護方法の実施例4のフロー図である。この図8におけるステップS50で処理がスタートすると、データ処理装置(CPU)20はステップS52で関数のエントリでローカル変数p、q、rのハッシュ値(crc)を計算し、領域32crcに置く。そしてステップS54で、ローカル変数p、q、rの内容を初期化/変更するたびにローカル変数p、q、rのハッシュ値(crc)の値を再計算して領域32crcに置き直す。
【0069】
そしてデータ処理装置(CPU)20はステップS56で、変数の内容を参照するたび、若しくは、関数から復帰する直前等の予め決めておいたチェックポイントで、ローカル変数p、q、rのハッシュ値(crc)を再計算し、領域32crcに格納しておいた値と比較する。その結果、ステップS58でローカル変数p、q、rの領域32crcに記憶したハッシュ値(crc)と再計算結果とが一致しているかどうかを判断し、一致している場合はステップS62に進んで終了し、不一致の場合はステップS60でCPU例外を発生させ、システムを完全に停止させるエラー処理を行って終了する。
【0070】
このように、スタック領域28に記憶するデータの複製を記憶させる、またはデータが大きい場合にハッシュ値(crc)を算出して記憶させること、さらに、プログラムの実施時に記憶したデータまたはハッシュ値(crc)と、複製データまたは再計算したハッシュ値(crc)とを比較することは、市販されているコンパイラで作ったプログラムにそのような指示を行うだけで実施できる。そのため、比較結果が異なっていたとき、プログラムの実行を中止してスタック領域に記憶したデータに異常があることをユーザに通知すれば、異常事態が起こる前にその発生を防止でき、非常に簡単な方法でスタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、などで生じたデータ破損を検知できる、コンピュータメモリにおけるスタック領域のデータの保護方法を提供することができる。
【0071】
なお、以上の説明では、スタックメモリ上の引数とローカル変数を別々にデータ保護する場合を例に説明してきたが、例えば実施例1で説明した関数への引数28を関数コールする際に複製して渡し、関数のエントリにあたって複製した引数同士を比較して、不一致を検出した場合にデータ処理装置(CPU)20によりCPU例外を発生させる方法、及び実施例4で説明したローカル変数の領域32p、32q、32r以外にハッシュ値(crc)を記憶する領域32crcを用意し、計算するたびにハッシュ値(crc)を再算出して両者を比較してチェックする方法とを併用すると、関数への引数は通常データ量がそれほど大きくなく、ローカル変数は大きなものがあるがハッシュ値(crc)とすることでデータ量が小さくできるから、関数への引数とローカル変数の異常とを一度に検出でき、さらにスタック領域28のデータの保護を確実に行うことができる。またこれは、実施例2と実施例3を組み合わせた場合も同様である。
【産業上の利用可能性】
【0072】
本発明によれば、スタック領域における、特に関数への引数、ローカル変数の改変を、市販されているコンパイラで作ったプログラムで検知でき、さらに、メモリ故障等による改変の検出も実施可能であるから、特に、火力発電所のガスタービンにおける安全システムなど、もしプログラムが暴走した場合は大きな事故を起こす可能性のあるシステムにおける、コンピュータメモリにおけるスタック領域のデータの保護方法として好適である。
【符号の説明】
【0073】
10 ガスタービン(もしくは、蒸気タービン)
12 発電機
13 回転数センサ
14 バルブ制御装置
15 回転数入力装置
16 コントロールバルブ
17 入出力装置
18 コントロールコンピュータ
19 シャットオフバルブ
20 データ処理装置(CPU)
21 トリップバルブ
22 記憶装置
24 制御プログラム
26 メインメモリ装置
28 スタック領域
30 汎用レジスタ保存値
32 ローカル変数
34 フレームポインタ保存値
36 関数の戻り番地
38 関数への引数
50 攻撃コード
52 関数の戻り番地
60 カナリア
62 ヒープ領域

【特許請求の範囲】
【請求項1】
プログラムによりコンピュータメモリにおけるスタック領域に、関数への引数、関数の戻り番地、フレームポインタ保存値、ローカル変数、汎用レジスタ保存値の各データを保存するための領域を確保し、前記プログラムを実施するとき、前記スタック領域における特定ビットの故障、複数の作成者のプログラミングにより生じた使用アドレス間違いによるデータの破損、悪意のあるプログラムによるデータの破損、を含むいずれかにより生じたデータ破損による前記プログラムの暴走を含む異常事態を生じないようにした、コンピュータメモリにおけるスタック領域のデータの保護方法であって、
前記スタック領域に記憶するデータの複製、またはデータが大きい場合にハッシュ値(crc)を同時に保存し、前記プログラムの実施時、前記記憶したデータまたはハッシュ値(crc)と、複製データまたは再計算したハッシュ値(crc)とを比較し、両者が異なっていたとき、前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とするコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項2】
前記スタック領域における関数への引数の記憶領域に関数への引数とその複製を同時に記憶し、前記関数の実行後、前記関数への引数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項1に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項3】
前記関数への引数が複数有る場合、前記関数への引数とその複製とを、関数への全引数、その全複製の順に記憶するか、または関数への第1の引数、その関数への第1の引数の複製、関数への第2の引数、その関数への第2の引数の複製、の順で複数データを同様に対にして記憶させることを特徴とする請求項2に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項4】
前記スタック領域における関数への引数の記憶領域に関数への引数とそのハッシュ値(crc)とを同時に記憶し、前記関数の実行後、前記関数への引数のハッシュ値(crc)を再計算して前記記憶させたハッシュ値(crc)と再計算結果とを比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項1に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項5】
前記スタック領域における関数への引数の記憶領域に記憶する関数への引数のハッシュ値(crc)の複製をさらに記憶させ、前記関数の実行後、前記関数への引数のハッシュ値(crc)を再計算し、前記記憶させたハッシュ値(crc)と複製ハッシュ値(crc)と前記再計算結果とを比較し、前記再計算結果とハッシュ値(crc)と複製ハッシュ値(crc)との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項4に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項6】
前記スタック領域におけるローカル変数領域にローカル変数とその複製とを記憶し、前記ローカル変数の計算毎に前記ローカル変数領域に計算結果のローカル変数とその複製とを格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数とその複製とを比較して両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項1に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項7】
前記ローカル変数が複数有る場合、前記ローカル変数とその複製とを、全ローカル変数、その全ローカル変数の複製の順に記憶するか、または第1のローカル変数、その第1のローカル変数の複製、第2のローカル変数、その第2のローカル変数の複製、の順で複数データを対にして並べて記憶させることを特徴とする請求項6に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項8】
前記スタック領域におけるローカル変数領域にローカル変数とそのハッシュ値(crc)とを記憶し、前記ローカル変数の計算毎に計算結果とローカル変数のハッシュ値(crc)を再計算して格納すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値(crc)を再計算して記憶されたハッシュ値(crc)と比較し、両者が異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項1に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項9】
前記ローカル変数とそのハッシュ値(crc)とを記憶する領域にさらにローカル変数のハッシュ値(crc)の複製を記憶する領域を確保し、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ローカル変数のハッシュ値(crc)とその複製の領域に計算結果のハッシュ値(crc)を再計算して格納し、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値(crc)を再計算して前記記憶させたハッシュ値(crc)と複製ハッシュ値(crc)と比較し、前記再計算結果と記憶されたハッシュ値(crc)と複製ハッシュ値(crc)との値のいずれかが異なっていた場合に前記プログラムの実行を中止し、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項8に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項10】
前記スタック領域における関数への引数領域に関数への引数とその複製とを同時に記憶すると共に、前記ローカル変数領域にローカル変数とそのハッシュ値(crc)とを記憶して、前記ローカル変数の計算毎に前記ローカル変数の記憶領域に計算結果を、ハッシュ値(crc)の記憶領域に計算結果のハッシュ値(crc)を計算して格納し、前記関数の実行後に前記関数への引数とその複製とを比較すると共に、前記ローカル変数の計算前、計算後に、前記ローカル変数のハッシュ値(crc)を再計算して記憶されたハッシュ値(crc)と比較し、それぞれの比較結果のいずれかが異なっていた場合に前記プログラムの実行を中止して、前記スタック領域に記憶したデータに異常があることをユーザに通知することを特徴とする請求項1に記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項11】
前記スタック領域に記憶するデータの複製、または複製データが大きい場合に記憶するハッシュ値(crc)は、ビット反転させたデータを用いることを特徴とする請求項1乃至10のいずれかに記載したコンピュータメモリにおけるスタック領域のデータの保護方法。
【請求項12】
ガスタービンによる発電システムにおける、コンピュータを用いた制御装置の安全制御システムに用いられていることを特徴とする、請求項1乃至11のいずれかに記載したコンピュータメモリにおけるスタック領域のデータの保護方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate


【公開番号】特開2010−198147(P2010−198147A)
【公開日】平成22年9月9日(2010.9.9)
【国際特許分類】
【出願番号】特願2009−40086(P2009−40086)
【出願日】平成21年2月24日(2009.2.24)
【出願人】(000006208)三菱重工業株式会社 (10,378)
【Fターム(参考)】