(57)【特許請求の範囲】
【請求項１】
監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスと、前記監査対象プログラムを実行し、前記第１のプロセスに接続可能な第２のプロセスと、を実行する監査装置であって、
前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる命令文を挿入する接続命令挿入部と、
前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定部と、を備える監査装置。
【請求項２】
前記識別情報取得命令挿入部は、予め指定された特定のファイルパスを前記第２のプロセスに割り当てられるプロセス空間にマッピングさせ、前記ファイルパスに対応する先頭アドレスを前記識別情報として取得させる命令文を挿入する請求項１に記載の監査装置。
【請求項３】
前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の末尾部において取得される前記アドレス情報を、前記関数の冒頭部において取得される前記アドレス情報に更新する更新部を備える請求項１又は請求項２に記載の監査装置。
【請求項４】
監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスと、前記監査対象プログラムを実行し、前記第１のプロセスに接続可能な第２のプロセスと、をコンピュータが実行する監査方法であって、
前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入ステップと、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる接続命令文を挿入する接続命令挿入ステップと、
前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定ステップと、をコンピュータが実行する監査方法。
【請求項５】
第２のプロセスを動作させる監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスを動作させる監査プログラムであって、
コンピュータを、前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる接続命令文を挿入する接続命令挿入部と、
前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定部と、として機能させる監査プログラム。
【請求項６】
監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスを動作させる監査装置と、前記監査対象プログラムを実行し、前記第１のプロセスとプロセス間通信により接続可能な第２のプロセスを動作させる監査対象装置と、を備える監査システムであって、
前記監査装置は、前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる命令文を挿入する接続命令挿入部と、
前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定部と、を備える監査システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する技術に関する。
【背景技術】
【０００２】
ソフトウェアの脆弱性を利用した攻撃の代表としてバッファオーバーフロー攻撃が知られている。プログラムの動作において関数を呼び出す際に、元の動作に戻るためにリターンアドレスが、メモリ領域に格納される。このリターンアドレスが改ざんされることで、プログラムが不正な動作を起こす問題が生じている。
【０００３】
特許文献１において、バッファオーバーフローの発生を防ぐためにプログラムを変換する変換装置に関する技術が開示されている。
【０００４】
特許文献２において、プログラム開発者によるプログラム修正作業を行うことなく、プログラムに使用される高級言語に依存することなく、バッファオーバーフローによる不正なプログラムの実行を防止する技術が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１３−１９６５１２号公報
【特許文献２】特許５７７７８４３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１や特許文献２に記載の技術は、何れもアドレス情報がメモリ領域の範囲かを判定することで、プログラムが不正に書き換えられたとしてプログラムの実行を停止させることが開示されている。一方、このような手法において、所定のメモリ領域におけるプログラムの書き換えを検知し防止できるものの、その精度において改善の余地があった。
【０００７】
また、プログラム処理によりバッファオーバーフローを防止する技術は、当該プログラムを直接に攻撃されるリスクが存在する点において、十分な安全性は保証されておらず、改善の余地があった。
【０００８】
上述したような実状に鑑みて、本発明は、ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する監査装置、監査方法、監査システムおよび、監査プログラムを提供することを解決すべき課題とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決するために、本発明は、監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスと、前記監査対象プログラムを実行し、前記第１のプロセスに接続可能な第２のプロセスと、を実行する監査装置であって、前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる命令文を挿入する接続命令挿入部と、前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定部と、を備える。
【００１０】
このような構成とすることで、監査対象プログラムに、監査対象プログラムにおける第２のプロセスとは別の第１のプロセスに接続させることで、第２のプロセスを中断し、第１のプロセスにおいてプログラムの改ざんを検知することができるため、監査対象プログラムにおいて不正なプログラムが実行されることを未然に防ぐことができる。接続された第１のプロセスは、監査対象プログラムから独立したプログラムが実行するプロセスであるため、直接的に攻撃を受けるリスクを低減することができる。また、関数の冒頭部および末尾部のアドレスを比較する判定手法とすることで、確度の高い改ざんの検知を可能とする。
【００１１】
本発明の好ましい形態では、前記識別情報取得命令挿入部は、予め指定された特定のファイルパスを前記第２のプロセスに割り当てられるプロセス空間にマッピングさせ、前記ファイルパスに対応する先頭アドレスを前記識別情報として取得させる命令文を挿入する。
このような構成とすることで、第１のプロセスおよび第２のプロセスにおいて共通で取得することができ、且つランダム性を有する識別情報を取得することができる。
【００１２】
本発明の好ましい形態では、前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の末尾部において取得されるアドレス情報を、前記関数の冒頭部において取得されるアドレス情報に更新する更新部を備える。
このような構成とすることで、関数末尾部におけるアドレス情報が関数冒頭部におけるアドレス情報に更新されるため、不正に改ざんされたアドレス情報を用いたプログラムの処理の実行を防止することができる。
【００１３】
本発明は、監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスと、前記監査対象プログラムを実行し、前記第１のプロセスに接続可能な第２のプロセスと、をコンピュータが実行する監査方法であって、前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入ステップと、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる接続命令文を挿入する接続命令挿入ステップと、前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定ステップと、をコンピュータが実行する。
【００１４】
第２のプロセスを動作させる監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスを動作させる監査プログラムであって、コンピュータを、前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる接続命令文を挿入する接続命令挿入部と、前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定部と、として機能させる。
【００１５】
監査対象プログラムにおける改ざんを検知する処理を実行する第１のプロセスを動作させる監査装置と、前記監査対象プログラムを実行し、前記第１のプロセスとプロセス間通信により接続可能な第２のプロセスを動作させる監査対象装置と、を備える監査システムであって、前記監査装置は、前記監査対象プログラムに、前記第１のプロセスおよび前記第２のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第１のプロセスに接続させる命令文を挿入する接続命令挿入部と、前記第２のプロセスから接続される前記第１のプロセスにおいて、前記第１のプロセスおよび前記第２のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第２のプロセスの処理を停止させる判定部と、を備える。
【発明の効果】
【００１６】
本発明によれば、ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する監査装置、監査方法、監査プログラムおよび、監査システムを提供することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施形態における、監査装置のハードウェア構成例を示す。
【図２】本発明の実施形態における、識別情報取得命令挿入部の処理フローチャートを示す。
【図３】本発明の実施形態における、接続命令挿入部の処理フローチャートを示す。
【図４】本発明の実施形態における、関数冒頭部の接続命令挿入部の処理を示す。
【図５】本発明の実施形態における、関数末尾部の接続命令挿入部の処理を示す。
【図６】本発明の実施形態における、第１のプロセスの処理フローチャートを示す。
【図７】本発明の実施形態における、スタックの一例を示す。
【発明を実施するための形態】
【００１８】
以下、図面を用いて、本発明の実施形態に関する監査装置について説明する。なお、以下に示す実施形態は本発明の一例であり、本発明を以下の実施形態に限定するものではなく、様々な構成を採用することもできる。
【００１９】
本実施形態では、監査装置の構成、動作等について説明するが、同様の構成の監査方法、監査プログラムおよび、監査プログラム記録媒体、監査システム等も、同様の作用効果を奏することができる。この監査プログラム記録媒体を用いれば、例えばコンピュータに前述の監査プログラムをインストールすることができる。以下で説明する本実施形態にかかる一連の処理は、コンピュータで実行可能なプログラムとして提供され、ＣＤ−ＲＯＭやフレキシブルディスクなどの非一時的コンピュータ可読記録媒体、さらには通信回線を経て提供可能である。
【００２０】
バッファオーバーフローは、例えば、プログラムにおいて、変数に文字列をコピーする場合などで、データを格納するために確保されたバッファ領域の上限を超えてデータが書き込まれることで、隣接するバッファ領域外のデータが上書きされることで生じる。
【００２１】
このバッファオーバーフローを意図的に生じさせるバッファオーバーフロー攻撃は、バッファ領域外に記憶されるリターンアドレスを書き換えることで、不正なプログラムを実行させる。例えば、プログラムにおける関数の被演算子として入力されるデータによりバッファオーバーフローが生じる場合、関数の実行前後においてリターンアドレスが書き換えられる。
【００２２】
本実施形態において、監査装置１は、監査対象プログラムに含まれる関数の冒頭部および末尾部において、それぞれのリターンアドレスを取得するための命令を挿入することで、関数の実行前後におけるリターンアドレスを取得し、更に取得したリターンアドレスが一致するか否かを判定することで、不正なプログラムの書き換えを検知することができる。なお、詳しくは後述するが、第１のプロセスにおける、第２のプロセスの関数の冒頭部および末尾部の判定は、特定のシステムコール番号と識別情報との組み合わせによって行う。これにより、関数本体のロジックで、万一、同じシステムコール番号が使用されたとしても、識別情報が合致していない限り、関数の冒頭部および末尾部ではないと判断することができ、誤検知を大幅に減らすことが可能となる。
【００２３】
本実施形態における、監査装置１は、図１に示すようにハードウェア構成要素として、演算装置（ＣＰＵ）１０１、主記憶装置（ＲＡＭ）１０２、入力装置１０３、表示装置１０４、通信装置１０５および、補助記憶装置１１０などを備える。また、補助記憶装置１１０は、オペレーティングシステム（ＯＳ）１１１と、ＯＳ１１１と協働してその機能を発揮する監査プログラム１１２と、監査対象プログラム１１３と、各種データなどと、を記憶している。なお、監査対象プログラム１１３は、監査装置１とデータ通信可能に構成された監査対象装置（図示せず）の補助記憶装置に記憶されてもよい。また、ＣＰＵ１０１は、一時的な記憶回路として複数のレジスタ１０６を備える。本実施形態において、ＣＰＵ１０１はＡＲＭプロセッサであり、レジスタ１０６は、ｒ０からｒ１５の１６本の３２ビットレジスタである例を説明する。なお、本実施形態において、ＯＳ１１１は、Ｌｉｎｕｘ（登録商標）である例を示すが、メモリマップを取得可能な他のＯＳであってもよい。
【００２４】
本実施形態において、監査プログラム１１２は、各命令文の挿入処理や改ざんの判定処理などを含む第１のプロセスをＣＰＵ１０１に実行させる。監査対象プログラム１１３は、プログラムが改ざんされているか否かの判定の対象とされるプログラムであり、ソースコードにより記述された一連の処理を含む第２のプロセスをＣＰＵ１０１に実行させる。なお、第２のプロセスは、第１のプロセスの子プロセスとして生成される。また、本実施形態では、第１のプロセスと第２のプロセスの間で行われるプロセス間通信は、同一の監査装置１内で行われるローカル通信の実施例を説明するが、第１のプロセスと第２のプロセスがそれぞれ異なるコンピュータで実行され、ネットワークを介してデータ通信を行うシステムとして構成されてもよい。また、以下の説明において、不明確とならない限りＣＰＵ１０１の介在を省略する。
【００２５】
本実施形態において、監査対象プログラム１１３は、Ｃ言語により記述される例を説明するが、メモリ操作が可能な他の言語により記述されてもよい。また、本実施形態において、監査プログラム１１２は、アセンブリ言語により記述される。本実施形態において、監査プログラム１１２における処理は、第１のプロセスとして実行され、ＲＡＭ１０２のメモリ上にプロセス空間が確保される。なお、監査対象プログラム１１３における処理では、異なるプロセス空間が割り当てられる。プロセス空間は、アドレス空間のうちＣＰＵ１０１でのＯＳ１１１の処理によって各プロセスに割り当てられた仮想的なアドレス空間をいう。アドレス空間とは、メモリアドレスによってアクセス可能なメモリ空間をいう。各プロセスは、一意な識別子としてプロセスＩＤをそれぞれ有する。
【００２６】
監査装置１は、機能構成要素として、識別情報取得命令挿入部２０１と、接続命令挿入部２０２と、判定部２０３と、更新部２０４と、を備える。本実施形態において、識別情報取得命令挿入部２０１および接続命令挿入部２０２は、監査対象プログラム１１３におけるアプリケーションプログラムの実行ファイルが実行される前の事前処理を実行する。本実施形態において、識別情報取得命令挿入部２０１および接続命令挿入部２０２が挿入する命令文は、１以上のコードにより構成されるものとする。
【００２７】
はじめに、本実施形態における事前処理について説明する。事前処理は、監査対象プログラム１１３に対して実行される。図２は、監査装置１において識別情報取得命令挿入部２０１が監査対象プログラム１１３に識別情報を取得するための命令文を挿入する処理の流れを示すフローチャートである。
【００２８】
監査装置１は、監査対象プログラム１１３のソースプログラムを冒頭から終端まで順に読み込む（ステップＳ１０１）。識別情報取得命令挿入部２０１は、読み込まれたソースプログラムの関数の冒頭部を判定する（ステップＳ１０２）。本実施形態において、判定する関数はｍａｉｎ関数とする。関数の冒頭部が判定された場合（ステップＳ１０２においてＹ）、識別情報取得命令挿入部２０１は、識別情報を格納するための静的変数の宣言文を、当該関数の冒頭部に挿入する（ステップＳ１０３）。これにより、後に取得される識別情報を格納するメモリ領域が確保される。識別情報取得命令挿入部２０１は、予め指定された特定のファイルパスを第２のプロセスに割り当てられるプロセス空間にマッピングさせるための命令文を挿入する（ステップＳ１０４）。マッピングの命令文は、例えば、ｍｍａｐ関数を使用できる。上述の命令文の実行によりプロセス空間にマップされるメモリマップは、ＯＳのカーネルにおいてプロセスの状態を示すデータ構造の情報をマップしたファイルを指し、プロセスＩＤにより識別されるプロセス別に存在する。メモリマップは、プロセス空間の各領域の開始アドレスおよび終了アドレス並びに、ファイルパスなどを示す。識別情報取得命令挿入部２０１は、マップされた特定のファイルパスに基づいて、対応する先頭アドレス（開始アドレス）を識別情報として取得し、ステップＳ１０３において宣言された静的変数に格納する命令文を挿入する（ステップＳ１０５）。例えば、第２のプロセスのプロセスＩＤをＰＩＤ２とすると、第２のプロセスにおいて実行されるファイルは、/var/bin/PID2.binというファイルパスを有する。識別情報取得命令挿入部２０１は、予め指定されたＰＩＤ２を含むファイルパスに対応する先頭アドレスを取得するような命令文を挿入する。なお、識別情報取得命令挿入部２０１は、先頭アドレスに代えて終了アドレスを識別情報として取得する命令文を挿入してもよい。監査装置１は、ステップＳ１０５までの処理を実行すると、次のコードを読み込み（ステップＳ１０６）、ステップＳ１０２からステップＳ１０５までの処理をソースプログラムの終端まで繰り返す。
【００２９】
ステップＳ１０１からステップＳ１０６までの処理によって、各命令文が挿入された監査対象プログラム１１３が実行されることで、監査装置１は、第２のプロセスにおいて識別情報を取得できる。また、本実施形態において取得される識別情報は、第２のプロセスのプロセスＩＤによって特定されるため、親プロセスである第１のプロセスでも同様の手法により、共通の識別情報を取得可能であり、更にランダム性を有するという特徴がある。なお、上述した特徴を有する識別情報であれば、本実施形態と異なる手法により識別情報が取得されてもよく、例えば、第１のプロセスにおいて、事前に共通の識別情報を第２のプロセスに受け渡す処理を実行する等、様々な手法を採用することができる。このとき、識別情報は、プロセス空間のメモリアドレスとして用いられる偶数ではなく、所定の奇数による固定値を用いる構成とすることが好ましい。
【００３０】
識別情報を取得するための処理について異なる実施形態の例を説明する。異なる実施形態において識別情報は、第２のプロセスのプロセスＩＤ（ＰＩＤ２）のハッシュ値とする。識別情報取得命令挿入部２０１は、ステップＳ１０３において静的変数の宣言文を挿入後、ＰＩＤ２を取得する命令文を挿入する。更に、識別情報取得命令挿入部２０１は、ハッシュ関数に取得したＰＩＤ２を引数として入力する命令文を挿入する。識別情報取得命令挿入部２０１は、上述のハッシュ関数の戻り値として得られるハッシュ値を識別情報として取得し、ステップＳ１０３において宣言された静的変数に格納する命令文を挿入する。これら挿入された命令文が実行されることで、監査装置１は、第２のプロセスにおいて識別情報を取得できる。なお、ハッシュ値の文字列は任意の長さとしてよいが、データ量と強度の観点から８文字（３２ｂｉｔ）程度の長さとすることが好ましい。
【００３１】
図３は、監査装置１において接続命令挿入部２０２が監査対象プログラム１１３に、監査対象プログラム１１３における改ざんを検知するための第１のプロセスに接続させるための処理を示す命令文を挿入する処理の流れを示すフローチャートである。
【００３２】
監査装置１は、監査対象プログラム１１３のソースファイル格納ディレクトリを冒頭から読み込み（ステップＳ２０１）、ディレクトリに格納されるソースファイルをディレクトリの冒頭から読み込む（ステップＳ２０２）。監査装置１は、高級言語により記述されたソースコードをアセンブリコードに変換し（ステップＳ２０３）、変換されたアセンブリコードを冒頭から読み込む（ステップＳ２０４）。接続命令挿入部２０２は、読み込まれたアセンブリコードにおける関数の冒頭部を判定する（ステップＳ２０５）。関数の冒頭部が判定された場合（ステップＳ２０５においてＹ）、接続命令挿入部２０２は、監査プログラム１１２における第１のプロセスに接続する処理を実行する命令文を挿入する（ステップＳ２０６）。接続命令挿入部２０２は、アセンブリコードにおける関数の末尾部を判定する（ステップＳ２０７）。関数の末尾部が判定された場合（ステップＳ２０７においてＹ）、接続命令挿入部２０２は、監査プログラム１１２の第１のプロセスに接続するための処理を実行する命令文を挿入する（ステップＳ２０８）。
【００３３】
本実施形態において、関数の冒頭部に命令文を挿入するための詳細な処理（ステップＳ２０６）について、図４を参照し、説明する。図４（ａ）は、ステップＳ２０５において関数の冒頭部が判定された場合の続く処理に関するフローチャートを示す。図４（ｂ）は、関数の冒頭部および冒頭部に挿入する命令文の一例を示す。接続命令挿入部２０２は、関数の冒頭部を示す所定のコードＣ１の指定を予め受け付け、コードＣ１を判定した次の行において、コードＣ２（命令文）を挿入する。なお、コードＣ３は、リターンアドレスをスタックに格納する命令を含むコードであり、コードＣ１は、コードＣ３より上の行に記述されるコードであれば任意のものが指定されてよい。なお、図４（ｂ）におけるコードＣ２は、命令文の一部のみを示す。
【００３４】
はじめに、接続命令挿入部２０２は、所定のレジスタ１０６（ｒ０，ｒ１，ｒ７，ｒ９，ｒ１０）に格納されるデータをプッシュする命令文を挿入する（ステップＳ３０１）。プッシュとは、データをスタック領域に一時的にスタックする処理を示す。ステップＳ３０１で挿入された命令文が実行されることで、関数の本体処理で必要なレジスタに格納されている情報をスタックに退避させることができる。接続命令挿入部２０２は、コードＣ３が実行されることでリターンアドレスが格納されるリンクレジスタ（ｌｒ）の位置をスタック格納順としてレジスタｒ９に格納する命令文を挿入する（ステップＳ３０２）。図７（ａ）は、コードＣ３は実行されることで、格納されるスタックの例を示す。フレームポインタ（ｆｐ）は、フレーム中の特定の位置を示すレジスタであり、図７（ａ）では、スタック格納順の基準となる位置（０）を示す。接続命令挿入部２０２は、ステップＳ１０３において宣言した識別情報の格納用静的変数のアドレスを取得し（ステップＳ３０３）、ステップＳ３０３において取得したアドレスを参照した結果をレジスタｒ１０にロードする命令文を挿入する（ステップＳ３０４）。接続命令挿入部２０２は、関数の冒頭部を示すコール番号（図４（ｂ）の例では＃１９９）を含む接続命令文を挿入する（ステップＳ３０５）。挿入された接続命令が実行されることで、第２のプロセスから第１のプロセスに処理が受け渡される。接続命令挿入部２０２は、ステップＳ３０１においてプッシュされたレジスタ１０６をポップする命令文を挿入し（ステップＳ３０６）、処理を完了する。ポップとは、スタックされたデータを順に取り出す処理を示す。これにより、関数本体で必要なレジスタ情報を復帰することができる。
【００３５】
ステップＳ３０１〜ステップＳ３０６において挿入された命令文が実行されることで、第２のプロセスにおいて実行される関数の冒頭部におけるリターンアドレスを所定のレジスタに格納し、第１のプロセスに接続する処理が実行される。なお、本実施形態において、これらの命令文が実行されることで、第２のプロセスにおいてレジスタ１０６に格納される一連のデータをレジスタ情報と定義する。
【００３６】
本実施形態において、関数の末尾部に命令文を挿入するための詳細な処理（ステップＳ２０８）について、図５を参照し、説明する。図５（ａ）は、ステップＳ２０７において関数の末尾部が判定された場合の続く処理に関するフローチャートを示す。図５（ｂ）は、関数の末尾部および末尾部に挿入する命令文の一例を示す。コード（Ｃ４−Ｃ６）は、図４（ｂ）におけるコード（Ｃ１−Ｃ３）にそれぞれ対応する関数の末尾用コードをそれぞれ示す。
【００３７】
接続命令挿入部２０２は、関数の戻り値であるレジスタｒ０に格納されるデータをレジスタｒ９に退避する命令文を挿入する（ステップＳ４０１）。接続命令挿入部２０２は、ステップＳ１０３において宣言した識別情報の格納用の静的変数のアドレスを取得し（ステップＳ４０２）、当該アドレスを参照した結果をレジスタｒ１０にロードする命令文を挿入する（ステップＳ４０３）。接続命令挿入部２０２は、関数の末尾部を示すコール番号（図５（ｂ）の例では＃２００）を含む接続命令文を挿入し（ステップＳ４０４）、処理を完了する。ステップＳ４０１〜ステップＳ４０４において挿入された命令文が実行されることで、第２のプロセスにおいて実行される関数の末尾部におけるリターンアドレスを第１のプロセスに受け渡すことができる。
【００３８】
本実施形態において、上述したステップＳ３０５およびステップＳ４０４において挿入される接続命令文は、システムコール関数を含む命令文であり、実行されることで第２のプロセスから第１のプロセスにシステムコールし、処理を受け渡すために用いられる一連の処理を定義する。システムコール関数は、「ｇｅｔｕｉｄ」「ｇｅｔｐｉｄ」「ｇｅｔｇｉｄ」等の関数本体のロジックに影響を与えない参照系の関数から任意のものを採用することができる。
【００３９】
以上に示した事前処理によって、監査装置１は、監査対象プログラム１１３に各種命令文を挿入し、監査対象プログラム１１３は、挿入された命令文を実行することで、関数の冒頭部および末尾部の所定のポイントで処理を第１のプロセスに受け渡すことができるプログラムに変換された。続いて、図６を参照しながら、監査プログラム１１２における第１のプロセスの処理および、変換された監査対象プログラム１１３における第２のプロセスの処理について説明する。
【００４０】
はじめに、監査装置１は、第１のプロセスにおいて識別情報を取得する（ステップＳ５０１）。具体的には、監査装置１は、引数で指定された監査対象プログラム１１３の起動コマンドを取得し、更に、ｐｓコマンドを実行することで監査対象プログラム１１３における第２のプロセスのプロセスＩＤを取得する。続いて、監査装置１は、取得したプロセスＩＤのメモリマップを参照することで、当該プロセスＩＤを有する特定のファイルパスに対応する先頭アドレスを識別情報として取得することができる。これによって、第２のプロセスにおいて取得される識別情報と共通の識別情報が、第１のプロセスにおいて取得される。なお、識別情報としてハッシュ値を用いる実施形態において、監査装置１は、取得した第２のプロセスのプロセスＩＤ（ＰＩＤ２）を、共通のハッシュ関数の引数として入力することで、戻り値として得られたハッシュ値を識別情報として取得することができる。
【００４１】
監査装置１は、識別情報を取得後、第２のプロセス（監査対象プログラム１１３）に接続し、処理を受け渡す（ステップＳ５０２）。監査装置１は、第２のプロセスにおいて、事前処理において挿入された命令文を実行し、識別情報の取得し、識別情報の格納用静的変数に識別情報を格納する。監査装置１は、第２のプロセスにおいて、関数の冒頭部に挿入された接続命令によって、第１のプロセスに接続する。これにより、第２のプロセスがシステムコールを行う直前で、第１のプロセスによって、第２のプロセスの処理を中断させることができるようになる。すなわち、不正な処理が実行される前に監査を行うことが可能となる。
【００４２】
監査装置１は、第１のプロセスにおいて、第２のプロセスに挿入された接続命令文によるシステムコールが実行されたことを確認し（ステップＳ５０３）、接続命令文に含まれるコール番号が関数の冒頭部を示すコール番号か否かを判定する（ステップＳ５０４）。監査装置１は、関数冒頭部を示すコール番号と判定した場合（ステップＳ５０４においてＹ）、第２のプロセスにおいてレジスタ１０６に格納されたレジスタ情報を取得する（ステップＳ５０５）。監査装置１は、ステップＳ５０１で第１のプロセスにおいて取得された識別情報と、ステップＳ５０５で第２のプロセスにおいて取得されたレジスタ情報に含まれる識別情報と、が一致するか否かを判定する（ステップＳ５０６）。識別情報が一致すると判定された場合（ステップＳ５０６においてＹ）、監査装置１は、所定のレジスタ１０６に格納されるデータを独自スタックとして格納する（ステップＳ５０７）。このときスタックされるデータは、図７（ｂ）に示すように、スタック格納順（ｒ９）、フレームポインタ（ｆｐ）および、リターンアドレス（ｌｒ）を少なくとも含む。これにより、第１のプロセスは、監査対象プログラム１１３における関数冒頭部のリターンアドレスを第１のプロセスにおけるリンクレジスタ（ｌｒ）として一時的に格納することができる。監査装置１は、続くステップＳ５０８において、関数末尾部を示すコール番号でないと判定し（ステップＳ５０８においてＮ）、システムコールによって中断していた第２のプロセスの元の処理を再開する（ステップＳ６０３）。
【００４３】
処理を再開した第２のプロセスは、関数の末尾部に挿入された接続命令文が実行されることによって、第１のプロセスによって、再び処理を中断する。２回目の接続命令には関数の末尾部を示すコール番号が含まれ、監査装置１は、ステップＳ５０８において、関数の末尾部を示すコール番号であると判定し（ステップＳ５０８においてＹ）、第２のプロセスの関数末尾部までの処理においてレジスタ１０６に格納されたレジスタ情報を取得する（ステップＳ５０９）。監査装置１は、ステップＳ５０６と同様に、識別情報の一致を判定した場合（ステップＳ５１０）、ステップＳ５０７において独自スタックに一時的に格納されたデータ（スタック格納順、フレームポインタ、リターンアドレス）を取得する（ステップＳ５１１）。ここで、ステップＳ５０９においてレジスタ情報として取得された関数の末尾部におけるリターンアドレスをアドレス情報Ａ１とし、ステップＳ５１１において取得された関数の冒頭部におけるリターンアドレスをアドレス情報Ａ２とする。判定部２０３は、アドレス情報Ａ１およびアドレス情報Ａ２をそれぞれ取得し、アドレス情報が一致するか否かを判定し（ステップＳ５１２）、それらが一致すれば処理を続行し、一致しなければ処理を停止させる。
【００４４】
続いて、判定部２０３による判定処理（ステップＳ５１２）の詳細を説明する。判定部２０３は、レジスタ１０６のスタックポインタに格納されるアドレスから所定のデータ量のデータを取得する（ステップＳ６０１）。スタックポインタとは、スタック領域の一番上のアドレスを示す。判定部２０３は、例えば、１ワード分のデータと、スタック領域に格納されたスタック格納順と、を積算することで、スタックポインタからリターンアドレスが格納されるリンクレジスタまでのオフセットを算出する（ステップＳ６０２）。これによって、リターンアドレスのオフセットが算出される。判定部２０３は、算出されたオフセットに基づいて、当該オフセットの位置から所定のデータ量（例えば、１ワード分など）のデータを取得する（ステップＳ６０３）。取得されたデータは、関数の末尾部のリターンアドレスが含まれる。判定部２０３は、ステップＳ５１１において取得された関数の冒頭部のリターンアドレス（アドレス情報Ａ２）および、ステップＳ６０３において取得された関数の末尾部のリターンアドレス（アドレス情報Ａ１）が一致するか否かを判定する（ステップＳ６０４）。リターンアドレスが一致しない場合（ステップＳ６０４においてＮ）、判定部２０３は、リターンアドレスが改ざんされていると判定し、第２のプロセスによるプログラムの処理を停止させる（ステップＳ６０５）。リターンアドレスが一致する場合（ステップＳ６０４においてＹ）、判定部２０３は、リターンアドレスが改ざんされていないものと判定し、第２のプロセスによるプログラムの処理を続行させる（ステップＳ６０６）。
【００４５】
ステップＳ５１２における判定処理の異なる実施形態について説明する。ステップＳ５１１において監査装置１が独自スタックよりデータを取得すると、更新部２０４は、独自スタックに格納されたデータに基づいて、第２のプロセスにおけるレジスタ１０６に格納されるデータを更新する。図７（ｃ）は、本実施形態におけるレジスタ１０６のデータ更新の概要を示す。更新部２０４は、独自スタックのリターンアドレスを第１のプロセスのプログラムカウンタｐｃに、独自スタックのフレームポインタを、スタックポインタを格納する第１のプロセスのレジスタｓｐに、それぞれ更新する。これによって、関数の冒頭部から末尾部までの処理において、リターンアドレスが改ざんされた場合であっても、改ざん前のリターンアドレスに更新されるため、不正なプログラムが実行されることを防止できる。
【００４６】
また、ステップＳ６０４における判定処理の異なる実施形態について説明する。異なる実施形態では、更新部２０４は、図７（ｄ）に示すように、関数の冒頭部において独自スタックとして格納されたデータによって、関数の末尾部におけるスタックに格納されるデータを更新する。具体的には、更新部２０４は、第１のプロセスのスタックポインタ（ｓｐ）に格納される値と、ステップＳ６０２において算出されたオフセットを積算した値を算出する。更新部２０４は、算出した値のアドレスを独自スタックのリターンアドレスで更新し、「算出した値−１ワード」のアドレスを独自スタックのフレームポインタで更新する。これによって、関数の冒頭部から末尾部の間で、リターンアドレスが改ざんされた場合であっても、改ざん前のリターンアドレスに更新されるため、不正なプログラムが実行されることを防止できる。
【００４７】
本実施形態において、監査プログラム１１２は、監査対象プログラム１１３に命令文を挿入する事前処理と、監査対象プログラム１１３の改ざんを検知する処理（ステップＳ５０１−ステップＳ５１２）と、を実行可能に構成されるが、上述した２つの処理は、それぞれ事前処理を実行する事前処理プログラムと、改ざんを検知する処理を実行する検知処理プログラムと、として監査装置１にインストールされる構成であってもよい。
【符号の説明】
【００４８】
１  監査装置
１０１  演算装置（ＣＰＵ）
１０２  主記憶装置（ＲＡＭ）
１０３  入力装置
１０４  表示装置
１０５  通信装置
１０６  レジスタ
１１０  補助記憶装置
１１１  オペレーティングシステム（ＯＳ）
１１２  監査プログラム
１１３  監査対象プログラム
２０１  識別情報取得命令挿入部
２０２  接続命令挿入部
２０３  判定部
２０４  更新部
【要約】      （修正有）【課題】ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する監査装置、監査方法及び監査プログラムを提供する。【解決手段】監査装置１は、監査プログラムが備える第１のプロセスに接続可能な監査対象プログラムの第２のプロセスを実行する。監視装置は、監査対象プログラムに、第１のプロセス及び第２のプロセスがそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する。また、監視装置は、監査対象プログラムの所定の関数の冒頭部及び末尾部に、第１のプロセスに接続させる命令文を挿入する。監視装置の第１のプロセスは、第１のプロセス及び第２のプロセスにおいて取得される識別情報が一致すると判定する場合、関数の冒頭部及び末尾部におけるアドレス情報を取得する。関数の冒頭部におけるアドレス情報と関数の末尾部におけるアドレス情報が一致しないと判定する場合、第２のプロセスの処理を停止させる。【選択図】図１【図１】
0006827244.tif 000002
【図２】
0006827244.tif 000003
【図３】
0006827244.tif 000004
【図４】
0006827244.tif 000005
【図５】
0006827244.tif 000006
【図６】
0006827244.tif 000007
【図７】
0006827244.tif 000008