(57)【特許請求の範囲】
【請求項１】
メモリ上の任意の位置に存在する命令を次に実行する命令として指定する制御遷移の指定先となりうるメモリアドレスの第１のビット位置の値から所定の計算により算出された第１の値を、当該メモリアドレスの第２のビット位置の値となるように変換する変換部と、
前記制御遷移の命令が実行される前に、当該制御遷移によって指定される命令のメモリアドレスの前記第１の値が前記第２のビット位置の値と一致するか否かを判定し、一致しない場合に、前記制御遷移の命令が不正な命令であると判定する判定部と、
を備えたことを特徴とする制御監視装置。
【請求項２】
前記判定部によって前記制御遷移によって指定される命令のメモリアドレスの前記第１の値が前記第２のビット位置の値と一致すると判定された場合に、当該メモリアドレスを前記変換部による変換前の値に補正する補正部をさらに備えたことを特徴とする請求項１に記載の制御監視装置。
【請求項３】
前記メモリが所定の領域に分割された分割領域に、前記メモリ上の任意の位置に存在する命令を複製する複製部をさらに備えたことを特徴とする請求項１又は２に記載の制御監視装置。
【請求項４】
前記複製部は、仮想メモリにおける前記分割領域に、前記メモリ上の任意の位置に存在する命令を複製した場合に、当該分割領域全てを単一の物理メモリに対応させることを特徴とする請求項３に記載の制御監視装置。
【請求項５】
メモリ上の任意の位置に存在する命令を次に実行する命令として指定する制御遷移の制御を監視する制御監視装置によって実行される制御監視方法であって、
前記制御遷移の指定先となりうるメモリアドレスの第１のビット位置の値から所定の計算により算出された第１の値を、当該メモリアドレスの第２のビット位置の値となるように変換する変換工程と、
前記制御遷移の命令が実行される前に、当該制御遷移によって指定される命令のメモリアドレスの前記第１の値が前記第２のビット位置の値と一致するか否かを判定し、一致しない場合に、前記制御遷移の命令が不正な命令であると判定する判定工程と、
を含んだことを特徴とする制御監視方法。
【請求項６】
メモリ上の任意の位置に存在する命令を次に実行する命令として指定する制御遷移の指定先となりうるメモリアドレスの第１のビット位置の値から所定の計算により算出された第１の値を、当該メモリアドレスの第２のビット位置の値となるように変換する変換手順と、
前記制御遷移の命令が実行される前に、当該制御遷移によって指定される命令のメモリアドレスの前記第１の値が前記第２のビット位置の値と一致するか否かを判定し、一致しない場合に、前記制御遷移の命令が不正な命令であると判定する判定手順と、
をコンピュータに実行させることを特徴とする制御監視プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、制御監視装置、制御監視方法及び制御監視プログラムに関する。
【背景技術】
【０００２】
従来、ソフトウェアに対する攻撃の中でも、メモリ上のコードを指すポインタ（以下、コードポインタと記す）をバッファオーバーフロー攻撃などによって書き換えることにより、攻撃者がプログラムの制御フローを奪取するような攻撃が脅威となっている。このような攻撃は、成功すると標的と同等の権限で攻撃者が自由に命令を実行することが可能となるため、その影響度は高い。このような攻撃を行う際には、攻撃者が用意した命令列をスタックやヒープなどの書き込み可能領域へ挿入してそこへ制御遷移させる方法（コード挿入）と、メモリ上に既に存在する命令列へ制御遷移させる方法(コード再利用) とがある。
【０００３】
最近のハードウェアやＯＳ（Operating  System）においては、指定したメモリ領域を実行不可能にさせる機能が備えられており、コード挿入を効果的に防ぐことができるようになっている。しかしながら、コード再利用については、有名なReturn-to-libc 攻撃だけでなく、その一般形であるＲＯＰ (Return  Oriented  Programming) 攻撃などに見られるように、現在主流の攻撃方法として未だ多くの攻撃コードで利用されている。このような攻撃を行うためには、再利用の対象となる命令列がメモリ上のどのアドレス（位置）に存在するのかを攻撃者が把握し、それを攻撃コード内で指定することが多くの場合必要となる。
【０００４】
上述したコード再利用による攻撃に対する対策として、これまで様々な技術が提案されているが、例えば、非特許文献１のように、多くの場合、特殊なコンパイラによるソースコードからの再コンパイルが必要であるなど、一般用途で許容できる実用性を有していない。しかしながら、Windows（登録商標）を含む、最近の主要なＯＳの多くには、ＡＳＬＲ (Address  Space  Layout  Randomization) という実用性に優れた対策技術が導入されている（例えば、非特許文献２）。
【０００５】
ＡＳＬＲは、プログラムイメージがメモリ上にロードされる先のアドレスをランダマイズする手法であり、その効果としてプログラムイメージ内の各命令が配置されるアドレスが予測できなくなるため、攻撃時に遷移先のアドレスを指定することが困難となる。 さらに、ＡＳＬＲは、あくまでも配置先を変えているだけであり、プログラムの構造や実行内容については、ＡＳＬＲを適用しない場合と全く同じものを保持することができるため、再配置されることを意識して開発されたプログラムでさえあれば誤動作の心配が少なく、再コンパイルの必要もないことより実用性に優れている。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】D. Williams et al., “Security through Diversity: Leveraging Virtual Machine Technology,” IEEE Security and Privacy 7, 2009.
【非特許文献２】MSDN Library, “Windows ISV Software Security Defenses”, http://msdn.microsoft.com/en-us/library/bb430720.aspx
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述した従来技術では、アドレスの結びつけを利用した攻撃に対して脆弱性を有していた。例えば、上述した従来技術では、アドレス漏洩を利用した攻撃や、Partial  Overwriteと呼ばれる攻撃などに対して脆弱性を有していた。
【０００８】
アドレス漏洩とは、コードポインタの内容が攻撃者に対して明らかになるような欠陥であり、例えば、format  string脆弱性が悪用されることによってスタック上に保存された関数の戻り先アドレスが攻撃者に知られてしまうケースなどが該当する。ここで、攻撃者は、実行されているプログラムと同一のプログラムを保持している場合、メモリ上の命令Ａのアドレスａ が攻撃者へ漏洩すると、同プログラムイメージ上の別の任意の命令Ｘのメモリ上のアドレスｘを、ＡとＸの距離ｄを用いて「ｘ=ａ+ｄ」によって計算することが可能となる。これにより、攻撃者は、このプログラムイメージの任意の命令について、攻撃対象システム上でのアドレスを特定することが可能となる。
【０００９】
また、Partial  Overwriteとは、アドレスの具体的な値の漏洩を必要とせず、書き換え先がアドレスであることさえ既知であれば実行可能な攻撃である。ＡＳＬＲでは、メモリ割り当てサイズやページサイズの都合から上位ビットのみがランダマイズされることが一般的である（例えば、Windows７  ３２bit におけるＡＳＬＲの実装では、ビット１７〜２４の８ビットがランダマイズされる仕様となっている）ため、上位ビットがランダマイズされていても、下位ビットのみのアドレスを書き換えることによってアドレスの指定が可能となり、Partial  Overwriteは、これを利用した攻撃である。またｘ８６のバイトオーダは、リトルエンディアンであり、メモリ上ではアドレスがバイト単位で下位から順に保存されているため、本攻撃はバッファオーバーフロー攻撃にも容易に適用できる。
【００１０】
ＡＳＬＲは、プログラムイメージ全体を１つの塊として動かしているために、その中でのアドレスの結びつけを可能としてしまい、その結果、上述したような攻撃が成立することとなる。
【００１１】
そこで、本願に係る技術は、上述した従来技術の問題に鑑みてなされたものであって、アドレスの結びつけを利用した攻撃に対する安全性を向上させることを可能にする制御監視装置、制御監視方法及び制御監視プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するため、本願に係る制御監視装置は、メモリ上の任意の位置に存在する命令を次に実行する命令として指定する制御遷移の指定先となりうるメモリアドレスを所定の条件に従うように変換する変換部と、前記制御遷移の命令が実行される前に、当該制御遷移によって指定される命令のメモリアドレスが前記所定の条件に従っているか否かを判定し、従っていない場合に、前記制御遷移の命令が不正な命令であると判定する判定部とを備えることを特徴とする。
【発明の効果】
【００１３】
本願に係る装置は、アドレスの結びつけを利用した攻撃に対する安全性を向上させることを可能にする。
【図面の簡単な説明】
【００１４】
【図１】図１は、第１の実施形態に係る制御監視装置の概要を説明するための図である。
【図２】図２は、第１の実施形態に係る制御監視装置のモジュール構成要素を示した図である。
【図３】図３は、第１の実施形態に係る制御遷移の一例を示す図である。
【図４】図４は、第１の実施形態に係る制御監視装置による処理の手順を示すフローチャートである。
【図５】図５は、第２の実施形態に係る制御監視装置のモジュール構成要素を示した図である。
【図６】図６は、第２の実施形態に係る制御遷移の一例を示す図である。
【図７】図７は、第２の実施形態に係る制御監視装置による処理の手順を示すフローチャートである。
【図８】図８は、第３の実施形態に係る制御監視プログラムを実行するコンピュータを示す図である。
【発明を実施するための形態】
【００１５】
以下に添付図面を参照して、本願の開示する制御監視装置、制御監視方法及び制御監視プログラムの実施例を詳細に説明する。なお、本願の開示する制御監視装置、制御監視方法及び制御監視プログラムは、以下の実施例により限定されるものではない。
【００１６】
（第１の実施形態）
まず、第１の実施形態に係る制御監視装置の概要について説明する。図１は、第１の実施形態に係る制御監視装置１００の概要を説明するための図である。図１に示すように、第１の実施形態に係る制御監視装置１００は、ＯＳ（Operating  System）がインストールされたハードウェア上で防御対象プログラム及び制御監視プログラムが動作する。防御対象プログラムは、攻撃者からの攻撃に対して防御の対象となるプログラムであり、再配置可能である。ここで、再配置とは、プログラムがロードされる位置に応じて、プログラム内に出現するアドレスの値を調整することである。これによりプログラムを任意の位置にロードすることが可能となる。すなわち、防御対象プログラムは、調整対象となるアドレスがプログラム内のどこに存在するかという情報が実行ファイル内に付加されている。
【００１７】
制御監視プログラムは、防御対象プログラムについて、それが実行するすべての命令をフックでき、かつ、そのメモリ空間に自由にアクセスできるプログラムである。そして、制御監視プログラムは、防御対象プログラムにおける制御遷移命令を監視することで、アドレスの結びつけを利用した攻撃に対する安全性を向上させる。なお、制御遷移命令の監視の詳細については、後述する。例えば、制御監視プログラムは、上記の性質を有していれば、ＶＭＭ(Virtual  Machine  Monitor)の機能、ＯＳの機能、ローダアプリケーションの機能、ハードウェアの機能、あるいはそれらの組み合わせとしての形態などとして実現できる。なお、上記したフックとは、プログラム中の特定の箇所にユーザが独自の処理を追加することである。
【００１８】
ＯＳは、ハードウェア上で動作する各種アプリケーションに種々のサービスを提供する基本ソフトである。ハードウェアは、物理的な計算機であり、各種演算処理を実行するＣＰＵ（Central  Processing  Unit）や、各種情報を一時記憶するＲＡＭ（Random  Access  Memory）等を有する。なお、本実施形態に係る制御監視装置は、当該分野の技術者によって、以下の説明要綱に基づき適宜変形可能である。従って、本実施形態の説明は、当該分野に対して示される内容として広く理解されるべきであり、発明を限定するものではない。
【００１９】
また、本願の対象は、特定の命令セットアーキテクチャに限定されるものではないが、以下では、ＩＡ−３２命令セットアーキテクチャを想定する。したがって、以下に記載するＣＡＬＬ命令などの具体的な制御遷移命令は、それぞれのアーキテクチャではそれに対応する制御遷移命令に置き換えることで実現できる。さらにここでは３２ｂｉｔメモリ空間のシステムでの動作を想定するが、これも必ずしもこれに限ったものではなく、例えば６４ｂｉｔメモリ空間でも実施可能である。
【００２０】
図２は、第１の実施形態に係る制御監視装置１００のモジュール構成要素を示した図である。制御監視装置１００は、図２に示すように、アドレス変換部１０１、アドレス判定部１０２、及びアドレス補正部１０３の三つのモジュールを備える。
【００２１】
アドレス変換部１０１は、メモリ上の任意の位置に存在する命令を次に実行する命令として指定する制御遷移の指定先となりうるメモリアドレスを所定の条件に従うように変換する。具体的には、アドレス変換部１０１は、アドレスの所定のビット位置（以下、被計算ビットと記す）の値から所定の計算方法によって計算された値を、そのアドレス自身の別のビット位置（以下、計算結果ビットと記す）の値として保持させるとする条件に基づいて、アドレスを変換する。これにより、プログラムのメモリアドレス空間の一部分は、ｎを計算結果ビット長として最大２n個の領域（以下、セグメントと記す）に分割され、各アドレスはその被計算ビットから計算された計算結果ビットの値に応じていずれかのセグメントに属することとなる。これにより攻撃者は、この特定の計算方法を把握していない限り、この規則に従ったアドレスを独自に生成することが困難になる。このような仕組みは、例えば、計算方法として他のハッシュ値を容易に推測できないようなハッシュ関数を用い、攻撃者から隠蔽される乱数値を被計算ビット列と共にその入力として与えることにより実現できる。
【００２２】
例えば、アドレス変換部１０１は、以下の条件に基づいてアドレスを変換する。ここで、各アドレスが「０ｘＫＫＡＸＸＸＸＸ」で表されるとする。また、被計算ビットをアドレスの下位から「１−２０ビット」の計２０ビットとして「Ｘ‘＝ＸＸＸＸＸ」で表し、計算結果ビットを下位から「２１−２４ビット」の計４ビットとして「Ａ」で表し、下位から「２５−３２ビット」の計８ビットを、本条件では特に利用しない余剰ビット列として「ＫＫ」で表す。ここで、２０ビット空間から４ビット空間へのハッシュ関数を「Ｈａｓｈ（）」として、Ｒを２０ビット空間から一様ランダムに選択された乱数としたときに、「Ａ＝Ｈａｓｈ（Ｒ＋Ｘ’）」を満たすことが正規のアドレスが満たしているべき条件であると定義する。これにより、アドレス変換部１０１は、プログラムにおける変換後の正規の遷移先アドレスを、Ａの値に応じて、「０ｘＫＫ００００００〜０ｘＫＫ０ＦＦＦＦＦ」、「０ｘＫＫ１０００００〜０ｘＫＫ１ＦＦＦＦＦ」、・・・、「０ｘＫＫＦ０００００〜０ｘＫＫＦＦＦＦＦＦ」の１６個のセグメントのいずれかに振り分けることとなる。
【００２３】
例えば、アドレス変換部１０１は、「Ａ＝Ｈａｓｈ（Ｒ＋Ｘ’）＝３」を満たすアドレス全体を４つ目のセグメントである「０ｘＫＫ３０００００〜０ｘＫＫ３ＦＦＦＦＦ」に振り分ける。なお、ここで用いる被計算ビット列と計算結果ビット列について、ビット長や位置は、利用可能なメモリ空間のサイズ、プログラムのサイズ、及び保証したい安全性のレベルなどを考慮して設定することができる。さらに、どのアドレスがどのセグメントに属するかのパターンは、計算の入力として乱数を与え、それを（例えば、プロセスごとに）変動させることによって変化させることができる。これにより、攻撃者からは、あたかも制御遷移命令の遷移先がランダムに選ばれたセグメントを指しているように見えるため、遷移先として指定したい命令のアドレスがどのセグメントに属するかを指定することが困難になる。
【００２４】
ここで、アドレス変換部１０１は、上記した条件によるアドレスの変換を、アドレスが生成された直後に実行する。すなわち、アドレス変換部１０１は、正規のアドレスが攻撃者によって改ざんされる前にアドレスの変換を実行する。ここで、アドレスは、プログラムの実行開始前に生成されるアドレス（以下、初期アドレスと記す）と、プログラムの実行後に生成されるアドレスとがあるため、アドレス変換部１０１は、この両方のタイミングでアドレスの変換を行う。具体的には、アドレス変換部１０１は、初期アドレスの変換に関しては、プログラムイメージのロード処理をフックして、再配置情報によって指定されている全てのアドレスを条件に基づき変換する。
【００２５】
また、アドレス変換部１０１は、実行時に動的に生成されるアドレス、例えば、ＣＡＬＬ 命令の実行時にスタックに積まれる戻りアドレスなどについては、ＣＡＬＬ命令をフックし、積まれたアドレスを変換して、処理を戻す。
【００２６】
アドレス判定部１０２は、制御遷移の命令が実行される前に、当該制御遷移によって指定される命令のメモリアドレスが所定の条件に従っているか否かを判定し、従っていない場合に、制御遷移の命令が不正な命令であると判定する。具体的には、アドレス判定部１０２は、制御遷移命令が実行される直前に遷移先のアドレスをフックして、アドレス変換部１０１の変換処理と同様に被計算ビットから計算した値を、計算結果ビットと比較することによりアドレスの検証を行う。ここで、被計算ビットと計算結果ビットとが一致した場合、アドレス判定部１０２は、当該アドレスを正常であると判定する。一方、被計算ビットと計算結果ビットとが一致しなかった場合、アドレス判定部１０２は、アドレスを不正であると判定する。
【００２７】
例えば、アドレス判定部１０２は、絶対アドレスを指定した制御遷移命令、すなわち、絶対アドレスを指定したＣＡＬＬ命令、絶対アドレスを指定したＪＭＰ命令、およびＲＥＴ命令をフックして、遷移先アドレスが条件に従っているか否かを検証する。そして、アドレス判定部１０２は、条件に従っていた場合はプログラムを再開させ、条件に従っていなかった場合は、当該アドレスは攻撃者によって不正に改ざんされたものと判定してプログラムを終了させたり、ログを残しつつ実行は再開させるなどの処置をポリシーに応じて実行する。
【００２８】
アドレス補正部１０３は、アドレス判定部１０２によって正常であると判定された遷移先のアドレスの制御遷移命令を実行する場合に、当該遷移先のアドレスを変換前のアドレスに補正する。具体的には、アドレス補正部１０３は、プログラムを再開する場合、その遷移先アドレスに対して、アドレス変換部１０１の変換処理の逆変換を行うことにより得られるアドレスへ制御を遷移させ、プログラムを続行させる。これにより、実際にコードが存在するセグメントに遷移させることができる。
【００２９】
図３は、第１の実施形態に係る制御遷移の一例を示す図である。図３においては、図３の（Ａ）が通常の制御遷移を示し、図３の（Ｂ）が第１の実施形態に係る制御監視装置１００における制御遷移を示す。ここで、図３においては、最小の各矩形がセグメントを示し、ハッチングされたセグメントは実際にコードが存在するセグメントを示す。また、実線の矢印は正常な制御フローを示し、傾いている実線の矢印は、制御遷移命令による実際の制御遷移を示し、点線の矢印は、アドレスによって指定されている制御遷移先を示す。
【００３０】
例えば、通常の制御遷移は、図３の（Ａ）に示すように、アドレスに指定される制御遷移先と実際の制御遷移先とが重なり、１つのセグメント内で遷移される。一方、第１の実施形態に係る制御遷移は、図３の（Ｂ）の矢印１０及び１２に示すように、アドレスによって指定された制御遷移先は、先頭とは異なるセグメントである。ここで、図３の（Ｂ）に示すように、アドレスによって指定された制御遷移先のセグメントには、コードが存在していない。しかしながら、第１の実施形態に係る制御監視装置１００においては、アドレス補正部１０３によってアドレスが補正されることで、図３の（Ｂ）の矢印１１及び１３に示すように、実際の制御遷移先がコードが存在するセグメントから飛び出すことはない。
【００３１】
次に、第１の実施形態に係る制御監視装置１００による処理の手順について、図４を用いて説明する。図４は、第１の実施形態に係る制御監視装置１００による処理の手順を示すフローチャートである。なお、図４における点線の枠内の処理が、アドレス変換部１０１、アドレス判定部１０２、及びアドレス補正部１０３の三つのモジュールによる処理を示す。
【００３２】
図４に示すように、第１の実施形態に係る制御監視装置１００においては、プログラムがロードされると（ステップＳ１０１）、アドレス変換部１０１は、ロードされたプログラムの初期アドレスを変換する（ステップＳ１０２）。初期アドレスが変換された後、制御監視装置１００においては、プログラムが実行開始され（ステップＳ１０３）、実行されたプログラムがＣＡＬＬ命令か否かが判定される（ステップＳ１０４）。
【００３３】
ここで、実行されたプログラムがＣＡＬＬ命令であった場合には（ステップＳ１０４肯定）、アドレス変換部１０１が戻りアドレスを変換して（ステップＳ１０５）、制御監視装置１００において、絶対制御遷移命令か否かが判定される（ステップＳ１０６）。一方、実行されたプログラムがＣＡＬＬ命令ではなかった場合には（ステップＳ１０４否定）、制御監視装置１００において、絶対制御遷移命令か否かが判定される（ステップＳ１０６）。
【００３４】
そして、ステップＳ１０６において、絶対制御遷移命令であった場合には（ステップＳ１０６肯定）、アドレス判定部１０２は、遷移先アドレスを検証して（ステップＳ１０７）、不正なアドレスであるか否かを判定する（ステップＳ１０８）。ここで、不正なアドレスでない場合には（ステップＳ１０８否定）、アドレス補正部１０３が遷移先アドレスを補正して（ステップＳ１０９）、制御監視装置１００において命令が実行される（ステップＳ１１０）。一方、不正なアドレスである場合には（ステップＳ１０８肯定）、制御監視装置１００においてプログラムが終了される。
【００３５】
なお、ステップＳ１０６において、絶対制御遷移命令ではなかった場合には（ステップＳ１０６否定）、制御監視装置１００において命令が実行される（ステップＳ１１０）。ステップＳ１１０における命令の実行後は、次の命令がＣＡＬＬ命令か否かを判定する（ステップＳ１０４）、或いは、プログラムが終了される。
【００３６】
なお、図４に示すフローチャートにおいては、ステップＳ１０８において、不正なアドレスであると判定された場合に、プログラムを終了する場合について示すが、実施形態はこれに限定されるものではなく、例えば、ログを残しつつ実行は再開させるなどの処置をポリシーに応じて実行する場合であってもよい。
【００３７】
［第１の実施形態の効果］
上述したように、第１の実施形態によれば、アドレス変換部１０１は、メモリ上の任意の位置に存在する命令を次に実行する命令として指定する制御遷移の指定先となりうるメモリアドレスを所定の条件に従うように変換する。そして、アドレス判定部１０２は、制御遷移の命令が実行される前に、当該制御遷移によって指定される命令のメモリアドレスが所定の条件に従っているか否かを判定し、従っていない場合に、制御遷移の命令が不正な命令であると判定する。従って、第１の実施形態に係る制御監視装置１００は、特定のアドレスが攻撃者に対して漏洩したとしても、結びつけによって別の命令を一意に指定することを困難にすることができ、アドレスの結びつけを利用した攻撃に対する安全性を向上させることを可能にする。さらに、第１の実施形態に係る制御監視装置１００は、ＡＳＬＲと同様に、特定の命令のアドレスを直接指定することを困難にすることも可能である。その結果、第１の実施形態に係る制御監視装置１００は、アドレス漏洩を利用した攻撃やPartial  Overwrite攻撃を含む、不正な制御遷移に基づいた攻撃を防御することを可能にする。
【００３８】
また、第１の実施形態によれば、アドレス変換部１０１は、メモリアドレスの第１のビット位置の値から所定の計算により算出された第１の値を、当該メモリアドレスの第２のビット位置の値となるような条件を前記所定の条件として用いる。そして、アドレス判定部１０２は、制御遷移によって指定される命令のメモリアドレスの第１の値が第２のビット位置の値と一致するか否かを判定し、一致しない場合に、制御遷移の命令が不正な命令であると判定する。従って、第１の実施形態に係る制御監視装置１００は、攻撃者が独自にアドレスを生成することを困難にすることを可能にする。
【００３９】
また、第１の実施形態によれば、アドレス補正部１０３は、アドレス判定部１０２によって制御遷移によって指定される命令のメモリアドレスの第１の値が第２のビット位置の値と一致すると判定された場合に、当該メモリアドレスをアドレス変換部１０１による変換前の値に補正する。従って、第１の実施形態に係る制御監視装置１００は、正規の制御遷移を確実にコードの存在するセグメントに実行させることを可能にする。
【００４０】
（第２の実施形態）
上述した第１に実施形態においては、遷移先のアドレスを補正することによりコードが存在するセグメントに遷移させる場合について説明した。第２の実施形態では、プログラムイメージをセグメントにコピーすることにより、遷移先のアドレスを補正することなく、コードが存在するセグメントに遷移させる場合について説明する。
【００４１】
図５は、第２の実施形態に係る制御監視装置のモジュール構成要素を示した図である。第２の実施形態に係るモジュール構成要素は、第１の実施形態と比較して、アドレス補正部１０３がなく、プログラムイメージ複製部１０４を新たに有する点が異なる。以下、これを中心に説明する。
【００４２】
プログラムイメージ複製部１０４は、ロードされたプログラムのプログラムイメージを複製して、全てのセグメント上にコピーする。図６は、第２の実施形態に係る制御遷移の一例を示す図である。図６においては、最小の各矩形がセグメントを示し、ハッチングされたセグメントは実際にコードが存在するセグメントを示す。また、実線の矢印は正常な制御フローを示し、傾いている実線の矢印は、制御遷移命令による実際の制御遷移を示し、点線の矢印は、アドレスによって指定されている制御遷移先を示す。
【００４３】
例えば、プログラムイメージ複製部１０４は、図６に示すように、すべてのセグメントにおいてプログラムイメージをコピーする。これにより、第２の実施形態に係る制御遷移では、遷移先アドレスを補正することなく、コードが存在するセグメントに遷移させることができる。すなわち、図６に示すように、第２の実施形態に係る制御遷移では、遷移先アドレスによって指定された矢印１０及び矢印１５と、実際の遷移である矢印１４及び矢印１６とが一致する。このように、第２の実施形態に係る制御遷移は、複数のセグメントを跨いで制御が進むこととなり、遷移先アドレスの逆変換をすることなく制御を続行することができる。
【００４４】
次に、第２の実施形態に係る制御監視装置１００による処理の手順について、図７を用いて説明する。図７は、第２の実施形態に係る制御監視装置１００による処理の手順を示すフローチャートである。なお、図７における点線の枠内の処理が、アドレス変換部１０１、アドレス判定部１０２、及びプログラムイメージ複製部１０４の三つのモジュールによる処理を示す。
【００４５】
図７に示すように、第２の実施形態に係る制御監視装置１００においては、プログラムがロードされると（ステップＳ２０１）、プログラムイメージ複製部１０４は、ロードされたプログラムのプログラムイメージを複製して（ステップＳ２０２）、すべてのセグメントにコピーする。そして、アドレス変換部１０１は、ロードされたプログラムの初期アドレスを変換する（ステップＳ２０３）。初期アドレスが変換された後、制御監視装置１００においては、プログラムが実行開始され（ステップＳ２０４）、実行されたプログラムがＣＡＬＬ命令か否かが判定される（ステップＳ２０５）。
【００４６】
ここで、実行されたプログラムがＣＡＬＬ命令であった場合には（ステップＳ２０５肯定）、アドレス変換部１０１が戻りアドレスを変換して（ステップＳ２０６）、制御監視装置１００において、絶対制御遷移命令か否かが判定される（ステップＳ２０７）。一方、実行されたプログラムがＣＡＬＬ命令ではなかった場合には（ステップＳ２０５否定）、制御監視装置１００において、絶対制御遷移命令か否かが判定される（ステップＳ２０７）。
【００４７】
そして、ステップＳ２０７において、絶対制御遷移命令であった場合には（ステップＳ２０７肯定）、アドレス判定部１０２は、遷移先アドレスを検証して（ステップＳ２０８）、不正なアドレスであるか否かを判定する（ステップＳ２０９）。ここで、不正なアドレスでない場合には（ステップＳ２０９否定）、制御監視装置１００において命令が実行される（ステップＳ２１０）。一方、不正なアドレスである場合には（ステップＳ２０９肯定）、制御監視装置１００においてプログラムが終了される。
【００４８】
なお、ステップＳ２０７において、絶対制御遷移命令ではなかった場合には（ステップＳ２０７否定）、制御監視装置１００において命令が実行される（ステップＳ２１０）。ステップＳ２１０における命令の実行後は、次の命令がＣＡＬＬ命令か否かを判定する（ステップＳ２０５）、或いは、プログラムが終了される。
【００４９】
なお、図７に示すフローチャートにおいては、ステップＳ２０９において、不正なアドレスであると判定された場合に、プログラムを終了する場合について示すが、実施形態はこれに限定されるものではなく、例えば、ログを残しつつ実行は再開させるなどの処置をポリシーに応じて実行する場合であってもよい。
【００５０】
［第２の実施形態の効果］
上述した第２の実施形態によれば、プログラムイメージ複製部１０４は、メモリが所定の領域に分割された分割領域に、メモリ上の任意の位置に存在する命令を複製する。従って、第２の実施形態に係る制御監視装置１００は、アドレスを実際にコードが存在するアドレスへ書き換えることなく、制御遷移を実行させることを可能にする。これにより、第２の実施形態に係る制御監視装置１００は、プログラムロード時に発生するオーバーヘッドの増加と引き換えに、プログラム実行中のオーバーヘッドを減らすことができ、アプリケーションによっては有益な効果が得られる。
【００５１】
（第３の実施形態）
これまで第１の実施形態及び第２の実施形態について説明したが、本願に係る技術は第１の実施形態及び第２の実施形態に限定されるものではない。すなわち、第１の実施形態及び第２の実施形態は、その他の様々な形態で実施されることが可能であり、種々の省略、置き換え、変更を行うことができる。
【００５２】
上述した第２の実施形態では、全てのセグメントにプログラムイメージをコピーする場合について説明した。第３の実施形態では、仮想メモリにおける複数のセグメントに共通するデータが存在する場合に、物理メモリの消費量を削減する場合について説明する。
【００５３】
プログラムイメージ複製部１０４は、仮想メモリ空間におけるセグメントに、プログラムイメージを複製した場合に、当該セグメント全てを単一の物理メモリに対応させる。例えば、プログラムイメージ複製部１０４は、複製が行われるタイミングにおいてmmapやMapViewOfFileなどのＡＰＩ（Application  Programming  Interface）を用いることにより複数の仮想アドレス領域を同じ物理アドレスへ指すようにする。これにより、物理メモリの消費量を抑制することを可能にする。具体的には、プログラムイメージが複製された仮想メモリのセグメントについて、それぞれ消費される物理メモリ量を作成した複製の個数分から複製１つ分まで抑制することができる。
【００５４】
[システム構成等]
例えば、各装置の分散・統合の具体的形態（例えば、図２の形態）は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的又は物理的に分散・統合することができる。一例を挙げると、アドレス判定部１０２とアドレス補正部１０３とを一つの処理部として統合してもよく、一方、アドレス判定部１０２を、ビットの値を算出する算出部と、ビットの値を比較して判定する判定部とに分散してもよい。
【００５５】
[制御監視プログラム]
上記実施形態で説明した制御監視装置１００は、あらかじめ用意されたプログラムをコンピュータで実行することで実現することもできる。そこで、以下では、図１に示した制御監視装置１００と同様の機能を実現する制御監視プログラムを実行するコンピュータの一例を説明する。
【００５６】
図８は、第３の実施形態に係る制御監視プログラムを実行するコンピュータ１０００を示す図である。図８に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。 
【００５７】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。 
【００５８】
ここで、図８に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ（Operating  System）１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。本実施形態に係る制御監視プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ１０９０に記憶される。具体的には、上記実施形態で説明したアドレス変換部１０１と同様の情報処理を実行する変換手順と、アドレス判定部１０２と同様の情報処理を実行する判定手順と、アドレス補正部１０３と同様の情報処理を実行する補正手順とが記述されたプログラムモジュールが、ハードディスクドライブ１０９０に記憶される。 
【００５９】
また、上記実施形態で説明した記憶領域に記憶されるデータのように、制御監視プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュールやプログラムデータを必要に応じてＲＡＭ１０１２に読み出して、変換手順と、判定手順と、補正手順とを実行する。
【００６０】
なお、制御監視プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、情報送受信プログラムに係るプログラムモジュールやプログラムデータは、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【００６１】
これらの実施例やその変形は、本願に係る技術に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。
【符号の説明】
【００６２】
１００  制御監視装置
１０１  アドレス変換部
１０２  アドレス判定部
１０３  アドレス補正部
１０４  プログラムイメージ複製部
【図１】
0005766648.tif 000002
【図２】
0005766648.tif 000003
【図３】
0005766648.tif 000004
【図４】
0005766648.tif 000005
【図５】
0005766648.tif 000006
【図６】
0005766648.tif 000007
【図７】
0005766648.tif 000008
【図８】
0005766648.tif 000009