(57)【特許請求の範囲】
【請求項１】
既知の実行コードを数理モデルに変換して表したデータである、既知因子コードを保持する因子コード保持手段と、
不正プログラムによる攻撃が成功した状態を表す成功状態情報を保持する成功状態保持手段と、
検査対象の実行コードを前記数理モデルに変換して表したデータである、分析対象抽象コードを生成し、前記分析対象抽象コードに、前記因子コード保持手段に保持された前記既知因子コードが含まれるか否かを判定する処理と、前記検査対象の実行コードの実行が終了した際の状態が、前記成功状態保持手段に保持された前記成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、前記検査対象の実行コードが不正プログラムであるか否かを判定する因子探索手段と、を備える
プログラム分析システム。
【請求項２】
前記因子探索手段は、前記分析対象抽象コードに、前記因子コード保持手段に保持された前記既知因子コードが含まれるとともに、前記検査対象の実行コードの実行が終了した際の状態が、前記成功状態保持手段に保持された前記成功状態情報に含まれる場合、前記検査対象の実行コードが不正プログラムであると判定する
請求項１に記載のプログラム分析システム。
【請求項３】
前記因子探索手段は、前記因子コード保持手段に保持された前記既知因子コードが、前記分析対象抽象コードに含まれないと判定した場合には、
前記分析対象抽象コードを、互いに素な因子コードである分析対象因子コードに更に分解し、
分解された前記分析対象因子コードの少なくとも一部を並べ替えることで、並べ替える前の前記分析対象抽象コードと同等の実行結果が得られる場合には、前記分析対象因子コードの少なくとも一部を並べ替えた後の前記分析対象抽象コードに、前記既知因子コードが含まれるか否かを判定する処理を更に実行し、
前記分析対象因子コードの少なくとも一部を並べ替えた後の前記分析対象抽象コードに、前記既知因子コードが含まれるとともに、前記検査対象の実行コードの実行が終了した際の状態が、前記成功状態保持手段に保持された前記成功状態情報に含まれる場合、前記検査対象の実行コードが不正プログラムであると判定する
請求項２に記載のプログラム分析システム。
【請求項４】
前記数理モデルは、ある実行コードに含まれる命令を、１以上の写像と、前記写像に関する入力ベクトル及び出力ベクトルとを用いて表すモデルであり、
前記因子探索手段は、前記検査対象の実行コードに含まれる１以上の命令列を前記写像に変換し、変換された１以上の前記写像の積を演算することにより、前記写像を統合することで、前記分析対象抽象コードを生成する
請求項１乃至請求項３のいずれかに記載のプログラム分析システム。
【請求項５】
前記数理モデルにおける前記入力ベクトル及び前記出力ベクトルの要素は、前記検査対象の実行コードが実行される情報処理装置を構成する演算装置に実装されたレジスタの内容を表す情報と、前記検査対象の実行コードが実行される前記情報処理装置を構成するメモリの特定のアドレスの内容を表す情報と、を少なくとも含む、前記検査対象の実行コードが実行される前記情報処理装置の状態を表す情報であり、
前記因子探索手段は、前記検査対象の実行コードの実行が終了した際の状態を表す前記出力ベクトルの要素が、前記成功状態保持手段に保持された前記成功状態情報に含まれるか否かを判定する
請求項４に記載のプログラム分析システム。
【請求項６】
前記因子探索手段は、実行コードに含まれる命令と、当該命令を表す前記数理モデルである前記写像とを関連付ける変換情報を用いて、前記検査対象の実行コードに含まれる１以上の命令列を前記写像に変換する
請求項４又は請求項５に記載のプログラム分析システム。
【請求項７】
脆弱性を利用した攻撃を実行する実行コードの検体を保持する脆弱性データ保持手段と、
既知の不正プログラムの検体を保持する不正プログラムデータ保持手段と、
前記脆弱性データ保持手段に保持された検体と、不正プログラムデータ保持部に保持された検体と、の少なくともいずれかの実行コードを、前記変換情報を用いて前記数理モデルに変換して表したデータである既知抽象コードを生成し、前記既知抽象コードから分解された前記既知因子コードを前記因子コード保持手段に提供する因子抽出手段と、を更に備え、
前記因子探索手段は、前記分析対象抽象コードに、前記脆弱性データ保持手段に保持された検体から取得された前記既知因子コードと、前記不正プログラムデータ保持部に保持された検体から取得された前記既知因子コードと、の少なくとも何れかが含まれるとともに、前記検査対象の実行コードの実行が終了した際の状態が、前記成功状態保持手段に保持された前記成功状態情報に含まれる場合、前記検査対象の実行コードが不正プログラムであると判定する
請求項６に記載のプログラム分析システム。
【請求項８】
正常に稼働しているシステムにおいて実行される実行コードの検体を保持するシステムデータ保持手段と、
前記システムデータ保持手段に保持された検体の実行コードを、前記変換情報を用いて前記数理モデルに変換して表したデータである既知抽象コードを生成し、前記既知抽象コードから分解された前記既知因子コードを前記因子コード保持手段に提供する因子抽出手段と、
前記検査対象の実行コードを、前記変換情報を用いて前記分析対象抽象コードに変換するとともに、
前記分析対象抽象コードの少なくとも一部を、前記システムデータ保持手段に保持された検体の実行コードから取得した前記既知因子コードに置換することで、元の前記検査対象の実行コードよりもコードサイズが低減された実行コードを生成する実行ファイル調整手段と、を更に備える
請求項６に記載のプログラム分析システム。
【請求項９】
ハードウェア装置が、
検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成し、
前記分析対象抽象コードに、既知の実行コードを前記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、前記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、前記検査対象の実行コードが不正プログラムであるか否かを判定する
プログラム分析方法。
【請求項１０】
検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成する処理と、
前記分析対象抽象コードに、既知の実行コードを前記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、前記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、前記検査対象の実行コードが不正プログラムであるか否かを判定する処理と、をコンピュータに実行させる
コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンピュータ・プログラムを分析した結果から、不正なプログラムを検出可能なプログラム分析システム等に関する。
【背景技術】
【０００２】
昨今、組織内のコンピュータや重要施設（インフラ等）に不正な指令を与える不正プログラム（マルウェア等）に起因する、セキュリティの脅威が発生している。係る脅威を低減するセキュリティ対策の一つとして、確実性が高い方法を用いてマルウェアを検出することが考えられる。【０００３】
セキュリティ対策に関連して、例えば、以下のような技術が知られている。【０００４】
特許文献１には、攻撃コードが配置されている攻撃ＵＲＬ（Ｕｎｉｖｅｒｓａｌ  Ｒｅｓｏｕｒｃｅ  Ｌｏｃａｔｏｒ）と、攻撃ＵＲＬに接続される入り口ＵＲＬとの組を悪性ＵＲＬの組として記憶し、悪性ＵＲＬの組に含まれる入り口ＵＲＬへのアクセスを監視する監視装置に関する技術が開示されている。【０００５】
特許文献２には、通信データから、既知の攻撃に関する特徴情報（例えばＵＲＬのパス情報）とは異なる他の特徴情報を抽出し、当該他の特徴情報を含む他の通信データを特定することにより、未知の攻撃に関する通信データを検知することを期待する技術が開示されている。【０００６】
特許文献３には、複数の囮システムを用いて収集した攻撃情報（マルウェア活動に関するＩＰ（Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）アドレス、ＵＲＬ等）をクラスタリングし、異なる種別の囮システムで収集した攻撃情報が複数重複して存在する可能性が高い領域（ＩＰアドレス、ＵＲＬ等）を抽出する技術が開示されている。【０００７】
特許文献４には、仮想マシン環境を用いて採取したマルウェアのサンプルを解析することで、当該マルウェアのシグネチャを生成するマルウェア解析システムに関する技術が開示されている。【０００８】
特許文献５には、実行可能コードをエミュレートすることにより、当該実行可能コードが悪意のあるコード（例えばマルウェア等）であるか否かを判定する方法に関する技術が開示されている。【０００９】
また、セキュリティ対策以外の分野において、以下のような技術が知られている。【００１０】
特許文献６には、ソースプログラムを元に作成された仕様書又は制御フロー図から、リバースエンジニアリングツールを用いて、テスト仕様書を作成するシステムに関する技術が開示されている。【００１１】
特許文献７には、入力データから読み込んだ文字列と、予め登録された文字列とをそれぞれ区分文字を用いて区分し、区分したそれぞれの文字列の一致度に基づいて、これらの文字列を照合する技術が開示されている。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特許第５７５２６４２号公報
【特許文献２】特許第５６５５１９１号公報
【特許文献３】特許第５６５０６１７号公報
【特許文献４】特表２０１４−５１９１１３号公報
【特許文献５】特表２００６−５１２６６７号公報
【特許文献６】特開２００１−０８４１３６号公報
【特許文献７】特開２０１４−０２６４２１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
マルウェアの内容を分析して、その攻撃を抑止することは、一般的には容易ではない。例えば、新種のマルウェアや、未知の脆弱性等を利用する攻撃（ゼロデイ攻撃）を実行するマルウェア等、既知ではないマルウェアの分析が必要となる場合がある。【００１４】
これに対して、上記特許文献１に開示された技術は、マルウェア等の攻撃コードが存在するＵＲＬへのアクセスを遮断する技術であり、あるコードが攻撃コードであるか否かを分析可能な技術ではない。上記特許文献２に開示された技術は、マルウェアにより実行された通信に関する通信データを解析することでマルウェアを検知する技術であり、マルウェア自体を分析可能な技術ではない。上記特許文献３に開示された技術は、マルウェアの活動に関連するＩＰアドレス、ＵＲＬ等の攻撃情報を抽出する技術であり、マルウェア自体を解析する技術ではない。上記特許文献４に開示された技術は、ＶＭ（Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ：仮想マシン）環境を用いてマルウェアの挙動を解析する技術である。ＶＭ環境における解析を検知したマルウェアが挙動を変更した場合、当該マルウェアを適切に解析できない可能性がある。特許文献５に開示された技術は、悪意のある処理が実行された状態を予め定義してから実行コードをエミュレートする技術である。このため、活動内容が予測できない未知の攻撃に十分対応できない可能性がある。なお、特許文献６、特許文献７に開示された技術は、いずれもマルウェアの解析に関連する技術ではない。【００１５】
本開示に係る技術は、上記のような事情を鑑みて着想されたものである。即ち、本開示に係る技術は、検査対象のプログラムの内容を適切に分析可能なプログラム分析システム等を提供することを、主たる目的の一つとする。
【課題を解決するための手段】
【００１６】
上記目的を達成可能な、本開示に係る技術の一つの態様であるプログラム分析システムは、以下のように構成される。即ち、係る分析システムは、既知の実行コードを数理モデルに変換して表したデータである、既知因子コードを保持する因子コード保持部と、不正プログラムによる攻撃が成功した状態を表す成功状態情報を保持する成功状態保持部と、検査対象の実行コードを上記数理モデルに変換して表したデータである、分析対象抽象コードを生成し、上記分析対象抽象コードに、上記因子コード保持部に保持された上記既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持部に保持された上記成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する因子探索部と、を備える。【００１７】
また、本開示に係る技術の一態様であるプログラム分析方法は、検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成し、上記分析対象抽象コードに、既知の実行コードを上記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する、ことを含む。【００１８】
また、同目的は、上記構成を有するプログラム分析システム、プログラム分析方法をコンピュータによって実現するコンピュータ・プログラム、及び、そのコンピュータ・プログラムが格納されているコンピュータ読み取り可能な記録媒体等によっても達成される。
【発明の効果】
【００１９】
本開示に係る技術によれば、検査対象のプログラムの内容を適切に分析することが可能である。
【図面の簡単な説明】
【００２０】
【図１Ａ】図１Ａは、本開示の第１の実施形態に係るプログラム分析システムの機能的な構成を例示するブロック図である。
【図１Ｂ】図１Ｂは、本開示の第１の実施形態に係るプログラム分析システムの変形例の機能的な構成を例示するブロック図である。
【図２】図２は、本開示の第１の実施形態に係るプログラム分析システムに含まれる因子抽出部の動作の一例を示すフローチャートである。
【図３】図３は、本開示の第１の実施形態に係るプログラム分析システムに含まれる成功状態提供部の動作の一例を示すフローチャートである。
【図４】図４は、本開示の第１の実施形態に係るプログラム分析システムに含まれる因子探索部の動作の一例を示すフローチャートである。
【図５】図５は、本開示の第１の実施形態に係るプログラム分析システムに含まれる判定結果提供部の動作の一例を示すフローチャートである。
【図６】図６は、本開示の第１の実施形態に係るプログラム分析システムに含まれる実行ファイル調整部の動作の一例を示すフローチャートである。
【図７】図７は、命令列の写像への変換を、具体例を用いて模式的に示す説明図である。
【図８】図８は、入力ベクトルにおける定数項の表現方法を模式的に示す説明図である。
【図９】図９は、線形関数に変換可能な命令列の具体例を示す説明図である。
【図１０Ａ】図１０Ａは、特定の命令（”ｍｏｖ”命令）を、写像に変換する具体例を示す説明図である。
【図１０Ｂ】図１０Ｂは、特定の命令（”ｌｅａ”命令）を、写像に変換する具体例を示す説明図である。
【図１０Ｃ】図１０Ｃは、特定の命令（”ｐｕｓｈ”命令）を、写像に変換する具体例を示す説明図である。
【図１０Ｄ】図１０Ｄは、特定の命令（”ｐｏｐ”命令）を、写像に変換する具体例を示す説明図である。
【図１１】図１１は、仮想レジスタを用いて、”Ｍｏｄ  Ｒ／Ｍ”バイトを含む命令を写像に変換する具体例を示す説明図である。
【図１２】図１２は、非線形命令に変換可能な命令列の具体例を示す説明図である。
【図１３】図１３は、特定の命令（”ｍｏｖｚｘ”命令、”ｍｏｖｓｘ”命令）を、非線形関数に変換する具体例を示す説明図である。
【図１４】図１４は、複数の命令列から変換された写像を、積により統合する方法を模式的に示す説明図である。
【図１５】図１５は、積による写像の統合処理を例示するフローチャートである。
【図１６】図１６は、連続する線形関数の積の計算処理を模式的に示す説明図である。
【図１７】図１７は、連続する線形関数の積の計算処理を例示するフローチャートである。
【図１８】図１８は、連続する命令列から変換された写像（線形関数）の統合を例示する説明図である。
【図１９】図１９は、連続する命令列から変換された写像（線形関数）の統合を例示する説明図である。
【図２０】図２０は、入力ベクトル及び出力ベクトルの要素（変数）に関する優先度の一例を示す説明図である。
【図２１】図２１は、入力ベクトルに関する定数項の正規化を例示する説明図である。
【図２２】図２２は、命令列と抽象コードとを関連付ける変換情報の具体例を示す説明図である。
【図２３】図２３は、本開示の第１の実施形態における因子データベースの具体例を示す説明図である。
【図２４】図２４は、本開示の第１の実施形態における成功状態データベースの具体例を示す説明図である。
【図２５Ａ】図２５Ａは、検査対象の実行コードの具体例を示す説明図である。
【図２５Ｂ】図２５Ｂは、図２５Ａに示す検査対象の実行コードを数理モデルに変換した具体例を示す説明図である。
【図２６Ａ】図２６Ａは、図２５Ａに例示する実行コードから変換された抽象コードの具体例を示す説明図である。
【図２６Ｂ】図２６Ｂは、図２６Ａに例示する抽象コードから分解された因子コードの具体例を示す説明図である。
【図２７】図２７は、既知の実行コードの具体例を示す説明図である。
【図２８Ａ】図２８Ａは、図２７に例示する実行コードから変換された抽象コードの具体例を示す説明図である。
【図２８Ｂ】図２８Ｂは、図２８Ａに例示する抽象コードから分解された因子コードの具体例を示す説明図である。
【図２９】図２９は、図２５Ａに例示する実行コードを短縮した実行コードの具体例を示す説明図である。
【図３０】本開示の第２の実施形態に係るプログラム分析システムの機能的な構成を例示するブロック図である。
【図３１】本開示の第２の実施形態に係るプログラム分析システムの変形例を例示するブロック図である。
【図３２】図３２は、本発明の各実施形態における分析システムの構成要素を実現可能なハードウェア装置の構成を例示する図面である。
【発明を実施するための形態】
【００２１】
本発明の実施形態に関する説明に先立って、本発明に関する技術的な検討事項等についてより詳細に説明する。
【００２２】
上記したように、不正プログラムに起因したセキュリティの脅威（例えば、未知の脆弱性によるゼロデイ攻撃や、当該攻撃によって仕込まれたマルウェアによる持続的活動等を含むサイバー攻撃）が問題となっている。不正プログラムには、未知の脆弱性を利用した攻撃を実行する不正プログラム、既知の脆弱性を利用した攻撃を実行する不正プログラムが含まれる。一般的に、未知の脆弱性を利用する不正プログラムの挙動や構造は、知られていない場合が多い。既知の脆弱性を利用する不正プログラムであっても、その挙動や構造が知られていない場合がある。
【００２３】
サイバー攻撃等のセキュリティの脅威を低減する観点からは、未知の脆弱性を利用する不正プログラムや、長期間活動可能な不正プログラムを発見し、当該不正プログラムに関する知見を蓄積することが有益である。
【００２４】
情報システムのセキュリティ強度を改善する観点からは、当該情報システムに対してセキュリティに関するテスト（例えば、不正プログラムを用いたペネトレーションテスト）を実行することが考えられる。例えば、周知の脆弱性を利用する不正プログラムは、一般的なセキュリティ対策方法（例えばアンチウィルスソフトウェアや、侵入防止システム等）により検出される可能性ある。システムが高度（強力）な攻撃に耐え得ることを確認する場合、周知の脆弱性を利用する不正プログラムだけではなく、例えば、発見されにくい不正プログラムを用いて、当該システムをテストすることが有益である。
【００２５】
未知の脆弱性を利用する不正プログラムは、例えば、既知の脆弱性を利用するプログラムを分析し、その構成要素（あるいはその組み合わせ）を含む他のプログラムを探索することで、発見できる場合がある。また、持続的に（長期間）活動可能な不正プログラムによる処理は、システムにおいて実行される通常の（正当な）処理と区別が容易ではなく、不正プログラム自体のコードサイズが小さい（コード長が短い）場合がある。係る特性を考慮して、既知の不正プログラム及びシステムが実行する通常処理を分析し、その構成要素（あるいはその組み合わせ）を用いることで、持続的に活動可能な（発見されにくい）不正プログラムを取得可能であると考えられる。
【００２６】
以下の各実施形態を用いて説明するプログラム分析システムは、例えば、既知の脆弱性（脆弱性を有するプログラム）、不正プログラム、及び、システムが実行する通常処理に関するプログラム等のコードを分析して、その構成要素（因子コードと記載する場合がある）を取得する。係るプログラム分析システムは、例えば、分析した因子コード（その組み合わせを含む）を用いて、脆弱性を利用する不正プログラムを探索するよう構成されてよい。係る探索処理には、あるプログラム（実行コード）が、不正プログラムであるか否かに関する判定処理が含まれてよい。また、係るプログラム分析システムは、ある不正プログラムを、上記因子コードを用いて加工することで、テスト用の不正プログラム（例えば、持続的に活動可能な（発見されにくい）不正プログラム）を取得するよう構成されてよい。具体的には、プログラム分析システムは、ある不正プログラムの少なくとも一部を他の因子コードに置換（あるいは組み合わせ）することにより、当該不正プログラムに含まれる、不正なコードのサイズを削減するよう構成されてもよい。
【００２７】
本開示に係るプログラム分析システムを上記のように構成することで、例えば、未知の不正プログラムに起因した攻撃を抑止し得る。その理由は、本開示に係るプログラム分析システムは、上記分析により取得した因子コードと、未知の不正プログラムに含まれる因子コードとを比較することで、未知の不正プログラムに攻撃の因子が含まれるか否かを判定可能だからである。また、本開示に係るプログラム分析システムは、ある不正プログラムを実行した後の状態が、攻撃が成功した状態（成功状態）にあるか否かを判定可能だからである。
【００２８】
また、本開示に係るプログラム分析システムをこのように構成することで、例えば、持続的に活動可能な不正プログラムによる活動を検知する能力が改善され得る。その理由は、以下の通りである。プログラム分析システムは、持続的活動を実施する不正プログラムは、他の不正プログラムと比べてコードサイズが小さいという特性を考慮して、検査対象の不正プログラムを構成する因子コードを置き換えることで、コードのサイズを削減する。これにより、係るプログラム分析システムは、コードサイズが比較的小さい不正プログラムが侵入した場合を想定した検査（テスト）に適用可能な実行コードを生成可能である。即ち、係るプログラム分析システムにより、コードサイズが比較的小さい不正プログラムを用いたペネトレーションテストを実施することができる。
【００２９】
本開示に係るプログラム分析システムを上記のように構成することで、検査対象のプログラムの内容を適切に分析することが可能であり、その結果を用いて、不正プログラムによる攻撃を抑制し得る。
【００３０】
以下、各実施形態を用いて、本開示に係るプログラム分析システムについて詳細に説明する。以下の各実施形態に記載されているプログラム分析システムの構成は例示であり、本発明の技術範囲はそれらには限定されない。以下の各実施形態におけるプログラム分析システムを構成する構成要素の区分け（例えば、機能的な単位による分割）は、プログラム分析システムを実現可能な一例である。当該プログラム分析システムの実装に際しては、以下の例示に限定されず、様々な構成が想定される。即ち、以下の各実施形態におけるプログラム分析システムを構成する構成要素は、更に分割されてもよい。また、以下の各実施形態におけるプログラム分析システムを構成する１以上の構成要素が、統合されてもよい。
【００３１】
以下において説明するプログラム分析システムは、単体の装置（物理的あるいは仮想的な装置）を用いて構成されてもよく、複数の離間した装置（物理的あるいは仮想的な装置）を用いて実現されてもよい。プログラム分析システムが複数の装置により構成される場合、各装置の間は有線、無線、又はそれらを適切に組み合わせた通信ネットワーク（通信回線）により通信可能に接続されてもよい。係る通信ネットワークは、物理的な通信ネットワークであってもよく、仮想的な通信ネットワークであってもよい。以下において説明するプログラム分析システム、あるいは、その構成要素を実現可能なハードウェア構成については、後述する。
【００３２】
＜第１の実施形態＞
［構成］
本開示に係る技術を実現可能な第１の実施形態について図面を参照して説明する。図１Ａは、本実施形態におけるプログラム分析システム１００の機能的な構成を例示するブロック図である。本実施形態においては、不正プログラムがマルウェアであることを想定する。なお、本開示が対象とする不正プログラムには、マルウェア以外のプログラムが含まれてよい。
【００３３】
図１Ａに例示するように、本実施形態におけるプログラム分析システム１００は、脆弱性データベース１０１、マルウェアデータベース１０２、及び、システムデータベース１０３を有する。また、プログラム分析システム１００は、因子抽出部１０４及び因子データベース１０５を有する。また、プログラム分析システム１００は、成功状態登録部１０６及び成功状態データベース１０７を有する。また、プログラム分析システム１００は、因子探索部１０８及び判定結果提供部１０９を有する。プログラム分析システム１００は、出力装置１１０と通信可能に接続されていてもよい。
【００３４】
脆弱性データベース１０１は、脆弱性を利用した攻撃を実行する実行コードである攻撃コードの検体を保持（ストア：ｓｔｏｒｅ）可能である。攻撃コードの検体は、例えば、既知の脆弱性を攻撃する処理が実装された１以上の命令列により表されてもよい。攻撃コードの検体は、当該攻撃コードを含む実行ファイルであってもよい。脆弱性データベース１０１は、上記以外に、既知の脆弱性を有するプログラムに関する実行コードの検体を保持してもよい。以下、脆弱性データベース１０１を、脆弱性データ保持部（脆弱性データ保持手段）と記載する場合がある。
【００３５】
マルウェアデータベース１０２は、既知のマルウェアの検体を保持可能である。マルウェアの検体は、例えば、マルウェアの実行コードの少なくとも一部であってもよく、マルウェアの実行コードそのものであってもよい。既知のマルウェアの検体は、周知の方法を含む適切な方法で収集されてよい。マルウェアデータベース１０２を実現可能な構成は、特に限定されない。以下、マルウェアデータベース１０２を、不正プログラムデータ保持部（不正プログラムデータ保持手段）と記載する場合がある。
【００３６】
システムデータベース１０３は、正常に稼働しているシステムにおいて用いられているオペレーティングシステム（ＯＳ：Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）やアプリケーションに関する検体を保持可能である。システムデータベース１０３に保持される検体は、例えば、ＯＳを構成するライブラリや実行ファイル、あるいは、アプリケーションを構成するライブラリや実行ファイルであってもよい。以下、システムデータベース１０３を、システムデータ保持部（システムデータ保持手段）と記載する場合がある。
【００３７】
上記各データベースには、予め十分な量の検体が保持されることを想定する。
【００３８】
因子抽出部１０４は、脆弱性データベース１０１、マルウェアデータベース１０２、及び、システムデータベース１０３から取得した検体から、因子コード（後述）を抽出する処理を実行可能である。因子抽出部１０４（因子抽出手段）は、抽出した因子コードを因子データベース１０５に登録する。因子抽出部１０４は、因子コードを抽出した検体の実行コードと、因子コードとを関連付けて、因子データベース１０５に登録してもよい。また、因子抽出部１０４は、例えば、因子コードと、当該因子コードが抽出された検体コードを保持するデータベース（脆弱性データベース１０１、マルウェアデータベース１０２及びシステムデータベース１０３）を特定可能な情報と、を関連付けて、因子データベース１０５に登録してもよい。因子抽出部１０４の具体的な処理については、後述する。
【００３９】
因子データベース１０５は、因子抽出部１０４に抽出された因子コードを保持可能である。以下、因子データベース１０５を、因子コード保持部（因子コード保持手段）と記載する場合がある。また、因子データベース１０５が保持する因子コードを、既知因子コードと記載する場合がある。
【００４０】
成功状態登録部１０６は、例えば、攻撃対象（コンピュータ等の情報処理装置、又は情報処理装置を含む情報処理システム）に対する攻撃が成功した状態（以下「成功状態」と記載する場合がある）を表すデータを、成功状態データベース１０７に登録する機能を提供可能である。例えば、プログラム分析システム１００のユーザは、成功状態登録部１０６を用いて、攻撃対象に関する攻撃が成功した状況（例えば、コンピュータの制御が攻撃プログラムに奪われた状況）を表す変数の状態（値）を、プログラム分析システム１００（特には成功状態データベース１０７）に登録可能である。係る変数の状態は、例えば、レジスタや特定のメモリ領域の状態を表してもよい。また、係る変数の状態は、例えば、各種ファイルや、レジストリ等の状態を表してもよい。
【００４１】
成功状態データベース１０７は、成功状態登録部１０６により登録された成功状態を表すデータを保持可能である。以下、成功状態データベース１０７を、成功状態保持部（成功状態保持手段）と記載する場合がある。
【００４２】
因子探索部１０８は、実行ファイル１１１（後述）を抽象コード（後述）に変換する。また、因子探索部１０８は、因子データベース１０５に保持された因子コード（既知因子コード）が、変換された抽象コードに含まれるか否かを確認する処理を実行可能である。また、因子探索部１０８は、当該処理の結果に基づいて、実行ファイルにマルウェア等の不正ファイルが含まれるか否かを判定する処理を実行可能である。以下、実行ファイル１１１から変換された抽象コードを、「分析対象抽象コード」と記載する場合がある。
【００４３】
実行ファイル１１１は、マルウェア等の不正プログラムを含むか否かの検査が実行されるファイルである。実行ファイル１１１は、脆弱性データベース１０１、マルウェアデータベース１０２及びシステムデータベース１０３のいずれにも登録されておらず、プログラム分析システム１００に入力される。実行ファイル１１１は、実行可能形式のファイルに限らず、ライブラリファイル等であってもよい。
【００４４】
判定結果提供部１０９は、因子探索部１０８における判定結果に応じて、脆弱性の有無を表す情報（結果情報）を生成する処理を実行可能である。係る結果情報は文字（テキスト）により表されてもよく、図表により表されてもよい。判定結果提供部１０９は、結果情報を出力装置１１０に提供可能である。
【００４５】
出力装置１１０は、判定結果提供部１０９から提供された結果情報を出力可能である。出力装置１１０が結果情報を出力する方法は、特に限定されず、適宜選択可能である。出力装置１１０は、例えば、各種表示デバイスを用いて結果情報を表示してもよく、結果情報をファイルに出力してもよく、結果情報を他の装置に送信してもよい。
【００４６】
上記各データベース（脆弱性データベース１０１、マルウェアデータベース１０２、システムデータベース１０３、因子データベース１０５、及び成功状態データベース１０７）を実現可能な構成は、特に限定されない。上記各データベースは、例えば、各種データベースソフトウェアを用いて実現されてもよく、ファイルシステムにおけるファイルを用いて実現されてもよい。
【００４７】
プログラム分析システム１００は、変形例として、図１Ｂに例示するように、実行ファイル調整部１１２を含んでもよい。実行ファイル調整部１１２（実行ファイル調整手段）は、実行ファイル１１１のサイズを低減（短縮）可能か否かを確認する処理を実行可能である。実行ファイル調整部１１２は、実行ファイル１１１よりもサイズが小さく、実行ファイル１１１と同様の処理を実行可能である出力ファイル１１３を生成する処理を実行可能である。実行ファイル調整部１１２の具体的な処理については後述する。
【００４８】
出力ファイル１１３は、実行ファイル１１１よりもサイズが小さく、実行ファイル１１１と同様の処理を実行可能な実行ファイルである。出力ファイル１１３は、例えば、実行ファイル１１１の一部が他のコードを用いて置き換えられた実行ファイルであってもよい。
【００４９】
［数理モデル］
以下、本実施形態及びその変形例におけるプログラム分析システム１００によって実行される、実行コードの数理モデルへの変換について説明する。以下において説明する数理モデル表現を表すデータが、上記説明した抽象コードに相当する。以下、説明の便宜上、実行コードがＩｎｔｅｌ（登録商標）社のｘ８６アーキテクチャ（３２ｂｉｔ）において実行可能な命令列により表されることを想定する。なお、本実施形態はこれには限定されず、他のアーキテクチャについても適用可能である。
【００５０】
マルウェア等の不正プログラムは、悪意のある（ｍａｌｉｃｉｏｕｓ）処理を実行する命令列を含む。また、マルウェア等により攻撃される可能性があるプログラムには、脆弱な実行コードに該当する命令列が含まれる場合がある。
【００５１】
ある処理を実現可能な命令列の組み合わせは複数存在し得ることから、命令列の複雑な組み合わせを分析することは必ずしも容易であるとは限らない。そこで、プログラム分析システム１００は、実行コードに含まれる命令列を数理モデルである写像に変換（抽象化）し、一連の命令列による処理を、写像の合成として表現する。これにより、プログラム分析システム１００は、ある実行コードを変換した数理モデルを用いて、当該実行コードを分析（例えば、攻撃コードか否かの判定、脆弱性を有するコードか否かの判定、コードの類似性の判定、コードの置換可能性の判定、等）することが可能である。
【００５２】
例えば、”ｎ”個目（”ｎ”は自然数）の命令を実行した際の、システム（例えばコンピュータ）の状態を”Ｓｎ”、ある正規の実行コードの数理モデルを”Ａ”、攻撃コードの数理モデルを”Ｂ”と表す。システムの状態”Ｓｎ”は、システムに含まれるレジスタ、メモリ、記憶媒体等の状態を含むと想定する。
【００５３】
正規の実行コードを実行した場合のシステムの状態遷移は、例えば、下式により表される。下式において、”Ｓｎ”は数理モデル”Ａ”に関する入力、”Ｓｎ＋１”は数理モデル”Ａ”に関する出力であると考えられる。
0006750674.tif 000002
【００５４】
攻撃コードを実行した場合のシステムの状態遷移は、例えば、下式により表され得る。
0006750674.tif 000003
【００５５】
上式において”Ｂ＝Ｃdiff×Ａ”なる関係が満たされる場合、攻撃コードを表す数理モデル”Ｂ”は、正規の実行コードを表す数理モデル”Ａ”と、差分”Ｃdiff”との組み合わせを用いて表され得る。例えば、差分”Ｃdiff”を小さくするような数理モデル”Ａ”を選択することにより、攻撃コードに特有の特徴（差分”Ｃdiff”）を低減可能であると考えられる。また、差分”Ｃdiff”は、攻撃コード特有の特徴であると考えられることから、差分”Ｃdiff”に相当する数理モデルに変換される実行コードは、攻撃コードである可能性があると考えられる。
【００５６】
上記のような基礎概念に基づいて、プログラム分析システム１００（特には、因子抽出部１０４、因子探索部１０８、及び実行ファイル調整部１１２）は、実行コードに含まれる命令列を、数理モデルである写像（写像を表す関数）の合成に変換する。プログラム分析システム１００は、ある命令列から変換した写像を表す関数の左辺に出力ベクトル（後述）を配置し、右辺の末尾には入力ベクトル（後述）を配置する。入力ベクトルは、写像を表す関数に対する引数として扱われる。
【００５７】
図７に例示する具体例を用いて説明すると、実行コード７０１に含まれる命令列は、それぞれ写像”ｆ１”乃至”ｆ５”に変換される。プログラム分析システム１００は、実行コードに含まれる命令を、レジスタ及びメモリ（メモリ領域）等の状態を、引数及び戻り値として扱う写像に変換可能である。この場合、１つの命令に対して写像の個数は１以上であってよい。プログラム分析システム１００は、例えば、ある命令列と、当該命令列が変換される写像とを関連付ける変換情報（図７の７０２）を保持し、当該変換情報を用いて、命令列を写像に変換してもよい。係る変換情報は、例えば、命令列と写像とを関連付ける辞書データであってもよい。
【００５８】
図７に例示する”ｖｉｎ”は、命令列から変換された写像に関する入力ベクトルである。”ｖｏｕｔ”は、命令列から変換された写像に関する出力ベクトルである。
【００５９】
以下、上記説明した写像に関する入力ベクトル及び出力ベクトルについて説明する。入力ベクトル及び出力ベクトルは、それぞれ、「実レジスタ」、「仮想レジスタ」、及び、「メモリ参照」のいずれか１以上の要素を含む変数ベクトルを用いて表される。以下、変数ベクトルの要素（即ち、入力ベクトル及び出力ベクトルの要素）を、単に「変数」と記載する場合がある。
【００６０】
実レジスタは、例えば、マルウェア等が実行される情報処理装置を構成する演算装置（ＣＰＵ：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に実装されたレジスタを表す。実レジスタには、レジスタ名が関連付けられていてよい。具体例として、Ｉｎｔｅｌ（登録商標）社のｘ８６アーキテクチャにおいては、上記実レジスタは、汎用レジスタ（ＧＰＲ：Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  Ｒｅｇｉｓｔｅｒ）であってもよい。実レジスタを含む変数ベクトルの具体例は、例えば、下式のように表されてもよい。
0006750674.tif 000004
【００６１】
仮想レジスタは、プログラム分析システム１００における計算の都合から導入される仮想的なレジスタである。係る仮想レジスタは、実際のＣＰＵには実装されていなくともよい。仮想レジスタには、当該仮想レジスタを表すレジスタ名が関連付けられていてもよい。
【００６２】
メモリ参照は、マルウェア等が実行される情報処理装置を構成するメモリ（例えば主メモリ等）に記憶された内容を表す要素である。具体的には、メモリ参照の要素は、当該要素が指すアドレス（メモリ領域のアドレス）の内容を表す。メモリ参照は、要素とアドレス幅を有する。メモリ参照の要素は、例えば、下式のように、角括弧（ブラケット）”［”と、”］”とにより囲まれた形式で表記されてもよい。また、メモリ参照の要素には、アドレス幅を表すビット数（例えば”ｒｅｆ８”、”ｒｅｆ１６”、”ｒｅｆ３２”等）が関連付けられてもよい。メモリ参照のうち、角括弧（ブラケット）”［”、”］”により囲まれた部分は、参照するメモリのアドレスを表す。以下、メモリ参照のうち、角括弧（ブラケット）”［”、”］”により囲まれた部分を、”アドレス部分”と記載する場合がある。
0006750674.tif 000005
【００６３】
情報処理装置が扱うメモリ領域は広大であることから、変数ベクトルの要素に全てのメモリ領域の状態を含めると、計算量が増大する可能性がある。このため、メモリ領域のうち、入出力に直接的に関与する領域が、変数ベクトルの要素に含まれてもよい。
【００６４】
変数ベクトルの要素には、定数項が含まれてもよい。定数項は、実数定数を表す要素である。プログラム分析システム１００においては、定数項は、例えば、図８に例示するように、３次元グラフィックスなどの分野において用いられる同次座標系のベクトル表現を用いて表されてもよい。定数項は、入力ベクトルにのみ現れてもよい。定数を引数として扱う非線形関数の実装を容易にすべく、積演算により写像を統合する過程（後述）では、定数項に”１”以外の値が設定されてもよい。
【００６５】
変数ベクトルに含まれる全ての要素（変数）には、当該要素が変更された回数を表す添え字が関連付けられてもよい。具体例として、”ｎ”番目（”ｎ”は自然数）の写像を想定する。下式のように、”ｎ”番目の写像により変更される入力ベクトルの要素の添え字には”ｎ−１”が関連付けられ、当該”ｎ”番目の写像により変更された出力ベクトルの要素の添え字は”ｎ”が関連付けられてもよい。
0006750674.tif 000006
【００６６】
上記説明したメモリ参照においては、例えば、下式のように、角括弧内の要素（アドレス部分）の添え字（例えば、”ｖｒｅｇ２”における”２”）と、メモリ参照自体の添え字（例えば、”［ｖｒｅｇ２］ｒｅｆ１６，１”における”１”）とが異なっていてもよい。
0006750674.tif 000007
【００６７】
以下、実行コードの写像への変換について説明する。プログラム分析システム１００は、実行コードに含まれる命令列を、線形関数、非線形関数及び外部関数のいずれかに変換する。
【００６８】
線形関数は、変換行列を保持する。当該変換行列と入力ベクトルとの積が、出力ベクトルとして扱われる。線形関数は、単一の変換行列により表されてもよい。即ち、ある命令に対する入力ベクトルが、変換行列を用いて出力ベクトルに変換可能である場合、当該命令は線形関数に変換される。変換行列の具体例については後述する。
【００６９】
非線形関数は、当該関数の種類を表す識別子と、当該関数による処理（関数の実体）を表す情報とを保持する。非線形関数は、例えば、単純な変換行列により表すことが困難な写像を表す。非線形関数は、変換行列を含まなくともよい。関数による処理を表す情報は、ラムダ式により表現されてもよい。この場合、ラムダ式に対する引数として入力ベクトルを与えると、出力ベクトルが得られる。非線形関数の具体例については後述する。
【００７０】
外部関数は、関数の種類を表す識別子を保持する。外部関数は、例えば、システムコール等、実行コードが実行される環境（システム）の外で作用する関数を表す。外部関数は、具体的には、例えば、分析対象である実行コードの外部で定義されたシステムコールや、ライブラリ関数であってもよい。
【００７１】
プログラム分析システム１００は、実行コードに含まれる命令列と、写像（後述する写像を表す関数）とを関連付ける変換情報（例えば、テーブルや、マップ等を用いて構成された辞書データ）等を保持してもよい。係る変換情報には、例えば、ある命令列と、当該命令列が変換される写像（上記各関数）との組み合わせが、１以上含まれていて良い。変換情報に含まれる組み合わせは、例えば、一つの命令（例えば”ｍｏｖ”命令等）と、当該命令が変換される写像（例えば、線形写像を表す変換行列等）との組み合わせであってもよい。変換情報に含まれる組み合わせは、複数の命令からなる命令列と、当該命令列が変換される写像との組み合わせであってもよい。プログラム分析システム１００には、分析する実行コードが実行されるコンピュータのアーキテクチャ等に応じて、適切な上記変換情報が与えられていてもよい。上記に限定されず、プログラム分析システム１００は、予め、ある命令列と、当該命令列が変換される写像との対応関係が組み込まれた状態で実装されてもよい。
【００７２】
プログラム分析システム１００は、実行コードに含まれる命令の内、例えば、図９に例示する命令を、線形関数に変換可能である。線形関数に変換される命令は、図９に例示する命令に限定されず、プログラム分析システム１００に適宜設定されていてもよい。図９に例示する命令と、当該命令が変換される線形関数との組み合わせが、上記変換情報に設定されていてもよい。以下、具体例を用いて説明する。
【００７３】
一つの具体例として、命令列”ｍｏｖ  ｅａｘ  ｅｃｘ”の、数理モデルへの変換について説明する（図１０Ａ）。この場合、実レジスタ”ｅａｘ”に実レジスタ”ｅｃｘ”が代入（転送）される。即ち、出力ベクトルの実レジスタ”ｅａｘ”には、入力ベクトルの実レジスタ”ｅｃｘ”が代入（転送）される。出力ベクトルに含まれる他の要素は、入力ベクトルから変更されない。この場合、図１０Ａに例示するように、命令列”ｍｏｖ  ｅａｘ  ｅｃｘ”は、図１０Ａに例示する単一の変換行列”Ｔｍｏｖ（ｅａｘ、ｅｃｘ）”含む線形関数を用いた写像に変換可能である。
【００７４】
他の具体例として、命令列”ｌｅａ  ｅａｘ  ［ｅｃｘ］”の、数理モデルへの変換について説明する（図１０Ｂ）。この場合、実レジスタ”ｅａｘ”に、メモリ参照”［ｅｃｘ］”のアドレスが代入（転送）される。即ち、出力ベクトルの実レジスタ”ｅａｘ”には、入力ベクトルのメモリ参照”［ｅｃｘ］”のアドレスが代入（転送）される。出力ベクトルに含まれる他の要素は、入力ベクトルから変更されない。この場合、図１０Ｂに例示するように、命令列”ｌｅａ  ｅａｘ  ［ｅｃｘ］”は、単一の変換行列”Ｔｌｅａ（ｅａｘ、［ｅｃｘ］）”含む線形関数を用いた写像に変換可能である。
【００７５】
上記のように、代入（転送）命令から変換された変換行列においては、出力ベクトルの要素に代入（転送）される入力ベクトルの要素に対して積の演算が実行される変換行列の要素には非ゼロ（”０”）要素が設定される。変換行列の他の要素はゼロ（”０”）要素に設定されてよい。
【００７６】
他の具体例として、命令列”ｐｕｓｈ  Ｃ”（”Ｃ”は定数）の、数理モデルへの変換について説明する（図１０Ｃ）。この場合、スタックポインタ（”ｅｓｐ”）はデクリメント（例えば４バイト分減算）され、スタックのトップに”Ｃ”が格納される。即ち、出力ベクトルのメモリ参照”［ｅｓｐ］”が参照するアドレス（スタックポインタが指すスタックの先頭）には、定数Ｃが格納される。また、出力ベクトルのスタックポインタ”ｅｓｐ”は、入力ベクトルのスタックポインタからデクリメントされる。出力ベクトルに含まれる他の要素は、入力ベクトルから変更されない。この場合、図１０Ｃに例示するように、命令列”ｐｕｓｈ  Ｃ”は、単一の変換行列”Ｔｐｕｓｈ（Ｃ）”含む線形関数を用いた写像に変換可能である。
【００７７】
他の具体例として、命令列”ｐｏｐ  ｅａｘ”の、数理モデルへの変換について説明する（図１０Ｄ）。この場合、出力ベクトルの実レジスタ”ｅａｘ”に、入力ベクトルのスタックポインタ”［ｅｓｐ］”が指すアドレスの内容が格納される。また、出力ベクトルのスタックポインタ”ｅｓｐ”はインクリメント（例えば４バイト分加算）される。この場合、図１０Ｄに例示するように、命令列”ｐｏｐ  ｅａｘ”は、単一の変換行列”Ｔｐｏｐ（ｅａｘ）”含む線形関数を用いた写像に変換可能である。
【００７８】
以下、ｘ８６アーキテクチャにおける”Ｍｏｄ  Ｒ／Ｍ”バイトを含む命令を数理モデルに変換する方法について、図１１に示す具体例を用いて説明する。表記を簡略化する観点から、図１１に示す具体例においては、入力ベクトル、出力ベクトル、及び変換行列の各要素の内、命令の実行に関係しない要素については省略されている。
”Ｍｏｄ  Ｒ／Ｍ”バイトは、オペコードの直後に配置され、オペコードで使用するレジスタと、アドレッシングモードとを指定するバイトである。
【００７９】
図１１に示す具体例は、命令列”ｍｏｖ  ｄｗｏｒｄ  ｐｔｒ  ［ｅａｘ＊２＋ｅｂｘ＋４］，  １０００”を数理モデルに変換する例である。まず、”Ｍｏｄ  Ｒ／Ｍ”を含む部分（アドレス演算）が、仮想レジスタ（”ｖｒｅｇ１”）を用いて表現される（図１１の（Ａ））。即ち、”［ｅａｘ＊２＋ｅｂｘ＋４］”により表されるアドレス計算の結果が、仮想レジスタ（”ｖｒｅｇ１”）に格納される。図１１における”Ｔ１”は、係るアドレス計算に関する変換行列である。上記のように導入された仮想レジスタが指し示すメモリ参照が、数理モデルとして表される（図１１の（Ｂ））。即ち、仮想レジスタにより参照されるメモリ領域に、即値”１０００”が格納される。図１１における”Ｔ２”は、仮想レジスタにより参照されるメモリ領域に対する即値の代入（転送）を表す変換行列である。以上より、図１１に例示した”Ｍｏｄ  Ｒ／Ｍ”を含む命令が変換さる数理モデル（”Ｔ”）は、２つの変換行列（”Ｔ１”及び”Ｔ２”）の積として表される（図１１の（Ｃ））。
【００８０】
上記説明した具体例以外の命令についても、例えば、当該命令（及び当該命令を含む命令列）と、当該命令が変換される線形関数との組み合わせが、上記変換情報に予め設定されてもよい。これにより、プログラム分析システム１００は、例えば、図９に例示した命令（及び当該命令を含む命令列）を線形関数に変換することが可能である。
【００８１】
本実施形態におけるプログラム分析システム１００は、実行コードに含まれる命令の内、例えば、図１２に例示する命令を非線形関数に変換可能である。図１２に例示する命令と、当該命令が変換される線形関数との組み合わせが、上記変換情報に設定されていてもよい。非線形関数に変換される命令は、図１２に例示する命令に限定されず、プログラム分析システム１００に適宜設定されていてもよい。
【００８２】
一つの具体例として、命令列”ｍｏｖｚｘ  ｅａｘ、  ｂｘ”（ゼロ拡張を伴うロード（転送）命令）の、数理モデルへの変換（図１３の（Ａ）部分）について説明する。この場合、係る命令は、入力変数とビット幅とを引数として受け付ける非線形関数に変換される。図１３の（Ａ）における非線形関数”Ｆｍｏｖｚｘ”は、例えば、入力変数を”ｘ”、ビット幅を”ｂ”とすると、下式のように実装されてもよい。なお、下式において”＆”は、論理積演算をあらわす。変数”ｘ”と、”（２ｂ−１）”との論理積を計算することで、”ｘ”をゼロ拡張した値が得られる。
0006750674.tif 000008
【００８３】
また、命令列”ｍｏｖｓｘ  ｅａｘ、  ｂｙｔｅ  ｐｔｒ  ［ｂｌ］”（符号拡張を伴うロード（転送）命令）も、上記と同様に、入力変数とビット幅とを引数として受け付ける非線形関数に変換される（図１３の（Ｂ）部分）。図１３の（Ｂ）における非線形関数”Ｆｍｏｖｓｘ”は、例えば、入力変数を”ｘ”、ビット幅を”ｂ”とすると、下式のように実装されてもよい。下式において、”Ｆｂｔ（ｘ、ｂ）”は、”ｂｔ”命令を表す非線形関数である。変数”ｘ”の符号を確認した結果に基づいて、符号拡張処理を実行することにより、”ｘ”を符号拡張した値が得られる。
0006750674.tif 000009
【００８４】
上記説明した具体例以外の命令についても、例えば、当該命令（及び当該命令を含む命令列）と、当該命令が変換される非線形関数との組み合わせが、上記変換情報に予め設定されてもよい。これにより、プログラム分析システム１００は、例えば、図１２に例示した命令（及び当該命令を含む命令列）を非線形関数に変換することが可能である。
【００８５】
以下、プログラム分析システム１００による写像の統合処理について説明する。
【００８６】
プログラム分析システム１００は、例えば、図１４に示すように複数の命令列が存在する場合（１行乃至１０行）、各命令列を、写像”Ｔ１”乃至”Ｔ１０”を用いた数理モデルに変換する。
【００８７】
プログラム分析システム１００（特には、因子抽出部１０４、因子探索部１０８、実行ファイル調整部１１２等）は、積の演算処理により写像を統合する。これにより、命令列の表現に用いられる写像の数が低減される。プログラム分析システム１００は、係る写像の統合により、例えば、最小限の写像の合成で、命令列を表現することができる。以下、積演算による写像の統合処理について、図１５に例示するフローチャートを参照して説明する。以下の処理は、プログラム分析システム１００に含まれる、因子抽出部１０４、因子探索部１０８、実行ファイル調整部１１２等により実行されてよい。
【００８８】
具体的には、プログラム分析システム１００は、連続する線形関数の積を演算する（ステップＳ１５０１）。プログラム分析システム１００は、連続する非線形関数と他の関数との積を演算する（ステップＳ１５０２）。プログラム分析システム１００は、他に積を演算可能な関数が存在する場合（ステップＳ１５０３においてＹＥＳ）、ステップＳ１５０１に戻って処理を続行する。プログラム分析システム１００は、他に積を演算可能な関数が存在しない場合、入出力ベクトルを正規化する（ステップＳ１５０４）。
【００８９】
以下、ステップＳ１５０１の処理について、図１６乃至図１９を参照して説明する。図１６に模式的に示すように、二つの線形関数（”Ｔ１”、”Ｔ２”）が連続している場合、プログラム分析システム１００は、これらを積を演算する。これにより、プログラム分析システム１００は、二つの写像を、一つの写像”Ｔ”に統合する。
【００９０】
変数ベクトル”ｖ１”は、線形関数”Ｔ１”の出力ベクトルであり、線形関数”Ｔ２”の入力ベクトルである。そこで、プログラム分析システム１００は、線形関数”Ｔ１”の出力ベクトルと、線形関数”Ｔ２”の入力ベクトルと、についてそれぞれに含まれる要素の種類及び位置を揃えるように、変数ベクトル”ｖ１”を調整する。また、線形関数”Ｔ１”及び”Ｔ２”、並びに、変数ベクトル”ｖ０”及び”ｖ２”の次元を、変数ベクトル”ｖ１”に合わせて拡張する。具体的には、変数ベクトル”ｖ１”に含まれる変数（要素）の種類と位置とに合わせるように、線形関数（”Ｔ１”、”Ｔ２”）の行と列とを拡張する。同様に、変数ベクトル”ｖ０”及び”ｖ２”の行を拡張する。以下、プログラム分析システム１００による上記処理を、行列拡大処理と記載する場合がある（ステップＳ１７０１）。
【００９１】
プログラム分析システム１００は、入力ベクトル及び出力ベクトルの各要素（変数）に、添え字を添付（関連付け）する。実行コードの内、”ｎ”（”ｎ”は自然数）行目の命令列から変換された数理モデルの出力ベクトルに含まれる要素には、添え字として”ｎ”が添付される。”ｎ”（”ｎ”は自然数）行目の命令列から変換された数理モデルの入力ベクトルに含まれる要素には、添え字として”ｎ−１”が添付される。なお、メモリ参照のアドレス部分（角括弧”［”、”］”に囲まれた部分）については、入力ベクトルのアドレス部分と、出力部分のアドレス部分とが（添え字も含めて）同じであってもよい。上記処理を、変数添え字添付処理と記載する場合がある。変数添え字添付処理において、プログラム分析システム１００は、例えば、入力ベクトル及び出力ベクトルの各要素を表すデータに対して、添え字を表すデータを付加データとして関連付けてもよい。あるデータに対して付加データを関連付ける具体的な方法は、例えば、テーブル、構造体、ポインタを用いる方法等、適切な方法を選択してよい。
【００９２】
プログラム分析システム１００は、ある命令から変換された数理モデルの出力ベクトルに含まれた要素（変数）とその添え字との組を、当該命令より後の命令から変換された数理モデルの出力ベクトルに含めてよい。例えば、”ｉ”（”ｉ”は自然数）番目の命令から変換された数理モデルの出力ベクトル”ｖｉ”に、要素”ａｉ”（変数”ａ”と、その添え字”ｉ”との組）が含まれる場合、プログラム分析システム１００は、”ｉ＋１”番目以降の命令から変換された数理モデルの出力ベクトルに、要素（変数）”ａｉ”を含めてよい。以下、上記処理を「変数伝搬処理」と記載する場合がある。
【００９３】
図１８に示す具体例を用いて説明すると、命令列１８０１の１行目（”ｐｏｐ  ｅｄｘ”）の出力ベクトルは、要素”ｅｄｘ”と、”ｅｓｐ”を含み、命令列１８０１の２行目（”ａｄｄ  ｅｃｘ  ｅｄｘ”）の入力ベクトルは、要素”ｅｃｘ”と、”ｅｄｘ”とを含む。これより、プログラム分析システム１００は、要素”ｅｃｘ”、”ｅｄｘ”及び”ｅｓｐ”を含むよう、変数ベクトル”ｖ１”を調整する。プログラム分析システム１００は、変数ベクトル”ｖ１”に含まれる要素の種類と位置に合わせて、各命令列から変換された数理モデル（変換行列）”Ｔ１”及び”Ｔ２”の行と列とを拡張する。プログラム分析システム１００は、数理モデル（変換行列）”Ｔ１”及び”Ｔ２”の入力ベクトル及び出力ベクトルに対して添え字を添付する。
【００９４】
プログラム分析システム１００は、各命令列から変換された数理モデル（変換行列）”Ｔ１”と”Ｔ２”との積を演算する（ステップＳ１７０２）。図１８に示す具体例では、係る積演算処理により、”Ｔ１”と”Ｔ２”とが統合され、２つの命令列が、一つの変換行列”Ｔ”により表される。
【００９５】
プログラム分析システム１００は、ステップＳ１７０２に統合された変換行列の次元を削減する処理である、次元削減処理を実行する（ステップＳ１７０３）。係る次元削減処理には、例えば入力ベクトル”ｖ０”の次元を削減することで、変換行列”Ｔ”の列を削減する処理が含まれてもよい。また、係る次元削減処理には、出力ベクトル”ｖ２”の次元を削減することで、変換行列”Ｔ”の行を削減する処理が含まれてもよい。
【００９６】
プログラム分析システム１００は、例えば、出力ベクトルに含まれる要素（変数）のうち、異なる添え字が添付された変数を削減してよい。具体的には、プログラム分析システム１００は、以下の各処理を実行してよい。プログラム分析システム１００は、出力ベクトルに含まれる変数が実レジスタ又はメモリ参照であり、異なる添字を持つ同じ変数が存在しない場合、その変数と添字との組は最終状態であると判定してよい。この場合、プログラム分析システム１００は、係る変数に関する処理を終了してよい。プログラム分析システム１００は、出力ベクトルに含まれる、ある変数とその添え字との組が最終状態ではなく、他の変数（例えばメモリ参照等）との関連を有しない場合、その変数と添え字との組を削除する。
【００９７】
プログラム分析システム１００は、以下の変数の正規化処理と、状態の正規化処理とを実行する（ステップＳ１７０４）。変数の正規化処理は、定数であることが確定している変数を抽出し、定数項に移動する処理である。プログラム分析システム１００は、変数の優先順位（例えば図２０）に基づいて、変数ベクトルに出現する変数の種類を低減する。状態の正規化処理は、出力ベクトルに含まれる全てのメモリ参照を、最終状態の変数により表す処理である。なお、プログラム分析システム１００は、ステップＳ１７０３乃至Ｓ１７０４の処理を、出力ベクトルが変化しなくなるまで繰り返してもよい。
【００９８】
図１９に示す具体例を用いて説明する。図１９に示す具体例において、プログラム分析システム１００は、実行コード（図１９の１９０１）に含まれる各命令列を数理モデル（図１９の１９０２）に変換する。プログラム分析システム１００は、上記説明した行列拡大処理（ステップＳ１７０１）及び積演算処理（ステップＳ１７０２）を実行し、統合された変換行列と、その入力ベクトル、出力ベクトルとを得る（図１９の１９０３）。
【００９９】
出力ベクトルに含まれる変数”ｅａｘ３”は、”ｅａｘ１”に依存している。また、出力ベクトルに含まれる変数”ｅａｘ１”は、定数”１０００”に依存している。よって、変数”ｅａｘ３”は、定数により表される。入力ベクトルの変数である”ｅａｘ１”は、定数（”１０００”）であることが確定していることから、入力ベクトルの変数を正規化することで、入力ベクトルの次元が縮小される。これにより、変換行列の列が縮小される（図１９の１９０４）。
【０１００】
入力ベクトルの変数である”ｅａｘ３”は、定数（”１００４”）により表されることから、出力ベクトルの正規化と、状態の正規化と実行することで、変換行列の行が縮小される（図１９の１９０５）。
【０１０１】
以下、非線形関数を含む積演算（図１５のステップＳ１５０２）について説明する。
【０１０２】
一例として、合成された写像を表す数理モデル”Ｔ＝Ｔ２×Ｔ１”において、数理モデル”Ｔ２”が非線形関数であり、数理モデル”Ｔ１”が線形関数である場合を想定する。線形関数”Ｔ１”の出力ベクトルに含まれる定数の集合と、非線形関数”Ｔ２”の入力ベクトルに含まれる変数の集合との論理積が空でない場合、非線形関数”Ｔ２”は、他の線形関数に変換できる可能性がある。この場合、プログラム分析システム１００は、非線形関数”Ｔ２”を線形関数に変換してから、上記した線形関数同士の積演算を実行してよい。非線形関数”Ｔ２”を線形関数に変換できない場合、プログラム分析システム１００は、入力ベクトルに対して線形関数”Ｔ１”を適用し、その結果に対して非線形関数”Ｔ２”を適用してよい。
【０１０３】
具体例として、”Ｔ１”がデータ代入（転送）命令（例えば、”ｍｏｖ  ｅｂｘ  Ｃ”（Ｃは定数））から変換された線形関数であり、”Ｔ２”が乗算命令（例えば”ｍｕｌ  ｅｂｘ”）から変換された非線形関数である場合を想定する。この場合、合成写像”Ｔ”は、”Ｔ＝ｍｕｌ○ｍｏｖ”（記号”○”は、合成写像を表す）と表される。なお、”ｍｕｌ”命令を実行すると、レジスタ”ｅａｘ”に格納された値と、”ｍｕｌ”命令に与えられたオペランドと乗算が行われ、その乗算結果の上位部分はレジスタ”ｅｄｘ”に、下位部分はレジスタ”ｅａｘ”に格納されることを想定する。このような命令列は、例えば以下のような疑似コードにより表される。
0006750674.tif 000010
【０１０４】
例えば、”ｅｂｘ＝１”が成立する場合（例えば”ｍｏｖ  ｅｂｘ  ｎ（ｎ：定数）”等の命令が実行された場合等）、”ｍｕｌ  ｅｂｘ”命令を実行しても、”ｅａｘ”の値は変わらない。また、”ｅｂｘ＝０”の場合、”ｍｕｌ  ｅｂｘ”命令を実行すると、”ｅａｘ”には”０”が格納される。いずれの場合においても、”ｅｄｘ”には”０”が格納される。これは、例えば、以下のような疑似コードにより表される。
0006750674.tif 000011
【０１０５】
上記の場合、”ｍｏｖ”命令から変換された線形関数の出力ベクトルに定数（この場合は”ｅｂｘ＝０”、”ｅｂｘ＝１”）が含まれる。即ち、この場合の定数の集合は”ｅｂｘ”である。また、”ｍｕｌ”命令から変換された非線形関数の入力ベクトルには”ｅｂｘ”、”ｅａｘ”が含まれる（即ち、入力ベクトルの変数の集合には、”ｅｂｘ”、”ｅａｘ”が含まれる）。よって、線形関数の出力ベクトルに含まれる定数の集合（この場合は”ｅｂｘ”）と、非線形関数の入力ベクトルに含まれる変数の集合（この場合は”ｅａｘ”、”ｅｂｘ”）とには、”ｅｂｘ”が含まれる。この場合、”ｍｕｌ”命令から変換された非線形関数は、線形関数に変換可能である。なお、”ｅｂｘ＝０”または、”ｅｂｘ＝１”が成立しない場合、”ｍｕｌ”命令から変換された非線形関数は、線形関数には変換されない。
【０１０６】
別の例として、合成された写像を表す数理モデル”Ｔ＝Ｔ２×Ｔ１”において、数理モデル”Ｔ１”、”Ｔ２”がともに非線形関数である場合を想定する。この場合、逆射の定義から、一方の写像が他方の（偏）逆写像であるとき、これらの写像は恒等写像に変換され得る。
【０１０７】
具体例として、”Ｔ１”が乗算命令（例えば、”ｍｕｌ  ｅｂｘ”）から変換された非線形関数であり、”Ｔ２”が除算命令（例えば”ｄｉｖ  ｅｂｘ”）から変換された非線形関数である場合を想定する。この場合、合成写像”Ｔ”は、”Ｔ＝ｄｉｖ○ｍｕｌ”（記号”○”は、合成写像を表す）と表される。このような命令列は、例えば、以下のような疑似コードにより表される。
0006750674.tif 000012
【０１０８】
ここで、ｅｂｘが”０”（ゼロ）ではない場合、”ｅａｘ”の値は変わらない。なぜなら、同じ値（”ｅｂｘ”）を乗算した後に除算しているからである。また、”ｅｄｘ”には”０”が設定される。これは、例えば、以下のような疑似コードにより表される。
0006750674.tif 000013
【０１０９】
以上より、数理モデル”Ｔ１”、”Ｔ２”のうち、一方の写像が他方の逆写像であるとき、これらを合成した写像”Ｔ”は、入力ベクトルを写像した結果を更に逆写像する処理に相当することから、恒等写像であると考えられる。上記具体例では、”ｄｉｖ”命令が”ｍｕｌ”命令の逆写像であることから、”Ｔ＝ｄｉｖ○ｍｕｌ”なる写像を恒等写像として扱うことが可能な場合がある。
プログラム分析システム１００は、例えば、恒等写像を”ｎｏｐ”命令に相当する写像として扱い、当該写像に関する処理を実行せずともよい。プログラム分析システム１００は、数理モデル”Ｔ１”、”Ｔ２”を恒等写像として扱えない場合、入力ベクトルに対して非線形関数”Ｔ１”を適用し、その結果に対して非線形関数”Ｔ２”を適用してよい。
【０１１０】
以下、入出力ベクトルの正規化（図１５のステップＳ１５０４）について説明する。プログラム分析システム１００は、入力ベクトルに含まれる要素（変数）の優先順位に基づいて、入力ベクトルの行の順序を並び替え（ソート）する。プログラム分析システム１００は、出力ベクトルに含まれる要素（変数）の優先順位に基づいて、出力ベクトルの行の順序を並び替え（ソート）する。変数の優先順位は、例えば、図２０に例示するように、予め定められていてもよい。なお、図２０に示す優先順位は、一つの具体例であり、変数の優先順位は適宜定められてよい。
【０１１１】
また、プログラム分析システム１００は、例えば、図２１に例示するように、入力ベクトルの定数項が”１”となるように、当該入力ベクトルを調整する。
【０１１２】
上記した処理により、プログラム分析システム１００は、実行コードの命令列を、数理モデルに変換することができる。上記したように、実行コードから変換された数理モデルは抽象コードに相当する。プログラム分析システム１００は、写像の合成処理を実行することにより、複数行からなる実行コードを、１以上の抽象コードに変換することができる。
【０１１３】
［動作］
以下、図２、図３、図４及び図５の各図に例示するフローチャートを参照して、本実施形態におけるプログラム分析システム１００の動作について説明する。
【０１１４】
図２は、因子抽出部１０４の動作の具体例を表すフローチャートである。図２に例示する処理は、例えば、所定のタイミング（例えば、所定時間ごと）で実行されてもよい。
【０１１５】
因子抽出部１０４は、脆弱性データベース１０１、マルウェアデータベース１０２、及び、システムデータベース１０３のそれぞれから検体（検体の実行コード）を読み込む（ステップＳ２０１）。
【０１１６】
因子抽出部１０４は、検体に含まれる実行コード（例えば、機械語コード）を、抽象コードに変換する（ステップＳ２０２）。この際、因子抽出部１０４は、例えば、検体の実行コードに含まれる実行コードを、逆アセンブルなどの静的解析手法を用いて解析してもよい。因子抽出部１０４は、例えば、実行コードの解析結果（例えば、アセンブラコード）と、抽象コードとを関連付ける、上記説明した変換情報（例えば、変換テーブルや変換マップ等）を保持し、当該変換情報を用いて、実行コードを抽象コードに変換してもよい。抽象コードは、上記したように、抽象化された変数名により表される入力ベクトル及び出力ベクトルと、それらの間の写像を表す関数と、から構成される。以下、因子抽出部１０４が、上記各データベースに含まれる検体から変換した抽象コードを、「既知抽象コード」と記載する場合がある。
【０１１７】
因子抽出部１０４は、例えば、実行コードを、特定の中間形式を用いて表されるデータ（中間データ）に変換し、当該変換されたデータを、更に抽象コードに変換してもよい。因子抽出部１０４は、例えば、実行コードを、ＳＳＡ形式（ｓｔａｔｉｃ  ｓｉｎｇｌｅ  ａｓｓｉｇｎｍｅｎｔ  ｆｏｒｍ）の中間データに変換してもよい。この場合、上記変換情報には、実行コードに含まれる命令列と、当該命令列から変換される中間データとの組み合わせと、ある中間データと、当該中間データから変換される数理モデルとの組み合わせとが含まれてもよい。
【０１１８】
因子抽出部１０４は、実行コードから変換した数理モデルに対して、上記説明した写像の統合処理を実行してもよい。
【０１１９】
因子抽出部１０４は、抽象コードを不可分な（互いに素な）因子コードに分解する（ステップＳ２０３）。因子コードは、実行コードを数理モデルに変換して表したデータである。ある因子コードと、他の因子コードとに、ある出力ベクトルの変数が共通して含まれるような依存関係が存在しない場合、それらの因子コードは、互いに素な因子コードである。因子コードは、例えば、１つ乃至２つの変数に対する演算を表す数理モデルである。抽象コードは、例えば、因子コードの集合によって表現され得る。
【０１２０】
因子抽出部１０４は、何らかの手法を用いて、抽象コードを表す行列を分解することで、抽象コードを、因子コードに分解する。因子抽出部１０４は、例えば、周知の行列分解手法（例えば、ＬＵ分解、特異値分解（ＳＶＤ：ｓｉｎｇｕｌａｒ  ｖａｌｕｅ  ｄｅｃｏｍｐｏｓｉｔｉｏｎ）、主成分分解）等を用いて抽象コードを表す行列を分解した結果を用いて、抽象コードを因子コードに分解してもよい。抽象コードを表す行列を分解する方法は上記に限定されない。例えば、抽象コードを表す行列と、何らかのベクトルとの積の演算結果における各行が互いに素である場合、それらの各行を因子コードとして扱ってもよい。
【０１２１】
因子抽出部１０４は、因子コードとその並び順、及び、仮想メモリ上のアドレスを因子データベース１０５に登録する（ステップＳ２０４）。因子抽出部１０４は、因子コードだけではなく、抽象コードを因子データベース１０５に登録してもよい。
【０１２２】
図３は、成功状態登録部１０６の動作の具体例を示すフローチャートである。成功状態登録部１０６は、例えば、プログラム分析システム１００の利用者からの要求に応じて処理を開始してよい。
【０１２３】
成功状態登録部１０６は、保護対象であるシステムや装置（コンピュータ、インフラなど）に関する攻撃が成功した状態（成功状態）を表す情報を、プログラム分析システム１００の利用者から受け付ける（ステップＳ３０１）。あるシステムに関する攻撃が成功した状態は、例えば、当該システムに関する制御が攻撃者に奪われた状態に相当する。攻撃が成功した状態を表す情報は、例えば、特定の変数、メモリ領域、ファイル等の状態を表す情報であってもよい。成功状態登録部は、例えば、攻撃が成功した状態を表す数理モデル表現を表す情報（データ）を、利用者から受け付けてもよい。成功状態登録部１０６は、例えば、利用者に対して、攻撃が成功した状態を表す数理モデルを作成するためのインタフェース等を提供してもよい。
【０１２４】
成功状態登録部１０６は、利用者から提供された、攻撃が成功した状態を表す情報を、成功状態データベース１０７に登録する（ステップＳ３０２）。
【０１２５】
図４は、因子探索部１０８の動作の具体例を示すフローチャートである。因子探索部１０８は、例えば、プログラム分析システム１００の利用者からの要求に応じて処理を開始してよい。
【０１２６】
因子探索部１０８は、検査対象である実行ファイル１１１の実行コード（例えば、機械語コード）を抽象コードに変換する（ステップＳ４０１）。実行ファイル１１１は、例えば、脆弱性データベース１０１、マルウェアデータベース１０２、及び、システムデータベース１０３のいずれにも登録されていない、未知の実行ファイルであってよい。
【０１２７】
因子探索部１０８は、上記因子抽出部１０４と同様、実行コードに含まれる命令と、抽象コード（数理モデル）とを関連付ける変換情報（例えば、変換テーブルや変換マップ等）を保持し、当該変換情報を用いて、実行コードを抽象コードに変換してもよい。例えば、係る変換情報には、実行コードに含まれるある命令列と、当該命令列から変換される数理モデル（線形関数、非線形関数、外部関数等）とが関連付けて設定されていてもよい。
【０１２８】
因子探索部１０８は、ステップＳ４０１において検査対象である実行ファイル１１１の実行コードから変換した抽象コードに、因子データベース１０５に登録された因子コード（既知因子コード）が含まれるか否かを確認する（ステップＳ４０２）。因子探索部１０８は、例えば、ステップＳ４０１において変換した抽象コードを因子コード（「分析対象因子コード」と記載する場合がある）に分解してもよい。因子探索部１０８は、因子データベース１０５を検索し、分解した因子コード（分析対象因子コード）に相当する因子コード（既知因子コード）が因子データベース１０５に登録されているか否かを確認してもよい。この際、因子探索部１０８は、因子データベース１０５に登録された因子コード（既知因子コード）のうち、脆弱性データベース１０１及びマルウェアデータベース１０２に登録された検体から抽出された因子コードを検索してもよい。
【０１２９】
実行ファイル１１１から変換した抽象コードに、因子データベース１０５に登録された因子コードが含まれなかった場合（ステップＳ４０２においてＮＯ）、因子探索部１０８は、係る抽象コードに可換性を有する因子コードが含まれるか確認する。可換性を有する因子コードとは、抽象コードに含まれる因子コードのうち、その位置や実行順序を並べ替えた場合に、並べ替える前と同等の実行結果が得られる因子コードである。因子探索部１０８は、例えば、抽象コードに含まれる１以上の因子コードを並べ替えても抽象コードの出力ベクトルが変わらない場合、当該１以上の因子コードを、可換性を有する因子コードであると判定してもよい。
【０１３０】
実行ファイル１１１から変換した抽象コードに、可換性を有する因子コードが含まれる場合、因子探索部１０８は、当該抽象コードにおいて部分的に因子コードを並べ替える。そして、因子探索部１０８は、因子コードを並べ替えた後の抽象コードに、因子データベース１０５に登録された因子コードが含まれるか否かを確認する（ステップＳ４０３）。
【０１３１】
因子データベース１０５に登録された因子コードが、ステップＳ４０３において並べ替えられた抽象コードに含まれない場合（ステップＳ４０４においてＮＯ）、因子探索部１０８は、実行ファイル１１１に関する脆弱性が存在しないと判定し（ステップＳ４０６）、処理を終了してよい。
【０１３２】
因子データベース１０５に登録された因子コードが、ステップＳ４０３において並べ替えられた抽象コードに含まれる場合（ステップＳ４０４においてＹＥＳ）、因子探索部１０８は、ステップＳ４０５から処理を実行する。また、ステップＳ４０２においてＹＥＳの場合も、因子探索部１０８は、ステップＳ４０５から処理を実行する。
【０１３３】
ステップＳ４０５において、因子探索部１０８は、実行ファイル１１１の最終的な動作状態である最終動作状態が、成功状態データベース１０７に登録された成功状態を表す情報に含まれるか否かを判定する（ステップＳ４０５）。最終動作状態は、例えば、実行ファイル１１１の実行が終了した際の状態として、実行ファイル１１１から変換された抽象コードにおける写像が実行された後の出力ベクトルの状態（より具体的には、当該出力ベクトルに含まれる要素）を表してもよい。
【０１３４】
最終動作状態が成功状態と合致する（又は、最終動作状態に成功状態が含まれる）場合（ステップＳ４０５においてＹＥＳ）、因子探索部１０８は、実行ファイル１１１に関する脆弱性が存在する、と判定する（ステップＳ４０７）。この場合、因子探索部１０８は、実行ファイル１１１に攻撃コードが含まれると判定してよい。ステップＳ４０５におおいてＮＯの場合、因子探索部１０８は、実行ファイル１１１に関する脆弱性が存在しない判定する（ステップＳ４０６）。この場合、因子探索部１０８は、実行ファイル１１１に攻撃コードが含まれないと判定してよい。因子探索部１０８は、上記判定結果を、判定結果提供部１０９に提供してよい。
【０１３５】
図５は、判定結果提供部１０９の動作の一例を表すフローチャートである。判定結果提供部１０９は、因子探索部１０８における判定結果から、実行ファイル１１１に関する脆弱性の有無を確認し、当該判定結果を表す情報（データ）を生成する（ステップＳ５０１）。判定結果提供部１０９は、係る情報を文字乃至図表を用いて表現するデータを生成してもよい。
【０１３６】
判定結果提供部１０９は、生成したデータを、出力装置１１０に提供する（ステップＳ５０２）。
【０１３７】
以下、プログラム分析システム１００が、変形例として、実行ファイル調整部１１２を含む場合の処理について説明する。
【０１３８】
図６は、実行ファイル調整部１１２の動作の具体例を表すフローチャートである。
【０１３９】
実行ファイル調整部１１２は、実行ファイル１１１の実行コードを抽象コードに変換する（ステップＳ６０１）。実行ファイル１１１は、例えば、利用者から提供されるマルウェアの検体であってもよい。実行ファイル調整部１１２は、上記因子抽出部１０４、因子探索部１０８と同様の処理により、実行ファイル１１１の実行コードを抽象コードに変換してもよい。また、実行ファイル調整部１１２は、抽象コードを、因子コードに分解してもよい。
【０１４０】
実行ファイル調整部１１２は、実行ファイル１１１から変換した抽象コードと、因子データベース１０５に登録された因子コードとを比較し、因子データベース１０５に登録された因子コードを部分的に用いて、元の抽象コードの長さを短縮（即ち、コードサイズを低減）可能か確認する。この際、実行ファイル調整部１１２は、例えば、実行ファイル１１１から変換した抽象コードを部分的に置き換えても、最終的な出力ベクトルに影響しないよう、抽象コードを調整可能であるか確認してもよい。
【０１４１】
実行ファイル調整部１１２は、元の抽象コードのコード長を短縮可能な場合、元の抽象コードの少なくとも一部を、因子データベース１０５に登録された因子コードに置き換える（ステップＳ６０２）。具体的には、実行ファイル調整部１１２は、例えば、実行ファイル１１１から変換した抽象コードの少なくとも一部を、システムデータベース１０３に登録された検体から抽出された因子コードに置き換える。これにより、あるシステムにおける通常の（正規の）実行コードに含まれる命令を用いて、実行ファイル１１１に含まれる実行コードの一部を置き換えることが可能である。
【０１４２】
ステップＳ６０２において、実行ファイル調整部１１２は、因子データベース１０５に保持している因子コードの集合に対して、抽象コードの長さが最小になるまで上記処理を繰り返してよい。
【０１４３】
実行ファイル調整部１１２は、ステップＳ６０２において置換された抽象コードを、実行コードに変換し、出力ファイル１１３を出力してもよい（ステップＳ６０３）。実行ファイル調整部１１２は、例えば、上記変換情報を参照して、抽象コードを、命令列に逆変換することで実行コードを生成してもよい。実行ファイル調整部１１２は、例えば、実行コードに対してアセンブル、リンク等の処理を実行することで実行ファイル１１１を生成してもよい。
【０１４４】
［具体例］
以下、具体例を用いて、上記のように構成されたプログラム分析システム１００について説明する。本具体例の構成は、図１Ａ及び図１Ｂに例示する構成と同様である。
【０１４５】
例えば、プログラム分析システム１００の利用者は、メンテナンス作業等を通じて、脆弱性データベース１０１、マルウェアデータベース１０２、及び、システムデータベース１０３に、検体を登録する。
【０１４６】
また、本具体例においては、プログラム分析システム１００は、命令列と抽象コードとを関連付ける変換情報（辞書データ）として、例えば、図２２に例示するようなデータを保持することを想定する。因子抽出部１０４、因子探索部１０８、及び、実行ファイル調整部１１２は、例えば、係る変換情報を用いて、各種実行コードを、抽象コードに変換することができる。因子抽出部１０４は、上記各データベースに登録された検体を解析し、因子データベース１０５に因子コードを登録する。本具体例においては、因子データベース１０５に、例えば、図２３に例示するような成功状態を表す情報が登録されていることを想定する。図２３に例示された因子コードにおいて、”ｍ”、”ｎ”には適切な数値が設定されてよい。図２３に例示された因子コードは、例えば、”（ｍｏｖ  ＤＷＯＲＤ  ＰＴＲ［ｅｓｐ＋ｎ］，ｍ）”と表される実行コードから変換された数理モデルであってもよい。
【０１４７】
プログラム分析システム１００の利用者は、成功状態登録部１０６を用いて、システムに対する攻撃が成功した状態を表す情報を成功状態データベース１０７に登録する。本具体例においては、成功状態データベース１０７に、例えば、図２４に例示するような成功状態を表す情報が登録されていることを想定する。
【０１４８】
本具体例においては、図２５Ａに例示するような実行コード２５０１により表される実行ファイル１１１を検査することを想定する。例えば、保護対象であるシステムにおいて発見された未知の実行ファイル（実行ファイル１１１）が、脆弱性を利用する不正プログラム（マルウェア等）であるか否か検査する場合、利用者は、実行ファイル１１１をプログラム分析システム１００に提供する。因子探索部１０８は、提供された実行ファイル１１１を抽象コードに変換する。例えば、因子探索部１０８は、図２５Ａに例示する実行コードに含まれる１２行の命令を、図２２に例示する変換情報等を用いて写像に変換する。係る変換の結果、例えば、図２５Ａに例示する実行コードの各行は、図２５Ｂに例示する数理モデルに変換可能である。因子探索部１０８は、例えば、図２５Ｂに例示する各数理モデルについて、積演算による写像の統合処理を実行する。係る処理により、図２５Ａに例示する実行コードは、図２６Ａに例示する抽象コード２６０１に変換可能である。因子探索部１０８は、例えば、図２６Ａに例示する抽象コードを因子コードに分解することで、図２６Ｂに例示する因子コード２６０２を得ることができる。
【０１４９】
因子探索部１０８は、因子データベース１０５を検索し、分解した因子コードに相当する因子コードが因子データベース１０５に登録されているか否かを確認する。本具体例においては、因子コード２６０２の因子コード”（［ｅｓｐ＋３９２］）＝（１）×（［［ｅｓｐ＋４］＋４］）”に相当する因子コードが、因子データベース１０５に登録されている。
【０１５０】
因子探索部１０８は実行コード２５０１の最終動作状態（即ち、抽象コード２６０１の出力ベクトルのうち、最終状態にある変数）と、成功状態データベース１０７に登録された、成功状態を表す情報とを比較する。本具体例においては、抽象コード２６０１の出力ベクトルのうち、”（［ｅｓｐ＋３９２］）”について、”（［ｅｓｐ＋３９２］）＝（１）×（［［ｅｓｐ＋４］＋４］）”が成立する。そして、成功状態を表すデータとして、”（［ｅｓｐ＋ｎ］）＝（１）×（ｍ）”が成功状態データベース１０７に登録されている（図２４）。以上より、因子探索部１０８は、実行コード２５０１について、マルウェアであると判定する。
【０１５１】
因子探索部１０８は、上記判定結果を判定結果提供部１０９に提供する。判定結果提供部１０９は、上記判定結果を表す情報（データ）を生成し、出力装置１１０に提供する。プログラム分析システム１００のユーザは、出力装置１１０の出力（例えば、画面表示等）を介して、実行ファイル１１１に関する検査結果を確認する。
【０１５２】
以下、プログラム分析システム１００の変形例として、利用者が、例えばペネトレーションテストを実施する目的で、実行ファイル１１１（実行コード２５０１）を実行ファイル調整部１１２に提供する場合を想定する。以下においては、システムデータベース１０３に、図２７に例示する実行コード２７０１が、既知の実行コードとして登録されていることを想定する。係る実行コード２７０１は、例えば、あるシステムにおける通常の（正規の）の処理であってよい。また、実行コード２７０１は、図２８Ａに例示するように、抽象コード２８０１に変換可能であること、及び、当該抽象コード２８０１を分解した因子コード２８０２（図２８Ｂ）が、因子データベース１０５に登録されていることを想定する。
【０１５３】
実行ファイル調整部１１２は、因子探索部１０８と同様に、実行ファイル１１１（実行コード２５０１）を解析し、抽象コード２６０１と、因子コード２６０２とを得る。
【０１５４】
実行ファイル調整部１１２は、因子コード２６０２と、因子データベース１０５に登録された因子コード２８０２とを比較する。この場合、因子コードのうち、”ｅａｘ”、”［ｅｓｐ−８］”の項は共通している。即ち、因子コード２８０２のうち、”［ｅｓｐ−１２］”、及び”ｅｄｘ”の項による影響を排除できれば、実行コード２７０１を用いて、実行コード２５０１の少なくとも一部を置換可能である。これより、実行ファイル調整部１１２は、実行コード２５０１の一部を、実行コード２７０１の呼出しに置換することで、実行コード２５０１のコード長を短縮する。
【０１５５】
具体的には、実行ファイル調整部１１２は、一時退避メモリ領域”Ｘ”、”Ｙ”を用いて、実行コード２５０１を、図２９に例示する短縮された実行コード２９０１に変換する。実行コード２９０１においては、一時退避メモリ領域”Ｘ”、”Ｙ”を用いて、”［ｅｓｐ−１２］”、及び”ｅｄｘ”の値を一時的に対比する。そして、実行コード２７０１を呼び出す（”ｃａｌｌ”）することで、実行コード２７０１に実装された処理を実行する。そののち、一時退避メモリ領域”Ｘ”、”Ｙ”に退避した”［ｅｓｐ−１２］”、及び”ｅｄｘ”の値を元に戻す。これにより、実行コード２７０１の実行に伴う、”［ｅｓｐ−１２］”、及び”ｅｄｘ”への影響を排除可能である。また、実行コード２９０１は、元の実行コード２５０１に比べてコード長が短縮されている。即ち、実行ファイル調整部１１２は、実行コード２５０１のコード長を短縮可能である。実行ファイル調整部１１２は、実行コード２９０１を含む出力ファイル１１３を出力してよい。
【０１５６】
利用者が、例えば、出力ファイル１１３を用いて、検査対象のシステムに対するペネトレーションテストを実施可能である。出力ファイル１１３に含まれる実行コード２９０１は、実行コード２５０１よりもコードサイズが短い。また、実行コード２９０１における処理の大部分は、実行コード２７０１（システムにおける通常の処理）により実行される。即ち、出力ファイル１１３は、システムにおいて実行される通常の（正当な）処理との区別が容易ではなく、コードサイズが小さいという特徴を有する。係る出力ファイル１１３を用いることで、利用者は、より高度なテストを実行することが可能であると考えられる。
【０１５７】
上記のように構成されたプログラム分析システム１００は、ある実行コードが攻撃コードであるか否かを判定可能であり、未知の攻撃コードを検出することが可能である。その理由は、以下の通りである。プログラム分析システム１００は、検査される実行コードから変換された数理モデル（因子コード）と、既知の脆弱性、マルウェア及びシステム等の検体から変換された数理（因子コード）モデルとを比較する。これにより、プログラム分析システム１００は、検査される実行コードに、攻撃コードに相当する因子が含まれるか確認可能である。また、プログラム分析システム１００は、検査される実行コードの最終動作状態と、あるシステムに関する攻撃が成功した状態である成功状態とを比較する。これにより、プログラム分析システム１００は、検査される実行コードを実行することにより、なんらかの攻撃が成功するか否かを判定可能である。即ち、プログラム分析システム１００は、実行コードに攻撃の因子が含まれるか否かと、当該実行コードが実行された状態が（既知の）攻撃成功状態にあるか否かという観点から、実行コードを検査する。これにより、プログラム分析システム１００は、例えば、脆弱性が未知であるか既知であるかによらず、係る脆弱性を攻撃する実行コードを検出することが可能である。以上より、プログラム分析システム１００によれば、例えば、未知の脆弱性を利用する実行コードを検出することにより、ゼロデイ攻撃を抑止することが期待される。
【０１５８】
また、プログラム分析システム１００の変形例においては、例えば、持続的に活動可能な不正プログラムによる活動を検知する能力を改善することが期待される。その理由は、以下の通りである。即ち、プログラム分析システム１００は、持続的活動を実施する不正プログラムは、比較的コードサイズが小さいという特性を考慮して、検査対象の不正プログラムを構成する因子コードを置き換えることで、コードのサイズを削減する。これにより、プログラム分析システム１００は、コードサイズが比較的小さい不正プログラムが侵入した場合を想定した検査（テスト）に適用可能な実行コードを生成可能である。即ち、プログラム分析システム１００は、コードサイズが比較的小さい不正プログラムを用いたペネトレーションテストを実施することができる。
【０１５９】
プログラム分析システム１００を上記のように構成することで、検査対象のプログラムの内容を適切に分析することが可能であり、その結果を用いて、不正プログラムによる攻撃を抑制し得る。
【０１６０】
＜第２の実施形態＞
以下、本開示に係る技術の基本的な実施形態である、第２の実施形態について説明する。
【０１６１】
図３０は、本実施形態におけるプログラム分析システム３０００の機能的な構成を例示するブロック図である。図３０に例示するように、本実施形態におけるプログラム分析システム３０００は、因子コード保持部３００１（因子コード保持手段）と、成功状態保持部３００２（成功状態保持手段）と、因子探索部３００３（因子探索手段）と、を備える。
【０１６２】
因子コード保持部３００１は、既知の実行コードを数理モデルに変換して表したデータである、既知因子コードを保持する。因子コード保持部３００１は、例えば、データベースあるいはファイルシステムにおけるファイルを用いて実現可能である。因子コード保持部３００１は、上記第１の実施形態における、因子データベース１０５と同様に構成されてもよい。
【０１６３】
因子コード保持部３００１には、例えば、上記第１の実施形態と同様、既知の脆弱性を攻撃する攻撃コードの検体、既知のマルウェアの検体、及び、システムにおける通常の（正規の）実行コードの検体等から抽出された既知因子コードが登録されてもよい。
【０１６４】
成功状態保持部３００２は、不正プログラムによる攻撃が成功した状態を表す成功状態情報を保持する。成功状態保持部３００２は、例えば、データベースあるいはファイルシステムにおけるファイルを用いて実現可能である。成功状態保持部３００２は、上記第１の実施形態における、成功状態データベース１０７と同様に構成されてもよい。
【０１６５】
因子探索部３００３は、検査対象の実行コードを数理モデルに変換して表したデータである、分析対象抽象コードを生成する。因子探索部３００３は、生成した分析対象抽象コードに、因子コード保持部３００１に保持された既知因子コードが含まれるか否かを判定する処理を実行する。また、因子探索部３００３は、検査対象の実行コードの実行が終了した際の状態が、成功状態保持部３００２に保持された成功状態情報に含まれるか否かを判定する処理を実行する。因子探索部３００３は、これの処理の結果に応じて、検査対象の実行コードが不正プログラムであるか否かを判定する。
【０１６６】
因子探索部３００３は、例えば、分析対象抽象コードに、因子コード保持部３００１に保持された既知因子コードが含まれるとともに、検査対象の実行コードの実行が終了した際の状態が、成功状態保持部３００２に保持された成功状態情報に含まれる場合、検査対象の実行コードが不正プログラムであると判定してもよい。
【０１６７】
上記数理モデルは、上記第１の実施形態と同様、ある実行コードに含まれる命令を、１以上の写像と、写像に関する入力ベクトル及び出力ベクトルとを用いて表すモデルであってもよい。係る数理モデルは、上記第1の実施形態と同様、線形関数、非線形関数、外部関数のいずれかにより表されてもよい。
【０１６８】
因子探索部３００３は、検査対象の実行コードに含まれる１以上の命令列を写像に変換し、変換された１以上の写像を積演算により統合することで、分析対象抽象コードを生成してもよい。
【０１６９】
因子探索部３００３は、例えば、検査対象の実行コードに含まれる命令と、当該命令を表す写像とを関連付ける変換情報を用いて、検査対象の実行コードに含まれる１以上の命令列を、写像に変換してもよい。
【０１７０】
因子探索部３００３は、例えば、上記第１の実施形態における因子探索部１０８と同様の機能を実現するよう構成されてもよい。
【０１７１】
また、本実施形態におけるプログラム分析システム３０００は、変形例として、実行ファイル調整部３００４を更に備えてもよい（図３１）。
【０１７２】
実行ファイル調整部３００４は、例えば、検査対象の実行コードを、変換情報を用いて分析対象抽象コードに変換するとともに、その分析対象抽象コードを更に分析対象因子コードに分解することができる。
【０１７３】
実行ファイル調整部３００４は、例えば、分析対象抽象コードに含まれる分析対象因子コードの少なくとも一部を、因子コード保持部３００１に保持された既知因子コードに置換することで、検査対象の実行コードのサイズを低減可能か判定してよい。実行ファイル調整部３００４は、検査対象の実行コードのサイズを低減可能である場合には、分析対象抽象コードに含まれる分析対象因子コードの少なくとも一部を、因子コード保持部３００１に保持された既知因子コードに置換してよい。
【０１７４】
本開示に係るプログラム分析システム３０００を上記のように構成することで、例えば、未知の不正プログラムに起因した攻撃を抑止し得る。その理由は、プログラム分析システム３０００（特には因子探索部３００３）は、検査対象の実行コードをから取得した分析対象因子コードと、不正プログラムに含まれる既知因子コードとを比較することで、検査対象の実行コードに攻撃の因子が含まれるか否かを判定可能だからである。また、本開示に係るプログラム分析システムは、ある検査対象の実行コードを実行した後の状態が、攻撃が成功した状態（成功状態）にあるか否かを判定可能だからである。
【０１７５】
また、本開示に係るプログラム分析システム３０００をこのように構成することで、例えば、持続的に活動可能な不正プログラムによる活動を検知する能力が改善され得る。その理由は、以下の通りである。持続的活動を実施する不正プログラムは、他の不正プログラムと比べてコードサイズが小さいという特性があると考えられる。そこでプログラム分析システム３０００（特には実行ファイル調整部３００４）は、検査対象の実行コードを構成する分析対象因子コードを置き換えることで、検査対象の実行コードのサイズを低減する。これにより、係るプログラム分析システム３０００は、コードサイズが比較的小さい不正プログラムが侵入した場合を想定した検査（テスト）に適用可能な出力ファイルを生成可能である。即ち、係るプログラム分析システム３０００により、コードサイズが比較的小さい不正プログラムを用いたペネトレーションテストを実施することができる。
【０１７６】
本開示に係るプログラム分析システム３０００を上記のように構成することで、検査対象のプログラムの内容を適切に分析することが可能であり、その結果を用いて、不正プログラムによる攻撃を抑制し得る。
【０１７７】
上記各実施形態においては、本開示に係る技術をプログラム分析システム（１００、３０００）に適用した例として説明した。上記各実施形態では、例えば、プログラム分析システム（１００、３０００）を動作させることによって、本開示に係るプログラム分析方法を実施することができる。本開示に係るプログラム分析方法を実施する方法は上記に限定されず、プログラム分析システム（１００、３０００）と同様の動作あるいは処理を実行可能な他の装置（例えば、コンピュータ等の情報処理装置）を用いて、本開示に係るプログラム分析方法を実施することも可能である。
【０１７８】
本開示に係る技術は、例えば、マルウェア分析装置、又は、コンピュータを用いてマルウェア分析装置を実現可能なプログラム等の用途に適用可能である。また、本開示に係る技術は、例えば、マルウェアの分類及び亜種のマルウェアの生成といった用途に適用可能である。
【０１７９】
＜ハードウェア及びソフトウェア・プログラム（コンピュータ・プログラム）の構成＞
以下、上記説明した各実施形態を実現可能なハードウェア構成について説明する。
【０１８０】
以下の説明においては、上記各実施形態において説明したプログラム分析システム（１００、３０００）をまとめて、単に「プログラム分析システム」と記載する。また、これらプログラム分析システムの各構成要素を、単に「プログラム分析システムの構成要素」と記載する場合がある。
【０１８１】
上記各実施形態において説明したプログラム分析システムは、１つ又は複数の専用のハードウェア装置により構成されてもよい。その場合、上記各図（図１Ａ、図１Ｂ、図３０、図３１）に示した各構成要素は、その一部又は全部を統合したハードウェア（処理ロジックを実装した集積回路あるいは記憶デバイス等）を用いて実現されてもよい。
【０１８２】
プログラム分析システムが専用のハードウェアにより実現される場合、係るプログラム分析システムの構成要素は、例えば、それぞれの機能を提供可能な回路構成（ｃｉｒｃｕｉｔｒｙ）により実現されてもよい。係る回路構成は、例えば、ＳｏＣ（Ｓｙｓｔｅｍ  ｏｎ  ａ  Ｃｈｉｐ）等の集積回路や、当該集積回路を用いて実現されたチップセット等を含む。この場合、プログラム分析システムの構成要素が保持するデータは、例えば、ＳｏＣとして統合されたＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）領域やフラッシュメモリ領域、あるいは、当該ＳｏＣに接続された記憶デバイス（半導体記憶装置等）に記憶されてもよい。また、この場合、プログラム分析システムの各構成要素を接続する通信回線としては、周知の通信バス等を採用してもよい。また、各構成要素を接続する通信回線は、それぞれの構成要素間をピアツーピアで接続してもよい。
【０１８３】
また、上述したプログラム分析システムは、図３２に例示するような汎用のハードウェア装置３２００と、係るハードウェア装置３２００によって実行される各種ソフトウェア・プログラム（コンピュータ・プログラム）とによって構成されてもよい。この場合、プログラム分析システムは、１台以上の適切な数の汎用のハードウェア装置３２００と、ソフトウェア・プログラムとの組み合わせにより構成されてもよい。
【０１８４】
図３２における演算装置３２０１は、汎用のＣＰＵ（中央処理装置：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やマイクロプロセッサ等の演算処理装置である。演算装置３２０１は、例えば後述する不揮発性記憶装置３２０３に記憶された各種ソフトウェア・プログラムをメモリ３２０２に読み出し、係るソフトウェア・プログラムに従って処理を実行してもよい。例えば、上記各実施形態におけるプログラム分析システムの構成要素の機能は、演算装置３２０１により実行されるソフトウェア・プログラムを用いて実現されてもよい。
【０１８５】
演算装置３２０１は、例えば、複数のＣＰＵコアを備えたマルチコアＣＰＵであってもよい。また演算装置３２０１は、１つのＣＰＵコアが複数のスレッドを実行可能な、マルチスレッドＣＰＵであってもよい。ハードウェア装置３２００は、複数の演算装置３２０１を備えてもよい。
【０１８６】
メモリ３２０２は、演算装置３２０１から参照可能な、ＲＡＭ等のメモリデバイスであり、ソフトウェア・プログラムや各種データ等を記憶する。なお、メモリ３２０２は、揮発性のメモリであってもよい。
【０１８７】
不揮発性記憶装置３２０３は、例えば磁気ディスクドライブや、フラッシュメモリによる半導体記憶装置等の、不揮発性の記憶装置（ストレージデバイス）である。不揮発性記憶装置３２０３は、各種ソフトウェア・プログラムやデータ等を記憶可能である。例えば、プログラム分析システムの各構成要素を実現可能なプログラムは、不揮発性記憶装置３２０３に記憶されてもよい。
【０１８８】
ドライブ装置３２０４は、例えば、後述する記録媒体３２０５に対するデータの読み込みや書き込みを処理する装置である。
【０１８９】
記録媒体３２０５は、例えば光ディスク、光磁気ディスク、半導体フラッシュメモリ等、データを記録可能な任意の記録媒体である。例えば、プログラム分析システムの各構成要素を実現可能なプログラムは、記録媒体３２０５に記録されていてもよい。
【０１９０】
ネットワークインタフェース３２０６は、通信ネットワークとの間の通信データの送受信を制御する装置である。ネットワークインタフェース３２０６は、例えば、１以上の通信ポートを備え、係る通信ポートを介して、通信ネットワークとの間で通信データを送受信してもよい。ネットワークインタフェース３２０６は、複数の通信ポートを備えてもよい。
【０１９１】
図３２に例示するハードウェア装置３２００の構成要素は、例えば、適切な通信方法（通信バス等）を用いて、通信可能に接続されていてもよい。
【０１９２】
上述した各実施形態を例に説明した本開示におけるプログラム分析システム、あるいはその構成要素は、例えば、図３２に例示するハードウェア装置３２００に対して、上記各実施形態において説明した機能を実現可能なソフトウェア・プログラムを供給することにより、実現されてもよい。
【０１９３】
より具体的には、例えば、係るハードウェア装置３２００に対して供給したソフトウェア・プログラムを、演算装置３２０１が実行することによって、本開示に関する技術が実現されてもよい。この場合、係るハードウェア装置３２００で稼働しているオペレーティングシステムや、データベース管理ソフト、ネットワークソフト、仮想環境基盤等のミドルウェアなどが各処理の一部を実行してもよい。
【０１９４】
上述した各実施形態において、上記各図に示した各部は、上述したハードウェアにより実行されるソフトウェア・プログラムの機能（処理）単位である、ソフトウェアモジュールとして実現することができる。ただし、これらの図面に示した各ソフトウェアモジュールの区分けは、説明の便宜上の構成であり、実装に際しては、様々な構成が想定され得る。
【０１９５】
図１Ａ、図１Ｂ、図３０及び図３１の各図に例示したプログラム分析システムの各構成要素をソフトウェアモジュールとして実現する場合、例えば、これらのソフトウェアモジュールが不揮発性記憶装置３２０３に記憶されてもよい。そして、演算装置３２０１がそれぞれの処理を実行する際に、これらのソフトウェアモジュールをメモリ３２０２に読み出してもよい。
【０１９６】
また、これらのソフトウェアモジュールは、共有メモリやプロセス間通信等の適宜の方法により、相互に各種データを伝達できるように構成されてもよい。このような構成により、これらのソフトウェアモジュールは、相互に通信可能に接続される。
【０１９７】
更に、上記ソフトウェア・プログラムは記録媒体３２０５に記録されてもよい。この場合、上記ソフトウェア・プログラムは、プログラム分析システムの出荷段階、あるいは運用段階等において、適宜ドライブ装置３２０４を通じて不揮発性記憶装置３２０３に格納されるよう構成されてもよい。
【０１９８】
なお、上記の場合において、上記ハードウェア装置３２００への各種ソフトウェア・プログラムの供給方法は、出荷前の製造段階、あるいは出荷後のメンテナンス段階等において、適当な治具（ツール）を利用して当該装置内にインストールする方法を採用してもよい。また、各種ソフトウェア・プログラムの供給方法は、インターネット等の通信回線を介して外部からダウンロードする方法等のように、現在では一般的な手順を採用してもよい。
【０１９９】
そして、このような場合において、本開示に関する技術は、係るソフトウェア・プログラムを構成するコード、あるいは係るコードが記録されたところの、コンピュータ読み取り可能な記録媒体によって構成されると捉えることができる。この場合、係る記録媒体は、ハードウェア装置３２００と独立した媒体に限らず、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）やインターネットなどにより伝送されたソフトウェア・プログラムをダウンロードして記憶又は一時記憶した記録媒体を含む。
【０２００】
また、上述したプログラム分析システムの構成要素は、図３２に例示するハードウェア装置３２００を仮想化した仮想化環境と、当該仮想化環境において実行される各種ソフトウェア・プログラム（コンピュータ・プログラム）とによって構成されてもよい。この場合、図３２に例示するハードウェア装置３２００の構成要素は、当該仮想化環境における仮想デバイスとして提供される。なお、この場合も、図３２に例示するハードウェア装置３２００を物理的な装置として構成した場合と同様の構成にて、本開示に関する技術を実現可能である。
【０２０１】
以上、本開示に関する技術を、上述した模範的な実施形態に適用した例として説明した。しかしながら、本開示の技術的範囲は、上述した各実施形態に記載した範囲には限定されない。当業者には、係る実施形態に対して多様な変更又は改良を加えることが可能であることは明らかである。そのような場合、係る変更又は改良を加えた新たな実施形態も、本開示の技術的範囲に含まれ得る。上述した各実施形態を組み合わせた実施形態も本開示の技術的範囲に含まれる。更に、上述した各実施形態と、上述した各実施形態に変更又は改良を加えた新たな実施形態とを組み合わせた実施形態も、本開示の技術的範囲に含まれ得る。そしてこのことは、請求の範囲に記載した事項から明らかである。
【０２０２】
なお、上述した実施形態及びその変形例の一部又は全部は、以下の付記のようにも記載されうる。しかしながら、上述した実施形態及びその変形例により例示的に説明した本開示に係る技術は、以下には限られない。
【０２０３】
（付記１）
既知の実行コードを数理モデルに変換して表したデータである、既知因子コードを保持する因子コード保持手段と、
不正プログラムによる攻撃が成功した状態を表す成功状態情報を保持する成功状態保持手段と、
検査対象の実行コードを上記数理モデルに変換して表したデータである、分析対象抽象コードを生成し、上記分析対象抽象コードに、上記因子コード保持手段に保持された上記既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する因子探索手段と、を備える
プログラム分析システム。
【０２０４】
（付記２）
上記因子探索手段は、上記分析対象抽象コードに、上記因子コード保持手段に保持された上記既知因子コードが含まれるとともに、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれる場合、上記検査対象の実行コードが不正プログラムであると判定する
付記１に記載のプログラム分析システム。
【０２０５】
（付記３）
上記因子探索手段は、上記因子コード保持手段に保持された上記既知因子コードが、上記分析対象抽象コードに含まれないと判定した場合には、
上記分析対象抽象コードを、互いに素な因子コードである分析対象因子コードに更に分解し、
分解された上記分析対象因子コードの少なくとも一部を並べ替えることで、並べ替える前の上記分析対象抽象コードと同等の実行結果が得られる場合には、上記分析対象因子コードの少なくとも一部を並べ替えた後の上記分析対象抽象コードに、上記既知因子コードが含まれるか否かを判定する処理を更に実行し、
上記分析対象因子コードの少なくとも一部を並べ替えた後の上記分析対象抽象コードに、上記既知因子コードが含まれるとともに、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれる場合、上記検査対象の実行コードが不正プログラムであると判定する
付記２に記載のプログラム分析システム。
【０２０６】
（付記４）
上記数理モデルは、ある実行コードに含まれる命令を、１以上の写像と、上記写像に関する入力ベクトル及び出力ベクトルとを用いて表すモデルであり、
上記因子探索手段は、上記検査対象の実行コードに含まれる１以上の命令列を上記写像に変換し、変換された１以上の上記写像を積演算により統合することで、上記分析対象抽象コードを生成する
付記１乃至付記３のいずれかに記載のプログラム分析システム。
【０２０７】
（付記５）
上記数理モデルにおける上記入力ベクトル及び上記出力ベクトルの要素は、上記検査対象の実行コードが実行される情報処理装置を構成する演算装置に実装されたレジスタの内容を表す情報と、上記検査対象の実行コードが実行される上記情報処理装置を構成するメモリの特定のアドレスの内容を表す情報と、を少なくとも含む、上記検査対象の実行コードが実行される上記情報処理装置の状態を表す情報であり、
上記因子探索手段は、上記検査対象の実行コードの実行が終了した際の状態を表す上記出力ベクトルの要素が、上記成功状態保持手段に保持された上記成功状態情報に含まれるか否かを判定する
付記４に記載のプログラム分析システム。
【０２０８】
（付記６）
上記因子探索手段は、実行コードに含まれる命令と、当該命令を表す上記数理モデルである上記写像とを関連付ける変換情報を用いて、上記検査対象の実行コードに含まれる１以上の命令列を上記写像に変換する
付記４又は付記５に記載のプログラム分析システム。
【０２０９】
（付記７）
脆弱性を利用した攻撃を実行する実行コードの検体を保持する脆弱性データ保持手段と、
既知の不正プログラムの検体を保持する不正プログラムデータ保持手段と、
上記脆弱性データ保持手段に保持された検体と、不正プログラムデータ保持部に保持された検体と、の少なくともいずれかの実行コードを、上記変換情報を用いて上記数理モデルに変換して表したデータである既知抽象コードを生成し、上記既知抽象コードから分解された上記既知因子コードを上記因子コード保持手段に提供する因子抽出手段と、を更に備え、
上記因子探索手段は、上記分析対象抽象コードに、上記脆弱性データ保持手段に保持された検体から取得された上記既知因子コードと、上記不正プログラムデータ保持部に保持された検体から取得された上記既知因子コードと、の少なくとも何れかが含まれるとともに、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれる場合、上記検査対象の実行コードが不正プログラムであると判定する
付記６に記載のプログラム分析システム。
【０２１０】
（付記８）
正常に稼働しているシステムにおいて実行される実行コードの検体を保持するシステムデータ保持手段と、
上記システムデータ保持手段に保持された検体の実行コードを、上記変換情報を用いて上記数理モデルに変換して表したデータである既知抽象コードを生成し、上記既知抽象コードから分解された上記既知因子コードを上記因子コード保持手段に提供する因子抽出手段と、
上記検査対象の実行コードを、上記変換情報を用いて上記分析対象抽象コードに変換するとともに、
上記分析対象抽象コードの少なくとも一部を、上記システムデータ保持手段に保持された検体の実行コードから取得した上記既知因子コードに置換することで、元の上記検査対象の実行コードよりもコードサイズが低減された実行コードを生成する実行ファイル調整手段と、を更に備える
付記６に記載のプログラム分析システム。
【０２１１】
（付記９）
上記写像が、単一の変換行列を有する線形関数により表される場合、
上記因子探索手段は、上記実行コードに含まれる複数の上記命令列から変換されたそれぞれの上記写像に含まれる上記変換行列の積を演算することにより、上記実行コードに含まれる複数の上記命令列から変換された上記写像を統合する
付記４乃至付記８のいずれかに記載のプログラム分析システム。
【０２１２】
（付記１０）
検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成し、
上記分析対象抽象コードに、既知の実行コードを上記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する
プログラム分析方法。
【０２１３】
（付記１１）
検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成する処理と、
上記分析対象抽象コードに、既知の実行コードを上記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する処理と、をコンピュータに実行させる
コンピュータ・プログラム。
【０２１４】
（付記１２）
攻撃の成功状態を入力する入力手段と、上記成功状態を記憶する手段と、既知の脆弱性の実行コードを記憶する記憶手段と、上記既知の脆弱性の実行コードから、実行コードの少なくとも一部を表すことが可能なデータである因子を抽出する手段と、既知のマルウェアの実行コードを記憶する記憶手段と、上記既知のマルウェアの実行コードに含まれる上記因子を抽出する手段と、上記因子を記憶する記憶手段と、任意の実行コードから上記因子を探索する探索手段と、1以上の上記因子が他の上記因子の部分集合によって同等の動作を保ちつつ表現され得るかを判定する判定手段と、上記因子を他の上記因子の部分集合によって置換した場合の最終的な動作状態が上記成功状態に存在するかを判定する判定手段と、上記判定の結果を表示する表示手段と、を備えるマルウェア対策システム。
【０２１５】
（付記１３）
既知のシステムを記憶する記憶手段と、上記既知のシステムの実行コードから上記因子を抽出する手段と、抽出した上記因子を他の上記因子の部分集合へ置換することにより、上記既知のシステムの実行コードを最小化する手段と、上記最小化された実行コードを出力する手段と、を更に備える、付記１２に記載のマルウェア対策システム。
【０２１６】
この出願は、２０１６年４月２６日に出願された日本出願特願２０１６−０８８２７８を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【符号の説明】
【０２１７】
１００    プログラム分析システム
１０１    脆弱性データベース
１０２    マルウェアデータベース
１０３    システムデータベース
１０４    因子抽出部
１０５    因子データベース
１０６    成功状態登録部
１０７    成功状態データベース
１０８    因子探索部
１０９    判定結果提供部
１１０    出力装置
１１１    実行ファイル
１１２    実行ファイル調整部
１１３    出力ファイル
３０００    プログラム分析システム
３００１    因子コード保持部
３００２    成功状態保持部
３００３    因子探索部
３００４    実行ファイル調整部
３２０１  演算装置
３２０２  メモリ
３２０３  不揮発性記憶装置
３２０４  ドライブ装置
３２０５  記録媒体
３２０６  ネットワークインタフェース
【図１Ａ】
0006750674.tif 000014
【図１Ｂ】
0006750674.tif 000015
【図２】
0006750674.tif 000016
【図３】
0006750674.tif 000017
【図４】
0006750674.tif 000018
【図５】
0006750674.tif 000019
【図６】
0006750674.tif 000020
【図７】
0006750674.tif 000021
【図８】
0006750674.tif 000022
【図９】
0006750674.tif 000023
【図１０Ａ】
0006750674.tif 000024
【図１０Ｂ】
0006750674.tif 000025
【図１０Ｃ】
0006750674.tif 000026
【図１０Ｄ】
0006750674.tif 000027
【図１１】
0006750674.tif 000028
【図１２】
0006750674.tif 000029
【図１３】
0006750674.tif 000030
【図１４】
0006750674.tif 000031
【図１５】
0006750674.tif 000032
【図１６】
0006750674.tif 000033
【図１７】
0006750674.tif 000034
【図１８】
0006750674.tif 000035
【図１９】
0006750674.tif 000036
【図２０】
0006750674.tif 000037
【図２１】
0006750674.tif 000038
【図２２】
0006750674.tif 000039
【図２３】
0006750674.tif 000040
【図２４】
0006750674.tif 000041
【図２５Ａ】
0006750674.tif 000042
【図２５Ｂ】
0006750674.tif 000043
【図２６Ａ】
0006750674.tif 000044
【図２６Ｂ】
0006750674.tif 000045
【図２７】
0006750674.tif 000046
【図２８Ａ】
0006750674.tif 000047
【図２８Ｂ】
0006750674.tif 000048
【図２９】
0006750674.tif 000049
【図３０】
0006750674.tif 000050
【図３１】
0006750674.tif 000051
【図３２】
0006750674.tif 000052