(57)【要約】【課題】プログラムの動作の保護に対して、バッファオーバフローによる不正な命令コードの実行を防止するために、従来書換えが発生していないことを確認するための追加の処理が必要になり、プログラムの動作速度やメモリ消費量に影響を与える課題があった。【解決手段】処理の終了判定に利用される終端文字を含むアドレスで構成されるアドレス空間を、コンピュータのハードウェア情報に基づいて適切に生成し、不正利用から守りたいシステム関数のアドレスを、前記アドレス空間に割り当てることにより、速度性能の低下やメモリ消費量の増加を招くことなく、バッファオーバフローによる書換えを防止しセキュリティを維持することができる。【選択図】図２
2008305295.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得手段と、
ハードウェア情報を取得するハードウェア情報取得手段と、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成手段と、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得手段と、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得手段と、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定手段と、
を備えることを特徴とするセキュリティ保護装置。
【請求項２】
前記セキュリティ保護装置は、システム関数ビルド手段をさらに備え、
前記システム関数ビルド手段が、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てるようにオブジェクトコードを生成することを特徴とする請求項１記載のセキュリティ装置。
【請求項３】
前記システム関数アドレス決定手段が、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間の末尾に割り当てることを決定することを特徴とする請求項２記載のセキュリティ保護装置。
【請求項４】
前記アドレス空間生成手段は、前記特定の値を含むアドレスで構成される第一アドレス空間と、前記特定の値を含まないアドレスで構成される第二アドレス空間と、を生成することを特徴とする請求項３記載のセキュリティ保護装置。
【請求項５】
前記システム関数アドレス決定手段は、前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、アドレス空間のサイズが一番大きい前記第二アドレス空間と、オブジェクトサイズが一番大きい前記システム関数とを探し、前記システム関数のアドレスを、前記第二アドレス空間の末尾に割り当てることを特徴とする請求項４記載のセキュリティ保護装置。
【請求項６】
前記アドレス空間生成手段は、前記ハードウェア情報にエンディアン情報が含まれる場合、前記特定の値を、アドレスのどの位置に入れるかを決定して、アドレス空間を生成することを特徴とする請求項４記載のセキュリティ保護装置。
【請求項７】
前記システム関数情報には、優先度情報が含まれ、
前記システム関数アドレス決定手段は、前記優先度情報に従って、対象となるシステム関数の順序を決定することを特徴とする請求項４記載のセキュリティ保護装置。
【請求項８】
前記アドレス空間生成手段は、前記特定の値が複数ある場合には、前記特定の値を複数含むアドレスで構成される第三アドレス空間を生成し、
前記システム関数アドレス決定手段は、前記優先度情報に基づき、優先度の高い前記システム関数のアドレスを、前記第三アドレス空間の末尾に割り当てることを特徴とする請求項４記載のセキュリティ保護装置。
【請求項９】
コンピュータ上のプログラムの動作を保護するセキュリティ保護方法であって、
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得ステップと、
ハードウェア情報を取得するハードウェア取得ステップと、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成ステップと、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得ステップと、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得ステップと、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成ステップで生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定ステップと、
を備えるセキュリティ保護方法。
【請求項１０】
コンピュータ上のプログラムの動作を保護するセキュリティ保護プログラムであって、
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得ステップと、
ハードウェア情報を取得するハードウェア取得ステップと、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成ステップと、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得ステップと、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得ステップと、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成ステップで生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定ステップと、
を備えるセキュリティ保護プログラム。
【請求項１１】
コンピュータ上のプログラムの動作を保護するセキュリティ保護集積回路であって、
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得手段と、
ハードウェア情報を取得するハードウェア取得手段と、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成手段と、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得手段と、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得手段と、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定手段と、
を備えることを特徴とするセキュリティ保護集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ上で実行される種々のプログラムに対するセキュリティ技術に関するものである。
【背景技術】
【０００２】
近年、コンピュータを搭載する電機機器が、インターネットに代表される種々のネットワークと接続し動作する環境において、コンピュータの動作を保護するセキュリティ技術が重要となってきた。特に、プログラムの脆弱性を悪用し、不正な処理を機器に実行させるという攻撃は、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ；パーソナルコンピュータ或いはパソコン）の世界で蔓延している。
【０００３】
その中でも、何らかのデータ入力により、プログラム内部で確保しているバッファをオーバフローさせ、本来プログラムが次の命令コードを実行するために保持するアドレスを、不正に書換えて都合のよい命令コードにジャンプさせ、実行させる攻撃が存在する。
【０００４】
上記背景のもとで、バッファオーバフローによるアドレスの書換えを検出することにより、攻撃者にとって都合のよいジャンプ先にジャンプさせず、不正な処理を防止する技術として、プログラムの動作領域において、実行中の関数の呼び出し元へのリターンアドレスを格納する領域と、ローカル変数である配列を格納する領域の間にガード値を配置し、プログラムの動作の中でこのガード値が破壊されていれば、バッファオーバフローが発生したものと判断する方法が記述されていた（例えば、特許文献１参照）。
【０００５】
また、呼出し元から呼出し先に戻り番地を渡すことを止め、代わりに戻り番地ＩＤを引き渡し、返戻の際には、戻り番地ＩＤが有効か調べ、ジャンプ先を戻り番地表に登録してあるアドレスのみに制限することで、攻撃を抑止する方法が記述されていた（例えば、特許文献２参照）。この戻り番地ＩＤとは、戻り番地を記録する戻り番地表を検索するための番号である。
【特許文献１】特開２００１−２１６１６１号公報
【特許文献２】特開２００６−４８２５７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、前記従来の技術では、バッファオーバフロー攻撃を防止して不正な命令コードの実行を防止するために、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理が必要になり、プログラムの動作速度が低下するという課題があった。
【０００７】
例えば、特許文献１に開示された技術によると、プログラムの動作の中で実行される単位である関数の実行が終了し、呼出し元の関数へ戻る際に、ガード値が書換えられていないことを確認する必要がある。関数を呼び出して実行を開始する際にも、ガード値を生成し、リターンアドレスとローカル変数の間に格納する必要がある。関数の呼出しごとに行う必要があるこれらの処理は、プログラムの速度性能を大きく低下させることになる。
【０００８】
また、特許文献２に開示された技術によると、関数の実行が終了し、呼出し元の関数へ戻る際に、戻り番地ＩＤが有効かどうかを調べ、戻り番地表から戻り番地ＩＤに対応する戻り番地を求める処理が必要になり、関数の実行の度に実施されるこの処理のために、プログラムの速度性能を低下させることになる。
【０００９】
本発明は、前記従来の課題を解決するもので、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理を行わずに、バッファオーバフロー攻撃による不正な命令コードの実行を防止することを実現するセキュリティ保護装置、セキュリティ保護方法、セキュリティ保護プログラムおよびセキュリティ保護集積回路の提供を目的とする。
【課題を解決するための手段】
【００１０】
前記従来の課題を解決するために、本発明のセキュリティ保護装置では、プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得手段と、ハードウェア情報を取得するハードウェア情報取得手段と、前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成手段と、システム関数の情報であるシステム関数情報を取得するシステム関数情報取得手段と、前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得手段と、前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定手段と、備えることにより、前記アドレス空間生成部で生成したアドレス空間を効率的に利用することを特徴とする。
【００１１】
上記の構成により、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理を行う必要がなくなり、プログラムの動作速度の低下を招かないだけではなく、システム関数をバッファオーバフロー攻撃による不正な命令コードの実行をから保護することができるようになる。
【発明の効果】
【００１２】
本発明のセキュリティ保護装置によれば、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理を行う必要がなくなり、プログラムの動作速度の低下を招かないだけではなく、システム関数をバッファオーバフロー攻撃による不正な命令コードの実行から保護することができる。
【発明を実施するための最良の形態】
【００１３】
以下、本発明の実施の形態について、図面を参照しながら説明する。
【００１４】
（実施の形態１）
図１は、本発明の実施の形態１におけるセキュリティ保護装置を備えた情報処理装置の構成を示すハードウェア構成図である。この情報処理装置１００は、それ自体としてユーザの使用に供することもできるが、様々な電気機器に組み込まれてもよい。情報処理装置１００の一例は、代表的にはＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ；パーソナルコンピュータ或いはパソコン）等の汎用のコンピュータやＰＤＡ（Ｐｅｒｓｏｎａｌ  Ｄｉｇｉｔａｌ  Ａｓｓｉｓｔａｎｃｅ）、携帯電話機等の携帯通信端末、デジタルカメラ、携帯オーディオプレイヤーなどである。
【００１５】
情報処理装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ；中央演算処理部）１１１、メモリ装置１１２、通信装置１２８、入力装置１３０、表示装置１３１、割込コントローラ１３２及びタイマー回路１３３を備えている。これらの各構成要素は、バスライン１２５を通じて互いに接続されている。また、必要に応じて、バスライン１２５には、ハードディスク装置１２０及び読取装置１２６を接続することが可能となっている。ハードディスク装置１２０、読取装置１２６、入力装置１３０及び表示装置１３１は、それぞれ、インタフェース１２１、１２２、１２３及び１２４を通じてバスライン１２５に接続される。
【００１６】
セキュリティ保護装置１１０は、ＣＰＵ１１１とメモリ装置１１２とを備えている。なお、セキュリティ保護装置１１０は、ＨＤＤ１２０を備えるようにしてもよい。
【００１７】
ＣＰＵ１１１は、メモリ１０４に格納されているプログラムを読み出し実行する。なお、単一のＣＰＵで構成されても良く、複数のＣＰＵで構成されても良い。図１では、情報処理装置１００は、複数のＣＰＵ１１１ａ、１１１ｂ、１１１ｃ、・・・を有する一例を示した。
【００１８】
メモリ装置１１２は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１１２ａ及びＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１１２ｂを備えている。ＲＯＭ１１２ａは、ＣＰＵ１１１で実行するコンピュータプログラムを記憶している。コンピュータプログラムは、ハードディスク装置１２０に記憶させることもできる。ＣＰＵ１１１は、ＲＯＭ１１２ａ又はハードディスク装置１２０が格納するコンピュータプログラムを、必要に応じてＲＡＭ１１２ｂに書き込み、コンピュータプログラムが規定する処理を実行する。ＲＡＭ１１２ｂは、ＣＰＵ１１１が処理を実行するのに伴って発生するデータを一時的に記憶する媒体としても機能する。特に、本実施の形態において、ＲＡＭ１１２ｂの領域の一部が、後述するプログラムのアドレス空間に割り当てられる。具体的には、システム関数のロード先の領域であり、また、一時的にデータを格納するための領域であるデータ格納バッファとして使用される。ＲＯＭ１１２ａには、フラッシュＲＯＭのように書き込みが可能で、電源を切っても記憶内容を保持できる不揮発性のメモリや記憶媒体も含まれる。ＲＡＭ１１２ｂには、電源を切ると記憶内容が保持されない揮発性のメモリや記憶媒体が含まれる。
【００１９】
ハードディスク装置１２０は、内蔵する不図示のハードディスクに対して、コンピュータプログラム、或いはデータを書き込み及び読み出す装置である。
【００２０】
読取装置１２６は、記録媒体１２７（例えばＣＤやＤＶＤやメモリカードなど）に記録されたコンピュータプログラム、或いはデータを読み取る装置である。
【００２１】
通信装置１２８は、電話回線やネットワーク線や無線や赤外線通信等の通信回線１２９を介して、外部の機器と、コンピュータプログラム、或いはデータを交換する装置である。
【００２２】
入力装置１３０は、ユーザの操作によりデータ等を入力する装置であり、例えば、ＰＤＡに配列されたキーボード、携帯電話機に配列された入力ボタン、或いは着脱自在のマウス、キーボードである。また、マイクなどの音声入力機器などであってもよい。
【００２３】
表示装置１３１は、データ、画像等を画面に表示したり、データ等を音声で表示したりする装置であり、例えばＬＣＤ（Ｌｉｇｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ；液晶表示器）、ブラウン管、スピーカである。
【００２４】
タイマー回路１３３は、一定の周期でタイマー割込信号を出力する装置である。このタイマー割込信号に基づいて、ＣＰＵ１１１が処理を実行する。
【００２５】
割込コントローラ１３２は、タイマー回路１３３、入力装置１３０、ＣＰＵ１１１のうちの処理実行中のＣＰＵ以外のＣＰＵ、ネットワークデバイスとしての通信装置１２８、ハードディスク装置１２０、読取装置１２６等から送られる割込要求信号を、ＣＰＵ１１１へ中継する装置である。各装置からの割込要求には優先度が付けられている。割込コントローラ１３２は、同時に複数の装置から割り込みが発生した場合には、それらの要求を優先度に応じて調停する機能を有している。
【００２６】
以上のように、情報処理装置１００は、コンピュータとして構成されている。上記コンピュータプログラムは、ＲＯＭ１１２ａ、不図示のフレキシブルディスク、ＣＤ−ＲＯＭ等のプログラム記録媒体１２７を通じて供給することも、電気通信回線１２９等の伝送媒体を通じて供給することも可能である。例えば、プログラム記録媒体１２７としてＣＤ−ＲＯＭに記録されたコンピュータプログラムは、読取装置１２６を情報処理装置１００へ接続することにより、読み出すことができ、更にＲＡＭ１１２ｂ或いはハードディスク装置１２０に格納することができる。
【００２７】
プログラム記録媒体としてＲＯＭ１１２ａによってコンピュータプログラムが供給される場合には、当該ＲＯＭ１１２ａを情報処理装置１００に搭載することにより、ＣＰＵ１１１は上記コンピュータプログラムに従った処理を実行可能となる。電気通信回線１２９等の伝送媒体を通じて供給されるコンピュータプログラムは、通信装置１２８を通じて受信され、例えば、ＲＡＭ１１２ｂ或いはハードディスク装置１２０に格納される。伝送媒体は、有線の伝送媒体に限られず、無線の伝送媒体であっても良い。また、伝送媒体は通信線路のみでなく、通信線路を中継する中継装置、例えばルータをも含む。
【００２８】
本実施の形態におけるセキュリティ保護装置は、ＲＯＭ１１２ａに格納されているプログラムをＲＡＭ１１２ｂ上にロードし、ＣＰＵ１１１によるコンピュータプログラムの実行時に、呼出し元の関数へ戻る度に、書換えが発生していないことを確認するための追加の処理を行わずに、バッファオーバフロー攻撃による不正な命令コードの実行を防止することができる。なお、本実施の形態におけるセキュリティ保護装置は、ＣＰＵ１１１及びメモリ装置１１２を単一の半導体基板に作り込んだＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｅｄ  ｃｉｒｃｕｉｔ）等の集積回路として構成されてもよい。
【００２９】
次に、本発明の実施の形態におけるセキュリティ保護装置１１０が、どのような攻撃や処理から、どのようにシステム関数の不正利用を防止するのかについて、図４、図５を用いて概要を説明する。
【００３０】
図４に示す通り、プログラムは、自身のアドレス空間（４０１）の上に、プログラムの命令コードやデータを割り当て、アドレス空間上の命令コードを実行したり、ジャンプして次の命令コードの実行に移ったり、あるいはアドレス空間上のデータにアクセスして動作する。
【００３１】
例えば、プログラムのアドレス空間（４０１）には、プログラムが一時的にデータを格納するための領域であるデータ格納バッファ（４０２）があり、プログラムが外部から入力されたデータを格納する。また、プログラムのアドレス空間には、次の命令コードへジャンプする先の番地も格納されている。代表的には、ジャンプ先の番地は呼出し元の関数への戻り先番地（４０３）であることが多く、或いはポインタ関数などのポインタの指し先番地が格納されていることもあり、種々の可能性が考えられる。一般に、データ格納バッファ（４０２）と戻り先番地（４０３）は、プログラムのアドレス空間（４０１）で近い位置に配置されることが多い。
【００３２】
プログラムは、データが入力されると、入力データ（４０５）をデータ格納バッファ（４０２）に格納するが、プログラムのバッファ管理が十分でない場合、データ格納バッファ（４０２）の容量を超えてデータがオーバフローする可能性がある。悪意ある攻撃や意図せず過大な入力データ（４０５）を入力してバッファオーバフローすると、戻り先番地（４０３）が上書きされる。この上書きした箇所に、ＸＸ番地というアドレス（４０６）が書き込まれると、プログラムは戻り先番地（４０３）にジャンプするつもりで、ＸＸ番地に割り当てられているシステム関数（４０４）にジャンプして、意図せずシステム関数を実行することにつながる。
【００３３】
プログラムは、通常汎用の或いは自前のコピー関数を使用して、入力データ（４０５）をデータ格納バッファ（４０２）に格納する。したがって、セキュリティ保護装置１１０は、システム関数（４０４）が割り当てられているＸＸ番地を、コピー関数により上書きできないようにすることによって、不正にシステム関数を利用されることを防止してセキュリティを維持する。
【００３４】
プログラムによって呼び出されるコピー関数は、コピーする元データをコピー先の領域にコピーするにあたり、元データがどこまで有効かを調べるために、終端文字により判別する特徴を持つ。これは、コピー関数が、文字列の先頭を示すポインタアドレスを受け取り、そのポインタアドレスの示すところを始点としてコピー元のデータを取得し、コピー先のポインタアドレスへコピーデータをコピーするためである。
【００３５】
終端文字により判別する一例として、コピー関数が引数として受け取ったコピー元の文字列にＮＵＬＬ文字、すなわち‘０’（１６進表示で０ｘ００）の値が入っていれば、それを文字列の終端と判断して、コピーを終了する場合がある。
【００３６】
図５にこの例を示す。図５では、コピー元の文字列として、“ｃｏｐｙ”に‘０’（図５の５０１）が後続している。‘０’（図５の５０１）の後に“ｓｔｒ”という文字列が後続しているが、コピー関数は‘０’までをコピー元として有効なデータであると判別し、文字列“ｃｏｐｙ”をコピー先にコピーして“ｙ”（図５の５０２）までコピーすればコピーを終了することになる。
【００３７】
すなわち、コピー関数が終端と判断する終端文字を含むようなアドレスを生成した場合、そのアドレスはコピー関数によって最後までコピーすることができなくなる。例えば、図４のＸＸ番地（４０６）というアドレスに終端文字が含まれていれば、入力データ（４０５）をコピーする際に、ＸＸ番地という値を途中までしかコピーできなくなる。
【００３８】
したがって、セキュリティ保護装置１１０は、悪意あるプログラムが、プログラムのバッファオーバフローを引き起こし、悪意ある入力データをコピーさせてＸＸ番地のシステム関数（図４の４０４）にジャンプさせようとしても、ＸＸ番地（図４の４０６）のコピーをさせないため、不正なシステム関数の実行を防止することができる。
【００３９】
なお、プログラムが入力データ（図４の４０５）をデータ格納バッファ（図４の４０２）に格納する処理を実施する関数を、これまでコピー関数と呼んだが、単純にコピーする関数だけが対象になるわけではなく、受け取った複数のデータを結合させてデータ格納バッファに格納する関数や、受け取ったデータを特定の様式に従ってデータ格納バッファに格納する関数など、種々のデータ格納バッファに格納する関数が対象になる。以下、それらを総称してコピー関数とする。
【００４０】
次に、図２を用いて、セキュリティ保護装置１１０の構成要素について説明する。
【００４１】
図２は、本実施の形態に係るセキュリティ保護装置１１０の構成を例示している。通常、このセキュリティ保護装置１１０の実体はメモリ装置１１２或いはハードディスク装置１２０に格納され、ＣＰＵ１１１と協働して実行することにより、セキュリティ保護装置全体を実現している。
【００４２】
このセキュリティ保護装置１１０は、コンピュータ上で動作するプログラムの動作を保護するものである。セキュリティ保護装置１１０が動作する情報処理装置１００で動作するプログラムを保護することも可能であり、また別の情報処理装置で動作するためのプログラムの保護も可能である。
【００４３】
図２において、システム関数指定部２０１は、ユーザまたは開発者などから、不正に利用されることを防止しなければいけないシステム関数の指定を受け付ける。一つの関数の指定でもよいし、複数の関数をまとめた指定でもよい。ユーザまたは開発者の入力を受け付けるような仕様であればよい。そして、制御部２０２に処理を行うように通知する。
【００４４】
制御部２０２は、各構成部に対して処理の指示を行う。具体的には、後述する、終端文字取得部２０３、ハードウェア情報取得部２０５、アドレス空間生成部２０７、システム関数情報取得部２０９、システム関数アドレス決定部２１２、システム関数ビルド部２１３に処理を指示する。具体的な動作については、後述する図３のセキュリティ保護装置の処理の流れを示したフローチャートとともに説明する。
【００４５】
終端文字取得部２０３は、制御部２０２からの指示を受けて、プログラムの関数の処理の終了判定に用いられる特定の値すなわち終端文字を取得する。コピー関数の仕様により採用している終端文字が異なるため、終端文字取得部２０３はプログラムにより利用されるコピー関数を選択し、種々の終端文字を取得する必要がある。終端文字として、代表的には、上記に例示したＮＵＬＬ文字としての‘０ｘ００’（１６進表示）、或いは改行を示す‘０ｘ０ａ’（１６進表示）などがコピー関数に採用されることが多い。そして、取得した終端文字を終端文字記憶部２０４に記憶する。
【００４６】
終端文字記憶部２０４は、終端文字を含む終端文字情報を記憶する。
【００４７】
なお、開発者やユーザがあらかじめコピー関数の仕様を把握し終端文字のリストを、直接入力やファイル入力などの種々の方法で終端文字記憶部２０４に記憶しておくことも考えられる。
【００４８】
ハードウェア情報取得部２０５は、制御部２０２からの指示を受けて、プログラムが動作するアドレス空間に関する情報であるハードウェア情報を取得し、取得したハードウェア情報をハードウェア情報記憶部２０６に記憶する。詳細な動作に関しては後述する。
【００４９】
ハードウェア情報記憶部２０６は、ハードウェア情報取得部２０５からの指示を受けて、ハードウェア情報取得部２０５が取得したハードウェア情報を記憶する。
【００５０】
なお、開発者やユーザがあらかじめハードウェアに関する情報を、直接入力やファイル入力などの種々の方法でハードウェア情報記憶部２０６に記憶する方法が考えられる。また、ハードウェア情報取得部２０５が直接ＣＰＵなどの演算装置の情報が格納されているフラグを読み取って判断する方法も考えられる。
【００５１】
アドレス空間生成部２０７は、制御部２０２からの指示を受けて、終端文字記憶部２０４から取得した終端文字とハードウェア情報記憶部２０６から取得したアドレス空間に関する情報に基づいて、終端文字記憶部２０４から取得した終端文字の値を含むアドレスからなるアドレス空間を生成する。詳細な動作に関しては後述する。
【００５２】
アドレス空間情報記憶部２０８は、アドレス空間生成部２０７からの指示を受けて、アドレス空間に関する情報である、アドレス空間情報を記憶する。詳細な動作に関しては後述する。
【００５３】
システム関数情報取得部２０９は、制御部２０２からの指示を受けて、システム関数指定部２０１からシステム関数名などのシステム関数を識別する情報を取得し、取得したシステム関数名などの情報を用いて、システム関数名、ＲＯＭ等の記憶媒体にあるソースコードが存在する位置情報、ソースコード、サイズ情報、システム関数の優先度など、システム関数に関する情報である、システム関数情報を取得し、システム関数情報記憶部２１０にシステム関数情報を記憶する。詳細な動作に関しては後述する。
【００５４】
システム関数情報記憶部２１０は、システム関数情報取得部２０９からの指示を受けて、システム関数情報やシステム関数のオブジェクトサイズの情報などの情報を記憶する。なお、後述するように、システム関数情報は全ての処理が終わった後にシステム関数ビルド部２１３からの指示を受けて、システム関数情報記憶部２１０から消去してもよい。
【００５５】
システム関数サイズ取得部２１１は、制御部２０２からの指示を受けて、システム関数情報記憶部２１０から、ＲＯＭ等の記憶媒体にあるソースコードが存在する位置情報を含むシステム関数情報を取得し、その情報からソースコードを取得し、システム関数指定部２０１で指定されたシステム関数のオブジェクトサイズを取得する。具体的には、システム関数のオブジェクトサイズを取得するために、指定されたシステム関数を含むソースコードを事前に一時的にビルドし、ビルドされたオブジェクトコードの中からシステム関数指定部２０１で指定されたシステム関数のオブジェクトサイズを取得する。そして、取得したオブジェクトサイズをシステム関数情報記憶部２１０に記憶する。
【００５６】
なお、システム関数情報にソースコードが存在する場合には、そのソースコードを用いても良い。さらに、後述するように、システム関数情報記憶部２１０にオブジェクトサイズ情報が含まれている場合には、処理を行わなくてもよい。
【００５７】
システム関数アドレス決定部２１２は、制御部２０２からの指示を受けて、アドレス空間情報記憶部２０８から取得したアドレス空間情報とシステム関数情報記憶部２１０から取得したシステム関数情報とシステム関数のオブジェクトサイズの情報とを用いて、システム関数のアドレスを、アドレス空間生成部２０７で生成したアドレス空間のアドレスに割り当てることを決定する。詳細な動作に関しては後述する。
【００５８】
システム関数ビルド部２１３は、制御部２０２からの指示を受けて、システム関数情報と、システム関数アドレス決定部２１２が決定したシステム関数のアドレス情報とから、システム関数を指定のアドレスに割り当てるようにオブジェクトコードを生成する。
【００５９】
なお、処理が終わった後に、システム関数情報記憶部２１０からシステム関数情報を消去してもよい。
【００６０】
以上の構成により、セキュリティ保護装置１１０は、外部からの攻撃や内部の処理の暴走などに起因するシステム関数などの重要な関数の不正利用を防止することができる。
【００６１】
図３は、セキュリティ保護装置の処理の流れを示したフローチャートである。
【００６２】
図３を用いて、セキュリティ保護装置の大まかな処理の流れと制御部２０２の具体的な処理の内容を説明する。
【００６３】
まず、ユーザまたは開発者が、システム関数指定部２０１に、不正に利用されることを防止しなければいけないシステム関数を指定する。一つの関数を指定してもよいし、複数の関数をまとめて指定してもよい（Ｓ３０１）。次に、システム関数指定部２０１は、制御部２０２に通知をして、制御部２０２が起動する（Ｓ３０２）。通知を受けた制御部２０２は、終端文字取得部２０３に処理を行うように指示をする。指示を受けた終端文字取得部２０３は、プログラムの関数の処理の終了判定に用いられる特定の値すなわち終端文字を取得する（Ｓ３０３）。そして、終端文字記憶部２０４に取得した終端文字を記憶し、取得した終端文字を終端文字記憶部２０４に記憶した旨の通知を制御部２０２にする。通知を受けた制御部２０２は、ハードウェア情報取得部２０５に処理を行うように通知する。通知を受けたハードウェア情報取得部２０５は、プログラムが動作するアドレス空間に関する情報であるハードウェア情報を取得する（Ｓ３０４）。そして、ハードウェア情報記憶部２０６に記憶し、ハードウェア情報記憶部２０６にハードウェア情報を記憶した旨の通知を制御部２０２にする。
【００６４】
なお、制御部２０２が終端文字取得部２０３と、ハードウェア情報取得部２０５に指示する順番は問わない。システム関数指定部２０１から入力を受け付けたら、ハードウェア情報取得部２０５に先に指示してもよい。また、同時に終端文字取得部２０３とハードウェア情報取得部２０５とに指示を出してもよい。
【００６５】
次に、ハードウェア情報取得部２０５から通知を受けた制御部２０２は、アドレス空間生成部２０７に処理を行うように指示をする。指示を受けたアドレス空間生成部２０７は、終端文字記憶部２０４から終端文字情報を取得し、ハードウェア情報記憶部２０６からハードウェア情報を取得する。そして、終端文字情報とハードウェア情報とに基づいて、終端文字記憶部２０３から取得した終端文字の値を含むアドレスからなるアドレス空間を生成する（Ｓ３０５）。そして、アドレス空間情報記憶部２０８に、アドレス空間情報を記憶し、アドレス空間情報記憶部２０８に、アドレス空間情報を記憶した旨の通知を制御部２０２にする。
【００６６】
次に、制御部２０２は、システム関数情報取得部２０９に処理を行う指示をする。
【００６７】
なお、制御部２０２が終端文字取得部２０３とシステム関数情報取得部２０９に指示をする順番は問わない。制御部２０２はシステム関数指定部２０１から処理があった旨の通知を受けると、システム関数情報取得部２０９に先に指示をしてもよいし、同時に終端文字取得部２０３とシステム関数情報取得部２０９とに指示をしてもよい。したがって、実際の処理は図３の処理の順番に限られることはなく、Ｓ３０３、Ｓ３０４、Ｓ３０５の処理の順番と、Ｓ３０６、Ｓ３０７、Ｓ３０８の処理の順番が変わらなければ、どんな順番でも良い。たとえば、Ｓ３０３、Ｓ３０６、Ｓ３０４、Ｓ３０７、Ｓ３０５、Ｓ３０８の順番でもよいし、Ｓ３０３、Ｓ３０６、Ｓ３０７、Ｓ３０８、Ｓ３０４、Ｓ３０５でもよい。また、Ｓ３０３、Ｓ３０４、Ｓ３０６、Ｓ３０７、Ｓ３０５、Ｓ３０８でもよい。
【００６８】
システム関数情報取得部２０９は、制御部２０２から指示を受けると処理を開始する。
【００６９】
システム関数情報取得部２０９は、システム関数指定部２０１からシステム関数名やシステム関数ＩＤなどのシステム関数を識別する情報を取得し、その情報をもとに、ＲＯＭ等の記憶媒体にあるソースコードが存在する位置情報、ソースコード、サイズ情報、システム関数の優先度など、システム関数に関する情報であるシステム関数情報を取得する（Ｓ３０６）。そして、取得したシステム関数情報をシステム関数情報記憶部２１０に記憶し、システム関数情報をシステム関数情報記憶部２１０に記憶した旨の通知を制御部２０２にする。
【００７０】
システム関数サイズ取得部２１１は、制御部２０２から指示を受けると処理を開始する。システム関数サイズ取得部２１１は、システム関数指定部２０１により指定されたシステム関数のオブジェクトサイズを取得するために、システム関数情報記憶部２１０からシステム関数情報を取得し、システム関数情報にあるソースコード位置情報からシステム関数を含むソースコードを取得し、ソースコードを事前に一時的にビルドする。また、システム関数サイズ取得部２１１は、システム関数指定部２０１が指定するシステム関数のソースコードのみをビルドしてもよいが、システム関数指定部２０１から指定を受ける前に全てのソースコード、或いはシステム関数を含むと推測する一部のソースコードを事前にビルドしてもかまわない。システム関数サイズ取得部２１１は、ビルドされたオブジェクトコードの中からシステム関数指定部２０１により指定されたシステム関数のオブジェクトサイズを取得する（Ｓ３０７）。そして、取得したシステム関数のオブジェクトサイズをシステム関数情報記憶部２１０に記憶し、システム関数のオブジェクトサイズをシステム関数情報記憶部２１０に記憶した旨の通知を制御部２０２にする。
【００７１】
なお、システム関数情報記憶部２１０にオブジェクトサイズ情報が含まれている場合には、処理を行わずに、制御部２０２に通知をしてもよい。
【００７２】
制御部２０２は、アドレス空間生成部２０７と、システム関数サイズ取得部２１１とから通知を受けると、システム関数アドレス決定部２１２に処理を指示する。
【００７３】
なお、アドレス空間生成部２０７から過去に通知があった場合には、アドレス空間情報に変更が無い限りは、制御部２０２は、システム関数サイズ取得部２１１からの通知だけでも、システム関数アドレス決定部２１２に処理をするように指示を出すようにしてもよい。
【００７４】
また、システム関数指定部２０１で、過去に入力されたものが再び入力された場合等には、制御部２０２は処理をしなくてもよい。
【００７５】
制御部２０２から指示を受けると、システム関数アドレス決定部２１２は、処理を開始する。システム関数アドレス決定部２１２は、アドレス空間情報記憶部２０８からアドレス空間情報を、システム関数情報記憶部２１０からシステム関数情報とシステム関数のオブジェクトサイズを取得する。そして、アドレス空間情報、システム関数情報、システム関数のオブジェクトサイズ情報を用いて、システム関数のアドレスを、アドレス空間生成部２０７で生成したアドレス空間のアドレスに割り当てることを決定する（Ｓ３０８）。そして、システム関数アドレス決定部２１２は、決定したシステム関数のアドレス情報をシステム関数情報記憶部２１０に記憶し、決定したシステム関数のアドレス情報をシステム関数情報記憶部２１０に記憶した旨の通知を制御部２０２にする。システム関数のアドレス情報とは、システム関数に一意に割り当てられたアドレス空間の開始アドレスとサイズ情報、あるいは開始アドレスと末尾アドレスなどのアドレス空間を特定できる情報であればよい。
【００７６】
システム関数ビルド部２１３は、制御部２０２からの指示を受けて、システム関数情報記憶部２１０からシステム関数情報と、システム関数アドレス決定部２１２で決定したシステム関数のアドレス情報とを取得する。そして、システム関数を含むソースコードをコンパイルし、リンクする際に、システム関数情報とアドレス空間情報とに従ってアドレスを割り当ててオブジェクトコードを生成し（Ｓ３０９）、処理を終了する。
【００７７】
なお、処理が終わった後に、システム関数情報記憶部からシステム関数情報を消去してもよい。
【００７８】
また、システム関数ビルド部２１３は、すでにオブジェクトコードを生成済みのものに対して、システム関数のアドレスを決定し、オブジェクトコード内にアドレスを埋め込んでもかまわない。
【００７９】
なお、システム関数アドレス決定部２１２からの指示を受けて、処理を開始するようにしてもよい。この場合は、システム関数アドレス決定部２１２からシステム関数のアドレス情報を受け取ると、システム関数情報記憶部２１０からシステム関数情報を取得し、システム関数情報とシステム関数のアドレス情報とから、オブジェクトコードを生成する。
【００８０】
なお、ユーザや開発者があらかじめ終端文字、ハードウェア情報、コピー関数の仕様などを把握している場合には、終端文字のリストなどが終端文字記憶部２０４に記憶され、また、ハードウェア情報がハードウェア情報記憶部２０６に記憶され、また、システム関数情報がシステム関数情報記憶部２１０に記憶されているときがある。この場合、制御部２０２は再度、終端文字取得部２０３やハードウェア情報記憶部２０６、システム関数情報取得部２０９に処理をするように指示しなくてもよい。
【００８１】
以下に、ハードウェア情報取得部２０５、アドレス空間生成部２０７、アドレス空間情報記憶部２０８、システム関数情報取得部２０９、システム関数アドレス決定部２１２の詳細な動作について説明する。
【００８２】
ハードウェア情報取得部２０５は、プログラムが動作するアドレス空間に関する情報であるハードウェア情報を取得する。例えば、ＣＰＵなどの演算装置やメモリなどの記憶媒体の仕様に依存して取りうるアドレス空間の大きさを取得する。また他にも、メモリなどの記憶媒体上に、文字列の一定の単位（例えばバイト単位）でどのような順序で格納するかに関わるエンディアンの情報を取得する。
【００８３】
エンディアン形式に関わる問題は、例えば、図６に示す通り、０ｘ００１２３４７８（１６進表示）をメモリなどの記憶媒体に格納する場合、ビッグエンディアン形式の場合とリトルエンディアン形式の差異により１バイト単位で格納する順序が異なることに起因する。エンディアン形式により、アドレス空間生成部２０７が生成するアドレス空間の構成要素である各アドレスの構成が異なる可能性が出る。そこで、ハードウェア情報取得部２０５は、エンディアン形式の情報を取得し、アドレス空間生成部２０７がアドレス空間を生成する際に利用できるようにする。
【００８４】
アドレス空間生成部２０７は、制御部２０２からの指示を受けて、終端文字記憶部２０４から取得した終端文字と、ハードウェア情報記憶部２０６から取得したアドレス空間情報とに基づいて、終端文字記憶部２０４から取得した終端文字の値を含むアドレスで構成されるアドレス空間を生成する。ただし、プログラムが動作するハードウェアによっては、生成する適切なアドレスが変化する可能性がある。
【００８５】
例えば、プログラムが動作するＣＰＵに代表される演算装置やメモリなど記憶媒体のハードウェアがアドレスを３２ｂｉｔの空間で保証する場合、アドレスは３２ｂｉｔで構成されるため、１６進表示で‘０ｘ００００００００’から‘０ｘｆｆｆｆｆｆｆｆ’までの値を取りうる。しかし、ＣＰＵやメモリなどが、アドレスを６４ｂｉｔの空間で保証する場合、１６進表示で‘０ｘ００００００００００００００００’から‘０ｘｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆ’までの値を取りうる。また、これらのアドレス空間のうち、一部のみを利用可能である場合もある。
【００８６】
また、終端文字取得部２０３から渡される終端文字が、１つの終端文字でも、複数の終端文字でもかまわない。ハードウェア情報取得部２０５から取りうるアドレス空間の情報を取得して、そのアドレスの範囲で終端文字の値が含まれるアドレスで構成されるアドレス空間を生成する。
【００８７】
例えば、終端文字記憶部２０４から取得した終端文字が‘０ｘ００’であり、ハードウェア情報記憶部２０６からハードウェア情報として３２ｂｉｔ空間のアドレス空間であるという情報を取得すると、アドレス空間生成部２０７は‘０ｘ００００００００’から‘０ｘｆｆｆｆｆｆｆｆ’までのアドレス空間の中で、終端文字‘０ｘ００’を含むアドレスで構成されるアドレス空間を生成する。生成したアドレスは、例えば‘０ｘ１２００３４７８’のように必ず終端文字である‘０ｘ００’を含むアドレスになる。
【００８８】
また、アドレス空間生成部２０７は、ハードウェア情報記憶部２０６から取得したハードウェア情報にエンディアン形式の情報が含まれる場合、エンディアン形式により生成するアドレスの組合せを変えることもできる。
【００８９】
例えば、終端文字が‘０ｘ００’である場合に、‘０ｘ００１２３４７８’というアドレスの組合せの一つを生成すると、ビッグエンディアン形式の場合、このアドレスはデータとして、１バイトごとに‘０ｘ００’‘０ｘ１２’‘０ｘ３４’‘０ｘ７８’の順序で格納される。このアドレスをコピー関数がコピーしようとした場合、初めにコピーしようとした値‘０ｘ００’（図６の６０１）がコピー関数として終端文字と判断する文字であるため、次の文字である‘０ｘ１２’（図６の６０２）までコピーされることなくコピー処理が終了する。
【００９０】
しかし、リトルエンディアン形式の場合、このアドレスはデータとして、１バイトごとに‘０ｘ７８’‘０ｘ３４’‘０ｘ１２’‘０ｘ００’の順序で格納される。したがって、このアドレスをコピー関数がコピーしようとした場合、コピー関数のコピー処理は‘０ｘ７８’（図６の６０３）から始まり、終端文字である‘０ｘ００’（図６の６０４）まで一連のアドレスデータをコピー完了することになる。すなわち、リトルエンディアン形式の場合、終端文字を最上位桁に含むアドレスを生成しても、コピー関数の処理を止めることができなくなる。また、逆にビッグエンディアン形式の場合、終端文字を最下位桁に含むアドレスを生成しても、コピー関数の処理を止めることができなくなる。
【００９１】
アドレス空間生成部２０７は、ハードウェア情報取得部２０５から取得するエンディアン形式の情報に従って、終端文字をアドレスの一部に含み、コピー関数の処理が止められるようなアドレスで構成されるアドレス空間を生成することが可能である。
【００９２】
また、アドレス空間生成部２０７が終端文字記憶部２０４から複数の終端文字を取得することも可能で、その場合、全ての終端文字を含むアドレスで構成されるアドレス空間、及び一部の終端文字を含むアドレスで構成されるアドレス空間を生成、管理することが可能である。
【００９３】
一例を挙げると、終端文字記憶部２０４から終端文字として‘０ｘ００’と‘０ｘ０ａ’の２つの終端文字を取得した場合、アドレス空間生成部２０７は‘０ｘ００’と‘０ｘ０ａ’の２つの終端文字を含むアドレス（例：‘０ｘ１２０００ａ７８’）で構成されるアドレス空間を生成し、また別に１つのみの終端文字を含むアドレス（例：‘０ｘ１２００３４７８’や‘０ｘ１２０ａ３４７８’）で構成されるアドレス空間を生成することができる。
【００９４】
この場合、一例を挙げて説明すると、コピー関数Ａとコピー関数Ｂは終端文字‘０ｘ００’によってコピー元のデータの終了を判別し、コピー関数Ｃは終端文字‘０ｘ０ａ’によってコピー元のデータの終了を判別するならば、終端文字‘０ｘ００’と‘０ｘ０ａ’の双方を含むアドレスで構成されるアドレス空間は、コピー関数Ａ及びＢ及びＣのコピー処理を止めることができる。
【００９５】
一方、終端文字‘０ｘ００’のみを含むアドレスで構成されるアドレス空間の場合、コピー関数Ａ及びＢのコピー処理を止めることにつながり、また終端文字‘０ｘ０ａ’のみを含むアドレスで構成されるアドレス空間の場合、コピー関数Ｃのみのコピー処理を止めることにつながる。
【００９６】
セキュリティ保護装置１１０は、外部からの攻撃や内部の処理の暴走などに起因するシステム関数などの重要な関数の不正利用を防止する。そこで、図４に例示したシステム関数（４０４）を不正に利用されないように、プログラムのアドレス空間に割り当てる必要がある。
【００９７】
アドレス空間情報記憶部２０８は、生成した終端文字を含むアドレスで構成されたアドレス空間の情報を記憶する。例えば、終端文字を含むアドレスの開始と終端を記憶すればよい。
【００９８】
一例として、終端文字が‘０ｘ００’である場合、‘０ｘ００’を含むアドレスの開始が‘０ｘ０１０１００００’であれば、その開始アドレスから‘０ｘ００’を含むアドレスの終端は‘０ｘ０１０１００ｆｆ’までとなる。これにより、アドレス空間情報記憶部２０８は、終端文字を含むアドレス空間として‘０ｘ０１０１００００〜０ｘ０１０１００ｆｆ’のアドレス空間の情報を記憶すればよい。
【００９９】
また、アドレス空間情報記憶部２０８は終端文字を含むアドレス空間のサイズを、アドレス空間に対応付けて記憶してもよい。一例を挙げると、終端文字を含むアドレス空間が‘０ｘ０１０１００００〜０ｘ０１０１００ｆｆ’の場合、２５６バイトの空間サイズであることを記憶する。
【０１００】
アドレス空間情報記憶部２０８は、さらに終端文字を含むアドレス空間が複数存在する場合に、それらのアドレス空間上での距離を記憶してもよい。典型的には、最も近い終端文字を含むアドレス空間との距離を記憶する。
【０１０１】
一例を挙げると、終端文字を含むアドレス空間が‘０ｘ０１０１００００〜０ｘ０１０１００ｆｆ’から、次の終端文字を含むアドレス空間は‘０ｘ０１０２００００〜０ｘ０１０２００ｆｆ’となるので、この二つのアドレス空間の距離は６４キロバイトになる。
【０１０２】
以上の通り、アドレス空間情報記憶部２０８は、終端文字を含み連続するアドレス群の情報を記憶し、管理するアドレス空間のサイズ、管理するアドレス空間同士のアドレス空間上の距離を記憶する。
【０１０３】
図７に、終端文字を含むアドレスで構成された第一アドレス空間と、終端文字を含まないアドレスで構成された第二アドレス空間の情報の一例を示す。終端文字を含むアドレスで構成された第一アドレス空間と、終端文字を含まないアドレスで構成された第二アドレス空間アドレス空間に分けることにより、安全な空間と、安全でない空間とに分けて管理することができる。
【０１０４】
図７の例では、終端文字記憶部２０４から取得する終端文字を‘０ｘ００’一つとした場合に関して例示している。
【０１０５】
なお、図７により終端文字を含むアドレス情報の一例を示したが、終端文字を含むアドレスの組合せ、及び終端文字を含み連続するアドレス群、及びアドレス空間のサイズ、アドレス空間同士のアドレス空間上の距離などが管理できれば、どのような形式でもかまわない。
【０１０６】
図７では、プログラムが利用できるアドレス空間上のアドレス順に、終端文字を含むアドレスで構成される第一アドレス空間（７０２）を示している。例えば、終端文字記憶部２０４から取得した終端文字が‘０ｘ００’の場合、‘０ｘ００００００００〜０ｘ００ｆｆｆｆｆｆ’のアドレス空間を、終端文字‘０ｘ００’（７０１）を含むアドレスで構成される第一アドレス空間（７０２）として記憶している。そして、このアドレス空間のサイズが１６Ｍｂｙｔｅ（１６メガバイト）（７０２）であることを記憶している。この第一アドレス空間に後続し、終端文字を含まないアドレスで構成される第二アドレス空間（７０３、７０５）も記憶する。
【０１０７】
なお、第二アドレス空間（７０３）の中身はないので、第一アドレス空間（７０２）と第一アドレス空間（７０４）を合わせて第一アドレス空間としてもよい。
【０１０８】
なお、複数の終端文字を取得した場合、全ての終端文字を含むアドレスで構成される第三アドレス空間として記憶しておいてもよい。この場合、第三アドレス空間は、その複数の終端文字を含む様々なコピー関数のコピー処理を止めることができるので、第一アドレス空間よりも安全であるといえる。また、第三空間アドレスは第一空間アドレスを含む概念である。
【０１０９】
システム関数情報取得部２０９は、制御部２０２からの指示を受けて、システム関数指定部２０１からシステム関数名などの情報を取得し、取得したシステム関数名などの情報を用いて、システム関数情報を取得する。システム関数名は、具体的には、Ｓｙｓｔｅｍ、ｍｍａｐ、ｍａｌｌｏｃなどである。システム関数情報取得部２０９は、システム関数指定部２０１で指定されたシステム関数に関する情報を取得する。具体的には、図８に例示するような形式である。また、これらの形式に限定されることなく、様々な形式で取得する。システム関数情報としては、図８に示す通り、不正利用を防止したいシステム関数名（８０１）やＲＯＭ等の記憶媒体にあるソースコードが存在する位置情報（８０２）、不正利用を防止したいシステム関数の重要度に応じた優先度情報（８０３）、サイズ情報（８０４）などがある。また、ソースコードを含めても良い。不正利用を防止したいシステム関数の重要度に応じた優先度情報（８０２）を設けることにより、どのシステム関数から優先的に不正利用の防止を行うか判断することができる。
【０１１０】
なお、図８の例ではシステム関数に優先度高・中・低の３段階を対応付けたが、優先度情報（８０３）は何段階に設定してもよいし、システム関数情報の指定する順序に従って優先度情報（８０３）を判断する方法も考えられる。
【０１１１】
システム関数アドレス決定部２１２は、制御部２０２からの指示を受けると、アドレス空間情報記憶部２０８からアドレス空間情報を取得し、システム関数情報記憶部２１０からシステム関数情報とシステム関数のオブジェクトサイズを取得し、システム関数のアドレスを、アドレス空間生成部２０７で生成した終端文字を含むアドレスで構成される第一アドレス空間に割り当てる。その際にシステム関数のアドレスを、第一アドレス空間の末尾に割り当てるようにすると、第一アドレス空間を効率よくシステム関数に割り当てることができる。ここで、アドレス空間の末尾とは、前記アドレス空間内であって、前記アドレス空間の末尾アドレスからいくつかの命令コードを含む数バイト〜数十バイトの空間をいうものとする。システム関数にジャンプされないようにするためには、システム関数の先頭アドレスが、アドレス空間生成部２０７で生成される、終端文字を含むアドレスで構成される第一アドレス空間に割り当てられていればよい。或いは、システム関数の先頭からいくつかの命令コードを含む数バイト〜数十バイトの空間が、アドレス空間生成部２０７で生成される第一アドレス空間に割り当てられれば、そのシステム関数へのジャンプを防止することができる。システム関数アドレス決定部２１２は、この特徴を生かして、限りある保護可能なアドレス空間を効率的に利用することができる。
【０１１２】
また、システム関数アドレス決定部２１２は、システム関数のアドレスに、アドレス空間生成部２０７で生成した第一アドレス空間を割り当てる作業を行う際に、前記第一アドレス空間に後続する第二アドレス空間の情報を用いることもできる。これは、システム関数のアドレスを、終端文字を含む第一アドレス空間の末尾に割り当てる場合に、システム関数が前記第一アドレス空間に後続する第二アドレス空間まで跨る場合がある。この場合、前記第一アドレス空間に後続する第二アドレス空間の大きさによっては、システム関数を割り当てることができない場合もあるので、あらかじめ第一アドレス空間に後続する第二アドレス空間の情報を参照して、第二アドレス空間がシステム関数を割り当てることができるかどうかを判断する必要があるためである。
【０１１３】
図９は、システム関数指定部２０１で、ユーザまたは開発者が一つのシステム関数を指定した場合の、システム関数アドレス決定部２１２の処理の流れを示したフローチャートである。
【０１１４】
システム関数アドレス決定部２１２は、システム関数情報記憶部２１０から取得したシステム関数情報を用いて、未処理のシステム関数が残っているか調べる（Ｓ９０１）。未処理のシステム関数が残っていない場合、システム関数アドレス決定部２１２は処理を終了する（Ｓ９０１）。
【０１１５】
未処理のシステム関数が残っている場合、システム関数アドレス決定部２１２は、システム関数情報記憶部２１０から取得したシステム関数情報とシステム関数のサイズ情報とから、未処理のシステム関数のうちサイズが最大のものを選択する（Ｓ９０２）。
【０１１６】
第一アドレス空間の中で、前記第一アドレス空間に後続する第二アドレス空間を前記システム関数に割り当てることができる第一アドレス空間が存在する場合（Ｓ９０３）、システム関数アドレス決定部２１２は、前記第二アドレス空間のサイズが最大である前記第一アドレス空間を取得する（Ｓ９０４）。
【０１１７】
システム関数アドレス決定部２１２は、システム関数のアドレスを、ステップＳ９０４で選択した第一アドレス空間の末尾に割り当てる（Ｓ９０５）。
【０１１８】
なお、第一アドレス空間の末尾アドレスに割り当てると、さらにアドレス空間を効率よく利用できる。また、システム関数のアドレスを第一アドレス空間内のアドレスに割り当てるのであれば、問題は無い。
【０１１９】
システム関数アドレス決定部２１２は、システム関数の割り当てを行うと、割り当てに利用した第一アドレス空間情報を修正するようにアドレス空間情報記憶部２０８に通知する（Ｓ９０６）。つまり、前記第一アドレス空間を利用可能なアドレスまでに修正し、前記第一アドレス空間のサイズも、割り当てに利用したサイズ分を差し引いて修正するようにアドレス空間情報記憶部２０８に通知する。また、割り当てに利用した第一アドレス空間は、すでにシステム関数を割り当てたので、他のシステム関数が利用不可であることを記憶するようにアドレス空間情報記憶部２０８に通知する。
【０１２０】
さらに、システム関数アドレス決定部２１２は、ステップＳ９０５によるシステム関数の割り当てを行った際、前記第一アドレス空間の次の第一アドレス空間の領域までまたがってシステム関数の割り当てがなされた場合、またがって割り当てられた第一アドレス空間情報を修正する（Ｓ９０７）。具体的には、割り当て状況に応じて、第一アドレス空間の開始アドレスや末尾アドレス、アドレス空間のサイズ、アドレス空間の利用可否などを修正して記憶するようにアドレス空間情報記憶部２０８に通知すればよい。その後、第一の空間アドレスに割り当てることができないと判断したシステム関数を判断対象から除いて、最初のステップＳ９０１に戻る。
【０１２１】
ステップＳ９０３で、第一アドレス空間の中で後続する第二アドレス空間が利用可能なものが存在しない場合、システム関数アドレス決定部２１２は、第一アドレス空間のうちアドレス空間のサイズが最大のものを選択する（Ｓ９０８）。
【０１２２】
システム関数アドレス決定部２１２は、システム関数のサイズが、ステップＳ９０８で選択したアドレス空間のサイズより小さいかどうか、すなわち利用可能な第一アドレス空間のうち最大のサイズのもので、システム関数の割り当てに十分足りるサイズかどうかを確認する（Ｓ９０９）。
【０１２３】
システム関数のサイズが、選択した第一アドレス空間より小さい場合、システム関数アドレス決定部２１２は、選択した第一アドレス空間の先頭にシステム関数を割り当てる（Ｓ９１０）。第一アドレス空間の先頭とは、前記アドレス空間内であって、前記アドレス空間の先頭アドレスからいくつかの命令コードを含む数バイト〜数十バイトの空間をいうものとする。ただし、システム関数の先頭から末尾までの実体が、第一アドレス空間に収まるように割り当てれば問題はない。
【０１２４】
システム関数アドレス決定部２１２は、システム関数の割り当てを行うと、アドレス空間情報記憶部２０８に、割り当てに利用した第一アドレス空間情報を修正するように通知する（Ｓ９１１）。第一アドレス空間の先頭アドレスに割り当てる場合、アドレス空間情報記憶部２０８に、第一アドレス空間の先頭アドレスを利用可能なアドレスに修正し、第一アドレス空間のサイズも割り当てに利用したサイズ分を差し引いて修正するように通知する。その後、第一の空間アドレスに割り当てることができないと判断したシステム関数を判断対象から除いて、最初のステップＳ９０１に戻る。
【０１２５】
ステップＳ９０９で、システム関数のサイズが、選択した第一アドレス空間より小さくない、すなわち第一アドレス空間のサイズが、システム関数に割り当てるために十分なサイズではない場合、そのシステム関数の割り当ては終端文字を含むアドレス空間に割り当てることができないと判断し、その後、第一の空間アドレスに割り当てることができないと判断したシステム関数を判断対象から除いて、最初のステップＳ９０１に戻る。
【０１２６】
システム関数アドレス決定部２１２は、決定したシステム関数のアドレス情報をシステム関数情報記憶部２１０に記憶する。
【０１２７】
図１０は、システム関数アドレス決定部２１２がシステム関数のアドレスを決定した場合に、システム関数情報記憶部２１０に記憶する場合の形式である。システム関数アドレス決定部２１２は、図８のように、システム関数名（８０１）に対応づけてシステム関数のアドレス情報（１００２）をシステム関数情報記憶部２１０に記憶しておいてもよいし、別の形式で記憶してもよい。そして、システム関数情報記憶部２１０にシステム関数のアドレス情報を記憶した旨の通知を制御部２０２にする。
【０１２８】
なお、システム関数アドレス決定部２１２は、システム関数のアドレスを決定した場合、直接システム関数ビルド部２１３に渡すようにしてもよい。
【０１２９】
つぎに、図８に例示した通り、システム関数指定部２０１が指定するシステム関数に優先度情報８０３が対応付けられている場合、システム関数アドレス決定部２１２は優先度情報８０３に従って、保護すべき優先度が高いシステム関数から優先的に第一アドレス空間を割り当てる処理が可能である。
【０１３０】
図１１は、システム関数情報に優先度情報（Ｓ８０３）が付与されている場合の、システム関数アドレス決定部２１２の処理の流れを示したフローチャートである。図１１のフローチャートは、ステップ１１０２だけが図９のフローチャートと異なる。つまり、図９では、未処理のシステム関数が残っている場合、システム関数アドレス決定部２１２は、システム関数情報記憶部２１０から取得したシステム関数情報とシステム関数のサイズ情報とから、未処理のシステム関数のうちサイズが最大のものを選択する（Ｓ９０２）。一方、システム関数情報に優先度情報（Ｓ８０３）がある場合には、システム関数アドレス決定部２１２は、未処理のシステム関数が残っている場合、システム関数情報記憶部２１０から取得したシステム関数情報を用いて、優先度情報（Ｓ８０３）が最大のシステム関数を選択する。こうすることで、保護すべき優先度情報（Ｓ８０３）が高いシステム関数から優先的に第一アドレス空間を割り当てる処理が可能となる。
【０１３１】
また、終端文字取得部２０３から取得する終端文字が‘０ｘ００’の一つではなく複数の場合、アドレス空間生成部２０７は、全ての終端文字を含むアドレス、及び一部の終端文字を含むアドレスで構成されるアドレス空間を生成することが可能である。
【０１３２】
一例を挙げると、終端文字が‘０ｘ００’と‘０ｘ０ａ’の２つの場合、アドレス空間生成部２０７は２つの終端文字を含むアドレス（例：‘０ｘ１２０００ａ７８’）と、別に１つのみの終端文字を含むアドレス（例：‘０ｘ１２００３４７８’や‘０ｘ１２０ａ３４７８’）とで構成されるアドレス空間を生成することができる。
【０１３３】
２つの終端文字を含むアドレスは、２つのコピー関数の処理を止めることができるので、システム関数アドレス決定部２１２は、高優先度のシステム関数を２つの終端文字を含むアドレスに割り当て、低優先度のシステム関数を１つの終端文字のみ含むアドレスに割り当てる割り当て方式を取ることにより、より重要なシステム関数をより強力に保護することもできる。終端文字取得部２０３から取得する終端文字が３つ以上の場合も、同様の考え方で実現することができる。そして、終端文字が複数ある場合であっても、システム関数情報に優先度情報（Ｓ８０３）が付与されているときには、システム関数を優先度情報（Ｓ８０３）にしたがって、安全な空間に割り当てることができる。
【０１３４】
図９、１１に示したシステム関数アドレス決定部２１２の処理に関わるフローは、あくまで一例に過ぎず、図９、１１を用いて説明した範囲を逸脱することなく、他の実現方法で実現してもかまわない。
【０１３５】
（実施の形態２）
図１２は、本発明の実施の形態２におけるセキュリティ保護装置１１０の構成を例示している。図１２において、図２と同じ構成要素については、同じ符号を用い、説明を省略する。
【０１３６】
図１２の制御部１２０２は、図２のシステム関数指定部２０１の指示を受けずに、パソコンが起動されたときや、新たなアプリケーションをユーザが起動したときなどに処理を開始し、各構成部に対して処理の指示を行う。具体的には、終端文字取得部２０３、ハードウェア情報取得部２０５、アドレス空間生成部２０７、システム関数情報取得部２０９、システム関数アドレス決定部２１２、システム関数ビルド部２１３に処理を指示する。
【０１３７】
第二システム関数情報取得部１２０９は、制御部１２０２から指示を受けると、システム関数が記憶されているＲＯＭ等の記憶媒体から、システム関数情報をまとめて取得する。
【０１３８】
図１３は、セキュリティ保護装置の処理の流れを示したフローチャートである。図１３を用いて、図１２の制御部１２０２と図２の制御部２０２、図１２の第二システム関数情報取得部１２０９と図２のシステム関数情報取得部２０９とで、それぞれ処理が違う点を説明し、図３と同じ処理については、簡単に説明する。
【０１３９】
まず、制御部１２０２は、パソコンが起動されたときや、新たなアプリケーションをユーザが起動したときなどに起動する（Ｓ３０２）。制御部１２０２は、終端文字取得部２０３、ハードウェア情報取得部２０５に処理をするように指示をして（Ｓ３０３、Ｓ３０４）アドレス空間を生成させる（Ｓ３０５）か、あるいは、システム関数情報取得部２０９にシステム関数情報を取得してくるように指示をする（Ｓ１３０６）。指示する順番は問わないし、並行処理でもよい。したがって、実際の処理は図１３の処理の順番に限られることはなく、Ｓ３０３、Ｓ３０４、Ｓ３０５の処理の順番と、Ｓ１３０６、Ｓ３０７、Ｓ３０８の処理の順番が変わらなければ、どんな順番でも良い。たとえば、Ｓ３０３、Ｓ１３０６、Ｓ３０４、Ｓ３０７、Ｓ３０５、Ｓ３０８の順番でもよいし、Ｓ３０３、Ｓ１３０６、Ｓ３０７、Ｓ３０８、Ｓ３０４、Ｓ３０５でもよい。また、Ｓ３０３、Ｓ３０４、Ｓ１３０６、Ｓ３０７、Ｓ３０５、Ｓ３０８でもよい。
【０１４０】
指示を受けた第二システム関数情報取得部１２０９は、システム関数が記憶されているＲＯＭ等の記憶媒体から、システム関数情報をまとめて持ってきてくる（Ｓ１３０６）。そして、このシステム関数情報をシステム関数情報記憶部２１０に記憶し、システム関数情報をシステム関数情報記憶部２１０に記憶した旨の通知を制御部１２０２にする。そして、通知を受けた制御部１２０２は、システム関数サイズ取得部２１１に処理をするように指示をして、システム関数のオブジェクトサイズを取得する（Ｓ３０７）。
【０１４１】
制御部１２０２は、アドレス空間生成部２０７から、アドレス空間情報記憶部２０８にアドレス空間情報を記憶した旨の通知と、システム関数サイズ取得部２１１から、システム関数情報記憶部２１０にシステム関数のオブジェクトサイズの情報を記憶した旨の通知と、を受けた場合には、システム関数アドレス決定部２１２に処理をするように指示をする。
【０１４２】
システム関数アドレス決定部２１２は、制御部１２０２からの指示を受けて、処理を開始し、アドレス空間情報、システム関数情報、システム関数のオブジェクトサイズ情報を用いて、システム関数のアドレスを、アドレス空間生成部２０７で生成したアドレス空間のアドレスに割り当てることを決定する（Ｓ３０８）。処理の流れは、図９のフローチャートと同様である。
【０１４３】
制御部１２０２は、システム関数アドレス決定部２１２からシステム関数のアドレス情報をシステム関数情報記憶部２１０に記憶した旨の通知を受けたら、システム関数ビルド部２１３に処理をするように指示をする。
【０１４４】
制御部１２０２から指示を受けたシステム関数ビルド部２１３は、システム関数情報記憶部２１０から、システム関数情報と、決定したシステム関数のアドレス情報とを取得し、システム関数を指定のアドレスに割り当てるようにオブジェクトコードを生成して（Ｓ３０９）、処理を終了する。
【０１４５】
以上により、可能な限り多くのシステム関数をバッファオーバフローによる不正実行から保護することができる。
【０１４６】
なお、本発明の実施の形態１を示す図２の各機能ブロックは、典型的にはプログラムで実現されるが、集積回路であるＬＳＩとしてもよい。これらは個別に１チップ化されても良いし、一部又は全てを含むように１チップ化されても良い。ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
【０１４７】
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  ＰｒｏｇｒａｍｍａｂｌｅＧａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０１４８】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。
【０１４９】
このような構成をとることによって、書換えが発生していないことを確認するための追加の処理が必要ないので、プログラムの動作速度の低下やメモリ消費量の増加を招かないだけではなく、システム関数を不正な命令コードの実行から保護することができる。
【０１５０】
以上、前述の説明はあらゆる点において本発明の例示に過ぎず、その範囲を限定しようとするものではない。本発明の範囲を逸脱することなく種々の改良や変形を行うことができることは言うまでもない。
【産業上の利用可能性】
【０１５１】
本発明にかかるセキュリティ保護装置、セキュリティ保護方法、セキュリティ保護プログラムおよびセキュリティ保護集積回路は、コンピュータ上で実行するプログラムの動作を、速度性能を低下させたりメモリ消費量を増加させたりすることなく、バッファオーバフロー攻撃から保護することができるので、情報機器やＡＶ機器や通信機器、家電機器などのコンピュータを搭載する機器において有用である。
【図面の簡単な説明】
【０１５２】
【図１】本発明の実施の形態１による情報処理装置の構成を示すブロック図
【図２】図１のセキュリティ保護装置の構成を示すブロック図
【図３】本発明の実施の形態１によるセキュリティ保護装置の処理の流れを示したフローチャート
【図４】外部から重要な関数を不正に利用するための手続きの一例を模式的に描いた説明図
【図５】コピー関数がコピーを実施する様子の一例を示す図
【図６】エンディアン形式によるデータ格納順序の差異の例を示す図
【図７】本発明のアドレス空間情報記憶部２０８が管理するアドレス空間情報の一例を模式的に描いた説明図
【図８】本発明のシステム関数情報取得部が取得したシステム関数情報の一例を示す図
【図９】本発明のシステム関数アドレス決定部の動作手順の一例を示すフローチャート
【図１０】アドレス空間情報記憶部が管理する情報の一例を表形式で示す説明図
【図１１】本発明のシステム関数アドレス決定部の動作手順の一例を示すフローチャート
【図１２】本発明の実施の形態２によるセキュリティ保護装置の構成を示すブロック図
【図１３】本発明の実施の形態２によるセキュリティ保護装置の処理の流れを示したフローチャート
【符号の説明】
【０１５３】
１００    情報処理装置
１１０    セキュリティ保護装置
１１１    ＣＰＵ
１１１ａ    ＣＰＵ
１１１ｂ    ＣＰＵ
１１１ｃ    ＣＰＵ
１１２    メモリ装置
１１２ａ    ＲＯＭ
１１２ｂ    ＲＡＭ
１２０    ＨＤＤ
１２１〜１２４    Ｉ／Ｆ
１２５    バスライン
１２６    読取装置
１２７    記憶媒体
１２８    通信回線
１２９    通信装置
１３０    入力装置
１３１    表示装置
１３２    割込みコントローラ
１３３    タイマー回路
２０１    システム関数指定部
２０２    制御部
２０３    終端文字取得部
２０４    終端文字記憶部
２０５    ハードウェア情報取得部
２０６    ハードウェア情報記憶部
２０７    アドレス空間生成部
２０８    アドレス空間情報記憶部
２０９    システム関数情報取得部
２１０    システム関数情報記憶部
２１１    システム関数サイズ取得部
２１２    システム関数アドレス決定部
２１３    システム関数ビルド部
４０１    アドレス空間
４０２    データ格納バッファ
４０３    戻り先番地
４０４    システム関数
４０５    入力データ
４０６    戻り先番地
５０１    終端文字
５０２    文字
６０１〜６０４    アドレス
７０１    終端文字
７０２    第一アドレス空間
７０３    第二アドレス空間
８０１    システム関数情報
８０２    システム関数情報
８０３    システム関数情報
８０４    システム関数情報
１００２    システム関数のアドレス情報
【図１】
2008305295.tif 000003
【図２】
2008305295.tif 000004
【図３】
2008305295.tif 000005
【図４】
2008305295.tif 000006
【図５】
2008305295.tif 000007
【図６】
2008305295.tif 000008
【図７】
2008305295.tif 000009
【図８】
2008305295.tif 000010
【図９】
2008305295.tif 000011
【図１０】
2008305295.tif 000012
【図１１】
2008305295.tif 000013
【図１２】
2008305295.tif 000014
【図１３】
2008305295.tif 000015