説明

セキュリティ保護装置、セキュリティ保護方法、セキュリティ保護プログラムおよびセキュリティ保護集積回路

【課題】プログラムの動作の保護に対して、バッファオーバフローによる不正な命令コードの実行を防止するために、従来書換えが発生していないことを確認するための追加の処理が必要になり、プログラムの動作速度やメモリ消費量に影響を与える課題があった。
【解決手段】処理の終了判定に利用される終端文字を含むアドレスで構成されるアドレス空間を、コンピュータのハードウェア情報に基づいて適切に生成し、不正利用から守りたいシステム関数のアドレスを、前記アドレス空間に割り当てることにより、速度性能の低下やメモリ消費量の増加を招くことなく、バッファオーバフローによる書換えを防止しセキュリティを維持することができる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータ上で実行される種々のプログラムに対するセキュリティ技術に関するものである。
【背景技術】
【0002】
近年、コンピュータを搭載する電機機器が、インターネットに代表される種々のネットワークと接続し動作する環境において、コンピュータの動作を保護するセキュリティ技術が重要となってきた。特に、プログラムの脆弱性を悪用し、不正な処理を機器に実行させるという攻撃は、PC(Personal Computer;パーソナルコンピュータ或いはパソコン)の世界で蔓延している。
【0003】
その中でも、何らかのデータ入力により、プログラム内部で確保しているバッファをオーバフローさせ、本来プログラムが次の命令コードを実行するために保持するアドレスを、不正に書換えて都合のよい命令コードにジャンプさせ、実行させる攻撃が存在する。
【0004】
上記背景のもとで、バッファオーバフローによるアドレスの書換えを検出することにより、攻撃者にとって都合のよいジャンプ先にジャンプさせず、不正な処理を防止する技術として、プログラムの動作領域において、実行中の関数の呼び出し元へのリターンアドレスを格納する領域と、ローカル変数である配列を格納する領域の間にガード値を配置し、プログラムの動作の中でこのガード値が破壊されていれば、バッファオーバフローが発生したものと判断する方法が記述されていた(例えば、特許文献1参照)。
【0005】
また、呼出し元から呼出し先に戻り番地を渡すことを止め、代わりに戻り番地IDを引き渡し、返戻の際には、戻り番地IDが有効か調べ、ジャンプ先を戻り番地表に登録してあるアドレスのみに制限することで、攻撃を抑止する方法が記述されていた(例えば、特許文献2参照)。この戻り番地IDとは、戻り番地を記録する戻り番地表を検索するための番号である。
【特許文献1】特開2001−216161号公報
【特許文献2】特開2006−48257号公報
【発明の開示】
【発明が解決しようとする課題】
【0006】
しかしながら、前記従来の技術では、バッファオーバフロー攻撃を防止して不正な命令コードの実行を防止するために、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理が必要になり、プログラムの動作速度が低下するという課題があった。
【0007】
例えば、特許文献1に開示された技術によると、プログラムの動作の中で実行される単位である関数の実行が終了し、呼出し元の関数へ戻る際に、ガード値が書換えられていないことを確認する必要がある。関数を呼び出して実行を開始する際にも、ガード値を生成し、リターンアドレスとローカル変数の間に格納する必要がある。関数の呼出しごとに行う必要があるこれらの処理は、プログラムの速度性能を大きく低下させることになる。
【0008】
また、特許文献2に開示された技術によると、関数の実行が終了し、呼出し元の関数へ戻る際に、戻り番地IDが有効かどうかを調べ、戻り番地表から戻り番地IDに対応する戻り番地を求める処理が必要になり、関数の実行の度に実施されるこの処理のために、プログラムの速度性能を低下させることになる。
【0009】
本発明は、前記従来の課題を解決するもので、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理を行わずに、バッファオーバフロー攻撃による不正な命令コードの実行を防止することを実現するセキュリティ保護装置、セキュリティ保護方法、セキュリティ保護プログラムおよびセキュリティ保護集積回路の提供を目的とする。
【課題を解決するための手段】
【0010】
前記従来の課題を解決するために、本発明のセキュリティ保護装置では、プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得手段と、ハードウェア情報を取得するハードウェア情報取得手段と、前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成手段と、システム関数の情報であるシステム関数情報を取得するシステム関数情報取得手段と、前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得手段と、前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定手段と、備えることにより、前記アドレス空間生成部で生成したアドレス空間を効率的に利用することを特徴とする。
【0011】
上記の構成により、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理を行う必要がなくなり、プログラムの動作速度の低下を招かないだけではなく、システム関数をバッファオーバフロー攻撃による不正な命令コードの実行をから保護することができるようになる。
【発明の効果】
【0012】
本発明のセキュリティ保護装置によれば、呼出し元の関数へ戻る際に、書換えが発生していないことを確認するための追加の処理を行う必要がなくなり、プログラムの動作速度の低下を招かないだけではなく、システム関数をバッファオーバフロー攻撃による不正な命令コードの実行から保護することができる。
【発明を実施するための最良の形態】
【0013】
以下、本発明の実施の形態について、図面を参照しながら説明する。
【0014】
(実施の形態1)
図1は、本発明の実施の形態1におけるセキュリティ保護装置を備えた情報処理装置の構成を示すハードウェア構成図である。この情報処理装置100は、それ自体としてユーザの使用に供することもできるが、様々な電気機器に組み込まれてもよい。情報処理装置100の一例は、代表的にはPC(Personal Computer;パーソナルコンピュータ或いはパソコン)等の汎用のコンピュータやPDA(Personal Digital Assistance)、携帯電話機等の携帯通信端末、デジタルカメラ、携帯オーディオプレイヤーなどである。
【0015】
情報処理装置100は、CPU(Central Processing Unit;中央演算処理部)111、メモリ装置112、通信装置128、入力装置130、表示装置131、割込コントローラ132及びタイマー回路133を備えている。これらの各構成要素は、バスライン125を通じて互いに接続されている。また、必要に応じて、バスライン125には、ハードディスク装置120及び読取装置126を接続することが可能となっている。ハードディスク装置120、読取装置126、入力装置130及び表示装置131は、それぞれ、インタフェース121、122、123及び124を通じてバスライン125に接続される。
【0016】
セキュリティ保護装置110は、CPU111とメモリ装置112とを備えている。なお、セキュリティ保護装置110は、HDD120を備えるようにしてもよい。
【0017】
CPU111は、メモリ104に格納されているプログラムを読み出し実行する。なお、単一のCPUで構成されても良く、複数のCPUで構成されても良い。図1では、情報処理装置100は、複数のCPU111a、111b、111c、・・・を有する一例を示した。
【0018】
メモリ装置112は、ROM(Read Only Memory)112a及びRAM(Random Access Memory)112bを備えている。ROM112aは、CPU111で実行するコンピュータプログラムを記憶している。コンピュータプログラムは、ハードディスク装置120に記憶させることもできる。CPU111は、ROM112a又はハードディスク装置120が格納するコンピュータプログラムを、必要に応じてRAM112bに書き込み、コンピュータプログラムが規定する処理を実行する。RAM112bは、CPU111が処理を実行するのに伴って発生するデータを一時的に記憶する媒体としても機能する。特に、本実施の形態において、RAM112bの領域の一部が、後述するプログラムのアドレス空間に割り当てられる。具体的には、システム関数のロード先の領域であり、また、一時的にデータを格納するための領域であるデータ格納バッファとして使用される。ROM112aには、フラッシュROMのように書き込みが可能で、電源を切っても記憶内容を保持できる不揮発性のメモリや記憶媒体も含まれる。RAM112bには、電源を切ると記憶内容が保持されない揮発性のメモリや記憶媒体が含まれる。
【0019】
ハードディスク装置120は、内蔵する不図示のハードディスクに対して、コンピュータプログラム、或いはデータを書き込み及び読み出す装置である。
【0020】
読取装置126は、記録媒体127(例えばCDやDVDやメモリカードなど)に記録されたコンピュータプログラム、或いはデータを読み取る装置である。
【0021】
通信装置128は、電話回線やネットワーク線や無線や赤外線通信等の通信回線129を介して、外部の機器と、コンピュータプログラム、或いはデータを交換する装置である。
【0022】
入力装置130は、ユーザの操作によりデータ等を入力する装置であり、例えば、PDAに配列されたキーボード、携帯電話機に配列された入力ボタン、或いは着脱自在のマウス、キーボードである。また、マイクなどの音声入力機器などであってもよい。
【0023】
表示装置131は、データ、画像等を画面に表示したり、データ等を音声で表示したりする装置であり、例えばLCD(Liguid Crystal Display;液晶表示器)、ブラウン管、スピーカである。
【0024】
タイマー回路133は、一定の周期でタイマー割込信号を出力する装置である。このタイマー割込信号に基づいて、CPU111が処理を実行する。
【0025】
割込コントローラ132は、タイマー回路133、入力装置130、CPU111のうちの処理実行中のCPU以外のCPU、ネットワークデバイスとしての通信装置128、ハードディスク装置120、読取装置126等から送られる割込要求信号を、CPU111へ中継する装置である。各装置からの割込要求には優先度が付けられている。割込コントローラ132は、同時に複数の装置から割り込みが発生した場合には、それらの要求を優先度に応じて調停する機能を有している。
【0026】
以上のように、情報処理装置100は、コンピュータとして構成されている。上記コンピュータプログラムは、ROM112a、不図示のフレキシブルディスク、CD−ROM等のプログラム記録媒体127を通じて供給することも、電気通信回線129等の伝送媒体を通じて供給することも可能である。例えば、プログラム記録媒体127としてCD−ROMに記録されたコンピュータプログラムは、読取装置126を情報処理装置100へ接続することにより、読み出すことができ、更にRAM112b或いはハードディスク装置120に格納することができる。
【0027】
プログラム記録媒体としてROM112aによってコンピュータプログラムが供給される場合には、当該ROM112aを情報処理装置100に搭載することにより、CPU111は上記コンピュータプログラムに従った処理を実行可能となる。電気通信回線129等の伝送媒体を通じて供給されるコンピュータプログラムは、通信装置128を通じて受信され、例えば、RAM112b或いはハードディスク装置120に格納される。伝送媒体は、有線の伝送媒体に限られず、無線の伝送媒体であっても良い。また、伝送媒体は通信線路のみでなく、通信線路を中継する中継装置、例えばルータをも含む。
【0028】
本実施の形態におけるセキュリティ保護装置は、ROM112aに格納されているプログラムをRAM112b上にロードし、CPU111によるコンピュータプログラムの実行時に、呼出し元の関数へ戻る度に、書換えが発生していないことを確認するための追加の処理を行わずに、バッファオーバフロー攻撃による不正な命令コードの実行を防止することができる。なお、本実施の形態におけるセキュリティ保護装置は、CPU111及びメモリ装置112を単一の半導体基板に作り込んだLSI(Large Scale Integrated circuit)等の集積回路として構成されてもよい。
【0029】
次に、本発明の実施の形態におけるセキュリティ保護装置110が、どのような攻撃や処理から、どのようにシステム関数の不正利用を防止するのかについて、図4、図5を用いて概要を説明する。
【0030】
図4に示す通り、プログラムは、自身のアドレス空間(401)の上に、プログラムの命令コードやデータを割り当て、アドレス空間上の命令コードを実行したり、ジャンプして次の命令コードの実行に移ったり、あるいはアドレス空間上のデータにアクセスして動作する。
【0031】
例えば、プログラムのアドレス空間(401)には、プログラムが一時的にデータを格納するための領域であるデータ格納バッファ(402)があり、プログラムが外部から入力されたデータを格納する。また、プログラムのアドレス空間には、次の命令コードへジャンプする先の番地も格納されている。代表的には、ジャンプ先の番地は呼出し元の関数への戻り先番地(403)であることが多く、或いはポインタ関数などのポインタの指し先番地が格納されていることもあり、種々の可能性が考えられる。一般に、データ格納バッファ(402)と戻り先番地(403)は、プログラムのアドレス空間(401)で近い位置に配置されることが多い。
【0032】
プログラムは、データが入力されると、入力データ(405)をデータ格納バッファ(402)に格納するが、プログラムのバッファ管理が十分でない場合、データ格納バッファ(402)の容量を超えてデータがオーバフローする可能性がある。悪意ある攻撃や意図せず過大な入力データ(405)を入力してバッファオーバフローすると、戻り先番地(403)が上書きされる。この上書きした箇所に、XX番地というアドレス(406)が書き込まれると、プログラムは戻り先番地(403)にジャンプするつもりで、XX番地に割り当てられているシステム関数(404)にジャンプして、意図せずシステム関数を実行することにつながる。
【0033】
プログラムは、通常汎用の或いは自前のコピー関数を使用して、入力データ(405)をデータ格納バッファ(402)に格納する。したがって、セキュリティ保護装置110は、システム関数(404)が割り当てられているXX番地を、コピー関数により上書きできないようにすることによって、不正にシステム関数を利用されることを防止してセキュリティを維持する。
【0034】
プログラムによって呼び出されるコピー関数は、コピーする元データをコピー先の領域にコピーするにあたり、元データがどこまで有効かを調べるために、終端文字により判別する特徴を持つ。これは、コピー関数が、文字列の先頭を示すポインタアドレスを受け取り、そのポインタアドレスの示すところを始点としてコピー元のデータを取得し、コピー先のポインタアドレスへコピーデータをコピーするためである。
【0035】
終端文字により判別する一例として、コピー関数が引数として受け取ったコピー元の文字列にNULL文字、すなわち‘0’(16進表示で0x00)の値が入っていれば、それを文字列の終端と判断して、コピーを終了する場合がある。
【0036】
図5にこの例を示す。図5では、コピー元の文字列として、“copy”に‘0’(図5の501)が後続している。‘0’(図5の501)の後に“str”という文字列が後続しているが、コピー関数は‘0’までをコピー元として有効なデータであると判別し、文字列“copy”をコピー先にコピーして“y”(図5の502)までコピーすればコピーを終了することになる。
【0037】
すなわち、コピー関数が終端と判断する終端文字を含むようなアドレスを生成した場合、そのアドレスはコピー関数によって最後までコピーすることができなくなる。例えば、図4のXX番地(406)というアドレスに終端文字が含まれていれば、入力データ(405)をコピーする際に、XX番地という値を途中までしかコピーできなくなる。
【0038】
したがって、セキュリティ保護装置110は、悪意あるプログラムが、プログラムのバッファオーバフローを引き起こし、悪意ある入力データをコピーさせてXX番地のシステム関数(図4の404)にジャンプさせようとしても、XX番地(図4の406)のコピーをさせないため、不正なシステム関数の実行を防止することができる。
【0039】
なお、プログラムが入力データ(図4の405)をデータ格納バッファ(図4の402)に格納する処理を実施する関数を、これまでコピー関数と呼んだが、単純にコピーする関数だけが対象になるわけではなく、受け取った複数のデータを結合させてデータ格納バッファに格納する関数や、受け取ったデータを特定の様式に従ってデータ格納バッファに格納する関数など、種々のデータ格納バッファに格納する関数が対象になる。以下、それらを総称してコピー関数とする。
【0040】
次に、図2を用いて、セキュリティ保護装置110の構成要素について説明する。
【0041】
図2は、本実施の形態に係るセキュリティ保護装置110の構成を例示している。通常、このセキュリティ保護装置110の実体はメモリ装置112或いはハードディスク装置120に格納され、CPU111と協働して実行することにより、セキュリティ保護装置全体を実現している。
【0042】
このセキュリティ保護装置110は、コンピュータ上で動作するプログラムの動作を保護するものである。セキュリティ保護装置110が動作する情報処理装置100で動作するプログラムを保護することも可能であり、また別の情報処理装置で動作するためのプログラムの保護も可能である。
【0043】
図2において、システム関数指定部201は、ユーザまたは開発者などから、不正に利用されることを防止しなければいけないシステム関数の指定を受け付ける。一つの関数の指定でもよいし、複数の関数をまとめた指定でもよい。ユーザまたは開発者の入力を受け付けるような仕様であればよい。そして、制御部202に処理を行うように通知する。
【0044】
制御部202は、各構成部に対して処理の指示を行う。具体的には、後述する、終端文字取得部203、ハードウェア情報取得部205、アドレス空間生成部207、システム関数情報取得部209、システム関数アドレス決定部212、システム関数ビルド部213に処理を指示する。具体的な動作については、後述する図3のセキュリティ保護装置の処理の流れを示したフローチャートとともに説明する。
【0045】
終端文字取得部203は、制御部202からの指示を受けて、プログラムの関数の処理の終了判定に用いられる特定の値すなわち終端文字を取得する。コピー関数の仕様により採用している終端文字が異なるため、終端文字取得部203はプログラムにより利用されるコピー関数を選択し、種々の終端文字を取得する必要がある。終端文字として、代表的には、上記に例示したNULL文字としての‘0x00’(16進表示)、或いは改行を示す‘0x0a’(16進表示)などがコピー関数に採用されることが多い。そして、取得した終端文字を終端文字記憶部204に記憶する。
【0046】
終端文字記憶部204は、終端文字を含む終端文字情報を記憶する。
【0047】
なお、開発者やユーザがあらかじめコピー関数の仕様を把握し終端文字のリストを、直接入力やファイル入力などの種々の方法で終端文字記憶部204に記憶しておくことも考えられる。
【0048】
ハードウェア情報取得部205は、制御部202からの指示を受けて、プログラムが動作するアドレス空間に関する情報であるハードウェア情報を取得し、取得したハードウェア情報をハードウェア情報記憶部206に記憶する。詳細な動作に関しては後述する。
【0049】
ハードウェア情報記憶部206は、ハードウェア情報取得部205からの指示を受けて、ハードウェア情報取得部205が取得したハードウェア情報を記憶する。
【0050】
なお、開発者やユーザがあらかじめハードウェアに関する情報を、直接入力やファイル入力などの種々の方法でハードウェア情報記憶部206に記憶する方法が考えられる。また、ハードウェア情報取得部205が直接CPUなどの演算装置の情報が格納されているフラグを読み取って判断する方法も考えられる。
【0051】
アドレス空間生成部207は、制御部202からの指示を受けて、終端文字記憶部204から取得した終端文字とハードウェア情報記憶部206から取得したアドレス空間に関する情報に基づいて、終端文字記憶部204から取得した終端文字の値を含むアドレスからなるアドレス空間を生成する。詳細な動作に関しては後述する。
【0052】
アドレス空間情報記憶部208は、アドレス空間生成部207からの指示を受けて、アドレス空間に関する情報である、アドレス空間情報を記憶する。詳細な動作に関しては後述する。
【0053】
システム関数情報取得部209は、制御部202からの指示を受けて、システム関数指定部201からシステム関数名などのシステム関数を識別する情報を取得し、取得したシステム関数名などの情報を用いて、システム関数名、ROM等の記憶媒体にあるソースコードが存在する位置情報、ソースコード、サイズ情報、システム関数の優先度など、システム関数に関する情報である、システム関数情報を取得し、システム関数情報記憶部210にシステム関数情報を記憶する。詳細な動作に関しては後述する。
【0054】
システム関数情報記憶部210は、システム関数情報取得部209からの指示を受けて、システム関数情報やシステム関数のオブジェクトサイズの情報などの情報を記憶する。なお、後述するように、システム関数情報は全ての処理が終わった後にシステム関数ビルド部213からの指示を受けて、システム関数情報記憶部210から消去してもよい。
【0055】
システム関数サイズ取得部211は、制御部202からの指示を受けて、システム関数情報記憶部210から、ROM等の記憶媒体にあるソースコードが存在する位置情報を含むシステム関数情報を取得し、その情報からソースコードを取得し、システム関数指定部201で指定されたシステム関数のオブジェクトサイズを取得する。具体的には、システム関数のオブジェクトサイズを取得するために、指定されたシステム関数を含むソースコードを事前に一時的にビルドし、ビルドされたオブジェクトコードの中からシステム関数指定部201で指定されたシステム関数のオブジェクトサイズを取得する。そして、取得したオブジェクトサイズをシステム関数情報記憶部210に記憶する。
【0056】
なお、システム関数情報にソースコードが存在する場合には、そのソースコードを用いても良い。さらに、後述するように、システム関数情報記憶部210にオブジェクトサイズ情報が含まれている場合には、処理を行わなくてもよい。
【0057】
システム関数アドレス決定部212は、制御部202からの指示を受けて、アドレス空間情報記憶部208から取得したアドレス空間情報とシステム関数情報記憶部210から取得したシステム関数情報とシステム関数のオブジェクトサイズの情報とを用いて、システム関数のアドレスを、アドレス空間生成部207で生成したアドレス空間のアドレスに割り当てることを決定する。詳細な動作に関しては後述する。
【0058】
システム関数ビルド部213は、制御部202からの指示を受けて、システム関数情報と、システム関数アドレス決定部212が決定したシステム関数のアドレス情報とから、システム関数を指定のアドレスに割り当てるようにオブジェクトコードを生成する。
【0059】
なお、処理が終わった後に、システム関数情報記憶部210からシステム関数情報を消去してもよい。
【0060】
以上の構成により、セキュリティ保護装置110は、外部からの攻撃や内部の処理の暴走などに起因するシステム関数などの重要な関数の不正利用を防止することができる。
【0061】
図3は、セキュリティ保護装置の処理の流れを示したフローチャートである。
【0062】
図3を用いて、セキュリティ保護装置の大まかな処理の流れと制御部202の具体的な処理の内容を説明する。
【0063】
まず、ユーザまたは開発者が、システム関数指定部201に、不正に利用されることを防止しなければいけないシステム関数を指定する。一つの関数を指定してもよいし、複数の関数をまとめて指定してもよい(S301)。次に、システム関数指定部201は、制御部202に通知をして、制御部202が起動する(S302)。通知を受けた制御部202は、終端文字取得部203に処理を行うように指示をする。指示を受けた終端文字取得部203は、プログラムの関数の処理の終了判定に用いられる特定の値すなわち終端文字を取得する(S303)。そして、終端文字記憶部204に取得した終端文字を記憶し、取得した終端文字を終端文字記憶部204に記憶した旨の通知を制御部202にする。通知を受けた制御部202は、ハードウェア情報取得部205に処理を行うように通知する。通知を受けたハードウェア情報取得部205は、プログラムが動作するアドレス空間に関する情報であるハードウェア情報を取得する(S304)。そして、ハードウェア情報記憶部206に記憶し、ハードウェア情報記憶部206にハードウェア情報を記憶した旨の通知を制御部202にする。
【0064】
なお、制御部202が終端文字取得部203と、ハードウェア情報取得部205に指示する順番は問わない。システム関数指定部201から入力を受け付けたら、ハードウェア情報取得部205に先に指示してもよい。また、同時に終端文字取得部203とハードウェア情報取得部205とに指示を出してもよい。
【0065】
次に、ハードウェア情報取得部205から通知を受けた制御部202は、アドレス空間生成部207に処理を行うように指示をする。指示を受けたアドレス空間生成部207は、終端文字記憶部204から終端文字情報を取得し、ハードウェア情報記憶部206からハードウェア情報を取得する。そして、終端文字情報とハードウェア情報とに基づいて、終端文字記憶部203から取得した終端文字の値を含むアドレスからなるアドレス空間を生成する(S305)。そして、アドレス空間情報記憶部208に、アドレス空間情報を記憶し、アドレス空間情報記憶部208に、アドレス空間情報を記憶した旨の通知を制御部202にする。
【0066】
次に、制御部202は、システム関数情報取得部209に処理を行う指示をする。
【0067】
なお、制御部202が終端文字取得部203とシステム関数情報取得部209に指示をする順番は問わない。制御部202はシステム関数指定部201から処理があった旨の通知を受けると、システム関数情報取得部209に先に指示をしてもよいし、同時に終端文字取得部203とシステム関数情報取得部209とに指示をしてもよい。したがって、実際の処理は図3の処理の順番に限られることはなく、S303、S304、S305の処理の順番と、S306、S307、S308の処理の順番が変わらなければ、どんな順番でも良い。たとえば、S303、S306、S304、S307、S305、S308の順番でもよいし、S303、S306、S307、S308、S304、S305でもよい。また、S303、S304、S306、S307、S305、S308でもよい。
【0068】
システム関数情報取得部209は、制御部202から指示を受けると処理を開始する。
【0069】
システム関数情報取得部209は、システム関数指定部201からシステム関数名やシステム関数IDなどのシステム関数を識別する情報を取得し、その情報をもとに、ROM等の記憶媒体にあるソースコードが存在する位置情報、ソースコード、サイズ情報、システム関数の優先度など、システム関数に関する情報であるシステム関数情報を取得する(S306)。そして、取得したシステム関数情報をシステム関数情報記憶部210に記憶し、システム関数情報をシステム関数情報記憶部210に記憶した旨の通知を制御部202にする。
【0070】
システム関数サイズ取得部211は、制御部202から指示を受けると処理を開始する。システム関数サイズ取得部211は、システム関数指定部201により指定されたシステム関数のオブジェクトサイズを取得するために、システム関数情報記憶部210からシステム関数情報を取得し、システム関数情報にあるソースコード位置情報からシステム関数を含むソースコードを取得し、ソースコードを事前に一時的にビルドする。また、システム関数サイズ取得部211は、システム関数指定部201が指定するシステム関数のソースコードのみをビルドしてもよいが、システム関数指定部201から指定を受ける前に全てのソースコード、或いはシステム関数を含むと推測する一部のソースコードを事前にビルドしてもかまわない。システム関数サイズ取得部211は、ビルドされたオブジェクトコードの中からシステム関数指定部201により指定されたシステム関数のオブジェクトサイズを取得する(S307)。そして、取得したシステム関数のオブジェクトサイズをシステム関数情報記憶部210に記憶し、システム関数のオブジェクトサイズをシステム関数情報記憶部210に記憶した旨の通知を制御部202にする。
【0071】
なお、システム関数情報記憶部210にオブジェクトサイズ情報が含まれている場合には、処理を行わずに、制御部202に通知をしてもよい。
【0072】
制御部202は、アドレス空間生成部207と、システム関数サイズ取得部211とから通知を受けると、システム関数アドレス決定部212に処理を指示する。
【0073】
なお、アドレス空間生成部207から過去に通知があった場合には、アドレス空間情報に変更が無い限りは、制御部202は、システム関数サイズ取得部211からの通知だけでも、システム関数アドレス決定部212に処理をするように指示を出すようにしてもよい。
【0074】
また、システム関数指定部201で、過去に入力されたものが再び入力された場合等には、制御部202は処理をしなくてもよい。
【0075】
制御部202から指示を受けると、システム関数アドレス決定部212は、処理を開始する。システム関数アドレス決定部212は、アドレス空間情報記憶部208からアドレス空間情報を、システム関数情報記憶部210からシステム関数情報とシステム関数のオブジェクトサイズを取得する。そして、アドレス空間情報、システム関数情報、システム関数のオブジェクトサイズ情報を用いて、システム関数のアドレスを、アドレス空間生成部207で生成したアドレス空間のアドレスに割り当てることを決定する(S308)。そして、システム関数アドレス決定部212は、決定したシステム関数のアドレス情報をシステム関数情報記憶部210に記憶し、決定したシステム関数のアドレス情報をシステム関数情報記憶部210に記憶した旨の通知を制御部202にする。システム関数のアドレス情報とは、システム関数に一意に割り当てられたアドレス空間の開始アドレスとサイズ情報、あるいは開始アドレスと末尾アドレスなどのアドレス空間を特定できる情報であればよい。
【0076】
システム関数ビルド部213は、制御部202からの指示を受けて、システム関数情報記憶部210からシステム関数情報と、システム関数アドレス決定部212で決定したシステム関数のアドレス情報とを取得する。そして、システム関数を含むソースコードをコンパイルし、リンクする際に、システム関数情報とアドレス空間情報とに従ってアドレスを割り当ててオブジェクトコードを生成し(S309)、処理を終了する。
【0077】
なお、処理が終わった後に、システム関数情報記憶部からシステム関数情報を消去してもよい。
【0078】
また、システム関数ビルド部213は、すでにオブジェクトコードを生成済みのものに対して、システム関数のアドレスを決定し、オブジェクトコード内にアドレスを埋め込んでもかまわない。
【0079】
なお、システム関数アドレス決定部212からの指示を受けて、処理を開始するようにしてもよい。この場合は、システム関数アドレス決定部212からシステム関数のアドレス情報を受け取ると、システム関数情報記憶部210からシステム関数情報を取得し、システム関数情報とシステム関数のアドレス情報とから、オブジェクトコードを生成する。
【0080】
なお、ユーザや開発者があらかじめ終端文字、ハードウェア情報、コピー関数の仕様などを把握している場合には、終端文字のリストなどが終端文字記憶部204に記憶され、また、ハードウェア情報がハードウェア情報記憶部206に記憶され、また、システム関数情報がシステム関数情報記憶部210に記憶されているときがある。この場合、制御部202は再度、終端文字取得部203やハードウェア情報記憶部206、システム関数情報取得部209に処理をするように指示しなくてもよい。
【0081】
以下に、ハードウェア情報取得部205、アドレス空間生成部207、アドレス空間情報記憶部208、システム関数情報取得部209、システム関数アドレス決定部212の詳細な動作について説明する。
【0082】
ハードウェア情報取得部205は、プログラムが動作するアドレス空間に関する情報であるハードウェア情報を取得する。例えば、CPUなどの演算装置やメモリなどの記憶媒体の仕様に依存して取りうるアドレス空間の大きさを取得する。また他にも、メモリなどの記憶媒体上に、文字列の一定の単位(例えばバイト単位)でどのような順序で格納するかに関わるエンディアンの情報を取得する。
【0083】
エンディアン形式に関わる問題は、例えば、図6に示す通り、0x00123478(16進表示)をメモリなどの記憶媒体に格納する場合、ビッグエンディアン形式の場合とリトルエンディアン形式の差異により1バイト単位で格納する順序が異なることに起因する。エンディアン形式により、アドレス空間生成部207が生成するアドレス空間の構成要素である各アドレスの構成が異なる可能性が出る。そこで、ハードウェア情報取得部205は、エンディアン形式の情報を取得し、アドレス空間生成部207がアドレス空間を生成する際に利用できるようにする。
【0084】
アドレス空間生成部207は、制御部202からの指示を受けて、終端文字記憶部204から取得した終端文字と、ハードウェア情報記憶部206から取得したアドレス空間情報とに基づいて、終端文字記憶部204から取得した終端文字の値を含むアドレスで構成されるアドレス空間を生成する。ただし、プログラムが動作するハードウェアによっては、生成する適切なアドレスが変化する可能性がある。
【0085】
例えば、プログラムが動作するCPUに代表される演算装置やメモリなど記憶媒体のハードウェアがアドレスを32bitの空間で保証する場合、アドレスは32bitで構成されるため、16進表示で‘0x00000000’から‘0xffffffff’までの値を取りうる。しかし、CPUやメモリなどが、アドレスを64bitの空間で保証する場合、16進表示で‘0x0000000000000000’から‘0xffffffffffffffff’までの値を取りうる。また、これらのアドレス空間のうち、一部のみを利用可能である場合もある。
【0086】
また、終端文字取得部203から渡される終端文字が、1つの終端文字でも、複数の終端文字でもかまわない。ハードウェア情報取得部205から取りうるアドレス空間の情報を取得して、そのアドレスの範囲で終端文字の値が含まれるアドレスで構成されるアドレス空間を生成する。
【0087】
例えば、終端文字記憶部204から取得した終端文字が‘0x00’であり、ハードウェア情報記憶部206からハードウェア情報として32bit空間のアドレス空間であるという情報を取得すると、アドレス空間生成部207は‘0x00000000’から‘0xffffffff’までのアドレス空間の中で、終端文字‘0x00’を含むアドレスで構成されるアドレス空間を生成する。生成したアドレスは、例えば‘0x12003478’のように必ず終端文字である‘0x00’を含むアドレスになる。
【0088】
また、アドレス空間生成部207は、ハードウェア情報記憶部206から取得したハードウェア情報にエンディアン形式の情報が含まれる場合、エンディアン形式により生成するアドレスの組合せを変えることもできる。
【0089】
例えば、終端文字が‘0x00’である場合に、‘0x00123478’というアドレスの組合せの一つを生成すると、ビッグエンディアン形式の場合、このアドレスはデータとして、1バイトごとに‘0x00’‘0x12’‘0x34’‘0x78’の順序で格納される。このアドレスをコピー関数がコピーしようとした場合、初めにコピーしようとした値‘0x00’(図6の601)がコピー関数として終端文字と判断する文字であるため、次の文字である‘0x12’(図6の602)までコピーされることなくコピー処理が終了する。
【0090】
しかし、リトルエンディアン形式の場合、このアドレスはデータとして、1バイトごとに‘0x78’‘0x34’‘0x12’‘0x00’の順序で格納される。したがって、このアドレスをコピー関数がコピーしようとした場合、コピー関数のコピー処理は‘0x78’(図6の603)から始まり、終端文字である‘0x00’(図6の604)まで一連のアドレスデータをコピー完了することになる。すなわち、リトルエンディアン形式の場合、終端文字を最上位桁に含むアドレスを生成しても、コピー関数の処理を止めることができなくなる。また、逆にビッグエンディアン形式の場合、終端文字を最下位桁に含むアドレスを生成しても、コピー関数の処理を止めることができなくなる。
【0091】
アドレス空間生成部207は、ハードウェア情報取得部205から取得するエンディアン形式の情報に従って、終端文字をアドレスの一部に含み、コピー関数の処理が止められるようなアドレスで構成されるアドレス空間を生成することが可能である。
【0092】
また、アドレス空間生成部207が終端文字記憶部204から複数の終端文字を取得することも可能で、その場合、全ての終端文字を含むアドレスで構成されるアドレス空間、及び一部の終端文字を含むアドレスで構成されるアドレス空間を生成、管理することが可能である。
【0093】
一例を挙げると、終端文字記憶部204から終端文字として‘0x00’と‘0x0a’の2つの終端文字を取得した場合、アドレス空間生成部207は‘0x00’と‘0x0a’の2つの終端文字を含むアドレス(例:‘0x12000a78’)で構成されるアドレス空間を生成し、また別に1つのみの終端文字を含むアドレス(例:‘0x12003478’や‘0x120a3478’)で構成されるアドレス空間を生成することができる。
【0094】
この場合、一例を挙げて説明すると、コピー関数Aとコピー関数Bは終端文字‘0x00’によってコピー元のデータの終了を判別し、コピー関数Cは終端文字‘0x0a’によってコピー元のデータの終了を判別するならば、終端文字‘0x00’と‘0x0a’の双方を含むアドレスで構成されるアドレス空間は、コピー関数A及びB及びCのコピー処理を止めることができる。
【0095】
一方、終端文字‘0x00’のみを含むアドレスで構成されるアドレス空間の場合、コピー関数A及びBのコピー処理を止めることにつながり、また終端文字‘0x0a’のみを含むアドレスで構成されるアドレス空間の場合、コピー関数Cのみのコピー処理を止めることにつながる。
【0096】
セキュリティ保護装置110は、外部からの攻撃や内部の処理の暴走などに起因するシステム関数などの重要な関数の不正利用を防止する。そこで、図4に例示したシステム関数(404)を不正に利用されないように、プログラムのアドレス空間に割り当てる必要がある。
【0097】
アドレス空間情報記憶部208は、生成した終端文字を含むアドレスで構成されたアドレス空間の情報を記憶する。例えば、終端文字を含むアドレスの開始と終端を記憶すればよい。
【0098】
一例として、終端文字が‘0x00’である場合、‘0x00’を含むアドレスの開始が‘0x01010000’であれば、その開始アドレスから‘0x00’を含むアドレスの終端は‘0x010100ff’までとなる。これにより、アドレス空間情報記憶部208は、終端文字を含むアドレス空間として‘0x01010000〜0x010100ff’のアドレス空間の情報を記憶すればよい。
【0099】
また、アドレス空間情報記憶部208は終端文字を含むアドレス空間のサイズを、アドレス空間に対応付けて記憶してもよい。一例を挙げると、終端文字を含むアドレス空間が‘0x01010000〜0x010100ff’の場合、256バイトの空間サイズであることを記憶する。
【0100】
アドレス空間情報記憶部208は、さらに終端文字を含むアドレス空間が複数存在する場合に、それらのアドレス空間上での距離を記憶してもよい。典型的には、最も近い終端文字を含むアドレス空間との距離を記憶する。
【0101】
一例を挙げると、終端文字を含むアドレス空間が‘0x01010000〜0x010100ff’から、次の終端文字を含むアドレス空間は‘0x01020000〜0x010200ff’となるので、この二つのアドレス空間の距離は64キロバイトになる。
【0102】
以上の通り、アドレス空間情報記憶部208は、終端文字を含み連続するアドレス群の情報を記憶し、管理するアドレス空間のサイズ、管理するアドレス空間同士のアドレス空間上の距離を記憶する。
【0103】
図7に、終端文字を含むアドレスで構成された第一アドレス空間と、終端文字を含まないアドレスで構成された第二アドレス空間の情報の一例を示す。終端文字を含むアドレスで構成された第一アドレス空間と、終端文字を含まないアドレスで構成された第二アドレス空間アドレス空間に分けることにより、安全な空間と、安全でない空間とに分けて管理することができる。
【0104】
図7の例では、終端文字記憶部204から取得する終端文字を‘0x00’一つとした場合に関して例示している。
【0105】
なお、図7により終端文字を含むアドレス情報の一例を示したが、終端文字を含むアドレスの組合せ、及び終端文字を含み連続するアドレス群、及びアドレス空間のサイズ、アドレス空間同士のアドレス空間上の距離などが管理できれば、どのような形式でもかまわない。
【0106】
図7では、プログラムが利用できるアドレス空間上のアドレス順に、終端文字を含むアドレスで構成される第一アドレス空間(702)を示している。例えば、終端文字記憶部204から取得した終端文字が‘0x00’の場合、‘0x00000000〜0x00ffffff’のアドレス空間を、終端文字‘0x00’(701)を含むアドレスで構成される第一アドレス空間(702)として記憶している。そして、このアドレス空間のサイズが16Mbyte(16メガバイト)(702)であることを記憶している。この第一アドレス空間に後続し、終端文字を含まないアドレスで構成される第二アドレス空間(703、705)も記憶する。
【0107】
なお、第二アドレス空間(703)の中身はないので、第一アドレス空間(702)と第一アドレス空間(704)を合わせて第一アドレス空間としてもよい。
【0108】
なお、複数の終端文字を取得した場合、全ての終端文字を含むアドレスで構成される第三アドレス空間として記憶しておいてもよい。この場合、第三アドレス空間は、その複数の終端文字を含む様々なコピー関数のコピー処理を止めることができるので、第一アドレス空間よりも安全であるといえる。また、第三空間アドレスは第一空間アドレスを含む概念である。
【0109】
システム関数情報取得部209は、制御部202からの指示を受けて、システム関数指定部201からシステム関数名などの情報を取得し、取得したシステム関数名などの情報を用いて、システム関数情報を取得する。システム関数名は、具体的には、System、mmap、mallocなどである。システム関数情報取得部209は、システム関数指定部201で指定されたシステム関数に関する情報を取得する。具体的には、図8に例示するような形式である。また、これらの形式に限定されることなく、様々な形式で取得する。システム関数情報としては、図8に示す通り、不正利用を防止したいシステム関数名(801)やROM等の記憶媒体にあるソースコードが存在する位置情報(802)、不正利用を防止したいシステム関数の重要度に応じた優先度情報(803)、サイズ情報(804)などがある。また、ソースコードを含めても良い。不正利用を防止したいシステム関数の重要度に応じた優先度情報(802)を設けることにより、どのシステム関数から優先的に不正利用の防止を行うか判断することができる。
【0110】
なお、図8の例ではシステム関数に優先度高・中・低の3段階を対応付けたが、優先度情報(803)は何段階に設定してもよいし、システム関数情報の指定する順序に従って優先度情報(803)を判断する方法も考えられる。
【0111】
システム関数アドレス決定部212は、制御部202からの指示を受けると、アドレス空間情報記憶部208からアドレス空間情報を取得し、システム関数情報記憶部210からシステム関数情報とシステム関数のオブジェクトサイズを取得し、システム関数のアドレスを、アドレス空間生成部207で生成した終端文字を含むアドレスで構成される第一アドレス空間に割り当てる。その際にシステム関数のアドレスを、第一アドレス空間の末尾に割り当てるようにすると、第一アドレス空間を効率よくシステム関数に割り当てることができる。ここで、アドレス空間の末尾とは、前記アドレス空間内であって、前記アドレス空間の末尾アドレスからいくつかの命令コードを含む数バイト〜数十バイトの空間をいうものとする。システム関数にジャンプされないようにするためには、システム関数の先頭アドレスが、アドレス空間生成部207で生成される、終端文字を含むアドレスで構成される第一アドレス空間に割り当てられていればよい。或いは、システム関数の先頭からいくつかの命令コードを含む数バイト〜数十バイトの空間が、アドレス空間生成部207で生成される第一アドレス空間に割り当てられれば、そのシステム関数へのジャンプを防止することができる。システム関数アドレス決定部212は、この特徴を生かして、限りある保護可能なアドレス空間を効率的に利用することができる。
【0112】
また、システム関数アドレス決定部212は、システム関数のアドレスに、アドレス空間生成部207で生成した第一アドレス空間を割り当てる作業を行う際に、前記第一アドレス空間に後続する第二アドレス空間の情報を用いることもできる。これは、システム関数のアドレスを、終端文字を含む第一アドレス空間の末尾に割り当てる場合に、システム関数が前記第一アドレス空間に後続する第二アドレス空間まで跨る場合がある。この場合、前記第一アドレス空間に後続する第二アドレス空間の大きさによっては、システム関数を割り当てることができない場合もあるので、あらかじめ第一アドレス空間に後続する第二アドレス空間の情報を参照して、第二アドレス空間がシステム関数を割り当てることができるかどうかを判断する必要があるためである。
【0113】
図9は、システム関数指定部201で、ユーザまたは開発者が一つのシステム関数を指定した場合の、システム関数アドレス決定部212の処理の流れを示したフローチャートである。
【0114】
システム関数アドレス決定部212は、システム関数情報記憶部210から取得したシステム関数情報を用いて、未処理のシステム関数が残っているか調べる(S901)。未処理のシステム関数が残っていない場合、システム関数アドレス決定部212は処理を終了する(S901)。
【0115】
未処理のシステム関数が残っている場合、システム関数アドレス決定部212は、システム関数情報記憶部210から取得したシステム関数情報とシステム関数のサイズ情報とから、未処理のシステム関数のうちサイズが最大のものを選択する(S902)。
【0116】
第一アドレス空間の中で、前記第一アドレス空間に後続する第二アドレス空間を前記システム関数に割り当てることができる第一アドレス空間が存在する場合(S903)、システム関数アドレス決定部212は、前記第二アドレス空間のサイズが最大である前記第一アドレス空間を取得する(S904)。
【0117】
システム関数アドレス決定部212は、システム関数のアドレスを、ステップS904で選択した第一アドレス空間の末尾に割り当てる(S905)。
【0118】
なお、第一アドレス空間の末尾アドレスに割り当てると、さらにアドレス空間を効率よく利用できる。また、システム関数のアドレスを第一アドレス空間内のアドレスに割り当てるのであれば、問題は無い。
【0119】
システム関数アドレス決定部212は、システム関数の割り当てを行うと、割り当てに利用した第一アドレス空間情報を修正するようにアドレス空間情報記憶部208に通知する(S906)。つまり、前記第一アドレス空間を利用可能なアドレスまでに修正し、前記第一アドレス空間のサイズも、割り当てに利用したサイズ分を差し引いて修正するようにアドレス空間情報記憶部208に通知する。また、割り当てに利用した第一アドレス空間は、すでにシステム関数を割り当てたので、他のシステム関数が利用不可であることを記憶するようにアドレス空間情報記憶部208に通知する。
【0120】
さらに、システム関数アドレス決定部212は、ステップS905によるシステム関数の割り当てを行った際、前記第一アドレス空間の次の第一アドレス空間の領域までまたがってシステム関数の割り当てがなされた場合、またがって割り当てられた第一アドレス空間情報を修正する(S907)。具体的には、割り当て状況に応じて、第一アドレス空間の開始アドレスや末尾アドレス、アドレス空間のサイズ、アドレス空間の利用可否などを修正して記憶するようにアドレス空間情報記憶部208に通知すればよい。その後、第一の空間アドレスに割り当てることができないと判断したシステム関数を判断対象から除いて、最初のステップS901に戻る。
【0121】
ステップS903で、第一アドレス空間の中で後続する第二アドレス空間が利用可能なものが存在しない場合、システム関数アドレス決定部212は、第一アドレス空間のうちアドレス空間のサイズが最大のものを選択する(S908)。
【0122】
システム関数アドレス決定部212は、システム関数のサイズが、ステップS908で選択したアドレス空間のサイズより小さいかどうか、すなわち利用可能な第一アドレス空間のうち最大のサイズのもので、システム関数の割り当てに十分足りるサイズかどうかを確認する(S909)。
【0123】
システム関数のサイズが、選択した第一アドレス空間より小さい場合、システム関数アドレス決定部212は、選択した第一アドレス空間の先頭にシステム関数を割り当てる(S910)。第一アドレス空間の先頭とは、前記アドレス空間内であって、前記アドレス空間の先頭アドレスからいくつかの命令コードを含む数バイト〜数十バイトの空間をいうものとする。ただし、システム関数の先頭から末尾までの実体が、第一アドレス空間に収まるように割り当てれば問題はない。
【0124】
システム関数アドレス決定部212は、システム関数の割り当てを行うと、アドレス空間情報記憶部208に、割り当てに利用した第一アドレス空間情報を修正するように通知する(S911)。第一アドレス空間の先頭アドレスに割り当てる場合、アドレス空間情報記憶部208に、第一アドレス空間の先頭アドレスを利用可能なアドレスに修正し、第一アドレス空間のサイズも割り当てに利用したサイズ分を差し引いて修正するように通知する。その後、第一の空間アドレスに割り当てることができないと判断したシステム関数を判断対象から除いて、最初のステップS901に戻る。
【0125】
ステップS909で、システム関数のサイズが、選択した第一アドレス空間より小さくない、すなわち第一アドレス空間のサイズが、システム関数に割り当てるために十分なサイズではない場合、そのシステム関数の割り当ては終端文字を含むアドレス空間に割り当てることができないと判断し、その後、第一の空間アドレスに割り当てることができないと判断したシステム関数を判断対象から除いて、最初のステップS901に戻る。
【0126】
システム関数アドレス決定部212は、決定したシステム関数のアドレス情報をシステム関数情報記憶部210に記憶する。
【0127】
図10は、システム関数アドレス決定部212がシステム関数のアドレスを決定した場合に、システム関数情報記憶部210に記憶する場合の形式である。システム関数アドレス決定部212は、図8のように、システム関数名(801)に対応づけてシステム関数のアドレス情報(1002)をシステム関数情報記憶部210に記憶しておいてもよいし、別の形式で記憶してもよい。そして、システム関数情報記憶部210にシステム関数のアドレス情報を記憶した旨の通知を制御部202にする。
【0128】
なお、システム関数アドレス決定部212は、システム関数のアドレスを決定した場合、直接システム関数ビルド部213に渡すようにしてもよい。
【0129】
つぎに、図8に例示した通り、システム関数指定部201が指定するシステム関数に優先度情報803が対応付けられている場合、システム関数アドレス決定部212は優先度情報803に従って、保護すべき優先度が高いシステム関数から優先的に第一アドレス空間を割り当てる処理が可能である。
【0130】
図11は、システム関数情報に優先度情報(S803)が付与されている場合の、システム関数アドレス決定部212の処理の流れを示したフローチャートである。図11のフローチャートは、ステップ1102だけが図9のフローチャートと異なる。つまり、図9では、未処理のシステム関数が残っている場合、システム関数アドレス決定部212は、システム関数情報記憶部210から取得したシステム関数情報とシステム関数のサイズ情報とから、未処理のシステム関数のうちサイズが最大のものを選択する(S902)。一方、システム関数情報に優先度情報(S803)がある場合には、システム関数アドレス決定部212は、未処理のシステム関数が残っている場合、システム関数情報記憶部210から取得したシステム関数情報を用いて、優先度情報(S803)が最大のシステム関数を選択する。こうすることで、保護すべき優先度情報(S803)が高いシステム関数から優先的に第一アドレス空間を割り当てる処理が可能となる。
【0131】
また、終端文字取得部203から取得する終端文字が‘0x00’の一つではなく複数の場合、アドレス空間生成部207は、全ての終端文字を含むアドレス、及び一部の終端文字を含むアドレスで構成されるアドレス空間を生成することが可能である。
【0132】
一例を挙げると、終端文字が‘0x00’と‘0x0a’の2つの場合、アドレス空間生成部207は2つの終端文字を含むアドレス(例:‘0x12000a78’)と、別に1つのみの終端文字を含むアドレス(例:‘0x12003478’や‘0x120a3478’)とで構成されるアドレス空間を生成することができる。
【0133】
2つの終端文字を含むアドレスは、2つのコピー関数の処理を止めることができるので、システム関数アドレス決定部212は、高優先度のシステム関数を2つの終端文字を含むアドレスに割り当て、低優先度のシステム関数を1つの終端文字のみ含むアドレスに割り当てる割り当て方式を取ることにより、より重要なシステム関数をより強力に保護することもできる。終端文字取得部203から取得する終端文字が3つ以上の場合も、同様の考え方で実現することができる。そして、終端文字が複数ある場合であっても、システム関数情報に優先度情報(S803)が付与されているときには、システム関数を優先度情報(S803)にしたがって、安全な空間に割り当てることができる。
【0134】
図9、11に示したシステム関数アドレス決定部212の処理に関わるフローは、あくまで一例に過ぎず、図9、11を用いて説明した範囲を逸脱することなく、他の実現方法で実現してもかまわない。
【0135】
(実施の形態2)
図12は、本発明の実施の形態2におけるセキュリティ保護装置110の構成を例示している。図12において、図2と同じ構成要素については、同じ符号を用い、説明を省略する。
【0136】
図12の制御部1202は、図2のシステム関数指定部201の指示を受けずに、パソコンが起動されたときや、新たなアプリケーションをユーザが起動したときなどに処理を開始し、各構成部に対して処理の指示を行う。具体的には、終端文字取得部203、ハードウェア情報取得部205、アドレス空間生成部207、システム関数情報取得部209、システム関数アドレス決定部212、システム関数ビルド部213に処理を指示する。
【0137】
第二システム関数情報取得部1209は、制御部1202から指示を受けると、システム関数が記憶されているROM等の記憶媒体から、システム関数情報をまとめて取得する。
【0138】
図13は、セキュリティ保護装置の処理の流れを示したフローチャートである。図13を用いて、図12の制御部1202と図2の制御部202、図12の第二システム関数情報取得部1209と図2のシステム関数情報取得部209とで、それぞれ処理が違う点を説明し、図3と同じ処理については、簡単に説明する。
【0139】
まず、制御部1202は、パソコンが起動されたときや、新たなアプリケーションをユーザが起動したときなどに起動する(S302)。制御部1202は、終端文字取得部203、ハードウェア情報取得部205に処理をするように指示をして(S303、S304)アドレス空間を生成させる(S305)か、あるいは、システム関数情報取得部209にシステム関数情報を取得してくるように指示をする(S1306)。指示する順番は問わないし、並行処理でもよい。したがって、実際の処理は図13の処理の順番に限られることはなく、S303、S304、S305の処理の順番と、S1306、S307、S308の処理の順番が変わらなければ、どんな順番でも良い。たとえば、S303、S1306、S304、S307、S305、S308の順番でもよいし、S303、S1306、S307、S308、S304、S305でもよい。また、S303、S304、S1306、S307、S305、S308でもよい。
【0140】
指示を受けた第二システム関数情報取得部1209は、システム関数が記憶されているROM等の記憶媒体から、システム関数情報をまとめて持ってきてくる(S1306)。そして、このシステム関数情報をシステム関数情報記憶部210に記憶し、システム関数情報をシステム関数情報記憶部210に記憶した旨の通知を制御部1202にする。そして、通知を受けた制御部1202は、システム関数サイズ取得部211に処理をするように指示をして、システム関数のオブジェクトサイズを取得する(S307)。
【0141】
制御部1202は、アドレス空間生成部207から、アドレス空間情報記憶部208にアドレス空間情報を記憶した旨の通知と、システム関数サイズ取得部211から、システム関数情報記憶部210にシステム関数のオブジェクトサイズの情報を記憶した旨の通知と、を受けた場合には、システム関数アドレス決定部212に処理をするように指示をする。
【0142】
システム関数アドレス決定部212は、制御部1202からの指示を受けて、処理を開始し、アドレス空間情報、システム関数情報、システム関数のオブジェクトサイズ情報を用いて、システム関数のアドレスを、アドレス空間生成部207で生成したアドレス空間のアドレスに割り当てることを決定する(S308)。処理の流れは、図9のフローチャートと同様である。
【0143】
制御部1202は、システム関数アドレス決定部212からシステム関数のアドレス情報をシステム関数情報記憶部210に記憶した旨の通知を受けたら、システム関数ビルド部213に処理をするように指示をする。
【0144】
制御部1202から指示を受けたシステム関数ビルド部213は、システム関数情報記憶部210から、システム関数情報と、決定したシステム関数のアドレス情報とを取得し、システム関数を指定のアドレスに割り当てるようにオブジェクトコードを生成して(S309)、処理を終了する。
【0145】
以上により、可能な限り多くのシステム関数をバッファオーバフローによる不正実行から保護することができる。
【0146】
なお、本発明の実施の形態1を示す図2の各機能ブロックは、典型的にはプログラムで実現されるが、集積回路であるLSIとしてもよい。これらは個別に1チップ化されても良いし、一部又は全てを含むように1チップ化されても良い。ここでは、LSIとしたが、集積度の違いにより、IC、システムLSI、スーパーLSI、ウルトラLSIと呼称されることもある。
【0147】
また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field ProgrammableGate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【0148】
さらには、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。
【0149】
このような構成をとることによって、書換えが発生していないことを確認するための追加の処理が必要ないので、プログラムの動作速度の低下やメモリ消費量の増加を招かないだけではなく、システム関数を不正な命令コードの実行から保護することができる。
【0150】
以上、前述の説明はあらゆる点において本発明の例示に過ぎず、その範囲を限定しようとするものではない。本発明の範囲を逸脱することなく種々の改良や変形を行うことができることは言うまでもない。
【産業上の利用可能性】
【0151】
本発明にかかるセキュリティ保護装置、セキュリティ保護方法、セキュリティ保護プログラムおよびセキュリティ保護集積回路は、コンピュータ上で実行するプログラムの動作を、速度性能を低下させたりメモリ消費量を増加させたりすることなく、バッファオーバフロー攻撃から保護することができるので、情報機器やAV機器や通信機器、家電機器などのコンピュータを搭載する機器において有用である。
【図面の簡単な説明】
【0152】
【図1】本発明の実施の形態1による情報処理装置の構成を示すブロック図
【図2】図1のセキュリティ保護装置の構成を示すブロック図
【図3】本発明の実施の形態1によるセキュリティ保護装置の処理の流れを示したフローチャート
【図4】外部から重要な関数を不正に利用するための手続きの一例を模式的に描いた説明図
【図5】コピー関数がコピーを実施する様子の一例を示す図
【図6】エンディアン形式によるデータ格納順序の差異の例を示す図
【図7】本発明のアドレス空間情報記憶部208が管理するアドレス空間情報の一例を模式的に描いた説明図
【図8】本発明のシステム関数情報取得部が取得したシステム関数情報の一例を示す図
【図9】本発明のシステム関数アドレス決定部の動作手順の一例を示すフローチャート
【図10】アドレス空間情報記憶部が管理する情報の一例を表形式で示す説明図
【図11】本発明のシステム関数アドレス決定部の動作手順の一例を示すフローチャート
【図12】本発明の実施の形態2によるセキュリティ保護装置の構成を示すブロック図
【図13】本発明の実施の形態2によるセキュリティ保護装置の処理の流れを示したフローチャート
【符号の説明】
【0153】
100 情報処理装置
110 セキュリティ保護装置
111 CPU
111a CPU
111b CPU
111c CPU
112 メモリ装置
112a ROM
112b RAM
120 HDD
121〜124 I/F
125 バスライン
126 読取装置
127 記憶媒体
128 通信回線
129 通信装置
130 入力装置
131 表示装置
132 割込みコントローラ
133 タイマー回路
201 システム関数指定部
202 制御部
203 終端文字取得部
204 終端文字記憶部
205 ハードウェア情報取得部
206 ハードウェア情報記憶部
207 アドレス空間生成部
208 アドレス空間情報記憶部
209 システム関数情報取得部
210 システム関数情報記憶部
211 システム関数サイズ取得部
212 システム関数アドレス決定部
213 システム関数ビルド部
401 アドレス空間
402 データ格納バッファ
403 戻り先番地
404 システム関数
405 入力データ
406 戻り先番地
501 終端文字
502 文字
601〜604 アドレス
701 終端文字
702 第一アドレス空間
703 第二アドレス空間
801 システム関数情報
802 システム関数情報
803 システム関数情報
804 システム関数情報
1002 システム関数のアドレス情報

