JP2009129204A - コード検査システム及びコード検査方法及びプログラム - Google Patents
コード検査システム及びコード検査方法及びプログラム Download PDFInfo
- Publication number
- JP2009129204A JP2009129204A JP2007303742A JP2007303742A JP2009129204A JP 2009129204 A JP2009129204 A JP 2009129204A JP 2007303742 A JP2007303742 A JP 2007303742A JP 2007303742 A JP2007303742 A JP 2007303742A JP 2009129204 A JP2009129204 A JP 2009129204A
- Authority
- JP
- Japan
- Prior art keywords
- branch
- code
- inspection
- result
- conditional
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Abstract
【課題】開発プログラムに秘密裏に実装された不正コードや秘密の条件下で特権ユーザと同等の操作を可能とする不正コードを検出する。
【解決手段】悪意の開発者は、出荷前のテストフェーズで不正コードが実行されて発覚することを恐れるため、出荷前は不正コードが実行されないように秘密の条件が満たされないと不正コードが動作しないよう条件分岐させるはずである。この点に注目し、検査実行用コンパイラ300が不正コード検査対象プログラム400内の条件分岐実行状況を監視しながら機能確認試験を実施し、不正コード精査部504が条件分岐実行結果を解析し、不審な分岐結果を検出した場合、その条件文から呼び出される命令列を検査することで、不正なコードを検出する。プログラムの実行状態を特権モードと通常モードに分類して機能確認試験を行うことで、秘密の条件が満たされると特権ユーザと同等の操作を可能とする不正コードの検出も行う。
【選択図】図1
【解決手段】悪意の開発者は、出荷前のテストフェーズで不正コードが実行されて発覚することを恐れるため、出荷前は不正コードが実行されないように秘密の条件が満たされないと不正コードが動作しないよう条件分岐させるはずである。この点に注目し、検査実行用コンパイラ300が不正コード検査対象プログラム400内の条件分岐実行状況を監視しながら機能確認試験を実施し、不正コード精査部504が条件分岐実行結果を解析し、不審な分岐結果を検出した場合、その条件文から呼び出される命令列を検査することで、不正なコードを検出する。プログラムの実行状態を特権モードと通常モードに分類して機能確認試験を行うことで、秘密の条件が満たされると特権ユーザと同等の操作を可能とする不正コードの検出も行う。
【選択図】図1
Description
本発明は、プログラムコードに含まれる不正コードブロック(以下、不正コードともいう)を検出する技術に関する。
ソフトウェア開発時に、悪意の開発者が開発ソフトウェア中に秘密裏に悪意のコードを実装してしまう可能性がある。
従来はソースコードに対する手動によるレビューを行うことでこのような攻撃に対処してきたが、近年ソフトウェア開発が大規模化するにつれ、開発されるコード量も増加の一途を辿っており、手動でソースコードの全てをくまなくレビューすることは不可能となりつつある。
従来はソースコードに対する手動によるレビューを行うことでこのような攻撃に対処してきたが、近年ソフトウェア開発が大規模化するにつれ、開発されるコード量も増加の一途を辿っており、手動でソースコードの全てをくまなくレビューすることは不可能となりつつある。
不正な処理を行うプログラムを検出する技術としては、プログラムの動作を監視し、あらかじめ定義された不正な処理の実行を検出する方式(例えば特許文献1)や、検査対象となるプログラム内にあらかじめ定義された不正な処理を行う命令並びが含まれているかどうかを検査する方式(例えば非特許文献1 p.12 ヒューリスティック法)が知られている。
また、プログラムの欠陥を検出するための技術として、セキュリティ上問題のある実装のパターンをルール化して保持し、対象プログラムのソースコードを解析してパターンに合致する実装が無いかを検査する方式も知られている(例えば非特許文献2)。
特開2005−148814号公報
独立行政法人 情報処理推進機構 「未知ウィルス検出技術に関する調査 調査報告書」 15情経1675号 2004年4月 (http://www.ipa.go.jp/security/fy15/reports/uvd/documents/uvd_report.pdf)
FORTIFY SOFTWARE 「FORTIFY SOURCE CODE ANALYSIS SUITE」 (http://www.fortifysoftware.co.jp/data/FJP1−0601−05.pdf)
不正な処理を定義し、その定義にあてはまる処理の実行や命令並びを見つける手法(例えば特許文献1又は非特許文献1)では、あらかじめ不正な処理を定義しなければならない。
このような処理の定義はウィルスやワームの感染活動のように、一般に知られた共通の振る舞いが存在する場合には可能であるが、本明細書で対策しようとしている不正コードの場合、開発者の意図によって実行される処理は様々となるため、あらかじめ不正な振る舞いを定義することは困難である、という課題がある。
このような処理の定義はウィルスやワームの感染活動のように、一般に知られた共通の振る舞いが存在する場合には可能であるが、本明細書で対策しようとしている不正コードの場合、開発者の意図によって実行される処理は様々となるため、あらかじめ不正な振る舞いを定義することは困難である、という課題がある。
さらに、不正コードと正規のコードとの振る舞いが常に識別可能とは限らない。
例えば、不正コードの一例として、サーバプログラムにおいて、開発者のみが知る秘密のユーザ名でログインすると無条件に特権ユーザとしてサーバを操作できるようなコードを記述することが考えられる。
この場合、振る舞いは通常の特権ユーザのそれと全く同じであり、前記技術では不正コードの実行を検出できない。
例えば、不正コードの一例として、サーバプログラムにおいて、開発者のみが知る秘密のユーザ名でログインすると無条件に特権ユーザとしてサーバを操作できるようなコードを記述することが考えられる。
この場合、振る舞いは通常の特権ユーザのそれと全く同じであり、前記技術では不正コードの実行を検出できない。
次に、プログラムの欠陥を検出する技術(例えば非特許文献2)に関しても同様であり、当技術を利用して不正コードを検出するためには、不正コードのパターンをルール化しなければならない。
そのため前述した技術と同様の理由により不正コードの検出は困難である。
そのため前述した技術と同様の理由により不正コードの検出は困難である。
本発明は、上記のような課題を解決することを主な目的の一つとしており、開発プログラムに秘密裏に実装された不正目的のコードを検出することを主な目的とする。
更には、本発明は、秘密の条件が満たされると特権ユーザと同等の操作を可能とする類の不正コードを検出することも主な目的とする。
更には、本発明は、秘密の条件が満たされると特権ユーザと同等の操作を可能とする類の不正コードを検出することも主な目的とする。
本発明に係るコード検査システムは、
条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力部と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力部と、
前記分岐実行情報入力部により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積部と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を記憶する検査対象判別基準情報記憶部と、
条件分岐文ごとに、前記分岐結果蓄積部に蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査部とを有することを特徴とする。
条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力部と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力部と、
前記分岐実行情報入力部により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積部と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を記憶する検査対象判別基準情報記憶部と、
条件分岐文ごとに、前記分岐結果蓄積部に蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査部とを有することを特徴とする。
本発明によれば、実行結果が不自然な条件分岐文を抽出して検査を行うため、実行開発者が秘密の条件で動作するように実装された不正目的のコードを検出できるようになる。
実施の形態1.
悪意の開発者は、不正コードをプログラム中に実装するとき、出荷前のテストフェーズで不正なコードが実行されて発覚することを恐れる。
そのため出荷されるまで不正なコードが実行されないように、何らかの秘密の条件が満たされない限り不正なコードが動作しないよう条件分岐させるはずである。
本実施の形態では、不正コードがテストフェーズでは実行されないことに着目し、検査対象プログラム内の条件分岐実行状況を監視しながら機能確認の試験を実施し、不審な分岐結果を検出後、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出するものである。
さらに、プログラムの実行状態を特権モードと通常モードに分類して機能確認試験を行うことで、秘密の条件が満たされると特権ユーザと同等の操作を可能とする類の不正コードの検出も行う。
悪意の開発者は、不正コードをプログラム中に実装するとき、出荷前のテストフェーズで不正なコードが実行されて発覚することを恐れる。
そのため出荷されるまで不正なコードが実行されないように、何らかの秘密の条件が満たされない限り不正なコードが動作しないよう条件分岐させるはずである。
本実施の形態では、不正コードがテストフェーズでは実行されないことに着目し、検査対象プログラム内の条件分岐実行状況を監視しながら機能確認の試験を実施し、不審な分岐結果を検出後、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出するものである。
さらに、プログラムの実行状態を特権モードと通常モードに分類して機能確認試験を行うことで、秘密の条件が満たされると特権ユーザと同等の操作を可能とする類の不正コードの検出も行う。
図1は、本実施の形態に係る不正コード検査装置100の例を表す図である。
図1に示されるとおり、不正コード検査装置100は、不正コード検査ツール500、及び検査実行用コンパイラ300で構成されている。
なお、図1と異なり、不正コード検査ツール500及び検査実行用コンパイラ300が同じ不正コード検査装置100内に配置されていなくてもよく、それぞれが別のコンピュータに配置されていてもよい。
図1に示されるとおり、不正コード検査装置100は、不正コード検査ツール500、及び検査実行用コンパイラ300で構成されている。
なお、図1と異なり、不正コード検査ツール500及び検査実行用コンパイラ300が同じ不正コード検査装置100内に配置されていなくてもよく、それぞれが別のコンピュータに配置されていてもよい。
本実施の形態では、不正コード検査対象ソースコード200(以下、対象ソースコード200ともいう)を検査実行用コンパイラ300でコンパイルして生成された不正コード検査対象プログラム400(以下、対象プログラム400ともいう)に対して機能確認試験を実施してプログラム内の条件分岐を追跡し、機能確認試験の結果得られる分岐実行情報と対象ソースコード200を不正コード検査ツール500に入力し、不正コード検査ツール500が分岐実行情報に基づいて不審な分岐結果を検出し、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出する。
また、不正なコードを検出した場合は、システムオペレータに通知する。
また、不正なコードを検出した場合は、システムオペレータに通知する。
対象ソースコード200は、不正コードの検査の対象となるソースコードであり、不正コードが含まれる可能性がある。
また、対象ソースコード200には、条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれる。条件分岐文に含まれるコードブロックには、関数や状態変数が含まれる。
条件分岐文の具体例は、後述するが、条件式に対する評価結果いかんにより処理が分岐するプログラム文である。
対象ソースコード200は、プログラムコードの例である。
また、対象ソースコード200には、条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれる。条件分岐文に含まれるコードブロックには、関数や状態変数が含まれる。
条件分岐文の具体例は、後述するが、条件式に対する評価結果いかんにより処理が分岐するプログラム文である。
対象ソースコード200は、プログラムコードの例である。
対象プログラム400は、検査実行用コンパイラ300により対象ソースコード200に対してコンパイルされた後の実行コードである。
検査実行用コンパイラ300は、対象ソースコード200を入力として受け取り、対象プログラム400を出力するものである。
ただし、通常のコンパイラとは異なり対象ソースコード200中の各条件分岐文において不正コード検査ツール500が必要とする情報(分岐実行情報)を出力させるための実行コードを出力する(付加する)という特徴を持つ。
そして、機能確認試験を行う機能確認試験システムは、検査実行用コンパイラ300により条件分岐文に付加された実行コードに基づいて分岐実行情報を出力する。
このため、検査実行用コンパイラ300は、コード付加システムの例となる。
なお、このような実行コードを付加するコンパイラは既存のコンパイラ機能であるプロファイル測定用のコード生成機能を応用することで容易に構成可能であるため、詳細な説明は行わない。
ただし、通常のコンパイラとは異なり対象ソースコード200中の各条件分岐文において不正コード検査ツール500が必要とする情報(分岐実行情報)を出力させるための実行コードを出力する(付加する)という特徴を持つ。
そして、機能確認試験を行う機能確認試験システムは、検査実行用コンパイラ300により条件分岐文に付加された実行コードに基づいて分岐実行情報を出力する。
このため、検査実行用コンパイラ300は、コード付加システムの例となる。
なお、このような実行コードを付加するコンパイラは既存のコンパイラ機能であるプロファイル測定用のコード生成機能を応用することで容易に構成可能であるため、詳細な説明は行わない。
また、本実施の形態及び以降の実施の形態では、検査実行用コンパイラ300がユーザ(試験実施者)の指示に基づいて対象プログラム400の機能確認試験を行う例を主に説明する。
このため、本実施の形態及び以降の実施の形態において、検査実行用コンパイラ300は機能確認試験システムの例に相当する。
しかし、機能確認試験は必ずしも検査実行用コンパイラ300で行う必要はなく、不正コード検査装置100内の他の機能、又は不正コード検査装置100と接続された他のコンピュータシステム(機能確認試験システム)により機能確認試験が実施されるようにしてもよい。
なお、他のコンピュータシステムにより機能確認試験が実施される場合でも、検査実行用コンパイラ300によりコンパイル時に対象ソースコード200中の各条件分岐文に対して追加された実行コードが実行されて、分岐実行情報が出力される。
また、詳細は後述するが、分岐実行情報とは、機能確認試験で各条件分岐文が実行された際の分岐結果を示す情報である。
このため、本実施の形態及び以降の実施の形態において、検査実行用コンパイラ300は機能確認試験システムの例に相当する。
しかし、機能確認試験は必ずしも検査実行用コンパイラ300で行う必要はなく、不正コード検査装置100内の他の機能、又は不正コード検査装置100と接続された他のコンピュータシステム(機能確認試験システム)により機能確認試験が実施されるようにしてもよい。
なお、他のコンピュータシステムにより機能確認試験が実施される場合でも、検査実行用コンパイラ300によりコンパイル時に対象ソースコード200中の各条件分岐文に対して追加された実行コードが実行されて、分岐実行情報が出力される。
また、詳細は後述するが、分岐実行情報とは、機能確認試験で各条件分岐文が実行された際の分岐結果を示す情報である。
不正コード検査ツール500は、機能確認試験の結果出力される分岐実行情報に基づいて不審な分岐結果を検出し、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出する。
不正コード検査ツール500は、コード検査システムの例である。
不正コード検査ツール500は、コード検査システムの例である。
不正コード検査ツール500は、分岐実行状況測定部501、ソースコード入力部502、実行状態入力部503、不正コード精査部504、検査結果通知部505、検査対象判別基準情報記憶部506、ソースコード記憶部507及び重要操作データベース508で構成されている。
本明細書の最終部分で説明するように、分岐実行状況測定部501、ソースコード入力部502、実行状態入力部503、不正コード精査部504、検査結果通知部505は例えばプログラムとし、図1には図示していないCPU(Central Processing Unit)によりこれらのプログラムを実行するようにしてもよい。
また、検査対象判別基準情報記憶部506、ソースコード記憶部507、及び重要操作データベース508は、図1に図示していないRAM(Random Access Memory)、磁気ディスク装置、フラッシュメモリ等により構成される。
本明細書の最終部分で説明するように、分岐実行状況測定部501、ソースコード入力部502、実行状態入力部503、不正コード精査部504、検査結果通知部505は例えばプログラムとし、図1には図示していないCPU(Central Processing Unit)によりこれらのプログラムを実行するようにしてもよい。
また、検査対象判別基準情報記憶部506、ソースコード記憶部507、及び重要操作データベース508は、図1に図示していないRAM(Random Access Memory)、磁気ディスク装置、フラッシュメモリ等により構成される。
分岐実行状況測定部501は、実行中の対象プログラム400について出力される分岐実行情報を受け取り、ツール内部で管理を行う。
つまり、機能確認試験システム(検査実行用コンパイラ300又は他のシステム)から、各条件分岐文における分岐結果を示す分岐実行情報を入力する。
また、後述するように、図6に示すテーブルの形式で、入力した分岐実行情報に示される分岐結果を分岐条件文ごとに蓄積する。
分岐実行状況測定部501は、分岐実行情報入力部及び分岐結果蓄積部の例である。
つまり、機能確認試験システム(検査実行用コンパイラ300又は他のシステム)から、各条件分岐文における分岐結果を示す分岐実行情報を入力する。
また、後述するように、図6に示すテーブルの形式で、入力した分岐実行情報に示される分岐結果を分岐条件文ごとに蓄積する。
分岐実行状況測定部501は、分岐実行情報入力部及び分岐結果蓄積部の例である。
ソースコード入力部502は、本ツール内で対象ソースコード200を解析するために、外部からソースコードを入力するためのインタフェースである。
なお、対象ソースコード200を入力するのは不正コード精査部504における解析処理、不正コード検出処理が効率的になるという理由からであり、対象ソースコード200の代わりに対象プログラム400又は何らかの中間コードを入力し、不正コード精査部504が解析処理、不正コード検出処理を対象プログラム400又は中間コードで行うことも可能である。
なお、対象ソースコード200を入力するのは不正コード精査部504における解析処理、不正コード検出処理が効率的になるという理由からであり、対象ソースコード200の代わりに対象プログラム400又は何らかの中間コードを入力し、不正コード精査部504が解析処理、不正コード検出処理を対象プログラム400又は中間コードで行うことも可能である。
後述するが、本ツールでは対象プログラム400の実行状態(実行モードともいう)を外部から入力してもらう必要があり、実行状態入力部503はそのためのインタフェースである。
具体的には、対象プログラム400は特権モード及び通常モードの2つの実行モードで実行させることができ、実行状態入力部503は機能確認試験において分岐条件文の実行が特権モード及び通常モードのいずれで行われているかを示す情報(実行モード情報)を入力する。
そして、このようにして実行モードが通知されることで、分岐実行状況測定部501は、条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積することができる。
実行状態入力部503は、実行モード情報入力部の例である。
具体的には、対象プログラム400は特権モード及び通常モードの2つの実行モードで実行させることができ、実行状態入力部503は機能確認試験において分岐条件文の実行が特権モード及び通常モードのいずれで行われているかを示す情報(実行モード情報)を入力する。
そして、このようにして実行モードが通知されることで、分岐実行状況測定部501は、条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積することができる。
実行状態入力部503は、実行モード情報入力部の例である。
不正コード精査部504は、ソースコード入力部502により入力された対象ソースコード200と、分岐実行状況測定部501により集められた分岐実行情報から不正コードの有無を検査する。検査の結果は検査結果通知部505によりツールオペレータに通知される。
不正コード精査部504は、具体的には、分岐実行状況測定部501において蓄積された蓄積分岐結果が後述する検査対象判別基準情報に示されるいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された対象ソースコード200から、当該条件分岐文に含まれるコードブロックのうち検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査する。
そして、検査対象コードブロックの検査として、不正コード精査部504は、不正目的に利用される可能性のある重要操作(不正利用可能データ)が検査対象コードブロックに含まれているか否か及び検査対象コードブロックが重要操作を利用するか否かを検査し、検査対象コードブロックに重要操作が含まれている場合及び検査対象コードブロックが重要操作を利用している場合の少なくともいずれかにおいて、当該検査対象コードブロックを不正目的の可能性のある不正コードブロックに指定する。
重要操作は、後述する重要操作データベース508に格納されている。また、重要操作とは、例えば、不正目的に利用される可能性のある関数や状態変数である。
不正コード精査部504は、コードブロック検査部の例である。
不正コード精査部504は、具体的には、分岐実行状況測定部501において蓄積された蓄積分岐結果が後述する検査対象判別基準情報に示されるいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された対象ソースコード200から、当該条件分岐文に含まれるコードブロックのうち検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査する。
そして、検査対象コードブロックの検査として、不正コード精査部504は、不正目的に利用される可能性のある重要操作(不正利用可能データ)が検査対象コードブロックに含まれているか否か及び検査対象コードブロックが重要操作を利用するか否かを検査し、検査対象コードブロックに重要操作が含まれている場合及び検査対象コードブロックが重要操作を利用している場合の少なくともいずれかにおいて、当該検査対象コードブロックを不正目的の可能性のある不正コードブロックに指定する。
重要操作は、後述する重要操作データベース508に格納されている。また、重要操作とは、例えば、不正目的に利用される可能性のある関数や状態変数である。
不正コード精査部504は、コードブロック検査部の例である。
検査対象判別基準情報記憶部506は、検査対象判別基準情報を記憶している。
検査対象判別基準情報とは、検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する情報である。
検査対象判別基準とは、検査対象となる条件分岐文を判別するための基準である。検査対象判別基準には不自然な分岐結果のパターンが示され、不自然な分岐結果のパターンに合致する条件分岐文を検査対象としている。
検査対象判別基準情報は、具体的には、図5に示す情報である。
図5の詳細は、後述するが、図5におけるモード毎の条件評価結果の欄に記載される基準が検査対象判別基準であり、検査項目に示されるTRUEコードブロック又はFALSEコードブロックが検査対象のコードブロックの種類である。
TRUEコードブロック及びFALSEコードについても詳細は後述するが、条件式に対する評価結果がTRUEである場合に実行されるコードブロックがTRUEコードブロックであり、条件式に対する評価結果がFALSEである場合に実行されるコードブロックがFALSEコードブロックである。
検査対象判別基準情報とは、検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する情報である。
検査対象判別基準とは、検査対象となる条件分岐文を判別するための基準である。検査対象判別基準には不自然な分岐結果のパターンが示され、不自然な分岐結果のパターンに合致する条件分岐文を検査対象としている。
検査対象判別基準情報は、具体的には、図5に示す情報である。
図5の詳細は、後述するが、図5におけるモード毎の条件評価結果の欄に記載される基準が検査対象判別基準であり、検査項目に示されるTRUEコードブロック又はFALSEコードブロックが検査対象のコードブロックの種類である。
TRUEコードブロック及びFALSEコードについても詳細は後述するが、条件式に対する評価結果がTRUEである場合に実行されるコードブロックがTRUEコードブロックであり、条件式に対する評価結果がFALSEである場合に実行されるコードブロックがFALSEコードブロックである。
ソースコード記憶部507は、ソースコード入力部502により入力された対象ソースコード200を記憶する。
最後に重要操作データベース508であるが、本データベースには不正目的に利用される可能性のある重要操作(不正利用可能データ)の一覧(不正利用可能データ情報)が格納される。
重要操作とは、悪用されると危険な関数や状態変数等である。対象プログラム毎にこれらは変化する可能性があるため、データベース内に保存されるデータについては、ユーザによる追加・変更・削除が可能となっている。
重要操作データベース508は、不正利用可能データ情報記憶部の例である。
重要操作とは、悪用されると危険な関数や状態変数等である。対象プログラム毎にこれらは変化する可能性があるため、データベース内に保存されるデータについては、ユーザによる追加・変更・削除が可能となっている。
重要操作データベース508は、不正利用可能データ情報記憶部の例である。
図2は、本実施の形態に係る不正コード検査装置100を用いた不正コード検査のフローの例を示す図である。
まず、ユーザは対象ソースコード200を検査実行用コンパイラ300によってコンパイルし、対象プログラム400を生成する。
次に、ユーザは機能確認試験システム(検査実行用コンパイラ300又は他システム)を用いて対象プログラム400に対し機能確認試験を実施する。ここで、機能確認試験とは、エラー処理も含め、対象プログラムに期待されている全ての機能を確認する試験を指す。
まず、ユーザは対象ソースコード200を検査実行用コンパイラ300によってコンパイルし、対象プログラム400を生成する。
次に、ユーザは機能確認試験システム(検査実行用コンパイラ300又は他システム)を用いて対象プログラム400に対し機能確認試験を実施する。ここで、機能確認試験とは、エラー処理も含め、対象プログラムに期待されている全ての機能を確認する試験を指す。
対象プログラム400によっては、利用ユーザや動作環境に応じ、特別なモードで処理を行う場合がある。例えばサーバプログラムにおける管理者モードや、障害解析用のデバッグモードを挙げることができる。このような特権的な処理に対する機能確認試験を行う際には、事前に不正コード検査ツール500に対し、これから行う機能確認試験が特権的な処理に対するものであることを通知する。本実施の形態では対象プログラムの実行モードとして、通常モードと特権モードの二種類を指定可能とした。
このように、適切に実行状態(実行モード)の変更を不正コード検査ツール500に通知しながら機能確認試験を進めていき、全ての機能確認試験が完了した段階で、不正コード検査ツール500が不正コードの有無を検査し、検査結果600を出力する。
次に、不正コード検査ツール500の動作について、詳細に説明する。
はじめに用語の定義を行う。
ソースコード中で、与えられた条件に対する評価結果に応じて処理が分岐する文を条件分岐文(条件文ともいう)と呼ぶことにする。
条件分岐文で評価される条件の事を条件式と呼ぶことにする。
条件式は評価の結果、真(TRUE)あるいは偽(FALSE)をとり、真であった場合に実行される条件文中のコード群をTRUEコードブロックと呼ぶ。
同様に偽であった場合に実行されるコード群をFALSEコードブロックと呼ぶことにする。
ただし、FALSEコードブロックは省略される場合もある。そのような条件文では条件式の評価結果が偽の場合には何も実行されない。
条件式は一つ以上の論理式を論理演算子(否定(NOT)、論理積(AND)、論理和(OR))と組み合わせることで表される。
論理演算子を含まない最小の論理式を原子式と呼ぶことにする。
原子式あるいは原子式の否定の論理積だけからなる論理式を積項と呼ぶ。
ソースコード中で、与えられた条件に対する評価結果に応じて処理が分岐する文を条件分岐文(条件文ともいう)と呼ぶことにする。
条件分岐文で評価される条件の事を条件式と呼ぶことにする。
条件式は評価の結果、真(TRUE)あるいは偽(FALSE)をとり、真であった場合に実行される条件文中のコード群をTRUEコードブロックと呼ぶ。
同様に偽であった場合に実行されるコード群をFALSEコードブロックと呼ぶことにする。
ただし、FALSEコードブロックは省略される場合もある。そのような条件文では条件式の評価結果が偽の場合には何も実行されない。
条件式は一つ以上の論理式を論理演算子(否定(NOT)、論理積(AND)、論理和(OR))と組み合わせることで表される。
論理演算子を含まない最小の論理式を原子式と呼ぶことにする。
原子式あるいは原子式の否定の論理積だけからなる論理式を積項と呼ぶ。
図3にて、上記用語についてC言語ソースコードを用いて説明した。
図3(a)では、条件分岐文の構成例を示している。
また、図3(b)では、条件式の構成例を示している。
図3(a)では、条件分岐文の構成例を示している。
また、図3(b)では、条件式の構成例を示している。
対象プログラム400が起動され、機能確認試験が行われると、対象プログラム400中の条件分岐文が実行されるごとに、検査実行用コンパイラ300によって追加で埋め込まれたコードが実行され、その結果分岐実行情報が出力される。
本実施の形態では、分岐実行情報として以下の情報を含む。
実行された条件文識別情報(ソースファイル名、行番号等)、各原子式の評価結果(TRUE, FALSE, 評価されず)、及び条件式の評価結果である。
なお、条件式の評価結果は、各原子式の評価結果と条件式から算出可能であるため必須ではない。
本実施の形態では、分岐実行情報として以下の情報を含む。
実行された条件文識別情報(ソースファイル名、行番号等)、各原子式の評価結果(TRUE, FALSE, 評価されず)、及び条件式の評価結果である。
なお、条件式の評価結果は、各原子式の評価結果と条件式から算出可能であるため必須ではない。
不正コード検査ツール500において、分岐実行状況測定部501は受け取った分岐実行情報を図6で表されるようなテーブルで管理する。
各テーブルは各条件文識別情報でラベル付けされている。
分岐実行情報を分岐実行状況測定部501が受け取ると、情報中の条件文識別情報に基づいてテーブルを選択し、その時の実行モードと分岐実行情報の内容をテーブルに追記する。ただし、既に記録されているレコードと同一の場合には追記されない。
また、実行モードは実行状態入力部503に入力された内容に従う。
このようにして、分岐実行状況測定部501は、条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積する。
各テーブルは各条件文識別情報でラベル付けされている。
分岐実行情報を分岐実行状況測定部501が受け取ると、情報中の条件文識別情報に基づいてテーブルを選択し、その時の実行モードと分岐実行情報の内容をテーブルに追記する。ただし、既に記録されているレコードと同一の場合には追記されない。
また、実行モードは実行状態入力部503に入力された内容に従う。
このようにして、分岐実行状況測定部501は、条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積する。
次に、機能確認試験が完了すると、不正コード精査部504が呼び出され、不正コードの有無の検査が開始する。
なお、不正コード精査部504の起動と同時又は起動よりも前に、ソースコード入力部502により対象ソースコード200が入力され、ソースコード記憶部507に格納されているものとする。
なお、不正コード精査部504の起動と同時又は起動よりも前に、ソースコード入力部502により対象ソースコード200が入力され、ソースコード記憶部507に格納されているものとする。
本実施の形態では、不正コード精査部504が図4に示されるタイプの不正コードを検出することを想定している。
タイプ1は、不正コードとして最も典型的と考えられるタイプで、特定のユーザ名の入力や、指定された時刻への到達等、開発者のみが知る条件で実行される不正コードを記述するものである。
タイプ2は、開発者のみが知る条件(ユーザ名等)を入力すると、特権モードと同等の権限で対象プログラムを操作できるようにする場合を想定している。このような処理の例としては対象プログラムユーザの情報取得等が挙げられる。
タイプ3及びタイプ4は、タイプ1及びタイプ2の条件式を否定したものであり、FALSEコードブロック中に不正な処理が記述される。
タイプ1は、不正コードとして最も典型的と考えられるタイプで、特定のユーザ名の入力や、指定された時刻への到達等、開発者のみが知る条件で実行される不正コードを記述するものである。
タイプ2は、開発者のみが知る条件(ユーザ名等)を入力すると、特権モードと同等の権限で対象プログラムを操作できるようにする場合を想定している。このような処理の例としては対象プログラムユーザの情報取得等が挙げられる。
タイプ3及びタイプ4は、タイプ1及びタイプ2の条件式を否定したものであり、FALSEコードブロック中に不正な処理が記述される。
前節で分類した不正コードのパターンに対する検査方法を示したのが図5の検査対象判別基準情報である。
図5の表中タイプの欄は、先に分類した不正コードのタイプ番号に対応している。
モード毎の条件評価結果は、対象プログラム中に不正コードが含まれていた場合に条件文の条件式が実行状態に応じてどのように評価されるかを表している。つまり、モード毎の条件評価結果の欄に記載される内容は、検査が必要な条件分岐文と検査が不要な条件分岐文とを峻別するための検査対象判別基準である。
モード毎の条件評価結果に示される検査対象判別基準には、不自然な分岐結果のパターンが示される。
つまり、ある条件分岐文の分岐結果が常にTRUE又はFALSEになるのは不自然であると考えられる。
このため、特権モード及び通常モードの両モードで分岐結果が常にTRUE又はFALSEになる条件分岐文、特権モード又は通常モードのいずれかで分岐結果が常にTRUE又はFALSEになる条件分岐文は不自然であり、これらの条件分岐文は検査対象となる。
また、モード毎の条件評価結果に示される基準のうち、タイプ1に対するものは第1の検査対象判別基準の例であり、タイプ2に対するものは第2の検査対象判別基準の例であり、タイプ3に対するものは第3の検査対象判別基準の例であり、タイプ4に対するものは第4の検査対象判別基準の例である。
図5の表中タイプの欄は、先に分類した不正コードのタイプ番号に対応している。
モード毎の条件評価結果は、対象プログラム中に不正コードが含まれていた場合に条件文の条件式が実行状態に応じてどのように評価されるかを表している。つまり、モード毎の条件評価結果の欄に記載される内容は、検査が必要な条件分岐文と検査が不要な条件分岐文とを峻別するための検査対象判別基準である。
モード毎の条件評価結果に示される検査対象判別基準には、不自然な分岐結果のパターンが示される。
つまり、ある条件分岐文の分岐結果が常にTRUE又はFALSEになるのは不自然であると考えられる。
このため、特権モード及び通常モードの両モードで分岐結果が常にTRUE又はFALSEになる条件分岐文、特権モード又は通常モードのいずれかで分岐結果が常にTRUE又はFALSEになる条件分岐文は不自然であり、これらの条件分岐文は検査対象となる。
また、モード毎の条件評価結果に示される基準のうち、タイプ1に対するものは第1の検査対象判別基準の例であり、タイプ2に対するものは第2の検査対象判別基準の例であり、タイプ3に対するものは第3の検査対象判別基準の例であり、タイプ4に対するものは第4の検査対象判別基準の例である。
検査項目は、前記モード毎の条件評価結果マトリクスに該当する条件分岐文を発見した場合に、不正コードが含まれているかの識別方針について概要を説明するものである。
タイプ1の不正コードが含まれていた場合、悪意のある開発者の指定した条件が機能確認試験中に満たされることはないため、実行状態に関わらず(実行モードが通常モード、特権モードのいずれであっても)条件式の評価結果は常にFALSEとなる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
もし、条件文のTRUEコードブロック中に重要な操作が含まれていた場合、不正コードの可能性が高いとみなし、ユーザに通知を行う。
重要な操作を含んでいるかどうかのチェックはコードブロック及びコードブロックから呼び出され得る関数(メソッドも含む)内のコードを調べ、重要操作データベースに登録されている関数呼び出しや状態変数の操作が行われていないかを確認することで行われる。
この処理は確認対象となっている関数が別の関数を呼び出している場合、再帰的に行われ、開発対象外のAPI(Application Program Interface)への呼び出しに達するまで行われる。
タイプ1の不正コードが含まれていた場合、悪意のある開発者の指定した条件が機能確認試験中に満たされることはないため、実行状態に関わらず(実行モードが通常モード、特権モードのいずれであっても)条件式の評価結果は常にFALSEとなる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
もし、条件文のTRUEコードブロック中に重要な操作が含まれていた場合、不正コードの可能性が高いとみなし、ユーザに通知を行う。
重要な操作を含んでいるかどうかのチェックはコードブロック及びコードブロックから呼び出され得る関数(メソッドも含む)内のコードを調べ、重要操作データベースに登録されている関数呼び出しや状態変数の操作が行われていないかを確認することで行われる。
この処理は確認対象となっている関数が別の関数を呼び出している場合、再帰的に行われ、開発対象外のAPI(Application Program Interface)への呼び出しに達するまで行われる。
タイプ2の不正コードが含まれていた場合、条件式がTRUEになることは通常モードでは決してないが、特権モードだと少なくとも一度はTRUEになるはずである。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
問題となるのは、特権モード以外の場合でも条件式がTRUEになる場合があるかどうかである。もしそのような条件が存在するならば、特権モード以外でもTRUEコードブロックを実行できる可能性があることになる。そのため、TRUEコードブロック中に重要な操作が含まれていた場合、不正コードの可能性が高いとみなす。タイプ2に対する検査方法の詳細は後述する。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
問題となるのは、特権モード以外の場合でも条件式がTRUEになる場合があるかどうかである。もしそのような条件が存在するならば、特権モード以外でもTRUEコードブロックを実行できる可能性があることになる。そのため、TRUEコードブロック中に重要な操作が含まれていた場合、不正コードの可能性が高いとみなす。タイプ2に対する検査方法の詳細は後述する。
タイプ3の不正コードが含まれていた場合、機能確認試験中に条件式がFALSEになることはないため、実行状態に関わらず(実行モードが通常モード、特権モードのいずれであっても)条件式の評価結果は常にTRUEとなる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
タイプ3の場合、FALSEコードブロック内に重要な操作が含まれていないかを確認することで不正コード有無を判定する。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
タイプ3の場合、FALSEコードブロック内に重要な操作が含まれていないかを確認することで不正コード有無を判定する。
タイプ4の不正コードはタイプ2の逆であり、特権モードでは決して条件式がTRUEに評価されず、通常モードでは少なくとも一度はTRUEになる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
タイプ4の場合は、タイプ2の場合と同様に、特権モードであること以外にFALSEに評価されるための条件が存在するかを確認し、FALSEコードブロック中に重要な操作が無いかのチェックを行う。
タイプ4に対する検査方法の詳細は後述する。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
タイプ4の場合は、タイプ2の場合と同様に、特権モードであること以外にFALSEに評価されるための条件が存在するかを確認し、FALSEコードブロック中に重要な操作が無いかのチェックを行う。
タイプ4に対する検査方法の詳細は後述する。
また、図5に示す以外の評価結果、つまり特権モード、通常モードどちらにおいてもTRUE、FALSEの両方が現れた場合、その条件文には不正コードが含まれていないものとみなす。
以上の説明を前提に、図13を参照して不正コード検査ツール500の動作例を説明する。
先ず、ソースコード入力部502が、対象ソースコード200を入力し、ソースコード記憶部507に格納する(S1301)(プログラムコード入力ステップ)。
次に、分岐実行状況測定部501が検査実行用コンパイラ300(又は他システム)から分岐実行情報を入力しまた、実行状態入力部503が分岐実行情報が対象としている実行モードの種類を示す実行モード情報を入力する(S1302)(分岐実行情報入力ステップ)。
そして、分岐実行状況測定部501が、分岐実行情報に示される分岐結果を実行モードに従って図6に示すテーブルに登録する(S1303)。
なお、機能確認試験が実施されている間は、分岐実行状況測定部501は、繰り返し分岐実行情報を入力することになる。そして、分岐実行状況測定部501は、分岐実行情報を入力する度に、図6に示すテーブルに登録することで、条件分岐文ごとに、実行モードを区別しながら、分岐結果を順次蓄積していく。
この結果、機能確認試験が進行するにつれ、図6に示すテーブルのレコードが増えていく。
また、図13では、最初にソースコード入力部502が対象ソースコード200を入力する(S1301)こととしているが、機能確認試験の終了後、不正コード精査部504が起動するまでに対象ソースコード200を入力すればよい。
先ず、ソースコード入力部502が、対象ソースコード200を入力し、ソースコード記憶部507に格納する(S1301)(プログラムコード入力ステップ)。
次に、分岐実行状況測定部501が検査実行用コンパイラ300(又は他システム)から分岐実行情報を入力しまた、実行状態入力部503が分岐実行情報が対象としている実行モードの種類を示す実行モード情報を入力する(S1302)(分岐実行情報入力ステップ)。
そして、分岐実行状況測定部501が、分岐実行情報に示される分岐結果を実行モードに従って図6に示すテーブルに登録する(S1303)。
なお、機能確認試験が実施されている間は、分岐実行状況測定部501は、繰り返し分岐実行情報を入力することになる。そして、分岐実行状況測定部501は、分岐実行情報を入力する度に、図6に示すテーブルに登録することで、条件分岐文ごとに、実行モードを区別しながら、分岐結果を順次蓄積していく。
この結果、機能確認試験が進行するにつれ、図6に示すテーブルのレコードが増えていく。
また、図13では、最初にソースコード入力部502が対象ソースコード200を入力する(S1301)こととしているが、機能確認試験の終了後、不正コード精査部504が起動するまでに対象ソースコード200を入力すればよい。
次に、機能確認試験が終了する(S1304)と、不正コード精査部504が起動され、不正コード精査部504が図5に示す検査対象判別基準情報を参照する(S1305)(検査対象判別基準情報参照ステップ)。
そして、不正コード精査部504は、条件分岐文ごとに、分岐実行状況測定部501において図6の形式で蓄積されている蓄積分岐結果がいずれかの検査対象判別基準(タイプ1〜4)に合致するかどうかを判断し、ある条件分岐文について、蓄積分岐結果がいずれの検査対象判別基準にも合致しない場合(S1306でNO)は、その条件分岐文には不正コードが含まれている可能性がないと判定する(S1313)(コードブロック検査ステップ)。
一方、蓄積分岐結果がいずれかの検査対象判別基準に合致する場合(S1306でYES)は、該当するタイプにより処理が異なる(S1307)。
タイプ2又はタイプ4の場合は、図7に示す処理が行われる(S1311)(コードブロック検査ステップ)。図7に示す処理の内容は後述する。
そして、不正コード精査部504は、条件分岐文ごとに、分岐実行状況測定部501において図6の形式で蓄積されている蓄積分岐結果がいずれかの検査対象判別基準(タイプ1〜4)に合致するかどうかを判断し、ある条件分岐文について、蓄積分岐結果がいずれの検査対象判別基準にも合致しない場合(S1306でNO)は、その条件分岐文には不正コードが含まれている可能性がないと判定する(S1313)(コードブロック検査ステップ)。
一方、蓄積分岐結果がいずれかの検査対象判別基準に合致する場合(S1306でYES)は、該当するタイプにより処理が異なる(S1307)。
タイプ2又はタイプ4の場合は、図7に示す処理が行われる(S1311)(コードブロック検査ステップ)。図7に示す処理の内容は後述する。
タイプ1又はタイプ3の場合は、検査対象コードブロックの内容を検査する(S1308)(コードブロック検査ステップ)。
図5に示すとおり、タイプ1の場合は、その条件分岐文に含まれるTRUEコードブロックが検査対象コードブロックになり、タイプ3の場合は、その条件分岐文に含まれるFALSEコードブロックが検査対象コードブロックになる。
不正コード精査部504は、ソースコード記憶部507に記憶されている対象ソースコード200から該当する条件分岐文を抽出し、抽出した条件分岐文に含まれるコードブロックのうちTRUEコードブロック(タイプ1の場合)又はFALSEコードブロック(タイプ3の場合)を抽出し、抽出した検査対象コードブロックを検査する。
検査の方法は、抽出した検査対象コードブロックに重要操作データベース508に格納されている重要操作(不正目的に利用される可能性のある関数、状態変数等)が含まれていないか等を検査する。
検査対象コードブロックに重要操作が含まれていない場合(S1309でNO)は、その条件分岐文には不正コードが含まれている可能性がないと判定する(S1313)(コードブロック検査ステップ)。
一方、検査対象コードブロックに重要操作が含まれている場合(S1309でYES)は、その条件分岐文には不正コードが含まれている可能性があると判定する(S1310)(コードブロック検査ステップ)。
また、図6に示すテーブルに示されている条件分岐文のうちまだ検査を行っていない条件分岐文があれば、不正コード精査部504は、その条件分岐文についてS1306以降の処理を行う。
その後、検査結果通知部505が不正コード精査部504の判定結果をユーザに通知する(S1312)。
図5に示すとおり、タイプ1の場合は、その条件分岐文に含まれるTRUEコードブロックが検査対象コードブロックになり、タイプ3の場合は、その条件分岐文に含まれるFALSEコードブロックが検査対象コードブロックになる。
不正コード精査部504は、ソースコード記憶部507に記憶されている対象ソースコード200から該当する条件分岐文を抽出し、抽出した条件分岐文に含まれるコードブロックのうちTRUEコードブロック(タイプ1の場合)又はFALSEコードブロック(タイプ3の場合)を抽出し、抽出した検査対象コードブロックを検査する。
検査の方法は、抽出した検査対象コードブロックに重要操作データベース508に格納されている重要操作(不正目的に利用される可能性のある関数、状態変数等)が含まれていないか等を検査する。
検査対象コードブロックに重要操作が含まれていない場合(S1309でNO)は、その条件分岐文には不正コードが含まれている可能性がないと判定する(S1313)(コードブロック検査ステップ)。
一方、検査対象コードブロックに重要操作が含まれている場合(S1309でYES)は、その条件分岐文には不正コードが含まれている可能性があると判定する(S1310)(コードブロック検査ステップ)。
また、図6に示すテーブルに示されている条件分岐文のうちまだ検査を行っていない条件分岐文があれば、不正コード精査部504は、その条件分岐文についてS1306以降の処理を行う。
その後、検査結果通知部505が不正コード精査部504の判定結果をユーザに通知する(S1312)。
次に、不正コード有無の検査方法のうち、タイプ2及びタイプ4の検査について図7を用いてより詳細に説明する。
図7に示される処理は、不正コード精査部504により実行される。
まず、評価結果の分類がタイプ2かタイプ4かで分岐する(S701)。
不正コード精査部504は、タイプ2の場合には検証する条件式(図中fで表示)を元の条件式とし(S702)、重要操作の検査対象(図中Bで表示)は条件文中のTRUEコードブロックとする(S704)。
さらに、S709での判定に用いるレコードの集合(図中Sで表示)を、機能確認試験において、その条件式がTRUEと評価されかつ特権モードであった全てのレコードの集合とする(S706)。
一方、タイプ4であったならばfを元の条件式の否定とし(S703)、BはFALSEコードブロックとし(S705)、Sはその条件式がFALSEと評価されかつ特権モードであった全てのレコードの集合とする(S707)。
S706,S707による処理の例を図8に示す。
図7に示される処理は、不正コード精査部504により実行される。
まず、評価結果の分類がタイプ2かタイプ4かで分岐する(S701)。
不正コード精査部504は、タイプ2の場合には検証する条件式(図中fで表示)を元の条件式とし(S702)、重要操作の検査対象(図中Bで表示)は条件文中のTRUEコードブロックとする(S704)。
さらに、S709での判定に用いるレコードの集合(図中Sで表示)を、機能確認試験において、その条件式がTRUEと評価されかつ特権モードであった全てのレコードの集合とする(S706)。
一方、タイプ4であったならばfを元の条件式の否定とし(S703)、BはFALSEコードブロックとし(S705)、Sはその条件式がFALSEと評価されかつ特権モードであった全てのレコードの集合とする(S707)。
S706,S707による処理の例を図8に示す。
図8において、連番の1〜4は、ある条件分岐文がタイプ2の基準に合致した場合の当該条件分岐文に含まれる各原子式における真偽結果を示している。
また、連番の5〜7は、ある条件分岐文がタイプ4の基準に合致した場合の当該条件分岐文に含まれる各原子式における真偽結果を示している。
タイプ2の場合、図5に示すように、通常モード実行時の分岐結果が常にFALSEであって特権モード実行時の分岐結果が少なくとも一度TRUEとなれば検査対象となる。そして、タイプ2の場合は、図5の検査項目に示すように、TRUEになる条件のうち、一度も満たされなかったもの(一度もTRUEにならなかった原子式)がないかを確認するため、分岐結果(図8の結果の欄)がTRUEになったレコードを抽出する。図8の例では、特権モードにおいて分岐結果がTRUEとなっている1、2、4番のレコードをS709の対象とする(S={1、2、4})。
タイプ4の場合、図5に示すように、通常モード実行時の分岐結果が少なくとも一度はTRUEであり特権モード実行時の分岐結果が常にFALSEであれば検査対象となる。そして、タイプ4の場合は、図5の検査項目に示すように、FALSEになる条件のうち、一度も満たされなかったもの(一度もTRUEにならなかった原子式)がないかを確認するため、分岐結果(図8の結果の欄)がFALSEになったレコードを抽出する。図8の例では、特権モードにおいて分岐結果がFALSEとなっている5、6番のレコードをS709の対象とする(S={5、6})。
また、連番の5〜7は、ある条件分岐文がタイプ4の基準に合致した場合の当該条件分岐文に含まれる各原子式における真偽結果を示している。
タイプ2の場合、図5に示すように、通常モード実行時の分岐結果が常にFALSEであって特権モード実行時の分岐結果が少なくとも一度TRUEとなれば検査対象となる。そして、タイプ2の場合は、図5の検査項目に示すように、TRUEになる条件のうち、一度も満たされなかったもの(一度もTRUEにならなかった原子式)がないかを確認するため、分岐結果(図8の結果の欄)がTRUEになったレコードを抽出する。図8の例では、特権モードにおいて分岐結果がTRUEとなっている1、2、4番のレコードをS709の対象とする(S={1、2、4})。
タイプ4の場合、図5に示すように、通常モード実行時の分岐結果が少なくとも一度はTRUEであり特権モード実行時の分岐結果が常にFALSEであれば検査対象となる。そして、タイプ4の場合は、図5の検査項目に示すように、FALSEになる条件のうち、一度も満たされなかったもの(一度もTRUEにならなかった原子式)がないかを確認するため、分岐結果(図8の結果の欄)がFALSEになったレコードを抽出する。図8の例では、特権モードにおいて分岐結果がFALSEとなっている5、6番のレコードをS709の対象とする(S={5、6})。
次に、図7のフローにおいて、不正コード精査部504は、S708でfを積和標準形(加法標準形)に変換する。
積和標準形とは積項の論理和だけで表現される論理式であり、任意の論理式は適当な式変形により等価な積和標準形に変換できることが知られている。
次に、不正コード精査部504は、S709ではS708で変換されたfについてS中の各レコードの原子式の値を当てはめ、f中の各積項がTRUEになるかを確認する(図9参照)。
もしS内の全てのレコードに対して一度もTRUEにならない積項が存在したならばS710に分岐してコードブロックB中に重要操作が含まれているかを確認し、含まれていたならばS711で不正コードの可能性有りとする。
S709で全ての積項が一度はTRUEになるか、S710でB内に重要操作が含まれていなかった場合には、S712に進み、不正コードの可能性無と判定する。
積和標準形とは積項の論理和だけで表現される論理式であり、任意の論理式は適当な式変形により等価な積和標準形に変換できることが知られている。
次に、不正コード精査部504は、S709ではS708で変換されたfについてS中の各レコードの原子式の値を当てはめ、f中の各積項がTRUEになるかを確認する(図9参照)。
もしS内の全てのレコードに対して一度もTRUEにならない積項が存在したならばS710に分岐してコードブロックB中に重要操作が含まれているかを確認し、含まれていたならばS711で不正コードの可能性有りとする。
S709で全ての積項が一度はTRUEになるか、S710でB内に重要操作が含まれていなかった場合には、S712に進み、不正コードの可能性無と判定する。
以上のように、本実施の形態に係る不正コード検査装置では、条件分岐の実行状況を出力するようコンパイルされた対象プログラムに対し機能確認試験を実施し、出力された条件分岐の実行状況情報を収集し、不自然な分岐結果となった条件文に対してコードブロック内の重要操作の有無を検査することで、開発者により秘密の条件で動作するように実装された不正コードを検出できるようになる、という効果がある。
なお、前記タイプ1からタイプ4に該当するが、かつ不正コードの可能性無と判断された場合、試験が十分ではない恐れがあると警告を出力させることも可能である。
つまり、不正コード精査部504が、いずれかの条件分岐文の蓄積分岐結果がタイプ1〜4のいずれかの検査対象判別基準に合致すると判定したが、当該条件分岐文の検査対象コードブロックを検査した結果、当該検査対象コードブロックが不正コードブロックでなかった場合に、検査結果通知部505が、当該条件分岐文に対する機能確認試験が十分に行われなかった可能性がある旨をユーザに通知するようにしてもよい。
つまり、不正コード精査部504が、いずれかの条件分岐文の蓄積分岐結果がタイプ1〜4のいずれかの検査対象判別基準に合致すると判定したが、当該条件分岐文の検査対象コードブロックを検査した結果、当該検査対象コードブロックが不正コードブロックでなかった場合に、検査結果通知部505が、当該条件分岐文に対する機能確認試験が十分に行われなかった可能性がある旨をユーザに通知するようにしてもよい。
また、図5の例では、特権モードでの動作が可能となる不正コードを発見することを目的にタイプ2、タイプ4の基準が含んでいるが、タイプ1とタイプ3の不正コードのみを発見すれば足りるような場合は、図14に示す検査対象判別基準を用いるようにしてもよい。
以上、本実施の形態では、対象プログラム実行時に条件分岐の実行状況を出力するようなコードを生成する検査実行用コンパイラと、対象プログラム実行時に出力される条件分岐実行状況の情報と対象プログラムのソースコードを入力として不正コードの有無を検査する不正コード検査ツールからなる不正コード検査装置について説明した。
また、本実施の形態では、上記の不正コード検査ツールが、悪用されると危険な関数や状態変数の一覧が格納される重要操作データベースを持つことを説明した。
また、本実施の形態では、不正コード検査ツールが、条件分岐実行情況の情報を検査対象プログラムの動作を特権モードと通常モードに分類した上で不正コードの検査を行うことを説明した。
また、本実施の形態では、不正コード検査ツールは、不正コードのタイプをタイプ1〜4に分類し、また、それぞれに対する検査方法を規定した情報を有していることを説明した。
また、本実施の形態では、不正コード検査ツールが、タイプ1〜4に該当しているにも関わらず不正コードでなかった場合に、警告を出力する機能を有することを説明した。
実施の形態2.
図10は、本実施の形態に係る不正コード検査装置100の構成例を示す。
実施の形態1と異なり、対象プログラム400の実行結果を実行モード毎にファイル等識別できる状態で格納し、不正コード検査ツールに入力する点を主な特徴としている。
つまり、実施の形態1では、機能確認試験において条件分岐文が実行される度に、機能確認試験システム(検査実行用コンパイラ300又は他システム)から、実行された条件分岐文における分岐結果を示す分岐実行情報が出力され、不正コード検査ツール500では、繰り返し出力される分岐実行情報に示される分岐結果を分岐実行状況測定部501において図6に示す形式で蓄積していた。
一方、本実施の形態では、機能確認試験の間、機能確認試験システム(検査実行用コンパイラ300又は他システム)側で各条件分岐文の実行結果を蓄積し、機能確認試験が終了した後、通常モードの実行結果が示される分岐実行情報ファイル700と特権モードの実行結果が示される分岐実行情報ファイル800が出力される。
これらの分岐実行情報ファイルには、対象プログラム400に含まれる全ての分岐条件文について機能確認試験において実行された際の分岐結果の蓄積が示される。
不正コード検査ツール500では、分岐実行状況測定部501が、分岐実行情報ファイル700及び分岐実行情報ファイル800を入力し、不正コード精査部504が、条件分岐文ごとに、分岐実行情報ファイル700、800に示される蓄積された分岐結果がいずれかの検査対象判別基準に合致するかを判定し、検査対象コードブロックの検査を行う。
不正コード精査部504の動作は、実施の形態1と同様なので、動作の詳細は省略する。
図10は、本実施の形態に係る不正コード検査装置100の構成例を示す。
実施の形態1と異なり、対象プログラム400の実行結果を実行モード毎にファイル等識別できる状態で格納し、不正コード検査ツールに入力する点を主な特徴としている。
つまり、実施の形態1では、機能確認試験において条件分岐文が実行される度に、機能確認試験システム(検査実行用コンパイラ300又は他システム)から、実行された条件分岐文における分岐結果を示す分岐実行情報が出力され、不正コード検査ツール500では、繰り返し出力される分岐実行情報に示される分岐結果を分岐実行状況測定部501において図6に示す形式で蓄積していた。
一方、本実施の形態では、機能確認試験の間、機能確認試験システム(検査実行用コンパイラ300又は他システム)側で各条件分岐文の実行結果を蓄積し、機能確認試験が終了した後、通常モードの実行結果が示される分岐実行情報ファイル700と特権モードの実行結果が示される分岐実行情報ファイル800が出力される。
これらの分岐実行情報ファイルには、対象プログラム400に含まれる全ての分岐条件文について機能確認試験において実行された際の分岐結果の蓄積が示される。
不正コード検査ツール500では、分岐実行状況測定部501が、分岐実行情報ファイル700及び分岐実行情報ファイル800を入力し、不正コード精査部504が、条件分岐文ごとに、分岐実行情報ファイル700、800に示される蓄積された分岐結果がいずれかの検査対象判別基準に合致するかを判定し、検査対象コードブロックの検査を行う。
不正コード精査部504の動作は、実施の形態1と同様なので、動作の詳細は省略する。
このように、本実施の形態に係る不正コード検査装置では、機能確認試験の実施と不正コード検査を分離して実行できる、という効果がある。
以上、本実施の形態では、条件分岐実行状況の情報を実行モード毎に識別可能な形式で出力するようにした点を説明した。
実施の形態3.
図11は、本実施の形態に係る不正コード検査装置100の構成例を示す。
実施の形態1と異なり、ソース変更点検出部510及び検査済みコードデータベース509を具備することで、以前の検査によって問題無しと判定され、かつ前回と今回とで変更が無かったコードに関しては検査を再度実行しないことを主な特徴とする。
不正コード検査の結果、問題無しと判断されたソースコードに関してはソースファイル、あるいはソースファイル内の関数記述毎にハッシュ値が計算され、検査済みコードデータベース509に格納される。
次回検査時には入力されたソースコードから同様にハッシュ値を計算し、検査済みコードデータベース509に記録されているハッシュ値と比較する。
比較の結果、ハッシュ値が一致しなかったソースファイル、あるいは関数内の条件分岐のみを検査対象とする。
図11は、本実施の形態に係る不正コード検査装置100の構成例を示す。
実施の形態1と異なり、ソース変更点検出部510及び検査済みコードデータベース509を具備することで、以前の検査によって問題無しと判定され、かつ前回と今回とで変更が無かったコードに関しては検査を再度実行しないことを主な特徴とする。
不正コード検査の結果、問題無しと判断されたソースコードに関してはソースファイル、あるいはソースファイル内の関数記述毎にハッシュ値が計算され、検査済みコードデータベース509に格納される。
次回検査時には入力されたソースコードから同様にハッシュ値を計算し、検査済みコードデータベース509に記録されているハッシュ値と比較する。
比較の結果、ハッシュ値が一致しなかったソースファイル、あるいは関数内の条件分岐のみを検査対象とする。
つまり、本実施の形態では、不正コード精査部504による検査の結果ある条件分岐文が正当な(不正コードブロックが含まれていない)条件分岐文であると判明した場合に、不正コード精査部504が、当該検査済み条件分岐文の少なくとも一部を用いてハッシュ演算を行い、ハッシュ演算により得られたハッシュ値を検査済みコードデータベース509に登録する。
そして、不正コード精査部504が新たな検査を行う場合には、ソース変更点検出部510が、新たに検査の対象となった新たな条件分岐文の少なくとも一部を用いてハッシュ演算を行い、新たな条件分岐文に対するハッシュ演算により得られたハッシュ値と検査済みコードデータベース509に登録しているハッシュ値とを比較し、両ハッシュ値が一致する場合に、不正コード精査部504は、新たな条件分岐文の検査を行わない。
そして、不正コード精査部504が新たな検査を行う場合には、ソース変更点検出部510が、新たに検査の対象となった新たな条件分岐文の少なくとも一部を用いてハッシュ演算を行い、新たな条件分岐文に対するハッシュ演算により得られたハッシュ値と検査済みコードデータベース509に登録しているハッシュ値とを比較し、両ハッシュ値が一致する場合に、不正コード精査部504は、新たな条件分岐文の検査を行わない。
以上のように、本実施の形態では、前回からのソースコードの変更有無を識別し、改変のあった部分だけ検査することで、ソフトウェアの改版等において不正コード検査にかかる時間を短縮できるという効果がある。
以上、本実施の形態では、不正コード検査ツール内で前回検査時のソースコードのハッシュを記憶しておくことで、変更のあった箇所のみ不正コード検査を行うようにした点を説明した。
実施の形態4.
図12は、本実施の形態に係る不正コード検査装置100の構成例を示す。
本実施の形態では、実施の形態3で説明したソース変更点検出部510及び検査済みコードデータベース509の内容を検査実行用コンパイラから参照させることで、検査が完了しているソースコードに対しては分岐実行情報を出力するコードを生成しないようにしている。
図12は、本実施の形態に係る不正コード検査装置100の構成例を示す。
本実施の形態では、実施の形態3で説明したソース変更点検出部510及び検査済みコードデータベース509の内容を検査実行用コンパイラから参照させることで、検査が完了しているソースコードに対しては分岐実行情報を出力するコードを生成しないようにしている。
つまり、実施の形態1で説明したように、検査実行用コンパイラ300は、分岐実行情報を出力させるためのコードを条件分岐文に付加し、機能確認試験システム(検査実行用コンパイラ300又は他システム)は、機能確認試験の際に、当該付加されたコードに基づき分岐実行情報を出力する。このため、前述したように、検査実行用コンパイラ300は、コード付加システムとして機能している。
本実施の形態では、不正コード検査ツール500は、検査済みの条件分岐文に対するハッシュ演算により得られたハッシュ値を検査実行用コンパイラ300から参照可能なように検査済みコードデータベース509に登録している。
そして、検査実行用コンパイラ300が新たなプログラムコードの条件分岐文に対してコードを付加する際に、ソース変更点検出部510を用いて検査済みコードデータベース509に登録しているハッシュ値を参照するとともに、新たなプログラムコードの条件分岐文のハッシュ値を生成し、生成したハッシュ値と登録されているハッシュ値と比較し、両ハッシュ値が一致する場合は、当該条件分岐文にコードを付加しない。
これにより、既に検査済みの条件分岐文に対しては分岐条件情報が出力されないことになる。
本実施の形態では、不正コード検査ツール500は、検査済みの条件分岐文に対するハッシュ演算により得られたハッシュ値を検査実行用コンパイラ300から参照可能なように検査済みコードデータベース509に登録している。
そして、検査実行用コンパイラ300が新たなプログラムコードの条件分岐文に対してコードを付加する際に、ソース変更点検出部510を用いて検査済みコードデータベース509に登録しているハッシュ値を参照するとともに、新たなプログラムコードの条件分岐文のハッシュ値を生成し、生成したハッシュ値と登録されているハッシュ値と比較し、両ハッシュ値が一致する場合は、当該条件分岐文にコードを付加しない。
これにより、既に検査済みの条件分岐文に対しては分岐条件情報が出力されないことになる。
このように、本実施の形態によれば、実施の形態3と異なり、分岐実行情報は変更のあったコードに関するものしか出力されなくなるため、不正コード検査ツールでは検査時にソースコードの差分についてチェックする必要が無くなる。
また、分岐実行情報の出力量が減るため検査のためのオーバヘッドが軽減され、不正コード検査にかかる時間を短縮できるという効果がある。
また、分岐実行情報の出力量が減るため検査のためのオーバヘッドが軽減され、不正コード検査にかかる時間を短縮できるという効果がある。
以上、本実施の形態では、前回検査時のソースコードのハッシュを記憶し、検査実行用コンパイラに入力することで、前回検査から変更のあった箇所だけ条件分岐実行状況の情報を生成するようにした点を説明した。
最後に、実施の形態1〜4に示した不正コード検査装置100のハードウェア構成例について説明する。
図15は、実施の形態1〜4に示す不正コード検査装置100のハードウェア資源の一例を示す図である。
なお、図15の構成は、あくまでも不正コード検査装置100のハードウェア構成の一例を示すものであり、不正コード検査装置100のハードウェア構成は図15に記載の構成に限らず、他の構成であってもよい。
図15は、実施の形態1〜4に示す不正コード検査装置100のハードウェア資源の一例を示す図である。
なお、図15の構成は、あくまでも不正コード検査装置100のハードウェア構成の一例を示すものであり、不正コード検査装置100のハードウェア構成は図15に記載の構成に限らず、他の構成であってもよい。
図15において、不正コード検査装置100は、プログラムを実行するCPU911(Central Processing Unit、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう)を備えている。
CPU911は、バス912を介して、例えば、ROM(Read Only Memory)913、RAM(Random Access Memory)914、通信ボード915、表示装置901、キーボード902、マウス903、磁気ディスク装置920と接続され、これらのハードウェアデバイスを制御する。
更に、CPU911は、FDD904(Flexible Disk Drive)、コンパクトディスク装置905(CDD)、プリンタ装置906、スキャナ装置907と接続していてもよい。また、磁気ディスク装置920の代わりに、光ディスク装置、メモリカード(登録商標)読み書き装置などの記憶装置でもよい。
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード915、キーボード902、マウス903、スキャナ装置907、FDD904などは、入力装置の一例である。
また、通信ボード915、表示装置901、プリンタ装置906などは、出力装置の一例である。
CPU911は、バス912を介して、例えば、ROM(Read Only Memory)913、RAM(Random Access Memory)914、通信ボード915、表示装置901、キーボード902、マウス903、磁気ディスク装置920と接続され、これらのハードウェアデバイスを制御する。
更に、CPU911は、FDD904(Flexible Disk Drive)、コンパクトディスク装置905(CDD)、プリンタ装置906、スキャナ装置907と接続していてもよい。また、磁気ディスク装置920の代わりに、光ディスク装置、メモリカード(登録商標)読み書き装置などの記憶装置でもよい。
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード915、キーボード902、マウス903、スキャナ装置907、FDD904などは、入力装置の一例である。
また、通信ボード915、表示装置901、プリンタ装置906などは、出力装置の一例である。
通信ボード915は、例えば、通信ボード915は、LAN(ローカルエリアネットワーク)、インターネット、WAN(ワイドエリアネットワーク)などに接続されていても構わない。
磁気ディスク装置920には、オペレーティングシステム921(OS)、ウィンドウシステム922、プログラム群923、ファイル群924が記憶されている。プログラム群923のプログラムは、CPU911、オペレーティングシステム921、ウィンドウシステム922により実行される。
ROM913には、BIOS(Basic Input Output System)プログラムが格納され、磁気ディスク装置920にはブートプログラムが格納されている。
不正コード検査装置100の起動時には、ROM913のBIOSプログラム及び磁気ディスク装置920のブートプログラムが実行され、BIOSプログラム及びブートプログラムによりオペレーティングシステム921が起動される。
不正コード検査装置100の起動時には、ROM913のBIOSプログラム及び磁気ディスク装置920のブートプログラムが実行され、BIOSプログラム及びブートプログラムによりオペレーティングシステム921が起動される。
上記プログラム群923には、実施の形態1〜4に示した検査実行用コンパイラ300及び不正コード検査ツール500の構成要素として「〜部」として示している機能を実行するプログラムが記憶されている。プログラムは、CPU911により読み出され実行される。
また、ファイル群924には、検査対象判別基準情報記憶部506の内容として説明した検査対象判別基準情報、重要操作データベース508の内容として説明した重要操作等が含まれている。
また、ファイル群924には、実施の形態1〜4の説明において、「〜の判断」、「〜の判定」、「〜の検査」、「〜の計算」、「〜の比較」、「〜の評価」、「〜の更新」、「〜の設定」、「〜の変換」、「〜の登録」、「〜の選択」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのCPUの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
また、実施の形態1〜4で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、RAM914のメモリ、FDD904のフレキシブルディスク、CDD905のコンパクトディスク、磁気ディスク装置920の磁気ディスク、その他光ディスク、ミニディスク、DVD等の記録媒体に記録される。また、データや信号は、バス912や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
また、ファイル群924には、実施の形態1〜4の説明において、「〜の判断」、「〜の判定」、「〜の検査」、「〜の計算」、「〜の比較」、「〜の評価」、「〜の更新」、「〜の設定」、「〜の変換」、「〜の登録」、「〜の選択」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのCPUの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
また、実施の形態1〜4で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、RAM914のメモリ、FDD904のフレキシブルディスク、CDD905のコンパクトディスク、磁気ディスク装置920の磁気ディスク、その他光ディスク、ミニディスク、DVD等の記録媒体に記録される。また、データや信号は、バス912や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
また、実施の形態1〜4の説明において「〜部」として説明しているものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明しているものは、ROM913に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、DVD等の記録媒体に記憶される。プログラムはCPU911により読み出され、CPU911により実行される。すなわち、プログラムは、実施の形態1〜4の「〜部」としてコンピュータを機能させるものである。あるいは、実施の形態1〜4の「〜部」の手順や方法をコンピュータに実行させるものである。
このように、実施の形態1〜4に示す不正コード検査装置100は、処理装置たるCPU、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータであり、上記したように「〜部」として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。
100 不正コード検査装置、200 不正コード検査対象ソースコード、300 検査実行用コンパイラ、400 不正コード検査対象プログラム、500 不正コード検査ツール、501 分岐実行状況測定部、502 ソースコード入力部、503 実行状態入力部、504 不正コード精査部、505 検査結果通知部、506 検査対象判別基準情報記憶部、507 ソースコード記憶部、508 重要操作データベース、509 検査済みコードデータベース、510 ソース変更点検出部、600 検査結果、700 分岐実行情報ファイル、800 分岐実行情報ファイル。
Claims (20)
- 条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力部と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力部と、
前記分岐実行情報入力部により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積部と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を記憶する検査対象判別基準情報記憶部と、
条件分岐文ごとに、前記分岐結果蓄積部に蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査部とを有することを特徴とするコード検査システム。 - 前記検査対象判別基準情報記憶部は、
不自然な分岐結果のパターンが示され、不自然な分岐結果のパターンに合致する条件分岐文を検査対象とする検査対象判別基準を一つ以上含む検査対象判別基準情報を記憶することを特徴とする請求項1に記載のコード検査システム。 - 前記コード検査システムは、更に、
不正目的に利用される可能性のあるデータを不正利用可能データとして示す不正利用可能データ情報を記憶する不正利用可能データ情報記憶部を有し、
前記コードブロック検査部は、
前記不正利用可能データ情報に示される不正利用可能データが前記検査対象コードブロックに含まれているか否か及び前記検査対象コードブロックが前記不正利用可能データを利用するか否かを検査し、前記検査対象コードブロックに不正利用可能データが含まれている場合及び前記検査対象コードブロックが前記不正利用可能データを利用している場合の少なくともいずれかにおいて、当該検査対象コードブロックを不正目的の可能性のある不正コードブロックに指定することを特徴とする請求項1又は2に記載のコード検査システム。 - 前記不正利用可能データ情報記憶部は、
不正目的に利用される可能性のある関数及び状態変数の少なくともいずれを前記不正利用可能データとして示す不正利用可能データ情報を記憶することを特徴とする請求項3に記載のコード検査システム。 - 前記プログラムコード入力部は、
特権モード及び通常モードの2つの実行モードで実行させることができ、条件式に対する評価結果がTRUEである場合に実行されるTRUEコードブロックと条件式に対する評価結果がFALSEである場合に実行されるFALSEコードブロックとが含まれる条件分岐文を含むプログラムコードを入力し、
前記分岐実行情報入力部は、
前記特権モード及び前記通常モードの各々で条件分岐文を実行する機能確認試験システムから、前記特権モードで実行した際の条件分岐文の分岐結果を示す分岐実行情報及び前記通常モードで実行した際の条件分岐文の分岐結果を示す分岐実行情報を入力し、
前記分岐結果蓄積部は、
条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積し、
前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が常にFALSEであり、前記通常モードで実行された場合は分岐結果が常にFALSEであることを第1の検査対象判別基準とし、前記第1の検査対象判別基準における検査対象のコードブロックの種類をTRUEコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第1の検査対象判別基準に合致すると判定した場合に、当該条件分岐文に含まれるTRUEコードブロックを前記プログラムコードから抽出し、抽出したTRUEコードブロックを検査することを特徴とする請求項1〜4のいずれかに記載のコード検査システム。 - 前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が少なくとも一度はTRUEであり、前記通常モードで実行された場合は分岐結果が常にFALSEであることを第2の検査対象判別基準とし、前記第2の検査対象判別基準における検査対象のコードブロックの種類をTRUEコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第2の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出し、抽出した条件式を積和標準形に変換し、積和標準形に変換した条件式を用いた処理の結果が特定の結果となった場合に、前記第2の検査対象判別基準に合致する条件分岐文に含まれるTRUEコードブロックを前記プログラムコードから抽出し、抽出したTRUEコードブロックを検査することを特徴とする請求項5に記載のコード検査システム。 - 前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が常にTRUEであり、前記通常モードで実行された場合は分岐結果が常にTRUEであることを第3の検査対象判別基準とし、前記第3の検査対象判別基準における検査対象のコードブロックの種類をFALSEコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第3の検査対象判別基準に合致すると判定した場合に、当該条件分岐文に含まれるFALSEコードブロックを前記プログラムコードから抽出し、抽出したFALSEコードブロックを検査することを特徴とする請求項5又は6に記載のコード検査システム。 - 前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が常にFALSEであり、前記通常モードで実行された場合は分岐結果が少なくとも一度はTRUEであることを第4の検査対象判別基準とし、前記第4の検査対象判別基準における検査対象のコードブロックの種類をFALSEコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第4の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出し、抽出した条件式の否定形を積和標準形に変換し、積和標準形に変換した条件式の否定形を用いた処理の結果が特定の結果となった場合に、前記第4の検査対象判別基準に合致する条件分岐文に含まれるFALSEコードブロックを前記プログラムコードから抽出し、抽出したFALSEコードブロックを検査することを特徴とする請求項5〜7のいずれかに記載のコード検査システム。 - 前記プログラムコード入力部は、
条件式に一つ以上の原子式が含まれる条件分岐文を含むプログラムコードを入力し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第2の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出して当該条件式を積和標準形に変換するとともに、当該条件式に含まれる原子式の値を積和標準形に変換した条件式に適用し、適用した結果が特定の結果となった場合に、前記第2の検査対象判別基準に合致する条件分岐文に含まれるTRUEコードブロックを前記プログラムコードから抽出し、抽出したTRUEコードブロックを検査することを特徴とする請求項6に記載のコード検査システム。 - 前記プログラムコード入力部は、
条件式に一つ以上の原子式が含まれる条件分岐文が含まれるプログラムコードを入力し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第4の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出して当該条件式の否定形を積和標準形に変換するとともに、当該条件式に含まれる原子式の値を積和標準形に変換した条件式の否定形に適用し、適用した結果が特定の結果となった場合に、前記第4の検査対象判別基準に合致する条件分岐文に含まれるFALSEコードブロックを前記プログラムコードから抽出し、抽出したFALSEコードブロックを検査することを特徴とする請求項8に記載のコード検査システム。 - 前記プログラムコード入力部は、
条件式に対する評価結果がTRUEである場合に実行されるTRUEコードブロックと条件式に対する評価結果がFALSEである場合に実行されるFALSEコードブロックとが含まれる条件分岐文を含むプログラムコードを入力し、
前記検査対象判別基準情報記憶部は、
分岐結果が常にFALSEであること及び分岐結果が常にTRUEであることの各々を検査対象判別基準とし、分岐結果が常にFALSEであるとの検査対象判別基準における検査対象のコードブロックの種類をTRUEコードブロックと指定し、分岐結果が常にTRUEであるとの検査対象判別基準における検査対象のコードブロックの種類をFALSEコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が常にFALSEであると判定した場合に、当該条件分岐文に含まれるTRUEコードブロックを前記プログラムコードから抽出し、抽出したTRUEコードブロックを検査し、いずれかの条件分岐文の蓄積分岐結果が常にTRUEであると判定した場合に、当該条件分岐文に含まれるFALSEコードブロックを前記プログラムコードから抽出し、抽出したFALSEコードブロックを検査することを特徴とする請求項1〜4のいずれかに記載のコード検査システム。 - 前記コード検査システムは、更に、
前記コード検査システムの利用者に前記コードブロック検査部による検査結果を通知する検査結果通知部を有することを特徴とする請求項1〜11のいずれかに記載のコード検査システム。 - 前記コード検査システムは、更に、
前記コードブロック検査部によりいずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致すると判定され、当該条件分岐文の検査対象コードブロックが検査された結果、当該検査対象コードブロックが不正コードブロックに指定されなかった場合に、当該条件分岐文に対する機能確認試験が十分に行われなかった可能性がある旨を通知する検査結果通知部を有することを特徴とする請求項3又は4に記載のコード検査システム。 - 前記分岐実行情報入力部は、
機能確認試験において条件分岐文が実行される度に、前記機能確認試験システムから、実行された条件分岐文における分岐結果を示す分岐実行情報を入力することを特徴とする請求項1〜13のいずれかに記載のコード検査システム。 - 前記プログラムコード入力部は、
特権モード及び通常モードの2つの実行モードで実行させることができるプログラムコードを入力し、
前記分岐実行情報入力部は、
機能確認試験において条件分岐文が前記特権モード又は前記通常モードで実行される度に、前記機能確認試験システムから、実行された条件分岐文における分岐結果を示す分岐実行情報を入力し、
前記コード検査システムは、更に、
前記分岐実行情報入力部により入力される分岐実行情報が対象とする実行モードの種類が前記特権モード及び前記通常モードのいずれであるかを特定する実行モード情報を入力する実行モード情報入力部を有し、
前記分岐結果蓄積部は、
条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積し、
前記コードブロック検査部は、
前記分岐結果蓄積部に蓄積されている実行モードの種類ごとの蓄積分岐結果が前記検査対象判別基準情報に示されるいずれかの検査対象判別基準に合致するかを判定することを特徴とする請求項14に記載のコード検査システム。 - 前記分岐実行情報入力部は、
機能確認試験が終了した後、前記機能確認試験システムから、機能確認試験において条件分岐文が実行された際の分岐結果の蓄積が前記プログラムコードに含まれる全ての条件分岐文について示される分岐実行情報ファイルを入力し、
前記コードブロック検査部は、
条件分岐文ごとに、分岐実行情報ファイルに示される蓄積された分岐結果がいずれかの検査対象判別基準に合致するかを判定することを特徴とする請求項1に記載のコード検査システム。 - 前記コード検査システムは、
検査の結果ある条件分岐文が正当な条件分岐文であると判明した場合に、当該検査済み条件分岐文の少なくとも一部を用いてハッシュ演算を行い、ハッシュ演算により得られたハッシュ値を登録し、新たに検査の対象となった新たな条件分岐文の少なくとも一部を用いてハッシュ演算を行い、新たな条件分岐文に対するハッシュ演算により得られたハッシュ値と登録しているハッシュ値とを比較し、両ハッシュ値が一致する場合に、前記新たな条件分岐文の検査を行わないことを特徴とする請求項1に記載のコード検査システム。 - 前記機能確認試験システムは、
所定のコード付加システムによって条件分岐文に付加された、分岐実行情報を出力させるためのコードに基づき分岐実行情報を出力しており、
前記コード検査システムは、
検査済みの条件分岐文に対するハッシュ演算により得られたハッシュ値を前記コード付加システムから参照可能なように登録し、前記コード付加システムが条件分岐文に対してコードを付加する際に、登録しているハッシュ値を前記コード付加システムに参照させ、当該条件分岐文のハッシュ値と登録されているハッシュ値とを比較させて、両ハッシュ値が一致する場合に、当該条件分岐文にコードを付加させないことを特徴とする請求項17に記載のコード検査システム。 - 条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを、コンピュータが入力するプログラムコード入力ステップと、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記コンピュータが前記分岐実行情報を入力する分岐実行情報入力ステップと、
前記コンピュータが、前記分岐実行情報入力ステップにより入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積ステップと、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を、前記コンピュータが参照する検査対象判別基準情報参照ステップと、
前記コンピュータが、条件分岐文ごとに、前記分岐結果蓄積ステップにより蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査ステップとを有することを特徴とするコード検査方法。 - 条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力処理と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力処理と、
前記分岐実行情報入力処理により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積処理と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を参照する検査対象判別基準情報参照処理と、
条件分岐文ごとに、前記分岐結果蓄積処理により蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査処理とをコンピュータに実行させることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007303742A JP2009129204A (ja) | 2007-11-22 | 2007-11-22 | コード検査システム及びコード検査方法及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007303742A JP2009129204A (ja) | 2007-11-22 | 2007-11-22 | コード検査システム及びコード検査方法及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2009129204A true JP2009129204A (ja) | 2009-06-11 |
Family
ID=40820049
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007303742A Pending JP2009129204A (ja) | 2007-11-22 | 2007-11-22 | コード検査システム及びコード検査方法及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2009129204A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013016088A (ja) * | 2011-07-06 | 2013-01-24 | Mega Chips Corp | メモリシステム、セキュリティメモリおよび情報保護方法 |
JP2014501424A (ja) * | 2010-12-28 | 2014-01-20 | オラクル・インターナショナル・コーポレイション | ブレードの物理的な位置に基づく自動化されたプロビジョニングおよび設定を可能にする統合型ソフトウェアおよびハードウェアシステム |
WO2015030748A1 (en) * | 2013-08-28 | 2015-03-05 | Intel Corporation | Hardware and software execution profiling |
JP2018109957A (ja) * | 2016-12-30 | 2018-07-12 | 國家中山科學研究院 | 製品開発管理システム及び方法 |
JP2020003845A (ja) * | 2018-06-25 | 2020-01-09 | コニカミノルタ株式会社 | 情報処理装置、ウィルスチェック方法及びプログラム |
-
2007
- 2007-11-22 JP JP2007303742A patent/JP2009129204A/ja active Pending
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2014501424A (ja) * | 2010-12-28 | 2014-01-20 | オラクル・インターナショナル・コーポレイション | ブレードの物理的な位置に基づく自動化されたプロビジョニングおよび設定を可能にする統合型ソフトウェアおよびハードウェアシステム |
US9424023B2 (en) | 2010-12-28 | 2016-08-23 | Oracle International Corporation | Unified system lifecycle for components in an integrated software and hardware system |
US9720682B2 (en) | 2010-12-28 | 2017-08-01 | Oracle International Corporation | Integrated software and hardware system that enables automated provisioning and configuration of a blade based on its physical location |
JP2013016088A (ja) * | 2011-07-06 | 2013-01-24 | Mega Chips Corp | メモリシステム、セキュリティメモリおよび情報保護方法 |
WO2015030748A1 (en) * | 2013-08-28 | 2015-03-05 | Intel Corporation | Hardware and software execution profiling |
US10055585B2 (en) | 2013-08-28 | 2018-08-21 | Mcafee, Llc | Hardware and software execution profiling |
JP2018109957A (ja) * | 2016-12-30 | 2018-07-12 | 國家中山科學研究院 | 製品開発管理システム及び方法 |
JP2020003845A (ja) * | 2018-06-25 | 2020-01-09 | コニカミノルタ株式会社 | 情報処理装置、ウィルスチェック方法及びプログラム |
JP7155657B2 (ja) | 2018-06-25 | 2022-10-19 | コニカミノルタ株式会社 | 情報処理装置及びプログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Harer et al. | Automated software vulnerability detection with machine learning | |
Li et al. | Vulpecker: an automated vulnerability detection system based on code similarity analysis | |
Perl et al. | Vccfinder: Finding potential vulnerabilities in open-source projects to assist code audits | |
Carmony et al. | Extract Me If You Can: Abusing PDF Parsers in Malware Detectors. | |
US7900193B1 (en) | System and method for detecting defects in a computer program using data and control flow analysis | |
JP5940160B2 (ja) | アプリケーション・コード内のダウングレーダ・コードを評価するための方法、コンピュータ・プログラム製品、および装置(情報フロー・ダウングレーダにおける欠陥および非互換性問題の自動検出) | |
JPWO2006087780A1 (ja) | 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法 | |
US7409718B1 (en) | Method of decrypting and analyzing encrypted malicious scripts | |
US11048798B2 (en) | Method for detecting libraries in program binaries | |
Ferreira et al. | Do# ifdefs influence the occurrence of vulnerabilities? an empirical study of the linux kernel | |
JP6698956B2 (ja) | サンプルデータ生成装置、サンプルデータ生成方法およびサンプルデータ生成プログラム | |
WO2022180702A1 (ja) | 解析機能付与装置、解析機能付与プログラム及び解析機能付与方法 | |
JP6486574B2 (ja) | プログラムコード生成装置、プログラムコード生成方法及びプログラムコード生成プログラム | |
JP2009129204A (ja) | コード検査システム及びコード検査方法及びプログラム | |
CN116382755A (zh) | 基于漏洞防护的国产操作系统补丁升级方法 | |
JP6765554B2 (ja) | ソフトウェア試験装置、ソフトウェア試験方法、および、ソフトウェア試験プログラム | |
JP5618861B2 (ja) | 情報処理装置及び情報処理方法及びプログラム | |
Zhang et al. | Learning to Locate and Describe Vulnerabilities | |
JP7235126B2 (ja) | バックドア検査装置、バックドア検査方法、及びプログラム | |
JP2011150716A (ja) | 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法 | |
Borzykh et al. | Detecting Code Security Breaches by Means of Dataflow Analysis | |
Zheng et al. | A method based on feature matching to identify steganography software | |
JPWO2020240830A1 (ja) | 検知装置、検知方法、及び、検知プログラム | |
JP7008879B2 (ja) | 情報処理装置、情報処理方法及び情報処理プログラム | |
JP7509312B2 (ja) | プログラム解析装置、プログラム解析方法、及び、プログラム |