特許第6827244号(P6827244)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社 エーティーティーコンサルティングの特許一覧

特許6827244監査装置、監査方法、監査プログラムおよび監査システム
<>
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000002
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000003
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000004
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000005
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000006
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000007
  • 特許6827244-監査装置、監査方法、監査プログラムおよび監査システム 図000008
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B1)
(11)【特許番号】6827244
(24)【登録日】2021年1月21日
(45)【発行日】2021年2月10日
(54)【発明の名称】監査装置、監査方法、監査プログラムおよび監査システム
(51)【国際特許分類】
   G06F 21/12 20130101AFI20210128BHJP
   G06F 21/14 20130101ALI20210128BHJP
   G06F 21/52 20130101ALI20210128BHJP
【FI】
   G06F21/12 310
   G06F21/14
   G06F21/52
【請求項の数】6
【全頁数】15
(21)【出願番号】特願2020-154489(P2020-154489)
(22)【出願日】2020年9月15日
【審査請求日】2020年9月15日
【早期審査対象出願】
(73)【特許権者】
【識別番号】515090640
【氏名又は名称】株式会社ATTC
(74)【代理人】
【識別番号】100137338
【弁理士】
【氏名又は名称】辻田 朋子
(72)【発明者】
【氏名】平 昌展
【審査官】 松平 英
(56)【参考文献】
【文献】 特開2010−238228(JP,A)
【文献】 特表2017−505492(JP,A)
【文献】 特開2019−121203(JP,A)
【文献】 米国特許出願公開第2019/0205190(US,A1)
【文献】 米国特許第5732272(US,A)
【文献】 齋藤 孝道 Takamichi SAITO 他,プログラムローダを用いたメモリ破壊攻撃群への対策技術の提案と実装 Safe Trans Loader: Mitigation and Prevention of Memory Corruption Attacks,SCIS2016 [USB] SCIS2016 2016 Symposium on Cryptography and Information Security,SCIS2016 Organizing Committee ,2016年 1月22日,3B3-3,pp.1-8
【文献】 八木 毅 TAKESHI YAGI 他,コンピュータネットワークセキュリティ Computer Network Security,株式会社コロナ社 CORONA PUBLISHING CO.,LTD. 牛来 真也,2015年 4月10日,初版 ,pp.69-70,ISBN:978-4-339-02495-1
【文献】 木村 宏一 KOUICHI KIMURA,情報セキュリティスペシャリスト完全攻略,株式会社オーム社,2008年10月25日,第1版,pp.243-245,ISBN:978-4-274-20613-9
(58)【調査した分野】(Int.Cl.,DB名)
G06F12/14
21/00−21/88
G09C 1/00−5/00
H04K 1/00−3/00
H04L 9/00−9/38
(57)【特許請求の範囲】
【請求項1】
監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスと、前記監査対象プログラムを実行し、前記第1のプロセスに接続可能な第2のプロセスと、を実行する監査装置であって、
前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる命令文を挿入する接続命令挿入部と、
前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定部と、を備える監査装置。
【請求項2】
前記識別情報取得命令挿入部は、予め指定された特定のファイルパスを前記第2のプロセスに割り当てられるプロセス空間にマッピングさせ、前記ファイルパスに対応する先頭アドレスを前記識別情報として取得させる命令文を挿入する請求項1に記載の監査装置。
【請求項3】
前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の末尾部において取得される前記アドレス情報を、前記関数の冒頭部において取得される前記アドレス情報に更新する更新部を備える請求項1又は請求項2に記載の監査装置。
【請求項4】
監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスと、前記監査対象プログラムを実行し、前記第1のプロセスに接続可能な第2のプロセスと、をコンピュータが実行する監査方法であって、
前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入ステップと、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる接続命令文を挿入する接続命令挿入ステップと、
前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定ステップと、をコンピュータが実行する監査方法。
【請求項5】
第2のプロセスを動作させる監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスを動作させる監査プログラムであって、
コンピュータを、前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる接続命令文を挿入する接続命令挿入部と、
前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定部と、として機能させる監査プログラム。
【請求項6】
監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスを動作させる監査装置と、前記監査対象プログラムを実行し、前記第1のプロセスとプロセス間通信により接続可能な第2のプロセスを動作させる監査対象装置と、を備える監査システムであって、
前記監査装置は、前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、
前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる命令文を挿入する接続命令挿入部と、
前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定部と、を備える監査システム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する技術に関する。
【背景技術】
【0002】
ソフトウェアの脆弱性を利用した攻撃の代表としてバッファオーバーフロー攻撃が知られている。プログラムの動作において関数を呼び出す際に、元の動作に戻るためにリターンアドレスが、メモリ領域に格納される。このリターンアドレスが改ざんされることで、プログラムが不正な動作を起こす問題が生じている。
【0003】
特許文献1において、バッファオーバーフローの発生を防ぐためにプログラムを変換する変換装置に関する技術が開示されている。
【0004】
特許文献2において、プログラム開発者によるプログラム修正作業を行うことなく、プログラムに使用される高級言語に依存することなく、バッファオーバーフローによる不正なプログラムの実行を防止する技術が開示されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2013−196512号公報
【特許文献2】特許5777843号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、特許文献1や特許文献2に記載の技術は、何れもアドレス情報がメモリ領域の範囲かを判定することで、プログラムが不正に書き換えられたとしてプログラムの実行を停止させることが開示されている。一方、このような手法において、所定のメモリ領域におけるプログラムの書き換えを検知し防止できるものの、その精度において改善の余地があった。
【0007】
また、プログラム処理によりバッファオーバーフローを防止する技術は、当該プログラムを直接に攻撃されるリスクが存在する点において、十分な安全性は保証されておらず、改善の余地があった。
【0008】
上述したような実状に鑑みて、本発明は、ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する監査装置、監査方法、監査システムおよび、監査プログラムを提供することを解決すべき課題とする。
【課題を解決するための手段】
【0009】
上述した課題を解決するために、本発明は、監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスと、前記監査対象プログラムを実行し、前記第1のプロセスに接続可能な第2のプロセスと、を実行する監査装置であって、前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる命令文を挿入する接続命令挿入部と、前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定部と、を備える。
【0010】
このような構成とすることで、監査対象プログラムに、監査対象プログラムにおける第2のプロセスとは別の第1のプロセスに接続させることで、第2のプロセスを中断し、第1のプロセスにおいてプログラムの改ざんを検知することができるため、監査対象プログラムにおいて不正なプログラムが実行されることを未然に防ぐことができる。接続された第1のプロセスは、監査対象プログラムから独立したプログラムが実行するプロセスであるため、直接的に攻撃を受けるリスクを低減することができる。また、関数の冒頭部および末尾部のアドレスを比較する判定手法とすることで、確度の高い改ざんの検知を可能とする。
【0011】
本発明の好ましい形態では、前記識別情報取得命令挿入部は、予め指定された特定のファイルパスを前記第2のプロセスに割り当てられるプロセス空間にマッピングさせ、前記ファイルパスに対応する先頭アドレスを前記識別情報として取得させる命令文を挿入する。
このような構成とすることで、第1のプロセスおよび第2のプロセスにおいて共通で取得することができ、且つランダム性を有する識別情報を取得することができる。
【0012】
本発明の好ましい形態では、前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の末尾部において取得されるアドレス情報を、前記関数の冒頭部において取得されるアドレス情報に更新する更新部を備える。
このような構成とすることで、関数末尾部におけるアドレス情報が関数冒頭部におけるアドレス情報に更新されるため、不正に改ざんされたアドレス情報を用いたプログラムの処理の実行を防止することができる。
【0013】
本発明は、監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスと、前記監査対象プログラムを実行し、前記第1のプロセスに接続可能な第2のプロセスと、をコンピュータが実行する監査方法であって、前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入ステップと、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる接続命令文を挿入する接続命令挿入ステップと、前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定ステップと、をコンピュータが実行する。
【0014】
第2のプロセスを動作させる監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスを動作させる監査プログラムであって、コンピュータを、前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる接続命令文を挿入する接続命令挿入部と、前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定した場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定部と、として機能させる。
【0015】
監査対象プログラムにおける改ざんを検知する処理を実行する第1のプロセスを動作させる監査装置と、前記監査対象プログラムを実行し、前記第1のプロセスとプロセス間通信により接続可能な第2のプロセスを動作させる監査対象装置と、を備える監査システムであって、前記監査装置は、前記監査対象プログラムに、前記第1のプロセスおよび前記第2のプロセスにおいてそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する識別情報取得命令挿入部と、前記監査対象プログラムに含まれる所定の関数の冒頭部および末尾部に、前記第1のプロセスに接続させる命令文を挿入する接続命令挿入部と、前記第2のプロセスから接続される前記第1のプロセスにおいて、前記第1のプロセスおよび前記第2のプロセスにおいて取得される前記識別情報が一致することを判定する場合、前記関数の冒頭部および末尾部におけるアドレス情報を少なくとも取得し、前記関数の冒頭部におけるアドレス情報と前記関数の末尾部におけるアドレス情報が一致しないと判定する場合、前記第2のプロセスの処理を停止させる判定部と、を備える。
【発明の効果】
【0016】
本発明によれば、ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する監査装置、監査方法、監査プログラムおよび、監査システムを提供することができる。
【図面の簡単な説明】
【0017】
図1】本発明の実施形態における、監査装置のハードウェア構成例を示す。
図2】本発明の実施形態における、識別情報取得命令挿入部の処理フローチャートを示す。
図3】本発明の実施形態における、接続命令挿入部の処理フローチャートを示す。
図4】本発明の実施形態における、関数冒頭部の接続命令挿入部の処理を示す。
図5】本発明の実施形態における、関数末尾部の接続命令挿入部の処理を示す。
図6】本発明の実施形態における、第1のプロセスの処理フローチャートを示す。
図7】本発明の実施形態における、スタックの一例を示す。
【発明を実施するための形態】
【0018】
以下、図面を用いて、本発明の実施形態に関する監査装置について説明する。なお、以下に示す実施形態は本発明の一例であり、本発明を以下の実施形態に限定するものではなく、様々な構成を採用することもできる。
【0019】
本実施形態では、監査装置の構成、動作等について説明するが、同様の構成の監査方法、監査プログラムおよび、監査プログラム記録媒体、監査システム等も、同様の作用効果を奏することができる。この監査プログラム記録媒体を用いれば、例えばコンピュータに前述の監査プログラムをインストールすることができる。以下で説明する本実施形態にかかる一連の処理は、コンピュータで実行可能なプログラムとして提供され、CD−ROMやフレキシブルディスクなどの非一時的コンピュータ可読記録媒体、さらには通信回線を経て提供可能である。
【0020】
バッファオーバーフローは、例えば、プログラムにおいて、変数に文字列をコピーする場合などで、データを格納するために確保されたバッファ領域の上限を超えてデータが書き込まれることで、隣接するバッファ領域外のデータが上書きされることで生じる。
【0021】
このバッファオーバーフローを意図的に生じさせるバッファオーバーフロー攻撃は、バッファ領域外に記憶されるリターンアドレスを書き換えることで、不正なプログラムを実行させる。例えば、プログラムにおける関数の被演算子として入力されるデータによりバッファオーバーフローが生じる場合、関数の実行前後においてリターンアドレスが書き換えられる。
【0022】
本実施形態において、監査装置1は、監査対象プログラムに含まれる関数の冒頭部および末尾部において、それぞれのリターンアドレスを取得するための命令を挿入することで、関数の実行前後におけるリターンアドレスを取得し、更に取得したリターンアドレスが一致するか否かを判定することで、不正なプログラムの書き換えを検知することができる。なお、詳しくは後述するが、第1のプロセスにおける、第2のプロセスの関数の冒頭部および末尾部の判定は、特定のシステムコール番号と識別情報との組み合わせによって行う。これにより、関数本体のロジックで、万一、同じシステムコール番号が使用されたとしても、識別情報が合致していない限り、関数の冒頭部および末尾部ではないと判断することができ、誤検知を大幅に減らすことが可能となる。
【0023】
本実施形態における、監査装置1は、図1に示すようにハードウェア構成要素として、演算装置(CPU)101、主記憶装置(RAM)102、入力装置103、表示装置104、通信装置105および、補助記憶装置110などを備える。また、補助記憶装置110は、オペレーティングシステム(OS)111と、OS111と協働してその機能を発揮する監査プログラム112と、監査対象プログラム113と、各種データなどと、を記憶している。なお、監査対象プログラム113は、監査装置1とデータ通信可能に構成された監査対象装置(図示せず)の補助記憶装置に記憶されてもよい。また、CPU101は、一時的な記憶回路として複数のレジスタ106を備える。本実施形態において、CPU101はARMプロセッサであり、レジスタ106は、r0からr15の16本の32ビットレジスタである例を説明する。なお、本実施形態において、OS111は、Linux(登録商標)である例を示すが、メモリマップを取得可能な他のOSであってもよい。
【0024】
本実施形態において、監査プログラム112は、各命令文の挿入処理や改ざんの判定処理などを含む第1のプロセスをCPU101に実行させる。監査対象プログラム113は、プログラムが改ざんされているか否かの判定の対象とされるプログラムであり、ソースコードにより記述された一連の処理を含む第2のプロセスをCPU101に実行させる。なお、第2のプロセスは、第1のプロセスの子プロセスとして生成される。また、本実施形態では、第1のプロセスと第2のプロセスの間で行われるプロセス間通信は、同一の監査装置1内で行われるローカル通信の実施例を説明するが、第1のプロセスと第2のプロセスがそれぞれ異なるコンピュータで実行され、ネットワークを介してデータ通信を行うシステムとして構成されてもよい。また、以下の説明において、不明確とならない限りCPU101の介在を省略する。
【0025】
本実施形態において、監査対象プログラム113は、C言語により記述される例を説明するが、メモリ操作が可能な他の言語により記述されてもよい。また、本実施形態において、監査プログラム112は、アセンブリ言語により記述される。本実施形態において、監査プログラム112における処理は、第1のプロセスとして実行され、RAM102のメモリ上にプロセス空間が確保される。なお、監査対象プログラム113における処理では、異なるプロセス空間が割り当てられる。プロセス空間は、アドレス空間のうちCPU101でのOS111の処理によって各プロセスに割り当てられた仮想的なアドレス空間をいう。アドレス空間とは、メモリアドレスによってアクセス可能なメモリ空間をいう。各プロセスは、一意な識別子としてプロセスIDをそれぞれ有する。
【0026】
監査装置1は、機能構成要素として、識別情報取得命令挿入部201と、接続命令挿入部202と、判定部203と、更新部204と、を備える。本実施形態において、識別情報取得命令挿入部201および接続命令挿入部202は、監査対象プログラム113におけるアプリケーションプログラムの実行ファイルが実行される前の事前処理を実行する。本実施形態において、識別情報取得命令挿入部201および接続命令挿入部202が挿入する命令文は、1以上のコードにより構成されるものとする。
【0027】
はじめに、本実施形態における事前処理について説明する。事前処理は、監査対象プログラム113に対して実行される。図2は、監査装置1において識別情報取得命令挿入部201が監査対象プログラム113に識別情報を取得するための命令文を挿入する処理の流れを示すフローチャートである。
【0028】
監査装置1は、監査対象プログラム113のソースプログラムを冒頭から終端まで順に読み込む(ステップS101)。識別情報取得命令挿入部201は、読み込まれたソースプログラムの関数の冒頭部を判定する(ステップS102)。本実施形態において、判定する関数はmain関数とする。関数の冒頭部が判定された場合(ステップS102においてY)、識別情報取得命令挿入部201は、識別情報を格納するための静的変数の宣言文を、当該関数の冒頭部に挿入する(ステップS103)。これにより、後に取得される識別情報を格納するメモリ領域が確保される。識別情報取得命令挿入部201は、予め指定された特定のファイルパスを第2のプロセスに割り当てられるプロセス空間にマッピングさせるための命令文を挿入する(ステップS104)。マッピングの命令文は、例えば、mmap関数を使用できる。上述の命令文の実行によりプロセス空間にマップされるメモリマップは、OSのカーネルにおいてプロセスの状態を示すデータ構造の情報をマップしたファイルを指し、プロセスIDにより識別されるプロセス別に存在する。メモリマップは、プロセス空間の各領域の開始アドレスおよび終了アドレス並びに、ファイルパスなどを示す。識別情報取得命令挿入部201は、マップされた特定のファイルパスに基づいて、対応する先頭アドレス(開始アドレス)を識別情報として取得し、ステップS103において宣言された静的変数に格納する命令文を挿入する(ステップS105)。例えば、第2のプロセスのプロセスIDをPID2とすると、第2のプロセスにおいて実行されるファイルは、/var/bin/PID2.binというファイルパスを有する。識別情報取得命令挿入部201は、予め指定されたPID2を含むファイルパスに対応する先頭アドレスを取得するような命令文を挿入する。なお、識別情報取得命令挿入部201は、先頭アドレスに代えて終了アドレスを識別情報として取得する命令文を挿入してもよい。監査装置1は、ステップS105までの処理を実行すると、次のコードを読み込み(ステップS106)、ステップS102からステップS105までの処理をソースプログラムの終端まで繰り返す。
【0029】
ステップS101からステップS106までの処理によって、各命令文が挿入された監査対象プログラム113が実行されることで、監査装置1は、第2のプロセスにおいて識別情報を取得できる。また、本実施形態において取得される識別情報は、第2のプロセスのプロセスIDによって特定されるため、親プロセスである第1のプロセスでも同様の手法により、共通の識別情報を取得可能であり、更にランダム性を有するという特徴がある。なお、上述した特徴を有する識別情報であれば、本実施形態と異なる手法により識別情報が取得されてもよく、例えば、第1のプロセスにおいて、事前に共通の識別情報を第2のプロセスに受け渡す処理を実行する等、様々な手法を採用することができる。このとき、識別情報は、プロセス空間のメモリアドレスとして用いられる偶数ではなく、所定の奇数による固定値を用いる構成とすることが好ましい。
【0030】
識別情報を取得するための処理について異なる実施形態の例を説明する。異なる実施形態において識別情報は、第2のプロセスのプロセスID(PID2)のハッシュ値とする。識別情報取得命令挿入部201は、ステップS103において静的変数の宣言文を挿入後、PID2を取得する命令文を挿入する。更に、識別情報取得命令挿入部201は、ハッシュ関数に取得したPID2を引数として入力する命令文を挿入する。識別情報取得命令挿入部201は、上述のハッシュ関数の戻り値として得られるハッシュ値を識別情報として取得し、ステップS103において宣言された静的変数に格納する命令文を挿入する。これら挿入された命令文が実行されることで、監査装置1は、第2のプロセスにおいて識別情報を取得できる。なお、ハッシュ値の文字列は任意の長さとしてよいが、データ量と強度の観点から8文字(32bit)程度の長さとすることが好ましい。
【0031】
図3は、監査装置1において接続命令挿入部202が監査対象プログラム113に、監査対象プログラム113における改ざんを検知するための第1のプロセスに接続させるための処理を示す命令文を挿入する処理の流れを示すフローチャートである。
【0032】
監査装置1は、監査対象プログラム113のソースファイル格納ディレクトリを冒頭から読み込み(ステップS201)、ディレクトリに格納されるソースファイルをディレクトリの冒頭から読み込む(ステップS202)。監査装置1は、高級言語により記述されたソースコードをアセンブリコードに変換し(ステップS203)、変換されたアセンブリコードを冒頭から読み込む(ステップS204)。接続命令挿入部202は、読み込まれたアセンブリコードにおける関数の冒頭部を判定する(ステップS205)。関数の冒頭部が判定された場合(ステップS205においてY)、接続命令挿入部202は、監査プログラム112における第1のプロセスに接続する処理を実行する命令文を挿入する(ステップS206)。接続命令挿入部202は、アセンブリコードにおける関数の末尾部を判定する(ステップS207)。関数の末尾部が判定された場合(ステップS207においてY)、接続命令挿入部202は、監査プログラム112の第1のプロセスに接続するための処理を実行する命令文を挿入する(ステップS208)。
【0033】
本実施形態において、関数の冒頭部に命令文を挿入するための詳細な処理(ステップS206)について、図4を参照し、説明する。図4(a)は、ステップS205において関数の冒頭部が判定された場合の続く処理に関するフローチャートを示す。図4(b)は、関数の冒頭部および冒頭部に挿入する命令文の一例を示す。接続命令挿入部202は、関数の冒頭部を示す所定のコードC1の指定を予め受け付け、コードC1を判定した次の行において、コードC2(命令文)を挿入する。なお、コードC3は、リターンアドレスをスタックに格納する命令を含むコードであり、コードC1は、コードC3より上の行に記述されるコードであれば任意のものが指定されてよい。なお、図4(b)におけるコードC2は、命令文の一部のみを示す。
【0034】
はじめに、接続命令挿入部202は、所定のレジスタ106(r0,r1,r7,r9,r10)に格納されるデータをプッシュする命令文を挿入する(ステップS301)。プッシュとは、データをスタック領域に一時的にスタックする処理を示す。ステップS301で挿入された命令文が実行されることで、関数の本体処理で必要なレジスタに格納されている情報をスタックに退避させることができる。接続命令挿入部202は、コードC3が実行されることでリターンアドレスが格納されるリンクレジスタ(lr)の位置をスタック格納順としてレジスタr9に格納する命令文を挿入する(ステップS302)。図7(a)は、コードC3は実行されることで、格納されるスタックの例を示す。フレームポインタ(fp)は、フレーム中の特定の位置を示すレジスタであり、図7(a)では、スタック格納順の基準となる位置(0)を示す。接続命令挿入部202は、ステップS103において宣言した識別情報の格納用静的変数のアドレスを取得し(ステップS303)、ステップS303において取得したアドレスを参照した結果をレジスタr10にロードする命令文を挿入する(ステップS304)。接続命令挿入部202は、関数の冒頭部を示すコール番号(図4(b)の例では#199)を含む接続命令文を挿入する(ステップS305)。挿入された接続命令が実行されることで、第2のプロセスから第1のプロセスに処理が受け渡される。接続命令挿入部202は、ステップS301においてプッシュされたレジスタ106をポップする命令文を挿入し(ステップS306)、処理を完了する。ポップとは、スタックされたデータを順に取り出す処理を示す。これにより、関数本体で必要なレジスタ情報を復帰することができる。
【0035】
ステップS301〜ステップS306において挿入された命令文が実行されることで、第2のプロセスにおいて実行される関数の冒頭部におけるリターンアドレスを所定のレジスタに格納し、第1のプロセスに接続する処理が実行される。なお、本実施形態において、これらの命令文が実行されることで、第2のプロセスにおいてレジスタ106に格納される一連のデータをレジスタ情報と定義する。
【0036】
本実施形態において、関数の末尾部に命令文を挿入するための詳細な処理(ステップS208)について、図5を参照し、説明する。図5(a)は、ステップS207において関数の末尾部が判定された場合の続く処理に関するフローチャートを示す。図5(b)は、関数の末尾部および末尾部に挿入する命令文の一例を示す。コード(C4−C6)は、図4(b)におけるコード(C1−C3)にそれぞれ対応する関数の末尾用コードをそれぞれ示す。
【0037】
接続命令挿入部202は、関数の戻り値であるレジスタr0に格納されるデータをレジスタr9に退避する命令文を挿入する(ステップS401)。接続命令挿入部202は、ステップS103において宣言した識別情報の格納用の静的変数のアドレスを取得し(ステップS402)、当該アドレスを参照した結果をレジスタr10にロードする命令文を挿入する(ステップS403)。接続命令挿入部202は、関数の末尾部を示すコール番号(図5(b)の例では#200)を含む接続命令文を挿入し(ステップS404)、処理を完了する。ステップS401〜ステップS404において挿入された命令文が実行されることで、第2のプロセスにおいて実行される関数の末尾部におけるリターンアドレスを第1のプロセスに受け渡すことができる。
【0038】
本実施形態において、上述したステップS305およびステップS404において挿入される接続命令文は、システムコール関数を含む命令文であり、実行されることで第2のプロセスから第1のプロセスにシステムコールし、処理を受け渡すために用いられる一連の処理を定義する。システムコール関数は、「getuid」「getpid」「getgid」等の関数本体のロジックに影響を与えない参照系の関数から任意のものを採用することができる。
【0039】
以上に示した事前処理によって、監査装置1は、監査対象プログラム113に各種命令文を挿入し、監査対象プログラム113は、挿入された命令文を実行することで、関数の冒頭部および末尾部の所定のポイントで処理を第1のプロセスに受け渡すことができるプログラムに変換された。続いて、図6を参照しながら、監査プログラム112における第1のプロセスの処理および、変換された監査対象プログラム113における第2のプロセスの処理について説明する。
【0040】
はじめに、監査装置1は、第1のプロセスにおいて識別情報を取得する(ステップS501)。具体的には、監査装置1は、引数で指定された監査対象プログラム113の起動コマンドを取得し、更に、psコマンドを実行することで監査対象プログラム113における第2のプロセスのプロセスIDを取得する。続いて、監査装置1は、取得したプロセスIDのメモリマップを参照することで、当該プロセスIDを有する特定のファイルパスに対応する先頭アドレスを識別情報として取得することができる。これによって、第2のプロセスにおいて取得される識別情報と共通の識別情報が、第1のプロセスにおいて取得される。なお、識別情報としてハッシュ値を用いる実施形態において、監査装置1は、取得した第2のプロセスのプロセスID(PID2)を、共通のハッシュ関数の引数として入力することで、戻り値として得られたハッシュ値を識別情報として取得することができる。
【0041】
監査装置1は、識別情報を取得後、第2のプロセス(監査対象プログラム113)に接続し、処理を受け渡す(ステップS502)。監査装置1は、第2のプロセスにおいて、事前処理において挿入された命令文を実行し、識別情報の取得し、識別情報の格納用静的変数に識別情報を格納する。監査装置1は、第2のプロセスにおいて、関数の冒頭部に挿入された接続命令によって、第1のプロセスに接続する。これにより、第2のプロセスがシステムコールを行う直前で、第1のプロセスによって、第2のプロセスの処理を中断させることができるようになる。すなわち、不正な処理が実行される前に監査を行うことが可能となる。
【0042】
監査装置1は、第1のプロセスにおいて、第2のプロセスに挿入された接続命令文によるシステムコールが実行されたことを確認し(ステップS503)、接続命令文に含まれるコール番号が関数の冒頭部を示すコール番号か否かを判定する(ステップS504)。監査装置1は、関数冒頭部を示すコール番号と判定した場合(ステップS504においてY)、第2のプロセスにおいてレジスタ106に格納されたレジスタ情報を取得する(ステップS505)。監査装置1は、ステップS501で第1のプロセスにおいて取得された識別情報と、ステップS505で第2のプロセスにおいて取得されたレジスタ情報に含まれる識別情報と、が一致するか否かを判定する(ステップS506)。識別情報が一致すると判定された場合(ステップS506においてY)、監査装置1は、所定のレジスタ106に格納されるデータを独自スタックとして格納する(ステップS507)。このときスタックされるデータは、図7(b)に示すように、スタック格納順(r9)、フレームポインタ(fp)および、リターンアドレス(lr)を少なくとも含む。これにより、第1のプロセスは、監査対象プログラム113における関数冒頭部のリターンアドレスを第1のプロセスにおけるリンクレジスタ(lr)として一時的に格納することができる。監査装置1は、続くステップS508において、関数末尾部を示すコール番号でないと判定し(ステップS508においてN)、システムコールによって中断していた第2のプロセスの元の処理を再開する(ステップS603)。
【0043】
処理を再開した第2のプロセスは、関数の末尾部に挿入された接続命令文が実行されることによって、第1のプロセスによって、再び処理を中断する。2回目の接続命令には関数の末尾部を示すコール番号が含まれ、監査装置1は、ステップS508において、関数の末尾部を示すコール番号であると判定し(ステップS508においてY)、第2のプロセスの関数末尾部までの処理においてレジスタ106に格納されたレジスタ情報を取得する(ステップS509)。監査装置1は、ステップS506と同様に、識別情報の一致を判定した場合(ステップS510)、ステップS507において独自スタックに一時的に格納されたデータ(スタック格納順、フレームポインタ、リターンアドレス)を取得する(ステップS511)。ここで、ステップS509においてレジスタ情報として取得された関数の末尾部におけるリターンアドレスをアドレス情報A1とし、ステップS511において取得された関数の冒頭部におけるリターンアドレスをアドレス情報A2とする。判定部203は、アドレス情報A1およびアドレス情報A2をそれぞれ取得し、アドレス情報が一致するか否かを判定し(ステップS512)、それらが一致すれば処理を続行し、一致しなければ処理を停止させる。
【0044】
続いて、判定部203による判定処理(ステップS512)の詳細を説明する。判定部203は、レジスタ106のスタックポインタに格納されるアドレスから所定のデータ量のデータを取得する(ステップS601)。スタックポインタとは、スタック領域の一番上のアドレスを示す。判定部203は、例えば、1ワード分のデータと、スタック領域に格納されたスタック格納順と、を積算することで、スタックポインタからリターンアドレスが格納されるリンクレジスタまでのオフセットを算出する(ステップS602)。これによって、リターンアドレスのオフセットが算出される。判定部203は、算出されたオフセットに基づいて、当該オフセットの位置から所定のデータ量(例えば、1ワード分など)のデータを取得する(ステップS603)。取得されたデータは、関数の末尾部のリターンアドレスが含まれる。判定部203は、ステップS511において取得された関数の冒頭部のリターンアドレス(アドレス情報A2)および、ステップS603において取得された関数の末尾部のリターンアドレス(アドレス情報A1)が一致するか否かを判定する(ステップS604)。リターンアドレスが一致しない場合(ステップS604においてN)、判定部203は、リターンアドレスが改ざんされていると判定し、第2のプロセスによるプログラムの処理を停止させる(ステップS605)。リターンアドレスが一致する場合(ステップS604においてY)、判定部203は、リターンアドレスが改ざんされていないものと判定し、第2のプロセスによるプログラムの処理を続行させる(ステップS606)。
【0045】
ステップS512における判定処理の異なる実施形態について説明する。ステップS511において監査装置1が独自スタックよりデータを取得すると、更新部204は、独自スタックに格納されたデータに基づいて、第2のプロセスにおけるレジスタ106に格納されるデータを更新する。図7(c)は、本実施形態におけるレジスタ106のデータ更新の概要を示す。更新部204は、独自スタックのリターンアドレスを第1のプロセスのプログラムカウンタpcに、独自スタックのフレームポインタを、スタックポインタを格納する第1のプロセスのレジスタspに、それぞれ更新する。これによって、関数の冒頭部から末尾部までの処理において、リターンアドレスが改ざんされた場合であっても、改ざん前のリターンアドレスに更新されるため、不正なプログラムが実行されることを防止できる。
【0046】
また、ステップS604における判定処理の異なる実施形態について説明する。異なる実施形態では、更新部204は、図7(d)に示すように、関数の冒頭部において独自スタックとして格納されたデータによって、関数の末尾部におけるスタックに格納されるデータを更新する。具体的には、更新部204は、第1のプロセスのスタックポインタ(sp)に格納される値と、ステップS602において算出されたオフセットを積算した値を算出する。更新部204は、算出した値のアドレスを独自スタックのリターンアドレスで更新し、「算出した値−1ワード」のアドレスを独自スタックのフレームポインタで更新する。これによって、関数の冒頭部から末尾部の間で、リターンアドレスが改ざんされた場合であっても、改ざん前のリターンアドレスに更新されるため、不正なプログラムが実行されることを防止できる。
【0047】
本実施形態において、監査プログラム112は、監査対象プログラム113に命令文を挿入する事前処理と、監査対象プログラム113の改ざんを検知する処理(ステップS501−ステップS512)と、を実行可能に構成されるが、上述した2つの処理は、それぞれ事前処理を実行する事前処理プログラムと、改ざんを検知する処理を実行する検知処理プログラムと、として監査装置1にインストールされる構成であってもよい。
【符号の説明】
【0048】
1 監査装置
101 演算装置(CPU)
102 主記憶装置(RAM)
103 入力装置
104 表示装置
105 通信装置
106 レジスタ
110 補助記憶装置
111 オペレーティングシステム(OS)
112 監査プログラム
113 監査対象プログラム
201 識別情報取得命令挿入部
202 接続命令挿入部
203 判定部
204 更新部
【要約】      (修正有)
【課題】ソフトウェアの脆弱性を利用した攻撃により改ざんされた不正なプログラムの実行を防止する監査装置、監査方法及び監査プログラムを提供する。
【解決手段】監査装置1は、監査プログラムが備える第1のプロセスに接続可能な監査対象プログラムの第2のプロセスを実行する。監視装置は、監査対象プログラムに、第1のプロセス及び第2のプロセスがそれぞれ取得可能な共通の識別情報を取得させる命令文を挿入する。また、監視装置は、監査対象プログラムの所定の関数の冒頭部及び末尾部に、第1のプロセスに接続させる命令文を挿入する。監視装置の第1のプロセスは、第1のプロセス及び第2のプロセスにおいて取得される識別情報が一致すると判定する場合、関数の冒頭部及び末尾部におけるアドレス情報を取得する。関数の冒頭部におけるアドレス情報と関数の末尾部におけるアドレス情報が一致しないと判定する場合、第2のプロセスの処理を停止させる。
【選択図】図1
図1
図2
図3
図4
図5
図6
図7