【特許請求の範囲】
【請求項1】
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得手段と、
ハードウェア情報を取得するハードウェア情報取得手段と、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成手段と、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得手段と、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得手段と、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定手段と、
を備えることを特徴とするセキュリティ保護装置。
【請求項2】
前記セキュリティ保護装置は、システム関数ビルド手段をさらに備え、
前記システム関数ビルド手段が、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間のアドレスに割り当てるようにオブジェクトコードを生成することを特徴とする請求項1記載のセキュリティ装置。
【請求項3】
前記システム関数アドレス決定手段が、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成手段で生成した前記アドレス空間の末尾に割り当てることを決定することを特徴とする請求項2記載のセキュリティ保護装置。
【請求項4】
前記アドレス空間生成手段は、前記特定の値を含むアドレスで構成される第一アドレス空間と、前記特定の値を含まないアドレスで構成される第二アドレス空間と、を生成することを特徴とする請求項3記載のセキュリティ保護装置。
【請求項5】
前記システム関数アドレス決定手段は、前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、アドレス空間のサイズが一番大きい前記第二アドレス空間と、オブジェクトサイズが一番大きい前記システム関数とを探し、前記システム関数のアドレスを、前記第二アドレス空間の末尾に割り当てることを特徴とする請求項4記載のセキュリティ保護装置。
【請求項6】
前記アドレス空間生成手段は、前記ハードウェア情報にエンディアン情報が含まれる場合、前記特定の値を、アドレスのどの位置に入れるかを決定して、アドレス空間を生成することを特徴とする請求項4記載のセキュリティ保護装置。
【請求項7】
前記システム関数情報には、優先度情報が含まれ、
前記システム関数アドレス決定手段は、前記優先度情報に従って、対象となるシステム関数の順序を決定することを特徴とする請求項4記載のセキュリティ保護装置。
【請求項8】
前記アドレス空間生成手段は、前記特定の値が複数ある場合には、前記特定の値を複数含むアドレスで構成される第三アドレス空間を生成し、
前記システム関数アドレス決定手段は、前記優先度情報に基づき、優先度の高い前記システム関数のアドレスを、前記第三アドレス空間の末尾に割り当てることを特徴とする請求項4記載のセキュリティ保護装置。
【請求項9】
コンピュータ上のプログラムの動作を保護するセキュリティ保護方法であって、
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得ステップと、
ハードウェア情報を取得するハードウェア取得ステップと、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成ステップと、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得ステップと、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得ステップと、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成ステップで生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定ステップと、
を備えるセキュリティ保護方法。
【請求項10】
コンピュータ上のプログラムの動作を保護するセキュリティ保護プログラムであって、
プログラムの処理が終了するか否かの判定に用いられる特定の値を取得する終端文字取得ステップと、
ハードウェア情報を取得するハードウェア取得ステップと、
前記特定の値と前記ハードウェア情報とを用いて、前記特定の値を含むアドレスで構成されるアドレス空間を生成するアドレス空間生成ステップと、
システム関数の情報であるシステム関数情報を取得するシステム関数情報取得ステップと、
前記システム関数のオブジェクトサイズを取得するシステム関数サイズ取得ステップと、
前記アドレス空間の情報と、前記システム関数情報と、前記システム関数の前記オブジェクトサイズの情報と、を用いて、前記システム関数のアドレスを、前記アドレス空間生成ステップで生成した前記アドレス空間のアドレスに割り当てることを決定するシステム関数アドレス決定ステップと、
を備えるセキュリティ保護プログラム。
【請求項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

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate