(57)【要約】【課題】開発プログラムに秘密裏に実装された不正コードや秘密の条件下で特権ユーザと同等の操作を可能とする不正コードを検出する。【解決手段】悪意の開発者は、出荷前のテストフェーズで不正コードが実行されて発覚することを恐れるため、出荷前は不正コードが実行されないように秘密の条件が満たされないと不正コードが動作しないよう条件分岐させるはずである。この点に注目し、検査実行用コンパイラ３００が不正コード検査対象プログラム４００内の条件分岐実行状況を監視しながら機能確認試験を実施し、不正コード精査部５０４が条件分岐実行結果を解析し、不審な分岐結果を検出した場合、その条件文から呼び出される命令列を検査することで、不正なコードを検出する。プログラムの実行状態を特権モードと通常モードに分類して機能確認試験を行うことで、秘密の条件が満たされると特権ユーザと同等の操作を可能とする不正コードの検出も行う。【選択図】図１
2009129204.tif 000002
【特許請求の範囲】
【請求項１】
条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力部と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力部と、
前記分岐実行情報入力部により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積部と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を記憶する検査対象判別基準情報記憶部と、
条件分岐文ごとに、前記分岐結果蓄積部に蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査部とを有することを特徴とするコード検査システム。
【請求項２】
前記検査対象判別基準情報記憶部は、
不自然な分岐結果のパターンが示され、不自然な分岐結果のパターンに合致する条件分岐文を検査対象とする検査対象判別基準を一つ以上含む検査対象判別基準情報を記憶することを特徴とする請求項１に記載のコード検査システム。
【請求項３】
前記コード検査システムは、更に、
不正目的に利用される可能性のあるデータを不正利用可能データとして示す不正利用可能データ情報を記憶する不正利用可能データ情報記憶部を有し、
前記コードブロック検査部は、
前記不正利用可能データ情報に示される不正利用可能データが前記検査対象コードブロックに含まれているか否か及び前記検査対象コードブロックが前記不正利用可能データを利用するか否かを検査し、前記検査対象コードブロックに不正利用可能データが含まれている場合及び前記検査対象コードブロックが前記不正利用可能データを利用している場合の少なくともいずれかにおいて、当該検査対象コードブロックを不正目的の可能性のある不正コードブロックに指定することを特徴とする請求項１又は２に記載のコード検査システム。
【請求項４】
前記不正利用可能データ情報記憶部は、
不正目的に利用される可能性のある関数及び状態変数の少なくともいずれを前記不正利用可能データとして示す不正利用可能データ情報を記憶することを特徴とする請求項３に記載のコード検査システム。
【請求項５】
前記プログラムコード入力部は、
特権モード及び通常モードの２つの実行モードで実行させることができ、条件式に対する評価結果がＴＲＵＥである場合に実行されるＴＲＵＥコードブロックと条件式に対する評価結果がＦＡＬＳＥである場合に実行されるＦＡＬＳＥコードブロックとが含まれる条件分岐文を含むプログラムコードを入力し、
前記分岐実行情報入力部は、
前記特権モード及び前記通常モードの各々で条件分岐文を実行する機能確認試験システムから、前記特権モードで実行した際の条件分岐文の分岐結果を示す分岐実行情報及び前記通常モードで実行した際の条件分岐文の分岐結果を示す分岐実行情報を入力し、
前記分岐結果蓄積部は、
条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積し、
前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が常にＦＡＬＳＥであり、前記通常モードで実行された場合は分岐結果が常にＦＡＬＳＥであることを第１の検査対象判別基準とし、前記第１の検査対象判別基準における検査対象のコードブロックの種類をＴＲＵＥコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第１の検査対象判別基準に合致すると判定した場合に、当該条件分岐文に含まれるＴＲＵＥコードブロックを前記プログラムコードから抽出し、抽出したＴＲＵＥコードブロックを検査することを特徴とする請求項１〜４のいずれかに記載のコード検査システム。
【請求項６】
前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が少なくとも一度はＴＲＵＥであり、前記通常モードで実行された場合は分岐結果が常にＦＡＬＳＥであることを第２の検査対象判別基準とし、前記第２の検査対象判別基準における検査対象のコードブロックの種類をＴＲＵＥコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第２の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出し、抽出した条件式を積和標準形に変換し、積和標準形に変換した条件式を用いた処理の結果が特定の結果となった場合に、前記第２の検査対象判別基準に合致する条件分岐文に含まれるＴＲＵＥコードブロックを前記プログラムコードから抽出し、抽出したＴＲＵＥコードブロックを検査することを特徴とする請求項５に記載のコード検査システム。
【請求項７】
前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が常にＴＲＵＥであり、前記通常モードで実行された場合は分岐結果が常にＴＲＵＥであることを第３の検査対象判別基準とし、前記第３の検査対象判別基準における検査対象のコードブロックの種類をＦＡＬＳＥコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第３の検査対象判別基準に合致すると判定した場合に、当該条件分岐文に含まれるＦＡＬＳＥコードブロックを前記プログラムコードから抽出し、抽出したＦＡＬＳＥコードブロックを検査することを特徴とする請求項５又は６に記載のコード検査システム。
【請求項８】
前記検査対象判別基準情報記憶部は、
前記特権モードで実行された場合は分岐結果が常にＦＡＬＳＥであり、前記通常モードで実行された場合は分岐結果が少なくとも一度はＴＲＵＥであることを第４の検査対象判別基準とし、前記第４の検査対象判別基準における検査対象のコードブロックの種類をＦＡＬＳＥコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第４の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出し、抽出した条件式の否定形を積和標準形に変換し、積和標準形に変換した条件式の否定形を用いた処理の結果が特定の結果となった場合に、前記第４の検査対象判別基準に合致する条件分岐文に含まれるＦＡＬＳＥコードブロックを前記プログラムコードから抽出し、抽出したＦＡＬＳＥコードブロックを検査することを特徴とする請求項５〜７のいずれかに記載のコード検査システム。
【請求項９】
前記プログラムコード入力部は、
条件式に一つ以上の原子式が含まれる条件分岐文を含むプログラムコードを入力し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第２の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出して当該条件式を積和標準形に変換するとともに、当該条件式に含まれる原子式の値を積和標準形に変換した条件式に適用し、適用した結果が特定の結果となった場合に、前記第２の検査対象判別基準に合致する条件分岐文に含まれるＴＲＵＥコードブロックを前記プログラムコードから抽出し、抽出したＴＲＵＥコードブロックを検査することを特徴とする請求項６に記載のコード検査システム。
【請求項１０】
前記プログラムコード入力部は、
条件式に一つ以上の原子式が含まれる条件分岐文が含まれるプログラムコードを入力し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が前記第４の検査対象判別基準に合致すると判定した場合に、当該条件分岐文の条件式を前記プログラムコードから抽出して当該条件式の否定形を積和標準形に変換するとともに、当該条件式に含まれる原子式の値を積和標準形に変換した条件式の否定形に適用し、適用した結果が特定の結果となった場合に、前記第４の検査対象判別基準に合致する条件分岐文に含まれるＦＡＬＳＥコードブロックを前記プログラムコードから抽出し、抽出したＦＡＬＳＥコードブロックを検査することを特徴とする請求項８に記載のコード検査システム。
【請求項１１】
前記プログラムコード入力部は、
条件式に対する評価結果がＴＲＵＥである場合に実行されるＴＲＵＥコードブロックと条件式に対する評価結果がＦＡＬＳＥである場合に実行されるＦＡＬＳＥコードブロックとが含まれる条件分岐文を含むプログラムコードを入力し、
前記検査対象判別基準情報記憶部は、
分岐結果が常にＦＡＬＳＥであること及び分岐結果が常にＴＲＵＥであることの各々を検査対象判別基準とし、分岐結果が常にＦＡＬＳＥであるとの検査対象判別基準における検査対象のコードブロックの種類をＴＲＵＥコードブロックと指定し、分岐結果が常にＴＲＵＥであるとの検査対象判別基準における検査対象のコードブロックの種類をＦＡＬＳＥコードブロックと指定する検査対象判別基準情報を記憶し、
前記コードブロック検査部は、
いずれかの条件分岐文の蓄積分岐結果が常にＦＡＬＳＥであると判定した場合に、当該条件分岐文に含まれるＴＲＵＥコードブロックを前記プログラムコードから抽出し、抽出したＴＲＵＥコードブロックを検査し、いずれかの条件分岐文の蓄積分岐結果が常にＴＲＵＥであると判定した場合に、当該条件分岐文に含まれるＦＡＬＳＥコードブロックを前記プログラムコードから抽出し、抽出したＦＡＬＳＥコードブロックを検査することを特徴とする請求項１〜４のいずれかに記載のコード検査システム。
【請求項１２】
前記コード検査システムは、更に、
前記コード検査システムの利用者に前記コードブロック検査部による検査結果を通知する検査結果通知部を有することを特徴とする請求項１〜１１のいずれかに記載のコード検査システム。
【請求項１３】
前記コード検査システムは、更に、
前記コードブロック検査部によりいずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致すると判定され、当該条件分岐文の検査対象コードブロックが検査された結果、当該検査対象コードブロックが不正コードブロックに指定されなかった場合に、当該条件分岐文に対する機能確認試験が十分に行われなかった可能性がある旨を通知する検査結果通知部を有することを特徴とする請求項３又は４に記載のコード検査システム。
【請求項１４】
前記分岐実行情報入力部は、
機能確認試験において条件分岐文が実行される度に、前記機能確認試験システムから、実行された条件分岐文における分岐結果を示す分岐実行情報を入力することを特徴とする請求項１〜１３のいずれかに記載のコード検査システム。
【請求項１５】
前記プログラムコード入力部は、
特権モード及び通常モードの２つの実行モードで実行させることができるプログラムコードを入力し、
前記分岐実行情報入力部は、
機能確認試験において条件分岐文が前記特権モード又は前記通常モードで実行される度に、前記機能確認試験システムから、実行された条件分岐文における分岐結果を示す分岐実行情報を入力し、
前記コード検査システムは、更に、
前記分岐実行情報入力部により入力される分岐実行情報が対象とする実行モードの種類が前記特権モード及び前記通常モードのいずれであるかを特定する実行モード情報を入力する実行モード情報入力部を有し、
前記分岐結果蓄積部は、
条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積し、
前記コードブロック検査部は、
前記分岐結果蓄積部に蓄積されている実行モードの種類ごとの蓄積分岐結果が前記検査対象判別基準情報に示されるいずれかの検査対象判別基準に合致するかを判定することを特徴とする請求項１４に記載のコード検査システム。
【請求項１６】
前記分岐実行情報入力部は、
機能確認試験が終了した後、前記機能確認試験システムから、機能確認試験において条件分岐文が実行された際の分岐結果の蓄積が前記プログラムコードに含まれる全ての条件分岐文について示される分岐実行情報ファイルを入力し、
前記コードブロック検査部は、
条件分岐文ごとに、分岐実行情報ファイルに示される蓄積された分岐結果がいずれかの検査対象判別基準に合致するかを判定することを特徴とする請求項１に記載のコード検査システム。
【請求項１７】
前記コード検査システムは、
検査の結果ある条件分岐文が正当な条件分岐文であると判明した場合に、当該検査済み条件分岐文の少なくとも一部を用いてハッシュ演算を行い、ハッシュ演算により得られたハッシュ値を登録し、新たに検査の対象となった新たな条件分岐文の少なくとも一部を用いてハッシュ演算を行い、新たな条件分岐文に対するハッシュ演算により得られたハッシュ値と登録しているハッシュ値とを比較し、両ハッシュ値が一致する場合に、前記新たな条件分岐文の検査を行わないことを特徴とする請求項１に記載のコード検査システム。
【請求項１８】
前記機能確認試験システムは、
所定のコード付加システムによって条件分岐文に付加された、分岐実行情報を出力させるためのコードに基づき分岐実行情報を出力しており、
前記コード検査システムは、
検査済みの条件分岐文に対するハッシュ演算により得られたハッシュ値を前記コード付加システムから参照可能なように登録し、前記コード付加システムが条件分岐文に対してコードを付加する際に、登録しているハッシュ値を前記コード付加システムに参照させ、当該条件分岐文のハッシュ値と登録されているハッシュ値とを比較させて、両ハッシュ値が一致する場合に、当該条件分岐文にコードを付加させないことを特徴とする請求項１７に記載のコード検査システム。
【請求項１９】
条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを、コンピュータが入力するプログラムコード入力ステップと、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記コンピュータが前記分岐実行情報を入力する分岐実行情報入力ステップと、
前記コンピュータが、前記分岐実行情報入力ステップにより入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積ステップと、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を、前記コンピュータが参照する検査対象判別基準情報参照ステップと、
前記コンピュータが、条件分岐文ごとに、前記分岐結果蓄積ステップにより蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査ステップとを有することを特徴とするコード検査方法。
【請求項２０】
条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力処理と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力処理と、
前記分岐実行情報入力処理により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積処理と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を参照する検査対象判別基準情報参照処理と、
条件分岐文ごとに、前記分岐結果蓄積処理により蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査処理とをコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムコードに含まれる不正コードブロック（以下、不正コードともいう）を検出する技術に関する。
【背景技術】
【０００２】
ソフトウェア開発時に、悪意の開発者が開発ソフトウェア中に秘密裏に悪意のコードを実装してしまう可能性がある。
従来はソースコードに対する手動によるレビューを行うことでこのような攻撃に対処してきたが、近年ソフトウェア開発が大規模化するにつれ、開発されるコード量も増加の一途を辿っており、手動でソースコードの全てをくまなくレビューすることは不可能となりつつある。
【０００３】
不正な処理を行うプログラムを検出する技術としては、プログラムの動作を監視し、あらかじめ定義された不正な処理の実行を検出する方式（例えば特許文献１）や、検査対象となるプログラム内にあらかじめ定義された不正な処理を行う命令並びが含まれているかどうかを検査する方式（例えば非特許文献１  ｐ．１２  ヒューリスティック法）が知られている。
【０００４】
また、プログラムの欠陥を検出するための技術として、セキュリティ上問題のある実装のパターンをルール化して保持し、対象プログラムのソースコードを解析してパターンに合致する実装が無いかを検査する方式も知られている（例えば非特許文献２）。
【特許文献１】特開２００５−１４８８１４号公報
【非特許文献１】独立行政法人  情報処理推進機構  「未知ウィルス検出技術に関する調査  調査報告書」  １５情経１６７５号  ２００４年４月  （ｈｔｔｐ：／／ｗｗｗ．ｉｐａ．ｇｏ．ｊｐ／ｓｅｃｕｒｉｔｙ／ｆｙ１５／ｒｅｐｏｒｔｓ／ｕｖｄ／ｄｏｃｕｍｅｎｔｓ／ｕｖｄ＿ｒｅｐｏｒｔ．ｐｄｆ）
【非特許文献２】ＦＯＲＴＩＦＹ  ＳＯＦＴＷＡＲＥ  「ＦＯＲＴＩＦＹ  ＳＯＵＲＣＥ  ＣＯＤＥ  ＡＮＡＬＹＳＩＳ  ＳＵＩＴＥ」  （ｈｔｔｐ：／／ｗｗｗ．ｆｏｒｔｉｆｙｓｏｆｔｗａｒｅ．ｃｏ．ｊｐ／ｄａｔａ／ＦＪＰ１−０６０１−０５．ｐｄｆ）
【発明の開示】
【発明が解決しようとする課題】
【０００５】
不正な処理を定義し、その定義にあてはまる処理の実行や命令並びを見つける手法（例えば特許文献１又は非特許文献１）では、あらかじめ不正な処理を定義しなければならない。
このような処理の定義はウィルスやワームの感染活動のように、一般に知られた共通の振る舞いが存在する場合には可能であるが、本明細書で対策しようとしている不正コードの場合、開発者の意図によって実行される処理は様々となるため、あらかじめ不正な振る舞いを定義することは困難である、という課題がある。
【０００６】
さらに、不正コードと正規のコードとの振る舞いが常に識別可能とは限らない。
例えば、不正コードの一例として、サーバプログラムにおいて、開発者のみが知る秘密のユーザ名でログインすると無条件に特権ユーザとしてサーバを操作できるようなコードを記述することが考えられる。
この場合、振る舞いは通常の特権ユーザのそれと全く同じであり、前記技術では不正コードの実行を検出できない。
【０００７】
次に、プログラムの欠陥を検出する技術（例えば非特許文献２）に関しても同様であり、当技術を利用して不正コードを検出するためには、不正コードのパターンをルール化しなければならない。
そのため前述した技術と同様の理由により不正コードの検出は困難である。
【０００８】
本発明は、上記のような課題を解決することを主な目的の一つとしており、開発プログラムに秘密裏に実装された不正目的のコードを検出することを主な目的とする。
更には、本発明は、秘密の条件が満たされると特権ユーザと同等の操作を可能とする類の不正コードを検出することも主な目的とする。
【課題を解決するための手段】
【０００９】
本発明に係るコード検査システムは、
条件式に対する評価結果いかんにより処理が分岐する条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれるプログラムコードを入力するプログラムコード入力部と、
前記プログラムコードに対する機能確認試験を行い、条件分岐文を実行した際の分岐結果を示す分岐実行情報を出力する機能確認試験システムから、前記分岐実行情報を入力する分岐実行情報入力部と、
前記分岐実行情報入力部により入力された分岐実行情報に示される分岐結果を条件分岐文ごとに蓄積する分岐結果蓄積部と、
検査対象となる条件分岐文を判別するための基準として分岐結果に関する基準が示される検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する検査対象判別基準情報を記憶する検査対象判別基準情報記憶部と、
条件分岐文ごとに、前記分岐結果蓄積部に蓄積された蓄積分岐結果がいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された前記プログラムコードから、当該条件分岐文に含まれるコードブロックのうち前記検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査するコードブロック検査部とを有することを特徴とする。
【発明の効果】
【００１０】
本発明によれば、実行結果が不自然な条件分岐文を抽出して検査を行うため、実行開発者が秘密の条件で動作するように実装された不正目的のコードを検出できるようになる。
【発明を実施するための最良の形態】
【００１１】
実施の形態１．
悪意の開発者は、不正コードをプログラム中に実装するとき、出荷前のテストフェーズで不正なコードが実行されて発覚することを恐れる。
そのため出荷されるまで不正なコードが実行されないように、何らかの秘密の条件が満たされない限り不正なコードが動作しないよう条件分岐させるはずである。
本実施の形態では、不正コードがテストフェーズでは実行されないことに着目し、検査対象プログラム内の条件分岐実行状況を監視しながら機能確認の試験を実施し、不審な分岐結果を検出後、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出するものである。
さらに、プログラムの実行状態を特権モードと通常モードに分類して機能確認試験を行うことで、秘密の条件が満たされると特権ユーザと同等の操作を可能とする類の不正コードの検出も行う。
【００１２】
図１は、本実施の形態に係る不正コード検査装置１００の例を表す図である。
図１に示されるとおり、不正コード検査装置１００は、不正コード検査ツール５００、及び検査実行用コンパイラ３００で構成されている。
なお、図１と異なり、不正コード検査ツール５００及び検査実行用コンパイラ３００が同じ不正コード検査装置１００内に配置されていなくてもよく、それぞれが別のコンピュータに配置されていてもよい。
【００１３】
本実施の形態では、不正コード検査対象ソースコード２００（以下、対象ソースコード２００ともいう）を検査実行用コンパイラ３００でコンパイルして生成された不正コード検査対象プログラム４００（以下、対象プログラム４００ともいう）に対して機能確認試験を実施してプログラム内の条件分岐を追跡し、機能確認試験の結果得られる分岐実行情報と対象ソースコード２００を不正コード検査ツール５００に入力し、不正コード検査ツール５００が分岐実行情報に基づいて不審な分岐結果を検出し、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出する。
また、不正なコードを検出した場合は、システムオペレータに通知する。
【００１４】
対象ソースコード２００は、不正コードの検査の対象となるソースコードであり、不正コードが含まれる可能性がある。
また、対象ソースコード２００には、条件分岐文が一つ以上含まれ、各条件分岐文には一つ以上のコードブロックが含まれる。条件分岐文に含まれるコードブロックには、関数や状態変数が含まれる。
条件分岐文の具体例は、後述するが、条件式に対する評価結果いかんにより処理が分岐するプログラム文である。
対象ソースコード２００は、プログラムコードの例である。
【００１５】
対象プログラム４００は、検査実行用コンパイラ３００により対象ソースコード２００に対してコンパイルされた後の実行コードである。
【００１６】
検査実行用コンパイラ３００は、対象ソースコード２００を入力として受け取り、対象プログラム４００を出力するものである。
ただし、通常のコンパイラとは異なり対象ソースコード２００中の各条件分岐文において不正コード検査ツール５００が必要とする情報（分岐実行情報）を出力させるための実行コードを出力する（付加する）という特徴を持つ。
そして、機能確認試験を行う機能確認試験システムは、検査実行用コンパイラ３００により条件分岐文に付加された実行コードに基づいて分岐実行情報を出力する。
このため、検査実行用コンパイラ３００は、コード付加システムの例となる。
なお、このような実行コードを付加するコンパイラは既存のコンパイラ機能であるプロファイル測定用のコード生成機能を応用することで容易に構成可能であるため、詳細な説明は行わない。
【００１７】
また、本実施の形態及び以降の実施の形態では、検査実行用コンパイラ３００がユーザ（試験実施者）の指示に基づいて対象プログラム４００の機能確認試験を行う例を主に説明する。
このため、本実施の形態及び以降の実施の形態において、検査実行用コンパイラ３００は機能確認試験システムの例に相当する。
しかし、機能確認試験は必ずしも検査実行用コンパイラ３００で行う必要はなく、不正コード検査装置１００内の他の機能、又は不正コード検査装置１００と接続された他のコンピュータシステム（機能確認試験システム）により機能確認試験が実施されるようにしてもよい。
なお、他のコンピュータシステムにより機能確認試験が実施される場合でも、検査実行用コンパイラ３００によりコンパイル時に対象ソースコード２００中の各条件分岐文に対して追加された実行コードが実行されて、分岐実行情報が出力される。
また、詳細は後述するが、分岐実行情報とは、機能確認試験で各条件分岐文が実行された際の分岐結果を示す情報である。
【００１８】
不正コード検査ツール５００は、機能確認試験の結果出力される分岐実行情報に基づいて不審な分岐結果を検出し、その条件分岐文から呼び出される命令列を検査することで、不正なコードを検出する。
不正コード検査ツール５００は、コード検査システムの例である。
【００１９】
不正コード検査ツール５００は、分岐実行状況測定部５０１、ソースコード入力部５０２、実行状態入力部５０３、不正コード精査部５０４、検査結果通知部５０５、検査対象判別基準情報記憶部５０６、ソースコード記憶部５０７及び重要操作データベース５０８で構成されている。
本明細書の最終部分で説明するように、分岐実行状況測定部５０１、ソースコード入力部５０２、実行状態入力部５０３、不正コード精査部５０４、検査結果通知部５０５は例えばプログラムとし、図１には図示していないＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）によりこれらのプログラムを実行するようにしてもよい。
また、検査対象判別基準情報記憶部５０６、ソースコード記憶部５０７、及び重要操作データベース５０８は、図１に図示していないＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、磁気ディスク装置、フラッシュメモリ等により構成される。
【００２０】
分岐実行状況測定部５０１は、実行中の対象プログラム４００について出力される分岐実行情報を受け取り、ツール内部で管理を行う。
つまり、機能確認試験システム（検査実行用コンパイラ３００又は他のシステム）から、各条件分岐文における分岐結果を示す分岐実行情報を入力する。
また、後述するように、図６に示すテーブルの形式で、入力した分岐実行情報に示される分岐結果を分岐条件文ごとに蓄積する。
分岐実行状況測定部５０１は、分岐実行情報入力部及び分岐結果蓄積部の例である。
【００２１】
ソースコード入力部５０２は、本ツール内で対象ソースコード２００を解析するために、外部からソースコードを入力するためのインタフェースである。
なお、対象ソースコード２００を入力するのは不正コード精査部５０４における解析処理、不正コード検出処理が効率的になるという理由からであり、対象ソースコード２００の代わりに対象プログラム４００又は何らかの中間コードを入力し、不正コード精査部５０４が解析処理、不正コード検出処理を対象プログラム４００又は中間コードで行うことも可能である。
【００２２】
後述するが、本ツールでは対象プログラム４００の実行状態（実行モードともいう）を外部から入力してもらう必要があり、実行状態入力部５０３はそのためのインタフェースである。
具体的には、対象プログラム４００は特権モード及び通常モードの２つの実行モードで実行させることができ、実行状態入力部５０３は機能確認試験において分岐条件文の実行が特権モード及び通常モードのいずれで行われているかを示す情報（実行モード情報）を入力する。
そして、このようにして実行モードが通知されることで、分岐実行状況測定部５０１は、条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積することができる。
実行状態入力部５０３は、実行モード情報入力部の例である。
【００２３】
不正コード精査部５０４は、ソースコード入力部５０２により入力された対象ソースコード２００と、分岐実行状況測定部５０１により集められた分岐実行情報から不正コードの有無を検査する。検査の結果は検査結果通知部５０５によりツールオペレータに通知される。
不正コード精査部５０４は、具体的には、分岐実行状況測定部５０１において蓄積された蓄積分岐結果が後述する検査対象判別基準情報に示されるいずれかの検査対象判別基準に合致するかを判定し、いずれかの条件分岐文の蓄積分岐結果がいずれかの検査対象判別基準に合致する場合に、入力された対象ソースコード２００から、当該条件分岐文に含まれるコードブロックのうち検査対象判別基準情報で指定されているコードブロックの種類に合致するコードブロックを検査対象コードブロックとして抽出し、抽出した検査対象コードブロックを検査する。
そして、検査対象コードブロックの検査として、不正コード精査部５０４は、不正目的に利用される可能性のある重要操作（不正利用可能データ）が検査対象コードブロックに含まれているか否か及び検査対象コードブロックが重要操作を利用するか否かを検査し、検査対象コードブロックに重要操作が含まれている場合及び検査対象コードブロックが重要操作を利用している場合の少なくともいずれかにおいて、当該検査対象コードブロックを不正目的の可能性のある不正コードブロックに指定する。
重要操作は、後述する重要操作データベース５０８に格納されている。また、重要操作とは、例えば、不正目的に利用される可能性のある関数や状態変数である。
不正コード精査部５０４は、コードブロック検査部の例である。
【００２４】
検査対象判別基準情報記憶部５０６は、検査対象判別基準情報を記憶している。
検査対象判別基準情報とは、検査対象判別基準を一つ以上含み、検査対象判別基準ごとに検査対象のコードブロックの種類を指定する情報である。
検査対象判別基準とは、検査対象となる条件分岐文を判別するための基準である。検査対象判別基準には不自然な分岐結果のパターンが示され、不自然な分岐結果のパターンに合致する条件分岐文を検査対象としている。
検査対象判別基準情報は、具体的には、図５に示す情報である。
図５の詳細は、後述するが、図５におけるモード毎の条件評価結果の欄に記載される基準が検査対象判別基準であり、検査項目に示されるＴＲＵＥコードブロック又はＦＡＬＳＥコードブロックが検査対象のコードブロックの種類である。
ＴＲＵＥコードブロック及びＦＡＬＳＥコードについても詳細は後述するが、条件式に対する評価結果がＴＲＵＥである場合に実行されるコードブロックがＴＲＵＥコードブロックであり、条件式に対する評価結果がＦＡＬＳＥである場合に実行されるコードブロックがＦＡＬＳＥコードブロックである。
【００２５】
ソースコード記憶部５０７は、ソースコード入力部５０２により入力された対象ソースコード２００を記憶する。
【００２６】
最後に重要操作データベース５０８であるが、本データベースには不正目的に利用される可能性のある重要操作（不正利用可能データ）の一覧（不正利用可能データ情報）が格納される。
重要操作とは、悪用されると危険な関数や状態変数等である。対象プログラム毎にこれらは変化する可能性があるため、データベース内に保存されるデータについては、ユーザによる追加・変更・削除が可能となっている。
重要操作データベース５０８は、不正利用可能データ情報記憶部の例である。
【００２７】
図２は、本実施の形態に係る不正コード検査装置１００を用いた不正コード検査のフローの例を示す図である。
まず、ユーザは対象ソースコード２００を検査実行用コンパイラ３００によってコンパイルし、対象プログラム４００を生成する。
次に、ユーザは機能確認試験システム（検査実行用コンパイラ３００又は他システム）を用いて対象プログラム４００に対し機能確認試験を実施する。ここで、機能確認試験とは、エラー処理も含め、対象プログラムに期待されている全ての機能を確認する試験を指す。
【００２８】
対象プログラム４００によっては、利用ユーザや動作環境に応じ、特別なモードで処理を行う場合がある。例えばサーバプログラムにおける管理者モードや、障害解析用のデバッグモードを挙げることができる。このような特権的な処理に対する機能確認試験を行う際には、事前に不正コード検査ツール５００に対し、これから行う機能確認試験が特権的な処理に対するものであることを通知する。本実施の形態では対象プログラムの実行モードとして、通常モードと特権モードの二種類を指定可能とした。
【００２９】
このように、適切に実行状態（実行モード）の変更を不正コード検査ツール５００に通知しながら機能確認試験を進めていき、全ての機能確認試験が完了した段階で、不正コード検査ツール５００が不正コードの有無を検査し、検査結果６００を出力する。
【００３０】
次に、不正コード検査ツール５００の動作について、詳細に説明する。
【００３１】
はじめに用語の定義を行う。
ソースコード中で、与えられた条件に対する評価結果に応じて処理が分岐する文を条件分岐文（条件文ともいう）と呼ぶことにする。
条件分岐文で評価される条件の事を条件式と呼ぶことにする。
条件式は評価の結果、真（ＴＲＵＥ）あるいは偽（ＦＡＬＳＥ）をとり、真であった場合に実行される条件文中のコード群をＴＲＵＥコードブロックと呼ぶ。
同様に偽であった場合に実行されるコード群をＦＡＬＳＥコードブロックと呼ぶことにする。
ただし、ＦＡＬＳＥコードブロックは省略される場合もある。そのような条件文では条件式の評価結果が偽の場合には何も実行されない。
条件式は一つ以上の論理式を論理演算子（否定（ＮＯＴ）、論理積（ＡＮＤ）、論理和（ＯＲ））と組み合わせることで表される。
論理演算子を含まない最小の論理式を原子式と呼ぶことにする。
原子式あるいは原子式の否定の論理積だけからなる論理式を積項と呼ぶ。
【００３２】
図３にて、上記用語についてＣ言語ソースコードを用いて説明した。
図３（ａ）では、条件分岐文の構成例を示している。
また、図３（ｂ）では、条件式の構成例を示している。
【００３３】
対象プログラム４００が起動され、機能確認試験が行われると、対象プログラム４００中の条件分岐文が実行されるごとに、検査実行用コンパイラ３００によって追加で埋め込まれたコードが実行され、その結果分岐実行情報が出力される。
本実施の形態では、分岐実行情報として以下の情報を含む。
実行された条件文識別情報（ソースファイル名、行番号等）、各原子式の評価結果（ＴＲＵＥ，  ＦＡＬＳＥ，  評価されず）、及び条件式の評価結果である。
なお、条件式の評価結果は、各原子式の評価結果と条件式から算出可能であるため必須ではない。
【００３４】
不正コード検査ツール５００において、分岐実行状況測定部５０１は受け取った分岐実行情報を図６で表されるようなテーブルで管理する。
各テーブルは各条件文識別情報でラベル付けされている。
分岐実行情報を分岐実行状況測定部５０１が受け取ると、情報中の条件文識別情報に基づいてテーブルを選択し、その時の実行モードと分岐実行情報の内容をテーブルに追記する。ただし、既に記録されているレコードと同一の場合には追記されない。
また、実行モードは実行状態入力部５０３に入力された内容に従う。
このようにして、分岐実行状況測定部５０１は、条件分岐文ごとに、実行モードの種類を区別して、分岐結果を蓄積する。
【００３５】
次に、機能確認試験が完了すると、不正コード精査部５０４が呼び出され、不正コードの有無の検査が開始する。
なお、不正コード精査部５０４の起動と同時又は起動よりも前に、ソースコード入力部５０２により対象ソースコード２００が入力され、ソースコード記憶部５０７に格納されているものとする。
【００３６】
本実施の形態では、不正コード精査部５０４が図４に示されるタイプの不正コードを検出することを想定している。
タイプ１は、不正コードとして最も典型的と考えられるタイプで、特定のユーザ名の入力や、指定された時刻への到達等、開発者のみが知る条件で実行される不正コードを記述するものである。
タイプ２は、開発者のみが知る条件（ユーザ名等）を入力すると、特権モードと同等の権限で対象プログラムを操作できるようにする場合を想定している。このような処理の例としては対象プログラムユーザの情報取得等が挙げられる。
タイプ３及びタイプ４は、タイプ１及びタイプ２の条件式を否定したものであり、ＦＡＬＳＥコードブロック中に不正な処理が記述される。
【００３７】
前節で分類した不正コードのパターンに対する検査方法を示したのが図５の検査対象判別基準情報である。
図５の表中タイプの欄は、先に分類した不正コードのタイプ番号に対応している。
モード毎の条件評価結果は、対象プログラム中に不正コードが含まれていた場合に条件文の条件式が実行状態に応じてどのように評価されるかを表している。つまり、モード毎の条件評価結果の欄に記載される内容は、検査が必要な条件分岐文と検査が不要な条件分岐文とを峻別するための検査対象判別基準である。
モード毎の条件評価結果に示される検査対象判別基準には、不自然な分岐結果のパターンが示される。
つまり、ある条件分岐文の分岐結果が常にＴＲＵＥ又はＦＡＬＳＥになるのは不自然であると考えられる。
このため、特権モード及び通常モードの両モードで分岐結果が常にＴＲＵＥ又はＦＡＬＳＥになる条件分岐文、特権モード又は通常モードのいずれかで分岐結果が常にＴＲＵＥ又はＦＡＬＳＥになる条件分岐文は不自然であり、これらの条件分岐文は検査対象となる。
また、モード毎の条件評価結果に示される基準のうち、タイプ１に対するものは第１の検査対象判別基準の例であり、タイプ２に対するものは第２の検査対象判別基準の例であり、タイプ３に対するものは第３の検査対象判別基準の例であり、タイプ４に対するものは第４の検査対象判別基準の例である。
【００３８】
検査項目は、前記モード毎の条件評価結果マトリクスに該当する条件分岐文を発見した場合に、不正コードが含まれているかの識別方針について概要を説明するものである。
タイプ１の不正コードが含まれていた場合、悪意のある開発者の指定した条件が機能確認試験中に満たされることはないため、実行状態に関わらず（実行モードが通常モード、特権モードのいずれであっても）条件式の評価結果は常にＦＡＬＳＥとなる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
もし、条件文のＴＲＵＥコードブロック中に重要な操作が含まれていた場合、不正コードの可能性が高いとみなし、ユーザに通知を行う。
重要な操作を含んでいるかどうかのチェックはコードブロック及びコードブロックから呼び出され得る関数（メソッドも含む）内のコードを調べ、重要操作データベースに登録されている関数呼び出しや状態変数の操作が行われていないかを確認することで行われる。
この処理は確認対象となっている関数が別の関数を呼び出している場合、再帰的に行われ、開発対象外のＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）への呼び出しに達するまで行われる。
【００３９】
タイプ２の不正コードが含まれていた場合、条件式がＴＲＵＥになることは通常モードでは決してないが、特権モードだと少なくとも一度はＴＲＵＥになるはずである。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
問題となるのは、特権モード以外の場合でも条件式がＴＲＵＥになる場合があるかどうかである。もしそのような条件が存在するならば、特権モード以外でもＴＲＵＥコードブロックを実行できる可能性があることになる。そのため、ＴＲＵＥコードブロック中に重要な操作が含まれていた場合、不正コードの可能性が高いとみなす。タイプ２に対する検査方法の詳細は後述する。
【００４０】
タイプ３の不正コードが含まれていた場合、機能確認試験中に条件式がＦＡＬＳＥになることはないため、実行状態に関わらず（実行モードが通常モード、特権モードのいずれであっても）条件式の評価結果は常にＴＲＵＥとなる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
タイプ３の場合、ＦＡＬＳＥコードブロック内に重要な操作が含まれていないかを確認することで不正コード有無を判定する。
【００４１】
タイプ４の不正コードはタイプ２の逆であり、特権モードでは決して条件式がＴＲＵＥに評価されず、通常モードでは少なくとも一度はＴＲＵＥになる。
モード毎の条件評価結果の欄には、この点が判別基準として示されている。
タイプ４の場合は、タイプ２の場合と同様に、特権モードであること以外にＦＡＬＳＥに評価されるための条件が存在するかを確認し、ＦＡＬＳＥコードブロック中に重要な操作が無いかのチェックを行う。
タイプ４に対する検査方法の詳細は後述する。
【００４２】
また、図５に示す以外の評価結果、つまり特権モード、通常モードどちらにおいてもＴＲＵＥ、ＦＡＬＳＥの両方が現れた場合、その条件文には不正コードが含まれていないものとみなす。
【００４３】
以上の説明を前提に、図１３を参照して不正コード検査ツール５００の動作例を説明する。
先ず、ソースコード入力部５０２が、対象ソースコード２００を入力し、ソースコード記憶部５０７に格納する（Ｓ１３０１）（プログラムコード入力ステップ）。
次に、分岐実行状況測定部５０１が検査実行用コンパイラ３００（又は他システム）から分岐実行情報を入力しまた、実行状態入力部５０３が分岐実行情報が対象としている実行モードの種類を示す実行モード情報を入力する（Ｓ１３０２）（分岐実行情報入力ステップ）。
そして、分岐実行状況測定部５０１が、分岐実行情報に示される分岐結果を実行モードに従って図６に示すテーブルに登録する（Ｓ１３０３）。
なお、機能確認試験が実施されている間は、分岐実行状況測定部５０１は、繰り返し分岐実行情報を入力することになる。そして、分岐実行状況測定部５０１は、分岐実行情報を入力する度に、図６に示すテーブルに登録することで、条件分岐文ごとに、実行モードを区別しながら、分岐結果を順次蓄積していく。
この結果、機能確認試験が進行するにつれ、図６に示すテーブルのレコードが増えていく。
また、図１３では、最初にソースコード入力部５０２が対象ソースコード２００を入力する（Ｓ１３０１）こととしているが、機能確認試験の終了後、不正コード精査部５０４が起動するまでに対象ソースコード２００を入力すればよい。
【００４４】
次に、機能確認試験が終了する（Ｓ１３０４）と、不正コード精査部５０４が起動され、不正コード精査部５０４が図５に示す検査対象判別基準情報を参照する（Ｓ１３０５）（検査対象判別基準情報参照ステップ）。
そして、不正コード精査部５０４は、条件分岐文ごとに、分岐実行状況測定部５０１において図６の形式で蓄積されている蓄積分岐結果がいずれかの検査対象判別基準（タイプ１〜４）に合致するかどうかを判断し、ある条件分岐文について、蓄積分岐結果がいずれの検査対象判別基準にも合致しない場合（Ｓ１３０６でＮＯ）は、その条件分岐文には不正コードが含まれている可能性がないと判定する（Ｓ１３１３）（コードブロック検査ステップ）。
一方、蓄積分岐結果がいずれかの検査対象判別基準に合致する場合（Ｓ１３０６でＹＥＳ）は、該当するタイプにより処理が異なる（Ｓ１３０７）。
タイプ２又はタイプ４の場合は、図７に示す処理が行われる（Ｓ１３１１）（コードブロック検査ステップ）。図７に示す処理の内容は後述する。
【００４５】
タイプ１又はタイプ３の場合は、検査対象コードブロックの内容を検査する（Ｓ１３０８）（コードブロック検査ステップ）。
図５に示すとおり、タイプ１の場合は、その条件分岐文に含まれるＴＲＵＥコードブロックが検査対象コードブロックになり、タイプ３の場合は、その条件分岐文に含まれるＦＡＬＳＥコードブロックが検査対象コードブロックになる。
不正コード精査部５０４は、ソースコード記憶部５０７に記憶されている対象ソースコード２００から該当する条件分岐文を抽出し、抽出した条件分岐文に含まれるコードブロックのうちＴＲＵＥコードブロック（タイプ１の場合）又はＦＡＬＳＥコードブロック（タイプ３の場合）を抽出し、抽出した検査対象コードブロックを検査する。
検査の方法は、抽出した検査対象コードブロックに重要操作データベース５０８に格納されている重要操作（不正目的に利用される可能性のある関数、状態変数等）が含まれていないか等を検査する。
検査対象コードブロックに重要操作が含まれていない場合（Ｓ１３０９でＮＯ）は、その条件分岐文には不正コードが含まれている可能性がないと判定する（Ｓ１３１３）（コードブロック検査ステップ）。
一方、検査対象コードブロックに重要操作が含まれている場合（Ｓ１３０９でＹＥＳ）は、その条件分岐文には不正コードが含まれている可能性があると判定する（Ｓ１３１０）（コードブロック検査ステップ）。
また、図６に示すテーブルに示されている条件分岐文のうちまだ検査を行っていない条件分岐文があれば、不正コード精査部５０４は、その条件分岐文についてＳ１３０６以降の処理を行う。
その後、検査結果通知部５０５が不正コード精査部５０４の判定結果をユーザに通知する（Ｓ１３１２）。
【００４６】
次に、不正コード有無の検査方法のうち、タイプ２及びタイプ４の検査について図７を用いてより詳細に説明する。
図７に示される処理は、不正コード精査部５０４により実行される。
まず、評価結果の分類がタイプ２かタイプ４かで分岐する（Ｓ７０１）。
不正コード精査部５０４は、タイプ２の場合には検証する条件式（図中ｆで表示）を元の条件式とし（Ｓ７０２）、重要操作の検査対象（図中Ｂで表示）は条件文中のＴＲＵＥコードブロックとする（Ｓ７０４）。
さらに、Ｓ７０９での判定に用いるレコードの集合（図中Ｓで表示）を、機能確認試験において、その条件式がＴＲＵＥと評価されかつ特権モードであった全てのレコードの集合とする（Ｓ７０６）。
一方、タイプ４であったならばｆを元の条件式の否定とし（Ｓ７０３）、ＢはＦＡＬＳＥコードブロックとし（Ｓ７０５）、Ｓはその条件式がＦＡＬＳＥと評価されかつ特権モードであった全てのレコードの集合とする（Ｓ７０７）。
Ｓ７０６，Ｓ７０７による処理の例を図８に示す。
【００４７】
図８において、連番の１〜４は、ある条件分岐文がタイプ２の基準に合致した場合の当該条件分岐文に含まれる各原子式における真偽結果を示している。
また、連番の５〜７は、ある条件分岐文がタイプ４の基準に合致した場合の当該条件分岐文に含まれる各原子式における真偽結果を示している。
タイプ２の場合、図５に示すように、通常モード実行時の分岐結果が常にＦＡＬＳＥであって特権モード実行時の分岐結果が少なくとも一度ＴＲＵＥとなれば検査対象となる。そして、タイプ２の場合は、図５の検査項目に示すように、ＴＲＵＥになる条件のうち、一度も満たされなかったもの（一度もＴＲＵＥにならなかった原子式）がないかを確認するため、分岐結果（図８の結果の欄）がＴＲＵＥになったレコードを抽出する。図８の例では、特権モードにおいて分岐結果がＴＲＵＥとなっている１、２、４番のレコードをＳ７０９の対象とする（Ｓ＝｛１、２、４｝）。
タイプ４の場合、図５に示すように、通常モード実行時の分岐結果が少なくとも一度はＴＲＵＥであり特権モード実行時の分岐結果が常にＦＡＬＳＥであれば検査対象となる。そして、タイプ４の場合は、図５の検査項目に示すように、ＦＡＬＳＥになる条件のうち、一度も満たされなかったもの（一度もＴＲＵＥにならなかった原子式）がないかを確認するため、分岐結果（図８の結果の欄）がＦＡＬＳＥになったレコードを抽出する。図８の例では、特権モードにおいて分岐結果がＦＡＬＳＥとなっている５、６番のレコードをＳ７０９の対象とする（Ｓ＝｛５、６｝）。
【００４８】
次に、図７のフローにおいて、不正コード精査部５０４は、Ｓ７０８でｆを積和標準形（加法標準形）に変換する。
積和標準形とは積項の論理和だけで表現される論理式であり、任意の論理式は適当な式変形により等価な積和標準形に変換できることが知られている。
次に、不正コード精査部５０４は、Ｓ７０９ではＳ７０８で変換されたｆについてＳ中の各レコードの原子式の値を当てはめ、ｆ中の各積項がＴＲＵＥになるかを確認する（図９参照）。
もしＳ内の全てのレコードに対して一度もＴＲＵＥにならない積項が存在したならばＳ７１０に分岐してコードブロックＢ中に重要操作が含まれているかを確認し、含まれていたならばＳ７１１で不正コードの可能性有りとする。
Ｓ７０９で全ての積項が一度はＴＲＵＥになるか、Ｓ７１０でＢ内に重要操作が含まれていなかった場合には、Ｓ７１２に進み、不正コードの可能性無と判定する。
【００４９】
以上のように、本実施の形態に係る不正コード検査装置では、条件分岐の実行状況を出力するようコンパイルされた対象プログラムに対し機能確認試験を実施し、出力された条件分岐の実行状況情報を収集し、不自然な分岐結果となった条件文に対してコードブロック内の重要操作の有無を検査することで、開発者により秘密の条件で動作するように実装された不正コードを検出できるようになる、という効果がある。
【００５０】
なお、前記タイプ１からタイプ４に該当するが、かつ不正コードの可能性無と判断された場合、試験が十分ではない恐れがあると警告を出力させることも可能である。
つまり、不正コード精査部５０４が、いずれかの条件分岐文の蓄積分岐結果がタイプ１〜４のいずれかの検査対象判別基準に合致すると判定したが、当該条件分岐文の検査対象コードブロックを検査した結果、当該検査対象コードブロックが不正コードブロックでなかった場合に、検査結果通知部５０５が、当該条件分岐文に対する機能確認試験が十分に行われなかった可能性がある旨をユーザに通知するようにしてもよい。
【００５１】
また、図５の例では、特権モードでの動作が可能となる不正コードを発見することを目的にタイプ２、タイプ４の基準が含んでいるが、タイプ１とタイプ３の不正コードのみを発見すれば足りるような場合は、図１４に示す検査対象判別基準を用いるようにしてもよい。
【００５２】
以上、本実施の形態では、対象プログラム実行時に条件分岐の実行状況を出力するようなコードを生成する検査実行用コンパイラと、対象プログラム実行時に出力される条件分岐実行状況の情報と対象プログラムのソースコードを入力として不正コードの有無を検査する不正コード検査ツールからなる不正コード検査装置について説明した。
【００５３】
また、本実施の形態では、上記の不正コード検査ツールが、悪用されると危険な関数や状態変数の一覧が格納される重要操作データベースを持つことを説明した。
【００５４】
また、本実施の形態では、不正コード検査ツールが、条件分岐実行情況の情報を検査対象プログラムの動作を特権モードと通常モードに分類した上で不正コードの検査を行うことを説明した。
【００５５】
また、本実施の形態では、不正コード検査ツールは、不正コードのタイプをタイプ１〜４に分類し、また、それぞれに対する検査方法を規定した情報を有していることを説明した。
【００５６】
また、本実施の形態では、不正コード検査ツールが、タイプ１〜４に該当しているにも関わらず不正コードでなかった場合に、警告を出力する機能を有することを説明した。
【００５７】
実施の形態２．
図１０は、本実施の形態に係る不正コード検査装置１００の構成例を示す。
実施の形態１と異なり、対象プログラム４００の実行結果を実行モード毎にファイル等識別できる状態で格納し、不正コード検査ツールに入力する点を主な特徴としている。
つまり、実施の形態１では、機能確認試験において条件分岐文が実行される度に、機能確認試験システム（検査実行用コンパイラ３００又は他システム）から、実行された条件分岐文における分岐結果を示す分岐実行情報が出力され、不正コード検査ツール５００では、繰り返し出力される分岐実行情報に示される分岐結果を分岐実行状況測定部５０１において図６に示す形式で蓄積していた。
一方、本実施の形態では、機能確認試験の間、機能確認試験システム（検査実行用コンパイラ３００又は他システム）側で各条件分岐文の実行結果を蓄積し、機能確認試験が終了した後、通常モードの実行結果が示される分岐実行情報ファイル７００と特権モードの実行結果が示される分岐実行情報ファイル８００が出力される。
これらの分岐実行情報ファイルには、対象プログラム４００に含まれる全ての分岐条件文について機能確認試験において実行された際の分岐結果の蓄積が示される。
不正コード検査ツール５００では、分岐実行状況測定部５０１が、分岐実行情報ファイル７００及び分岐実行情報ファイル８００を入力し、不正コード精査部５０４が、条件分岐文ごとに、分岐実行情報ファイル７００、８００に示される蓄積された分岐結果がいずれかの検査対象判別基準に合致するかを判定し、検査対象コードブロックの検査を行う。
不正コード精査部５０４の動作は、実施の形態１と同様なので、動作の詳細は省略する。
【００５８】
このように、本実施の形態に係る不正コード検査装置では、機能確認試験の実施と不正コード検査を分離して実行できる、という効果がある。
【００５９】
以上、本実施の形態では、条件分岐実行状況の情報を実行モード毎に識別可能な形式で出力するようにした点を説明した。
【００６０】
実施の形態３．
図１１は、本実施の形態に係る不正コード検査装置１００の構成例を示す。
実施の形態１と異なり、ソース変更点検出部５１０及び検査済みコードデータベース５０９を具備することで、以前の検査によって問題無しと判定され、かつ前回と今回とで変更が無かったコードに関しては検査を再度実行しないことを主な特徴とする。
不正コード検査の結果、問題無しと判断されたソースコードに関してはソースファイル、あるいはソースファイル内の関数記述毎にハッシュ値が計算され、検査済みコードデータベース５０９に格納される。
次回検査時には入力されたソースコードから同様にハッシュ値を計算し、検査済みコードデータベース５０９に記録されているハッシュ値と比較する。
比較の結果、ハッシュ値が一致しなかったソースファイル、あるいは関数内の条件分岐のみを検査対象とする。
【００６１】
つまり、本実施の形態では、不正コード精査部５０４による検査の結果ある条件分岐文が正当な（不正コードブロックが含まれていない）条件分岐文であると判明した場合に、不正コード精査部５０４が、当該検査済み条件分岐文の少なくとも一部を用いてハッシュ演算を行い、ハッシュ演算により得られたハッシュ値を検査済みコードデータベース５０９に登録する。
そして、不正コード精査部５０４が新たな検査を行う場合には、ソース変更点検出部５１０が、新たに検査の対象となった新たな条件分岐文の少なくとも一部を用いてハッシュ演算を行い、新たな条件分岐文に対するハッシュ演算により得られたハッシュ値と検査済みコードデータベース５０９に登録しているハッシュ値とを比較し、両ハッシュ値が一致する場合に、不正コード精査部５０４は、新たな条件分岐文の検査を行わない。
【００６２】
以上のように、本実施の形態では、前回からのソースコードの変更有無を識別し、改変のあった部分だけ検査することで、ソフトウェアの改版等において不正コード検査にかかる時間を短縮できるという効果がある。
【００６３】
以上、本実施の形態では、不正コード検査ツール内で前回検査時のソースコードのハッシュを記憶しておくことで、変更のあった箇所のみ不正コード検査を行うようにした点を説明した。
【００６４】
実施の形態４．
図１２は、本実施の形態に係る不正コード検査装置１００の構成例を示す。
本実施の形態では、実施の形態３で説明したソース変更点検出部５１０及び検査済みコードデータベース５０９の内容を検査実行用コンパイラから参照させることで、検査が完了しているソースコードに対しては分岐実行情報を出力するコードを生成しないようにしている。
【００６５】
つまり、実施の形態１で説明したように、検査実行用コンパイラ３００は、分岐実行情報を出力させるためのコードを条件分岐文に付加し、機能確認試験システム（検査実行用コンパイラ３００又は他システム）は、機能確認試験の際に、当該付加されたコードに基づき分岐実行情報を出力する。このため、前述したように、検査実行用コンパイラ３００は、コード付加システムとして機能している。
本実施の形態では、不正コード検査ツール５００は、検査済みの条件分岐文に対するハッシュ演算により得られたハッシュ値を検査実行用コンパイラ３００から参照可能なように検査済みコードデータベース５０９に登録している。
そして、検査実行用コンパイラ３００が新たなプログラムコードの条件分岐文に対してコードを付加する際に、ソース変更点検出部５１０を用いて検査済みコードデータベース５０９に登録しているハッシュ値を参照するとともに、新たなプログラムコードの条件分岐文のハッシュ値を生成し、生成したハッシュ値と登録されているハッシュ値と比較し、両ハッシュ値が一致する場合は、当該条件分岐文にコードを付加しない。
これにより、既に検査済みの条件分岐文に対しては分岐条件情報が出力されないことになる。
【００６６】
このように、本実施の形態によれば、実施の形態３と異なり、分岐実行情報は変更のあったコードに関するものしか出力されなくなるため、不正コード検査ツールでは検査時にソースコードの差分についてチェックする必要が無くなる。
また、分岐実行情報の出力量が減るため検査のためのオーバヘッドが軽減され、不正コード検査にかかる時間を短縮できるという効果がある。
【００６７】
以上、本実施の形態では、前回検査時のソースコードのハッシュを記憶し、検査実行用コンパイラに入力することで、前回検査から変更のあった箇所だけ条件分岐実行状況の情報を生成するようにした点を説明した。
【００６８】
最後に、実施の形態１〜４に示した不正コード検査装置１００のハードウェア構成例について説明する。
図１５は、実施の形態１〜４に示す不正コード検査装置１００のハードウェア資源の一例を示す図である。
なお、図１５の構成は、あくまでも不正コード検査装置１００のハードウェア構成の一例を示すものであり、不正コード検査装置１００のハードウェア構成は図１５に記載の構成に限らず、他の構成であってもよい。
【００６９】
図１５において、不正コード検査装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。
ＣＰＵ９１１は、バス９１２を介して、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）９１３、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）９１４、通信ボード９１５、表示装置９０１、キーボード９０２、マウス９０３、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。
更に、ＣＰＵ９１１は、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ  Ｄｒｉｖｅ）、コンパクトディスク装置９０５（ＣＤＤ）、プリンタ装置９０６、スキャナ装置９０７と接続していてもよい。また、磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカード（登録商標）読み書き装置などの記憶装置でもよい。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード９１５、キーボード９０２、マウス９０３、スキャナ装置９０７、ＦＤＤ９０４などは、入力装置の一例である。
また、通信ボード９１５、表示装置９０１、プリンタ装置９０６などは、出力装置の一例である。
【００７０】
通信ボード９１５は、例えば、通信ボード９１５は、ＬＡＮ（ローカルエリアネットワーク）、インターネット、ＷＡＮ（ワイドエリアネットワーク）などに接続されていても構わない。
【００７１】
磁気ディスク装置９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。
【００７２】
ＲＯＭ９１３には、ＢＩＯＳ（Ｂａｓｉｃ  Ｉｎｐｕｔ  Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）プログラムが格納され、磁気ディスク装置９２０にはブートプログラムが格納されている。
不正コード検査装置１００の起動時には、ＲＯＭ９１３のＢＩＯＳプログラム及び磁気ディスク装置９２０のブートプログラムが実行され、ＢＩＯＳプログラム及びブートプログラムによりオペレーティングシステム９２１が起動される。
【００７３】
上記プログラム群９２３には、実施の形態１〜４に示した検査実行用コンパイラ３００及び不正コード検査ツール５００の構成要素として「〜部」として示している機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
【００７４】
また、ファイル群９２４には、検査対象判別基準情報記憶部５０６の内容として説明した検査対象判別基準情報、重要操作データベース５０８の内容として説明した重要操作等が含まれている。
また、ファイル群９２４には、実施の形態１〜４の説明において、「〜の判断」、「〜の判定」、「〜の検査」、「〜の計算」、「〜の比較」、「〜の評価」、「〜の更新」、「〜の設定」、「〜の変換」、「〜の登録」、「〜の選択」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのＣＰＵの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
また、実施の形態１〜４で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、ＲＡＭ９１４のメモリ、ＦＤＤ９０４のフレキシブルディスク、ＣＤＤ９０５のコンパクトディスク、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ等の記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００７５】
また、実施の形態１〜４の説明において「〜部」として説明しているものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明しているものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。すなわち、プログラムは、実施の形態１〜４の「〜部」としてコンピュータを機能させるものである。あるいは、実施の形態１〜４の「〜部」の手順や方法をコンピュータに実行させるものである。
【００７６】
このように、実施の形態１〜４に示す不正コード検査装置１００は、処理装置たるＣＰＵ、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータであり、上記したように「〜部」として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。
【図面の簡単な説明】
【００７７】
【図１】実施の形態１に係る不正コード検査装置の構成例を示す図。
【図２】実施の形態１に係る不正コード検査の手順の例を示す図。
【図３】実施の形態１に係る条件分岐文に含まれる要素の定義を説明する図。
【図４】実施の形態１に係る不正コードのタイプを説明する図。
【図５】実施の形態１に係る検査対象判別基準情報の例を示す図。
【図６】実施の形態１に係る分岐結果を蓄積するテーブルの例を示す図。
【図７】実施の形態１に係るタイプ２及びタイプ４のコードの検査方法の例を示すフローチャート図。
【図８】実施の形態１に係るタイプ２及びタイプ４のコードの検査手順を説明する図。
【図９】実施の形態１に係るタイプ２及びタイプ４のコードの検査手順を説明する図。
【図１０】実施の形態２に係る不正コード検査装置の構成例を示す図。
【図１１】実施の形態３に係る不正コード検査装置の構成例を示す図。
【図１２】実施の形態４に係る不正コード検査装置の構成例を示す図。
【図１３】実施の形態１に係る不正コード検査ツールの動作例を示すフローチャート図。
【図１４】実施の形態１に係る検査対象判別基準情報の例を示す図。
【図１５】実施の形態１〜４に係る不正コード検査装置のハードウェア構成例を示す図。
【符号の説明】
【００７８】
１００  不正コード検査装置、２００  不正コード検査対象ソースコード、３００  検査実行用コンパイラ、４００  不正コード検査対象プログラム、５００  不正コード検査ツール、５０１  分岐実行状況測定部、５０２  ソースコード入力部、５０３  実行状態入力部、５０４  不正コード精査部、５０５  検査結果通知部、５０６  検査対象判別基準情報記憶部、５０７  ソースコード記憶部、５０８  重要操作データベース、５０９  検査済みコードデータベース、５１０  ソース変更点検出部、６００  検査結果、７００  分岐実行情報ファイル、８００  分岐実行情報ファイル。
【図１】
2009129204.tif 000003
【図２】
2009129204.tif 000004
【図３】
2009129204.tif 000005
【図４】
2009129204.tif 000006
【図５】
2009129204.tif 000007
【図６】
2009129204.tif 000008
【図７】
2009129204.tif 000009
【図８】
2009129204.tif 000010
【図９】
2009129204.tif 000011
【図１０】
2009129204.tif 000012
【図１１】
2009129204.tif 000013
【図１２】
2009129204.tif 000014
【図１３】
2009129204.tif 000015
【図１４】
2009129204.tif 000016
【図１５】
2009129204.tif 000017