(57)【特許請求の範囲】
【請求項１】
バイナリコードの制御フローグラフであるバイナリ制御フローグラフと、前記バイナリコードに対応するソースコードの制御フローグラフであるソース制御フローグラフとの差分を抽出する差分抽出部と、
前記差分に基づいて前記バイナリコードに存在する異常を抽出する異常抽出部と
を備え、
前記差分抽出部は、
前記ソース制御フローグラフの基本ブロックの数と、前記基本ブロック間の接続情報と、前記基本ブロック内の命令数とをソース特徴情報として生成し、
前記バイナリ制御フローグラフの前記基本ブロックの数と、前記基本ブロック間の接続情報と、前記基本ブロック内の命令数とをバイナリ特徴情報として生成し、
前記差分として、前記ソース特徴情報と、前記バイナリ特徴情報との差分を抽出する検知装置。
【請求項２】
前記異常抽出部は、
異常の特徴を異常特徴として記憶している異常特徴リストを有し、
前記異常特徴に基づいて前記異常を抽出する請求項１に記載の検知装置。
【請求項３】
前記異常抽出部は、前記異常としてバックドアであると考えられるものを抽出し、
前記異常特徴リストは、前記異常特徴として前記バックドアの特徴を記憶している請求項２に記載の検知装置。
【請求項４】
前記ソースコードを解析し、前記ソースコードの前記制御フローグラフを、前記ソース制御フローグラフとして生成するソース解析部と、
前記バイナリコードを解析し、前記バイナリコードの前記制御フローグラフを、前記バイナリ制御フローグラフとして生成するバイナリ解析部と
を備える請求項１から３のいずれか１項に記載の検知装置。
【請求項５】
前記ソース解析部は、
前記ソースコードに基づいて中間コードを生成する中間コード生成部と、
前記中間コードに基づいて前記ソース制御フローグラフを生成するソース制御フローグラフ生成部と
を備え、
前記バイナリ解析部は、
前記バイナリコードを逆アセンブルする逆アセンブル部と、
前記逆アセンブル部が逆アセンブルした結果に基づいて前記バイナリ制御フローグラフを生成するバイナリ制御フローグラフ生成部と
を備える請求項４に記載の検知装置。
【請求項６】
差分抽出部が、バイナリコードの制御フローグラフであるバイナリ制御フローグラフと、前記バイナリコードに対応するソースコードの制御フローグラフであるソース制御フローグラフとの差分を抽出し、
異常抽出部が、前記差分に基づいて前記バイナリコードに存在する異常を抽出し、
前記差分抽出部は、
前記ソース制御フローグラフの基本ブロックの数と、前記基本ブロック間の接続情報と、前記基本ブロック内の命令数とをソース特徴情報として生成し、
前記バイナリ制御フローグラフの前記基本ブロックの数と、前記基本ブロック間の接続情報と、前記基本ブロック内の命令数とをバイナリ特徴情報として生成し、
前記差分として、前記ソース特徴情報と、前記バイナリ特徴情報との差分を抽出する検知方法。
【請求項７】
コンピュータに、
バイナリコードの制御フローグラフであるバイナリ制御フローグラフと、前記バイナリコードに対応するソースコードの制御フローグラフであるソース制御フローグラフとの差分を抽出させ、
前記差分に基づいて前記バイナリコードに存在する異常を抽出させ、
前記ソース制御フローグラフの基本ブロックの数と、前記基本ブロック間の接続情報と、前記基本ブロック内の命令数とをソース特徴情報として生成させ、
前記バイナリ制御フローグラフの前記基本ブロックの数と、前記基本ブロック間の接続情報と、前記基本ブロック内の命令数とをバイナリ特徴情報として生成させ、
前記差分として、前記ソース特徴情報と、前記バイナリ特徴情報との差分を抽出させる検知プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、検知装置、検知方法、及び、検知プログラムに関する。
【背景技術】
【０００２】
組み込み機器等のソフトウェアにおいて、プログラミング言語により記述されたソースコードは、コンパイラ、及び／又は、リンカを通じて、最終的に機械言語が記述されたバイナリコードに変換される。【０００３】
近年、コンパイラ等の開発環境をクラウドに整備する開発形態が増えつつある。この場合、ソースコードをクラウドに送信すると、クラウドにおいてコンパイル等が実行され、バイナリコードが返ってくる。
作業用ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等においてコンパイル等を実行することに対するクラウドにおいてコンパイル等を実行することの利点として、コンパイル時間が短縮する等、開発効率が向上することが挙げられる。【０００４】
しかしながら、クラウドに悪意がある場合、あるいは、正規の開発環境とは異なる悪意ある開発環境へと誘導された場合等に、
出力として得られたバイナリコードにバックドアが埋め込まれていることがあり、
バックドアを検出することは極めて困難である。【０００５】
バックドアは、そもそも埋め込まれているのか否か分からないことが多く、埋め込まれている場合であっても埋め込まれている場所は不明である。
そのため、動的解析によってバックドアを探す場合、膨大な工数を要する。【０００６】
特許文献１では、静的解析に関する技術として、２つのＣＦＧ（Ｃｏｎｔｒｏｌ  Ｆｌｏｗ  Ｇｒａｐｈ、制御フローグラフ）の差分を比較する技術が開示されている。
特許文献１の技術によれば、２つのＣＦＧそれぞれの内部に存在する基本ブロックについて、それらの内容、及び／又は、局所近傍に基づいてマッチングすることにより、両者に共通する基本ブロックを特定することができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−１６５８２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
静的解析によりバックドアを検知するためには、ソースコードと、バイナリコードとの間で処理に関する差分の有無を検査する必要がある。しかし、特許文献１の技術は、２つのバイナリ間の差分を比較するものであり、ソースコードから生成したＣＦＧと、バイナリコードから生成したＣＦＧとを比較するものではない。
そのため、静的解析により、バックドアである可能性が高い箇所を効率良く抽出することができないという課題があった。【０００９】
ただし、ソースコードから生成したＣＦＧと、バイナリコードから生成したＣＦＧとを比較する場合、同じソースコードから生成したバイナリであっても、コンパイル時の最適化オプション等によって、生成されるバイナリコードの構造が変化し得る点を考慮する必要がある。この点を考慮しない場合、具体例としては、基本ブロックの内容に基づいて単純に一致箇所を特定する方法を用いる場合、最適化オプションの影響により変化した箇所についても全て差分と判断してしまう。【００１０】
本発明は、静的解析により、バックドアである可能性が高い箇所を効率良く抽出することを目的とする。
【課題を解決するための手段】
【００１１】
本発明の検知装置は、
バイナリコードの制御フローグラフであるバイナリ制御フローグラフと、前記バイナリコードに対応するソースコードの制御フローグラフであるソース制御フローグラフとの差分を抽出する差分抽出部と、
前記差分に基づいて前記バイナリコードに存在する異常を抽出する異常抽出部と
を備える。
【発明の効果】
【００１２】
本発明の検知装置によれば、バイナリコードにバックドアが埋め込まれている場合に、バイナリコードの制御フローグラフであるバイナリ制御フローグラフと、バイナリコードに対応するソースコードの制御フローグラフであるソース制御フローグラフとの差分に基づいてバイナリコードに存在する異常を抽出するため、静的解析により、バックドアである可能性が高い箇所を効率良く抽出することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１に係る検知装置１００の構成図。
【図２】実施の形態１に係るソース解析部１２０の構成図。
【図３】実施の形態１に係るバイナリ解析部１３０の構成図。
【図４】実施の形態１に係る差分抽出部１４０の構成図。
【図５】実施の形態１に係る異常抽出部１５０の構成図。
【図６】実施の形態１に係る検知装置１００のハードウェア構成図。
【図７】実施の形態１に係る検知装置１００の動作を示すフローチャート。
【図８】実施の形態１に係るソース解析部１２０の動作を示すフローチャート。
【図９】関数Ｆｕｎｃ＿ａ４００のＣＦＧの具体例。
【図１０】実施の形態１に係るバイナリ解析部１３０の動作を示すフローチャート。
【図１１】関数Ｆｕｎｃ＿Ｘ５００のＣＦＧの具体例。
【図１２】実施の形態１に係る差分抽出部１４０の動作を示すフローチャート。
【図１３】ソース特徴情報６０１の具体例。
【図１４】バイナリ特徴情報６０２の具体例。
【図１５】差分情報６０３の具体例。
【図１６】実施の形態１に係る異常抽出部１５０の動作を示すフローチャート。
【図１７】異常特徴リスト１５２の具体例。
【図１８】異常候補情報１５５の具体例。
【発明を実施するための形態】
【００１４】
実施の形態１．
以下、本実施の形態について、図面を参照しながら詳細に説明する。
本実施の形態に係る検知装置１００は、コンパイル等をする際にバイナリコードに組み込まれた任意の異常を検知することができる。
しかし、以下の説明において、前記異常がバックドアに係るものである場合について説明する。従って、下記のバックドアという記述を、他の異常に関する用語に置き換えても良い。
バックドアは、サイバー攻撃の１種である。
【００１５】
＊＊＊構成の説明＊＊＊
図１は、本実施の形態に係る検知装置１００の構成例である。
【００１６】
本図に示すように、検知装置１００は、ソース解析部１２０と、バイナリ解析部１３０と、差分抽出部１４０と、異常抽出部１５０とから構成される。
【００１７】
図２は、ソース解析部１２０の構成例である。
本図に示すように、ソース解析部１２０は、中間コード生成部２１０と、ソースＣＦＧ（Ｃｏｎｔｒｏｌ  Ｆｌｏｗ  Ｇｒａｐｈ、制御フローグラフ）生成部２２０とから構成される。
ソース解析部１２０は、具体例としては、ソースコードからＣＦＧを生成することができる既存のコンパイラ基盤である。
即ち、ソース解析部１２０は、
ソース２００（ソースコード）に基づいて中間コード２０１を生成する中間コード生成部２１０と、
中間コード２０１に基づいてソースＣＦＧ（制御フローグラフ）２０２を生成するソースＣＦＧ（制御フローグラフ）生成部２２０と
を備える。
ＣＦＧは、プログラムに含まれる処理を、分岐を含まない処理の塊である基本ブロックに分割し、基本ブロックから基本ブロックへの遷移を線で表現することにより、プログラム実行時の処理の流れをグラフで表現したものである。
基本ブロックは、ＣＦＧにおける用語である。
本図の矢印は、検知装置１００の実行中に、データが流れ得ることを表す。
【００１８】
図３は、バイナリ解析部１３０の構成例である。
本図に示すように、バイナリ解析部１３０は、逆アセンブル部３１０と、バイナリＣＦＧ生成部３２０とから構成される。
即ち、バイナリ解析部１３０は、
バイナリ３００（バイナリコード）を逆アセンブルする逆アセンブル部３１０と、
逆アセンブル部３１０が逆アセンブルした結果に基づいてバイナリＣＦＧ（制御フローグラフ）３０２を生成するバイナリＣＦＧ（制御フローグラフ）生成部３２０と
を備える。
バイナリ解析部１３０は、具体例としては、バイナリコードからＣＦＧを生成することができる既存の逆アセンブルツールである。
【００１９】
図４は、差分抽出部１４０の構成例である。
本図に示すように、差分抽出部１４０は、特徴量計算部６１０と、特徴量比較部６２０とから構成される。
差分抽出部１４０は、バイナリ３００（バイナリコード）の制御フローグラフであるバイナリＣＦＧ（制御フローグラフ）３０２と、バイナリ３００（バイナリコード）に対応するソース２００（ソースコード）の制御フローグラフであるソースＣＦＧ（制御フローグラフ）２０２との差分を抽出する。
【００２０】
図５は、異常抽出部１５０の構成例である。
本図に示すように、異常抽出部１５０は、異常特徴リスト１５２と、リスト比較部１５１とから構成される。
異常抽出部１５０は、差分抽出部１４０が抽出した差分に基づいてバイナリ３００（バイナリコード）に存在する異常を抽出する。
異常抽出部１５０は、
異常の特徴を異常特徴として記憶している異常特徴リスト１５２を有し、
異常特徴に基づいて異常を抽出することができる。
異常抽出部１５０は、異常としてバックドアであると考えられるものを抽出しても良い。
異常特徴リスト１５２は、異常特徴としてバックドアの特徴を記憶していても良い。
【００２１】
異常特徴リスト１５２は、バックドアの特徴的な振る舞いに関する情報が格納されたリストである。
異常特徴リスト１５２が格納するデータの形式は、任意であって良い。バックドアの特徴的な振る舞いは、任意の振る舞いであって良い。
【００２２】
図６は、本実施の形態に係る検知装置１００のＨ／Ｗ（ハードウェア）・Ｓ／Ｗ（ソフトウェア）構成例である。
検知装置１００は、本図に示すＨ／Ｗ１５から構成される。
検知装置１００は、典型的には、汎用ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）から構成される。
【００２３】
ソース解析部１２０と、バイナリ解析部１３０と、差分抽出部１４０と、異常抽出部１５０との処理は、メモリ１２に格納されたプログラムをプロセッサ１１が読み出し実行する。
【００２４】
Ｈ／Ｗ１５は、実施の形態１のハードウェア構成を示し、プロセッサ１１と、メモリ１２と、補助記憶装置１３とから構成される。
【００２５】
プロセッサ１１は、検知プログラムと、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）と等を実行するプロセッシング装置である。プロセッシング装置は、ＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）と呼ぶこともあり、プロセッサ１１は、具体例としては、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
プロセッサ１１は、メモリ１２と接続されており、演算に必要なデータの一時記憶、及び／又は、データの保存を行い、メモリ１２に格納されたプログラムを読み出して実行する。
【００２６】
本図の検知装置１００は、プロセッサ１１を１つだけ備えているが、検知装置１００は、プロセッサ１１を代替する複数のプロセッサを備えていても良い。これら複数のプロセッサは、プログラムの実行等を分担する。
【００２７】
メモリ１２は、データを一時的に記憶する記憶装置であり、プロセッサ１１の作業領域として使用されるメインメモリとして機能する。メモリ１２は、具体例としては、ＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）等のＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。メモリ１２は、プロセッサ１１の演算結果を保持する。
【００２８】
補助記憶装置１３は、ソース２００と、バイナリ３００と、プロセッサ１１によって実行される各種プログラムと、Ｓ／Ｗ１６と、各プログラムの実行時に使用されるデータと等を記憶する。補助記憶装置１３は、具体例としては、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）又は、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）である。また、補助記憶装置１３は、メモリカード、ＳＤ（Ｓｅｃｕｒｅ  Ｄｉｇｉｔａｌ、登録商標）メモリカード、ＣＦ（Ｃｏｍｐａｃｔ  Ｆｌａｓｈ）、ＮＡＮＤフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、又は、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等の可搬記録媒体であってもよい。
【００２９】
Ｓ／Ｗ１６は、実施の形態１のソフトウェア構成を示し、ソース解析部１２０と、バイナリ解析部１３０と、差分抽出部１４０と、異常抽出部１５０と、ＯＳ１９とから構成される。
【００３０】
ＯＳ１９は、プロセッサ１１によって補助記憶装置１３からロードされ、メモリ１２に展開され、プロセッサ１１上で実行される。ＯＳ１９は、具体例としては、Ｌｉｎｕｘ（登録商標）又はＷｉｎｄｏｗｓ（登録商標）等、プロセッサ１１に適合する任意のものでよい。なお、ＯＳ１９と、Ｓ／Ｗ１６とは、メモリ１２に記憶されていても良い。
【００３１】
＊＊＊動作の説明＊＊＊
本実施の形態に係る検知装置１００の動作を説明する。
検知装置１００の動作手順は、検知方法に相当する。また、検知装置１００の動作を実現するプログラムは、検知プログラムに相当する。
【００３２】
図７は、検知装置１００の動作を示すフローチャートの例である。
本フローチャートに示す処理の順序は、適宜変更しても良い。
【００３３】
（ステップＳ１０１：ソースＣＦＧ生成処理）
ソース解析部１２０は、ソース２００に対応するソースＣＦＧ２０２を生成する。
ソース解析部１２０は、ソース２００（ソースコード）を解析し、ソース２００（ソースコード）の制御フローグラフを、ソースＣＦＧ（制御フローグラフ）２０２として生成する。
【００３４】
ソースＣＦＧ２０２は、ソース２００の制御フローをグラフ化したものであり、ソース２００に対応するＣＦＧである。
【００３５】
ソース２００は、ソースコードであり、バイナリ３００に対応するソースコードであり、バックドアに当たる処理を含まない。ソース２００の形式は任意であって良く、ソース２００の処理は任意であって良い。
【００３６】
（ステップＳ１０２：バイナリＣＦＧ生成処理）
バイナリ解析部１３０は、バイナリ３００に対応するバイナリＣＦＧ３０２を生成する。
バイナリ解析部１３０は、バイナリ３００（バイナリコード）を解析し、バイナリ３００（バイナリコード）の制御フローグラフを、バイナリＣＦＧ（制御フローグラフ）３０２として生成する。
【００３７】
バイナリＣＦＧ３０２は、バイナリ３００の制御フローをグラフ化したものであり、バイナリ３００に対応するＣＦＧである。
【００３８】
バイナリ３００は、
ソース２００に対応するバイナリコードであり、
ソース２００をクラウドに構築された開発環境においてコンパイルした結果として生成されたバイナリコードである。
【００３９】
検知装置１００は、
ステップＳ１０１と、ステップＳ１０２とを任意の順序で実行して良く、
ステップＳ１０１と、ステップＳ１０２とを並列に実行しても良い。
【００４０】
（ステップＳ１０３：差分抽出処理）
差分抽出部１４０は、ソースＣＦＧ２０２と、バイナリＣＦＧ３０２とのそれぞれについて特徴量を計算し、その計算結果から、両者の差分箇所を特定する。
差分抽出部１４０は、任意の特徴量を採用して良い。
【００４１】
（ステップＳ１０４：異常抽出処理）
異常抽出部１５０は、差分箇所の中から、バックドアの特徴的な振る舞いに合致する箇所を特定し、バックドアである可能性が高い箇所を更に絞り込む。
【００４２】
＊＊＊ソース解析部１２０の動作の説明＊＊＊
図８は、ソース解析部１２０の動作を示すフローチャートの例である。
本フローチャートに示す処理の順序は、適宜変更しても良い。
ソース解析部１２０は、ソース２００を入力とし、本フローチャートの処理を実行する。
【００４３】
（ステップＳ１２１：中間コード生成処理）
中間コード生成部２１０は、入力されたソース２００の構文を解析した上で、中間コード２０１を生成する。
【００４４】
中間コード２０１は、典型的には、ソース２００からバイナリ３００を生成する途中段階において生成するコードである。
【００４５】
（ステップＳ１２２：ソースＣＦＧ生成処理）
ソースＣＦＧ生成部２２０は、中間コード２０１から、ソースＣＦＧ２０２を生成する。
【００４６】
図９は、ソースＣＦＧ２０２の一部の具体例であって、関数Ｆｕｎｃ＿ａ４００のＣＦＧの具体例である。本例において、ソース２００は、関数Ｆｕｎｃ＿ａ４００を含むものとする。
本図より、
Ｆｕｎｃ＿ａ４００は、５つの基本ブロック（ブロックａ４０１と、ブロックｂ４０２と、ブロックｃ４０３と、ブロックｄ４０４と、ブロックｅ４０５）から構成されており、
ブロックａ４０１は、Ｆｕｎｃ＿ａ４００の先頭の基本ブロックであり、
ブロックｅ４０５は、Ｆｕｎｃ＿ａ４００の終端の基本ブロックであり、
ブロックａ４０１からブロックｂ４０２又はブロックｃ４０３を経由してブロックｅ４０５への遷移が存在し、
ブロックｄ４０４は、どこからも遷移せず、どこへも遷移しない基本ブロックであることが分かる。
【００４７】
＊＊＊バイナリ解析部１３０の動作の説明＊＊＊
図１０は、バイナリ解析部１３０の動作を示すフローチャートの例である。
本フローチャートに示す処理の順序は、適宜変更しても良い。
バイナリ解析部１３０は、バイナリ３００を入力とし、本フローチャートの処理を実行する。
【００４８】
（ステップＳ１３１：逆アセンブル処理）
逆アセンブル部３１０は、
入力されたバイナリ３００を逆アセンブルし、
アセンブラコード３０１を生成する。
【００４９】
（ステップＳ１３２：バイナリＣＦＧ生成処理）
バイナリＣＦＧ生成部３２０は、アセンブラコード３０１から、バイナリＣＦＧ３０２を生成する。
【００５０】
図１１は、バイナリＣＦＧ３０２の一部の具体例であって、関数Ｆｕｎｃ＿Ｘ５００のＣＦＧの具体例である。本例において、バイナリ３００はＦｕｎｃ＿Ｘ５００を含むものとする。
本図より、
Ｆｕｎｃ＿Ｘ５００は５つの基本ブロック（ブロックＶ５０１と、ブロックＷ５０２と、ブロックＸ５０３と、ブロックＹ５０４と、ブロックＺ５０５）から構成されており、
ブロックＶ５０１は、Ｆｕｎｃ＿Ｘ５００の先頭の基本ブロックであり、
ブロックＺ５０５は、Ｆｕｎｃ＿Ｘ５００の終端の基本ブロックであり、
ブロックＶ５０１からブロックＷ５０２、又は、ブロックＸ５０３と、ブロックＹ５０４とを経由してブロックＺ５０５への遷移が存在することが分かる。
【００５１】
＊＊＊差分抽出部１４０の動作の説明＊＊＊
図１２は、差分抽出部１４０の動作を示すフローチャートの例である。
本フローチャートに示す処理の順序は、適宜変更しても良い。
差分抽出部１４０は、図２に示すソース解析部１２０が生成したソースＣＦＧ２０２と、図３に示すバイナリ解析部１３０が生成したバイナリＣＦＧ３０２とを入力とし、本フローチャートの処理を実行する。
【００５２】
（ステップＳ１４１：ソース特徴情報生成処理）
特徴量計算部６１０は、ソースＣＦＧ２０２に基づいてソース特徴情報６０１を生成する。
特徴量計算部６１０は、ソース特徴情報６０１を、ソース２００、又は、バイナリ３００の関数毎に生成しても良く、別の区分毎に作成しても良い。
特徴量計算部６１０は、具体例としては、Ｆｕｎｃ＿ａ４００の基本ブロック数と、基本ブロック間の線の数と、基本ブロック内の実行命令数と等を集計し、図１３のソース特徴情報６０１を生成する。
【００５３】
図１３は、Ｆｕｎｃ＿ａ４００に対応するソース特徴情報６０１の例である。
図１３のソース特徴情報６０１は、ブロック７００と、ＩＮ数７０１と、ＩＮブロック７０２と、ＯＵＴ数７０３と、ＯＵＴブロック７０４と、Ｓｔｅｐ数７０５とから構成される。
【００５４】
ブロック７００には、ソースＣＦＧ２０２に存在する基本ブロックのラベル名が格納される。
ブロック７００には、本例において、ブロックａ４０１と、ブロックｂ４０２と、ブロックｃ４０３と、ブロックｄ４０４と、ブロックｅ４０５とが格納される。
【００５５】
ＩＮ数７０１には、各基本ブロックの遷移元の基本ブロックの数が格納される。
【００５６】
ＩＮブロック７０２には、各基本ブロックの遷移元の基本ブロックのラベル名が格納される。
【００５７】
ブロックａ４０１と、ブロックｄ４０４とについては、遷移元の基本ブロックが存在しないため、
ＩＮ数７０１には、共に０が格納され、
ＩＮブロック７０２には、共に遷移先がないことを示すＮＵＬＬが格納される。
【００５８】
ブロックｂ４０２と、ブロックｃ４０３とについては、遷移元はブロックａ４０１であるため、
ＩＮ数７０１には、共に１が格納され、
ＩＮブロック７０２には、共にブロックａ４０１を示す「ａ」が格納される。
【００５９】
ブロックｅ４０５については、遷移元は、ブロックｂ４０２と、ブロックｃ４０３とであるため、
ＩＮ数７０１には、２が格納され、
ＩＮブロック７０２には、ブロックｂ４０２と、ブロックｃ４０３とを示す「ｂ」と「ｃ」とが格納される。
【００６０】
ＯＵＴ数７０３には、各基本ブロックの遷移先の基本ブロックの数が格納される。
【００６１】
ＯＵＴブロック７０４には、各基本ブロックの遷移先の基本ブロックのラベル名が格納される。
【００６２】
ブロックａ４０１については、ブロックｂ４０２と、ブロックｃ４０３とに遷移するため、
ＯＵＴ数７０３には、２が格納され、
ＯＵＴブロック７０４には、ブロックｂ４０２と、ブロックｃ４０３とを示す「ｂ」と「ｃ」とが格納される。
【００６３】
ブロックｂ４０２と、ブロックｃ４０３とについては、ブロックｅ４０５に遷移するため、
ＯＵＴ数７０３には、共に１が格納され、
ＯＵＴブロック７０４には、共にブロックｅ４０５を示す「ｅ」が格納される。
【００６４】
ブロックｄ４０４と、ブロックｅ４０５とについては、どの基本ブロックにも遷移しないため、
ＯＵＴ数７０３には、共に０が格納され、
ＯＵＴブロック７０４には、共にＮＵＬＬが格納される。
【００６５】
Ｓｔｅｐ数７０５には、その基本ブロック内の実行命令数が格納される。
Ｓｔｅｐ数７０５の各値は、一例である。
【００６６】
（ステップＳ１４２：バイナリ特徴情報生成処理）
特徴量計算部６１０は、ステップＳ１４１と同様に、バイナリＣＦＧ３０２に基づいてバイナリ特徴情報６０２を生成する。
特徴量計算部６１０は、バイナリ特徴情報６０２を関数毎に生成しても良い。
特徴量計算部６１０は、具体例としては、Ｆｕｎｃ＿Ｘ５００の基本ブロック数と、基本ブロック間の線の数と、基本ブロック内の実行命令数と等を集計し、図１４のバイナリ特徴情報６０２を生成する。
【００６７】
図１４は、Ｆｕｎｃ＿Ｘ５００に対応するバイナリ特徴情報６０２の例である。
本例のバイナリ特徴情報６０２は、ブロック８００と、ＩＮ数８０１と、ＩＮブロック８０２と、ＯＵＴ数８０３と、ＯＵＴブロック８０４と、Ｓｔｅｐ数８０５との各項目から構成される。
各項目の定義は、それぞれブロック７００〜Ｓｔｅｐ数７０５の各項目と同一である。
バイナリ特徴情報６０２の各項目の値は、Ｆｕｎｃ＿Ｘ５００のＣＦＧに対応したものである。ただし、Ｓｔｅｐ数８０５の各値は、一例である。
【００６８】
特徴量計算部６１０は、
ステップＳ１４１と、ステップＳ１４２とを任意の順序で実行して良く、
ステップＳ１４１と、ステップＳ１４２とを並列に実行しても良い。
【００６９】
（ステップＳ１４３：特徴比較処理）
特徴量比較部６２０は、
ソース特徴情報６０１と、バイナリ特徴情報６０２との間で各関数の特徴を比較することにより、ソースＣＦＧ２０２と、バイナリＣＦＧ３０２との全ての関数について、対応している関数（以下、対応関数）が存在するか否かを判断し、
ソース特徴情報６０１と、バイナリ特徴情報６０２との対応関係がある全ての関数間で各基本ブロックの特徴を比較することにより、ソースＣＦＧ２０２と、バイナリＣＦＧ３０２との全ての基本ブロックについて、対応している基本ブロック（以下、対応ブロック）が存在するか否かを判断し、
対応ブロック間に差分が存在するか否かを判断し、
差分情報をまとめた差分情報６０３を生成する。
差分情報は、対応関数が存在しない関数の情報と、対応ブロックが存在しない基本ブロックの情報と、対応ブロック間に差分が存在する対応ブロックの情報との総称である。
関数と、基本ブロックとの差分情報の一部又は全部を差分と呼ぶ。
【００７０】
特徴量比較部６２０がバイナリＣＦＧ３０２の基本ブロックに対応ブロックが存在すると判断した場合、典型的には、バイナリＣＦＧ３０２の基本ブロックに対応する記述であってバイナリ３００の一部の記述は、ソースＣＦＧ２０２の基本ブロックに対応する記述であってソース２００の一部の記述がコンパイラ等により変換されたものである。特徴量比較部６２０がバイナリ３００の関数に対応関数が存在すると判断した場合についても同様である。
なお、特徴量比較部６２０は、本ステップの処理において、ソースＣＦＧ２０２のグラフ構造と、バイナリＣＦＧ３０２のグラフ構造とを総合的に考慮して対応する基本ブロックが存在するか否かを判断しても良い。
ソースＣＦＧ２０２の基本ブロックが、バイナリＣＦＧ３０２の基本ブロックと対応している場合、
ソースＣＦＧ２０２の基本ブロックは、バイナリＣＦＧ３０２の基本ブロックの対応ブロックであり、
バイナリＣＦＧ３０２の基本ブロックは、ソースＣＦＧ２０２の基本ブロックの対応ブロックである。バイナリＣＦＧ３０２の基本ブロックが、ソースＣＦＧ２０２の基本ブロックに対応している場合についても同様である。
【００７１】
図１３と、図１４とに示す例において、
ブロックｂ４０２が、ブロックＷ５０２と、
ブロックｃ４０３が、ブロックＸ５０３と、
ブロックｅ４０５が、ブロックＺ５０５と、それぞれ対応していることが分かる。
【００７２】
ブロックａ４０１と、ブロックＶ５０１とは、どちらも関数の先頭に位置する基本ブロックであることから互いに対応している。しかし、Ｓｔｅｐ数に差異があるため、特徴量比較部６２０は、共に差分があると判断する。
【００７３】
図１５は、Ｆｕｎｃ＿ａ４００に対応するソース特徴情報６０１と、Ｆｕｎｃ＿Ｘ５００に対応するバイナリ特徴情報６０２との差分の情報をまとめた差分情報６０３の具体例である。
以下、本例を用いて差分情報６０３を説明する。
本図の差分情報６０３は、ファイル９００と、Ｆｕｎｃ９０１と、対応Ｆｕｎｃ９０２と、ブロック９０３と、対応ブロック９０４と、ＩＮ数９０５と、ＩＮブロック９０６と、ＯＵＴ数９０７と、ＯＵＴブロック９０８と、Ｓｔｅｐ数９０９との各項目から構成される。
【００７４】
ファイル９００には、ソースＣＦＧ２０２と、バイナリＣＦＧ３０２とのいずれについての情報であるかを示すデータが格納される。
【００７５】
Ｆｕｎｃ９０１には、差分が存在する関数の名前が格納される。本例においては、Ｆｕｎｃ＿ａ４００と、Ｆｕｎｃ＿Ｘ５００とのいずれかが格納される。
【００７６】
対応Ｆｕｎｃ９０２には、Ｆｕｎｃ９０１に示される関数に対応する関数の名前が格納される。
本例においては、Ｆｕｎｃ＿ａ４００と、Ｆｕｎｃ＿Ｘ５００とが対応する関数であるため、Ｆｕｎｃ９０１にＦｕｎｃ＿ａ４００が示される場合、対応Ｆｕｎｃ９０２にはＦｕｎｃ＿Ｘ５００の関数の名前が格納される。
Ｆｕｎｃ９０１に示される関数に対応する関数が存在しない場合、対応Ｆｕｎｃ９０２にはＮＵＬＬが格納される。
【００７７】
ブロック９０３には、差分である基本ブロックのラベル名が格納される。
本例において、ブロックａ４０１と、ブロックｄ４０４と、ブロックＶ５０１と、ブロックＹ５０４とが差分であるため、これらのラベル名が格納される。
【００７８】
対応ブロック９０４には、ブロック９０３に示される基本ブロックの対応ブロックのラベル名が格納される。
本例において、ブロック９０３にブロックａ４０１が示される場合、対応ブロック９０４には、ブロックＶ５０１が格納される。
ブロックｄ４０４と、ブロックＹ５０４とのように、対応ブロックが存在しない場合、対応ブロック９０４にはＮＵＬＬが格納される。
【００７９】
ＩＮ数９０５と、ＩＮブロック９０６と、ＯＵＴ数９０７と、ＯＵＴブロック９０８と、Ｓｔｅｐ数９０９とには、ＩＮ数７０１〜Ｓｔｅｐ数７０５の各項目、又は、ＩＮ数８０１〜Ｓｔｅｐ数８０５の各項目の内容が、そのまま格納される。
【００８０】
＊＊＊異常抽出部１５０の動作の説明＊＊＊
図１６は、異常抽出部１５０の動作を示すフローチャートの例である。
本フローチャートに示す処理の順序は、適宜変更しても良い。
異常抽出部１５０は、差分情報６０３を入力とし、以下の処理を実行する。
【００８１】
（ステップＳ１５１：比較処理）
リスト比較部１５１は、差分情報６０３に格納された差分情報の中に、異常特徴リスト１５２に格納された条件と合致するものが存在するか否かを確認し、
条件と合致するものに基づいて異常候補情報１５５を生成する。
異常抽出部１５０は、差分情報６０３の中から、バックドアの特徴的な振る舞いに合致している差分情報を抽出する。
異常特徴リスト１５２は、バックドアの特徴的な振る舞いに関する情報が格納されたリストである。
異常特徴リスト１５２に格納された条件と合致する差分情報は、バックドアに対応する情報である可能性が高いと考えられる。
異常特徴リスト１５２は、バックドア以外の異常の特徴的な振る舞いに関する情報を格納していても良い。
異常特徴リスト１５２の情報は、差分情報６０３に関する条件式であっても良い。
【００８２】
図１７は、異常特徴リスト１５２の例である。
本例において、バックドアの特徴的な振る舞いとして、２つの条件を例示している。
「Ｎｏ．１：ソースＣＦＧ２０２に存在しない関数がバイナリＣＦＧ３０２に存在する」については、図１５の差分情報６０３において、ファイル９００がバイナリＣＦＧ３０２であり、かつ、対応Ｆｕｎｃ９０２がＮＵＬＬであるものが該当する。
【００８３】
「Ｎｏ．２：バイナリＣＦＧ３０２にのみ存在する基本ブロックから、ソースＣＦＧ２０２と、バイナリＣＦＧ３０２とに共通して存在する基本ブロックへの分岐がある」は、図１５の差分情報６０３において、ファイル９００がバイナリＣＦＧ３０２、かつ、対応ブロック９０４がＮＵＬＬ、かつ、ソースＣＦＧ２０２にも存在する基本ブロックがＯＵＴブロック９０８に格納されているものが該当する。
【００８４】
リスト比較部１５１は、図１５の差分情報６０３と、本例とを用いる場合、ブロックＹ５０４に関する情報が異常特徴リスト１５２のＮｏ．２の条件と合致しているため、ブロックＹ５０４に関する情報に基づいて異常候補情報１５５を生成する。
なお、異常特徴リスト１５２に格納された条件と合致しなかった、ブロックａ４０１と、ブロックｄ４０４と、ブロックＶ５０１とについては、コンパイル時の最適化によって、基本ブロック内の不要な処理が削除された、あるいは、基本ブロック全体が削除されたために生じた差分であると考えられる。
【００８５】
図１８は、リスト比較部１５１が生成する異常候補情報１５５の例である。
異常候補情報１５５は、Ｆｕｎｃ９２１と、対応Ｆｕｎｃ９２２と、ブロック９２３と、対応ブロック９２４と、ＩＮ数９２５と、ＩＮブロック９２６と、ＯＵＴ数９２７と、ＯＵＴブロック９２８と、Ｓｔｅｐ数９２９との各項目から構成される。
各項目の定義は、図１５に示したＦｕｎｃ９０１〜Ｓｔｅｐ数９０９の各項目と同一であるため、ここでの説明は割愛する。
【００８６】
（ステップＳ１５２：出力処理）
リスト比較部１５１は、異常候補情報１５５を出力する。
【００８７】
＊＊＊実施の形態１の特徴＊＊＊
差分抽出部１４０は、
ソースＣＦＧ（制御フローグラフ）２０２の基本ブロックの数と、基本ブロック間の接続情報と、基本ブロック内の命令数とをソース特徴情報６０１として生成し、
バイナリＣＦＧ（制御フローグラフ）３０２の基本ブロックの数と、基本ブロック間の接続情報と、基本ブロック内の命令数とをバイナリ特徴情報６０２として生成し、
差分として、ソース特徴情報６０１と、バイナリ特徴情報６０２との差分を抽出する。
【００８８】
＊＊＊実施の形態１の効果の説明＊＊＊
以上のように、本実施の形態によれば、
差分抽出部１４０は、バイナリＣＦＧ３０２と、ソースＣＦＧ２０２との差分に基づいて差分情報６０３を生成し、
異常抽出部１５０は、差分情報６０３の中から、バックドアの特徴的な振る舞いに合致している差分情報を抽出するため、
バイナリ３００にバックドアが埋め込まれている場合に、ＣＦＧを用いた静的解析により、埋め込まれたバックドアである可能性が高い箇所を抽出することができる。
さらに、本実施の形態によれば、コンパイル時の最適化処理により、ソースＣＦＧ２０２と、バイナリＣＦＧ３０２との間に差分が生じた場合であっても、最適化処理の影響による差分を除外し、バックドアが埋め込まれている可能性の高い箇所を抽出することができる。
【００８９】
＜変形例１＞
検知装置１００は、ソース解析部１２０を備えなくても良い。
本変形例において、
差分抽出部１４０は、他の装置等が生成したソースＣＦＧ２０２を利用し、
検知装置１００は、任意の方法によりソースＣＦＧ２０２を取り込んで良い。
【００９０】
＜変形例２＞
検知装置１００は、バイナリ解析部１３０を備えなくても良い。
本変形例において、
差分抽出部１４０は、他の装置等が生成したバイナリＣＦＧ３０２を利用し、
検知装置１００は、任意の方法によりバイナリＣＦＧ３０２を取り込んで良い。
【００９１】
＜変形例３＞
特徴量比較部６２０は、ステップＳ１４３において、ソースＣＦＧ２０２のある基本ブロックと、バイナリＣＦＧ３０２のある基本ブロックとについて、ソースＣＦＧ２０２のグラフ構造と、バイナリＣＦＧ３０２のグラフ構造とを考慮した場合に対応関係を見出せる場合であっても、両基本ブロックの特徴間に差異がある場合、互いに対応していないと判断しても良い。
特徴量比較部６２０は、ステップＳ１４３において、ソースＣＦＧ２０２のある関数と、バイナリＣＦＧ３０２のある関数とについても同様に判断しても良い。
【００９２】
＜変形例４＞
本実施の形態では、各機能構成要素をソフトウェアで実現する場合を説明した。しかし、変形例として、各機能構成要素はハードウェアで実現されても良い。
【００９３】
各機能構成要素がハードウェアで実現される場合には、検知装置１００は、プロセッサ１１に代えて、電子回路１７を備える。あるいは、図示しないが、検知装置１００は、プロセッサ１１、メモリ１２、及び補助記憶装置１３に代えて、電子回路１７を備える。電子回路１７は、各機能構成要素（及びメモリ１２と補助記憶装置１３）の機能を実現する専用の電子回路である。電子回路を、処理回路と呼ぶこともある。
【００９４】
電子回路１７は、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ（Ｇａｔｅ  Ａｒｒａｙ）、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）が想定される。
【００９５】
各機能構成要素を１つの電子回路１７で実現してもよいし、各機能構成要素を複数の電子回路１７に分散させて実現してもよい。
【００９６】
あるいは、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
【００９７】
前述したプロセッサ１１とメモリ１２と補助記憶装置１３と電子回路１７とを、総称して「プロセッシングサーキットリー」という。つまり、各機能構成要素の機能は、プロセッシングサーキットリーにより実現される。
＊＊＊他の実施の形態＊＊＊
前述した実施の形態の任意の構成要素の変形、もしくは実施の形態において任意の構成要素の省略が可能である。
【００９８】
また、実施の形態は、実施の形態１で示したものに限定されるものではなく、必要に応じて種々の変更が可能である。
【符号の説明】
【００９９】
１１  プロセッサ、１２  メモリ、１３  補助記憶装置、１５  Ｈ／Ｗ、１６  Ｓ／Ｗ、１７  電子回路、１９  ＯＳ、１００  検知装置、１２０  ソース解析部、１３０  バイナリ解析部、１４０  差分抽出部、１５０  異常抽出部、１５１  リスト比較部、１５２  異常特徴リスト、１５５  異常候補情報、２００  ソース、２０１  中間コード、２０２  ソースＣＦＧ、２１０  中間コード生成部、２２０  ソースＣＦＧ生成部、３００  バイナリ、３０１  アセンブラコード、３０２  バイナリＣＦＧ、３１０  逆アセンブル部、３２０  バイナリＣＦＧ生成部、４００  Ｆｕｎｃ＿ａ、４０１  ブロックａ、４０２  ブロックｂ、４０３  ブロックｃ、４０４  ブロックｄ、４０５  ブロックｅ、５００  Ｆｕｎｃ＿Ｘ、５０１  ブロックＶ、５０２  ブロックＷ、５０３  ブロックＸ、５０４  ブロックＹ、５０５  ブロックＺ、６０１  ソース特徴情報、６０２  バイナリ特徴情報、６０３  差分情報、６１０  特徴量計算部、６２０  特徴量比較部、７００  ブロック、７０１  ＩＮ数、７０２  ＩＮブロック、７０３  ＯＵＴ数、７０４  ＯＵＴブロック、７０５  Ｓｔｅｐ数、８００  ブロック、８０１  ＩＮ数、８０２  ＩＮブロック、８０３  ＯＵＴ数、８０４  ＯＵＴブロック、８０５  Ｓｔｅｐ数、９００  ファイル、９０１  Ｆｕｎｃ、９０２  対応Ｆｕｎｃ、９０３  ブロック、９０４  対応ブロック、９０５  ＩＮ数、９０６  ＩＮブロック、９０７  ＯＵＴ数、９０８  ＯＵＴブロック、９０９  Ｓｔｅｐ数、９２１  Ｆｕｎｃ、９２２  対応Ｆｕｎｃ、９２３  ブロック、９２４  対応ブロック、９２５  ＩＮ数、９２６  ＩＮブロック、９２７  ＯＵＴ数、９２８  ＯＵＴブロック、９２９  Ｓｔｅｐ数。
【図１】
0006945768.tif 000002
【図２】
0006945768.tif 000003
【図３】
0006945768.tif 000004
【図４】
0006945768.tif 000005
【図５】
0006945768.tif 000006
【図６】
0006945768.tif 000007
【図７】
0006945768.tif 000008
【図８】
0006945768.tif 000009
【図９】
0006945768.tif 000010
【図１０】
0006945768.tif 000011
【図１１】
0006945768.tif 000012
【図１２】
0006945768.tif 000013
【図１３】
0006945768.tif 000014
【図１４】
0006945768.tif 000015
【図１５】
0006945768.tif 000016
【図１６】
0006945768.tif 000017
【図１７】
0006945768.tif 000018
【図１８】
0006945768.tif 000019