本発明の実施形態に関する説明に先立って、本発明に関する技術的な検討事項等についてより詳細に説明する。
上記したように、不正プログラムに起因したセキュリティの脅威(例えば、未知の脆弱性によるゼロデイ攻撃や、当該攻撃によって仕込まれたマルウェアによる持続的活動等を含むサイバー攻撃)が問題となっている。不正プログラムには、未知の脆弱性を利用した攻撃を実行する不正プログラム、既知の脆弱性を利用した攻撃を実行する不正プログラムが含まれる。一般的に、未知の脆弱性を利用する不正プログラムの挙動や構造は、知られていない場合が多い。既知の脆弱性を利用する不正プログラムであっても、その挙動や構造が知られていない場合がある。
サイバー攻撃等のセキュリティの脅威を低減する観点からは、未知の脆弱性を利用する不正プログラムや、長期間活動可能な不正プログラムを発見し、当該不正プログラムに関する知見を蓄積することが有益である。
情報システムのセキュリティ強度を改善する観点からは、当該情報システムに対してセキュリティに関するテスト(例えば、不正プログラムを用いたペネトレーションテスト)を実行することが考えられる。例えば、周知の脆弱性を利用する不正プログラムは、一般的なセキュリティ対策方法(例えばアンチウィルスソフトウェアや、侵入防止システム等)により検出される可能性ある。システムが高度(強力)な攻撃に耐え得ることを確認する場合、周知の脆弱性を利用する不正プログラムだけではなく、例えば、発見されにくい不正プログラムを用いて、当該システムをテストすることが有益である。
未知の脆弱性を利用する不正プログラムは、例えば、既知の脆弱性を利用するプログラムを分析し、その構成要素(あるいはその組み合わせ)を含む他のプログラムを探索することで、発見できる場合がある。また、持続的に(長期間)活動可能な不正プログラムによる処理は、システムにおいて実行される通常の(正当な)処理と区別が容易ではなく、不正プログラム自体のコードサイズが小さい(コード長が短い)場合がある。係る特性を考慮して、既知の不正プログラム及びシステムが実行する通常処理を分析し、その構成要素(あるいはその組み合わせ)を用いることで、持続的に活動可能な(発見されにくい)不正プログラムを取得可能であると考えられる。
以下の各実施形態を用いて説明するプログラム分析システムは、例えば、既知の脆弱性(脆弱性を有するプログラム)、不正プログラム、及び、システムが実行する通常処理に関するプログラム等のコードを分析して、その構成要素(因子コードと記載する場合がある)を取得する。係るプログラム分析システムは、例えば、分析した因子コード(その組み合わせを含む)を用いて、脆弱性を利用する不正プログラムを探索するよう構成されてよい。係る探索処理には、あるプログラム(実行コード)が、不正プログラムであるか否かに関する判定処理が含まれてよい。また、係るプログラム分析システムは、ある不正プログラムを、上記因子コードを用いて加工することで、テスト用の不正プログラム(例えば、持続的に活動可能な(発見されにくい)不正プログラム)を取得するよう構成されてよい。具体的には、プログラム分析システムは、ある不正プログラムの少なくとも一部を他の因子コードに置換(あるいは組み合わせ)することにより、当該不正プログラムに含まれる、不正なコードのサイズを削減するよう構成されてもよい。
本開示に係るプログラム分析システムを上記のように構成することで、例えば、未知の不正プログラムに起因した攻撃を抑止し得る。その理由は、本開示に係るプログラム分析システムは、上記分析により取得した因子コードと、未知の不正プログラムに含まれる因子コードとを比較することで、未知の不正プログラムに攻撃の因子が含まれるか否かを判定可能だからである。また、本開示に係るプログラム分析システムは、ある不正プログラムを実行した後の状態が、攻撃が成功した状態(成功状態)にあるか否かを判定可能だからである。
また、本開示に係るプログラム分析システムをこのように構成することで、例えば、持続的に活動可能な不正プログラムによる活動を検知する能力が改善され得る。その理由は、以下の通りである。プログラム分析システムは、持続的活動を実施する不正プログラムは、他の不正プログラムと比べてコードサイズが小さいという特性を考慮して、検査対象の不正プログラムを構成する因子コードを置き換えることで、コードのサイズを削減する。これにより、係るプログラム分析システムは、コードサイズが比較的小さい不正プログラムが侵入した場合を想定した検査(テスト)に適用可能な実行コードを生成可能である。即ち、係るプログラム分析システムにより、コードサイズが比較的小さい不正プログラムを用いたペネトレーションテストを実施することができる。
本開示に係るプログラム分析システムを上記のように構成することで、検査対象のプログラムの内容を適切に分析することが可能であり、その結果を用いて、不正プログラムによる攻撃を抑制し得る。
以下、各実施形態を用いて、本開示に係るプログラム分析システムについて詳細に説明する。以下の各実施形態に記載されているプログラム分析システムの構成は例示であり、本発明の技術範囲はそれらには限定されない。以下の各実施形態におけるプログラム分析システムを構成する構成要素の区分け(例えば、機能的な単位による分割)は、プログラム分析システムを実現可能な一例である。当該プログラム分析システムの実装に際しては、以下の例示に限定されず、様々な構成が想定される。即ち、以下の各実施形態におけるプログラム分析システムを構成する構成要素は、更に分割されてもよい。また、以下の各実施形態におけるプログラム分析システムを構成する1以上の構成要素が、統合されてもよい。
以下において説明するプログラム分析システムは、単体の装置(物理的あるいは仮想的な装置)を用いて構成されてもよく、複数の離間した装置(物理的あるいは仮想的な装置)を用いて実現されてもよい。プログラム分析システムが複数の装置により構成される場合、各装置の間は有線、無線、又はそれらを適切に組み合わせた通信ネットワーク(通信回線)により通信可能に接続されてもよい。係る通信ネットワークは、物理的な通信ネットワークであってもよく、仮想的な通信ネットワークであってもよい。以下において説明するプログラム分析システム、あるいは、その構成要素を実現可能なハードウェア構成については、後述する。
<第1の実施形態>
[構成]
本開示に係る技術を実現可能な第1の実施形態について図面を参照して説明する。図1Aは、本実施形態におけるプログラム分析システム100の機能的な構成を例示するブロック図である。本実施形態においては、不正プログラムがマルウェアであることを想定する。なお、本開示が対象とする不正プログラムには、マルウェア以外のプログラムが含まれてよい。
図1Aに例示するように、本実施形態におけるプログラム分析システム100は、脆弱性データベース101、マルウェアデータベース102、及び、システムデータベース103を有する。また、プログラム分析システム100は、因子抽出部104及び因子データベース105を有する。また、プログラム分析システム100は、成功状態登録部106及び成功状態データベース107を有する。また、プログラム分析システム100は、因子探索部108及び判定結果提供部109を有する。プログラム分析システム100は、出力装置110と通信可能に接続されていてもよい。
脆弱性データベース101は、脆弱性を利用した攻撃を実行する実行コードである攻撃コードの検体を保持(ストア:store)可能である。攻撃コードの検体は、例えば、既知の脆弱性を攻撃する処理が実装された1以上の命令列により表されてもよい。攻撃コードの検体は、当該攻撃コードを含む実行ファイルであってもよい。脆弱性データベース101は、上記以外に、既知の脆弱性を有するプログラムに関する実行コードの検体を保持してもよい。以下、脆弱性データベース101を、脆弱性データ保持部(脆弱性データ保持手段)と記載する場合がある。
マルウェアデータベース102は、既知のマルウェアの検体を保持可能である。マルウェアの検体は、例えば、マルウェアの実行コードの少なくとも一部であってもよく、マルウェアの実行コードそのものであってもよい。既知のマルウェアの検体は、周知の方法を含む適切な方法で収集されてよい。マルウェアデータベース102を実現可能な構成は、特に限定されない。以下、マルウェアデータベース102を、不正プログラムデータ保持部(不正プログラムデータ保持手段)と記載する場合がある。
システムデータベース103は、正常に稼働しているシステムにおいて用いられているオペレーティングシステム(OS:Operating System)やアプリケーションに関する検体を保持可能である。システムデータベース103に保持される検体は、例えば、OSを構成するライブラリや実行ファイル、あるいは、アプリケーションを構成するライブラリや実行ファイルであってもよい。以下、システムデータベース103を、システムデータ保持部(システムデータ保持手段)と記載する場合がある。
上記各データベースには、予め十分な量の検体が保持されることを想定する。
因子抽出部104は、脆弱性データベース101、マルウェアデータベース102、及び、システムデータベース103から取得した検体から、因子コード(後述)を抽出する処理を実行可能である。因子抽出部104(因子抽出手段)は、抽出した因子コードを因子データベース105に登録する。因子抽出部104は、因子コードを抽出した検体の実行コードと、因子コードとを関連付けて、因子データベース105に登録してもよい。また、因子抽出部104は、例えば、因子コードと、当該因子コードが抽出された検体コードを保持するデータベース(脆弱性データベース101、マルウェアデータベース102及びシステムデータベース103)を特定可能な情報と、を関連付けて、因子データベース105に登録してもよい。因子抽出部104の具体的な処理については、後述する。
因子データベース105は、因子抽出部104に抽出された因子コードを保持可能である。以下、因子データベース105を、因子コード保持部(因子コード保持手段)と記載する場合がある。また、因子データベース105が保持する因子コードを、既知因子コードと記載する場合がある。
成功状態登録部106は、例えば、攻撃対象(コンピュータ等の情報処理装置、又は情報処理装置を含む情報処理システム)に対する攻撃が成功した状態(以下「成功状態」と記載する場合がある)を表すデータを、成功状態データベース107に登録する機能を提供可能である。例えば、プログラム分析システム100のユーザは、成功状態登録部106を用いて、攻撃対象に関する攻撃が成功した状況(例えば、コンピュータの制御が攻撃プログラムに奪われた状況)を表す変数の状態(値)を、プログラム分析システム100(特には成功状態データベース107)に登録可能である。係る変数の状態は、例えば、レジスタや特定のメモリ領域の状態を表してもよい。また、係る変数の状態は、例えば、各種ファイルや、レジストリ等の状態を表してもよい。
成功状態データベース107は、成功状態登録部106により登録された成功状態を表すデータを保持可能である。以下、成功状態データベース107を、成功状態保持部(成功状態保持手段)と記載する場合がある。
因子探索部108は、実行ファイル111(後述)を抽象コード(後述)に変換する。また、因子探索部108は、因子データベース105に保持された因子コード(既知因子コード)が、変換された抽象コードに含まれるか否かを確認する処理を実行可能である。また、因子探索部108は、当該処理の結果に基づいて、実行ファイルにマルウェア等の不正ファイルが含まれるか否かを判定する処理を実行可能である。以下、実行ファイル111から変換された抽象コードを、「分析対象抽象コード」と記載する場合がある。
実行ファイル111は、マルウェア等の不正プログラムを含むか否かの検査が実行されるファイルである。実行ファイル111は、脆弱性データベース101、マルウェアデータベース102及びシステムデータベース103のいずれにも登録されておらず、プログラム分析システム100に入力される。実行ファイル111は、実行可能形式のファイルに限らず、ライブラリファイル等であってもよい。
判定結果提供部109は、因子探索部108における判定結果に応じて、脆弱性の有無を表す情報(結果情報)を生成する処理を実行可能である。係る結果情報は文字(テキスト)により表されてもよく、図表により表されてもよい。判定結果提供部109は、結果情報を出力装置110に提供可能である。
出力装置110は、判定結果提供部109から提供された結果情報を出力可能である。出力装置110が結果情報を出力する方法は、特に限定されず、適宜選択可能である。出力装置110は、例えば、各種表示デバイスを用いて結果情報を表示してもよく、結果情報をファイルに出力してもよく、結果情報を他の装置に送信してもよい。
上記各データベース(脆弱性データベース101、マルウェアデータベース102、システムデータベース103、因子データベース105、及び成功状態データベース107)を実現可能な構成は、特に限定されない。上記各データベースは、例えば、各種データベースソフトウェアを用いて実現されてもよく、ファイルシステムにおけるファイルを用いて実現されてもよい。
プログラム分析システム100は、変形例として、図1Bに例示するように、実行ファイル調整部112を含んでもよい。実行ファイル調整部112(実行ファイル調整手段)は、実行ファイル111のサイズを低減(短縮)可能か否かを確認する処理を実行可能である。実行ファイル調整部112は、実行ファイル111よりもサイズが小さく、実行ファイル111と同様の処理を実行可能である出力ファイル113を生成する処理を実行可能である。実行ファイル調整部112の具体的な処理については後述する。
出力ファイル113は、実行ファイル111よりもサイズが小さく、実行ファイル111と同様の処理を実行可能な実行ファイルである。出力ファイル113は、例えば、実行ファイル111の一部が他のコードを用いて置き換えられた実行ファイルであってもよい。
[数理モデル]
以下、本実施形態及びその変形例におけるプログラム分析システム100によって実行される、実行コードの数理モデルへの変換について説明する。以下において説明する数理モデル表現を表すデータが、上記説明した抽象コードに相当する。以下、説明の便宜上、実行コードがIntel(登録商標)社のx86アーキテクチャ(32bit)において実行可能な命令列により表されることを想定する。なお、本実施形態はこれには限定されず、他のアーキテクチャについても適用可能である。
マルウェア等の不正プログラムは、悪意のある(malicious)処理を実行する命令列を含む。また、マルウェア等により攻撃される可能性があるプログラムには、脆弱な実行コードに該当する命令列が含まれる場合がある。
ある処理を実現可能な命令列の組み合わせは複数存在し得ることから、命令列の複雑な組み合わせを分析することは必ずしも容易であるとは限らない。そこで、プログラム分析システム100は、実行コードに含まれる命令列を数理モデルである写像に変換(抽象化)し、一連の命令列による処理を、写像の合成として表現する。これにより、プログラム分析システム100は、ある実行コードを変換した数理モデルを用いて、当該実行コードを分析(例えば、攻撃コードか否かの判定、脆弱性を有するコードか否かの判定、コードの類似性の判定、コードの置換可能性の判定、等)することが可能である。
例えば、”n”個目(”n”は自然数)の命令を実行した際の、システム(例えばコンピュータ)の状態を”Sn”、ある正規の実行コードの数理モデルを”A”、攻撃コードの数理モデルを”B”と表す。システムの状態”Sn”は、システムに含まれるレジスタ、メモリ、記憶媒体等の状態を含むと想定する。
正規の実行コードを実行した場合のシステムの状態遷移は、例えば、下式により表される。下式において、”S
n”は数理モデル”A”に関する入力、”S
n+1”は数理モデル”A”に関する出力であると考えられる。
攻撃コードを実行した場合のシステムの状態遷移は、例えば、下式により表され得る。
上式において”B=Cdiff×A”なる関係が満たされる場合、攻撃コードを表す数理モデル”B”は、正規の実行コードを表す数理モデル”A”と、差分”Cdiff”との組み合わせを用いて表され得る。例えば、差分”Cdiff”を小さくするような数理モデル”A”を選択することにより、攻撃コードに特有の特徴(差分”Cdiff”)を低減可能であると考えられる。また、差分”Cdiff”は、攻撃コード特有の特徴であると考えられることから、差分”Cdiff”に相当する数理モデルに変換される実行コードは、攻撃コードである可能性があると考えられる。
上記のような基礎概念に基づいて、プログラム分析システム100(特には、因子抽出部104、因子探索部108、及び実行ファイル調整部112)は、実行コードに含まれる命令列を、数理モデルである写像(写像を表す関数)の合成に変換する。プログラム分析システム100は、ある命令列から変換した写像を表す関数の左辺に出力ベクトル(後述)を配置し、右辺の末尾には入力ベクトル(後述)を配置する。入力ベクトルは、写像を表す関数に対する引数として扱われる。
図7に例示する具体例を用いて説明すると、実行コード701に含まれる命令列は、それぞれ写像”f1”乃至”f5”に変換される。プログラム分析システム100は、実行コードに含まれる命令を、レジスタ及びメモリ(メモリ領域)等の状態を、引数及び戻り値として扱う写像に変換可能である。この場合、1つの命令に対して写像の個数は1以上であってよい。プログラム分析システム100は、例えば、ある命令列と、当該命令列が変換される写像とを関連付ける変換情報(図7の702)を保持し、当該変換情報を用いて、命令列を写像に変換してもよい。係る変換情報は、例えば、命令列と写像とを関連付ける辞書データであってもよい。
図7に例示する”vin”は、命令列から変換された写像に関する入力ベクトルである。”vout”は、命令列から変換された写像に関する出力ベクトルである。
以下、上記説明した写像に関する入力ベクトル及び出力ベクトルについて説明する。入力ベクトル及び出力ベクトルは、それぞれ、「実レジスタ」、「仮想レジスタ」、及び、「メモリ参照」のいずれか1以上の要素を含む変数ベクトルを用いて表される。以下、変数ベクトルの要素(即ち、入力ベクトル及び出力ベクトルの要素)を、単に「変数」と記載する場合がある。
実レジスタは、例えば、マルウェア等が実行される情報処理装置を構成する演算装置(CPU:Central Processing Unit)に実装されたレジスタを表す。実レジスタには、レジスタ名が関連付けられていてよい。具体例として、Intel(登録商標)社のx86アーキテクチャにおいては、上記実レジスタは、汎用レジスタ(GPR:General Purpose Register)であってもよい。実レジスタを含む変数ベクトルの具体例は、例えば、下式のように表されてもよい。
仮想レジスタは、プログラム分析システム100における計算の都合から導入される仮想的なレジスタである。係る仮想レジスタは、実際のCPUには実装されていなくともよい。仮想レジスタには、当該仮想レジスタを表すレジスタ名が関連付けられていてもよい。
メモリ参照は、マルウェア等が実行される情報処理装置を構成するメモリ(例えば主メモリ等)に記憶された内容を表す要素である。具体的には、メモリ参照の要素は、当該要素が指すアドレス(メモリ領域のアドレス)の内容を表す。メモリ参照は、要素とアドレス幅を有する。メモリ参照の要素は、例えば、下式のように、角括弧(ブラケット)”[”と、”]”とにより囲まれた形式で表記されてもよい。また、メモリ参照の要素には、アドレス幅を表すビット数(例えば”ref8”、”ref16”、”ref32”等)が関連付けられてもよい。メモリ参照のうち、角括弧(ブラケット)”[”、”]”により囲まれた部分は、参照するメモリのアドレスを表す。以下、メモリ参照のうち、角括弧(ブラケット)”[”、”]”により囲まれた部分を、”アドレス部分”と記載する場合がある。
情報処理装置が扱うメモリ領域は広大であることから、変数ベクトルの要素に全てのメモリ領域の状態を含めると、計算量が増大する可能性がある。このため、メモリ領域のうち、入出力に直接的に関与する領域が、変数ベクトルの要素に含まれてもよい。
変数ベクトルの要素には、定数項が含まれてもよい。定数項は、実数定数を表す要素である。プログラム分析システム100においては、定数項は、例えば、図8に例示するように、3次元グラフィックスなどの分野において用いられる同次座標系のベクトル表現を用いて表されてもよい。定数項は、入力ベクトルにのみ現れてもよい。定数を引数として扱う非線形関数の実装を容易にすべく、積演算により写像を統合する過程(後述)では、定数項に”1”以外の値が設定されてもよい。
変数ベクトルに含まれる全ての要素(変数)には、当該要素が変更された回数を表す添え字が関連付けられてもよい。具体例として、”n”番目(”n”は自然数)の写像を想定する。下式のように、”n”番目の写像により変更される入力ベクトルの要素の添え字には”n−1”が関連付けられ、当該”n”番目の写像により変更された出力ベクトルの要素の添え字は”n”が関連付けられてもよい。
上記説明したメモリ参照においては、例えば、下式のように、角括弧内の要素(アドレス部分)の添え字(例えば、”vreg
2”における”2”)と、メモリ参照自体の添え字(例えば、”[vreg
2]
ref16,1”における”1”)とが異なっていてもよい。
以下、実行コードの写像への変換について説明する。プログラム分析システム100は、実行コードに含まれる命令列を、線形関数、非線形関数及び外部関数のいずれかに変換する。
線形関数は、変換行列を保持する。当該変換行列と入力ベクトルとの積が、出力ベクトルとして扱われる。線形関数は、単一の変換行列により表されてもよい。即ち、ある命令に対する入力ベクトルが、変換行列を用いて出力ベクトルに変換可能である場合、当該命令は線形関数に変換される。変換行列の具体例については後述する。
非線形関数は、当該関数の種類を表す識別子と、当該関数による処理(関数の実体)を表す情報とを保持する。非線形関数は、例えば、単純な変換行列により表すことが困難な写像を表す。非線形関数は、変換行列を含まなくともよい。関数による処理を表す情報は、ラムダ式により表現されてもよい。この場合、ラムダ式に対する引数として入力ベクトルを与えると、出力ベクトルが得られる。非線形関数の具体例については後述する。
外部関数は、関数の種類を表す識別子を保持する。外部関数は、例えば、システムコール等、実行コードが実行される環境(システム)の外で作用する関数を表す。外部関数は、具体的には、例えば、分析対象である実行コードの外部で定義されたシステムコールや、ライブラリ関数であってもよい。
プログラム分析システム100は、実行コードに含まれる命令列と、写像(後述する写像を表す関数)とを関連付ける変換情報(例えば、テーブルや、マップ等を用いて構成された辞書データ)等を保持してもよい。係る変換情報には、例えば、ある命令列と、当該命令列が変換される写像(上記各関数)との組み合わせが、1以上含まれていて良い。変換情報に含まれる組み合わせは、例えば、一つの命令(例えば”mov”命令等)と、当該命令が変換される写像(例えば、線形写像を表す変換行列等)との組み合わせであってもよい。変換情報に含まれる組み合わせは、複数の命令からなる命令列と、当該命令列が変換される写像との組み合わせであってもよい。プログラム分析システム100には、分析する実行コードが実行されるコンピュータのアーキテクチャ等に応じて、適切な上記変換情報が与えられていてもよい。上記に限定されず、プログラム分析システム100は、予め、ある命令列と、当該命令列が変換される写像との対応関係が組み込まれた状態で実装されてもよい。
プログラム分析システム100は、実行コードに含まれる命令の内、例えば、図9に例示する命令を、線形関数に変換可能である。線形関数に変換される命令は、図9に例示する命令に限定されず、プログラム分析システム100に適宜設定されていてもよい。図9に例示する命令と、当該命令が変換される線形関数との組み合わせが、上記変換情報に設定されていてもよい。以下、具体例を用いて説明する。
一つの具体例として、命令列”mov eax ecx”の、数理モデルへの変換について説明する(図10A)。この場合、実レジスタ”eax”に実レジスタ”ecx”が代入(転送)される。即ち、出力ベクトルの実レジスタ”eax”には、入力ベクトルの実レジスタ”ecx”が代入(転送)される。出力ベクトルに含まれる他の要素は、入力ベクトルから変更されない。この場合、図10Aに例示するように、命令列”mov eax ecx”は、図10Aに例示する単一の変換行列”Tmov(eax、ecx)”含む線形関数を用いた写像に変換可能である。
他の具体例として、命令列”lea eax [ecx]”の、数理モデルへの変換について説明する(図10B)。この場合、実レジスタ”eax”に、メモリ参照”[ecx]”のアドレスが代入(転送)される。即ち、出力ベクトルの実レジスタ”eax”には、入力ベクトルのメモリ参照”[ecx]”のアドレスが代入(転送)される。出力ベクトルに含まれる他の要素は、入力ベクトルから変更されない。この場合、図10Bに例示するように、命令列”lea eax [ecx]”は、単一の変換行列”Tlea(eax、[ecx])”含む線形関数を用いた写像に変換可能である。
上記のように、代入(転送)命令から変換された変換行列においては、出力ベクトルの要素に代入(転送)される入力ベクトルの要素に対して積の演算が実行される変換行列の要素には非ゼロ(”0”)要素が設定される。変換行列の他の要素はゼロ(”0”)要素に設定されてよい。
他の具体例として、命令列”push C”(”C”は定数)の、数理モデルへの変換について説明する(図10C)。この場合、スタックポインタ(”esp”)はデクリメント(例えば4バイト分減算)され、スタックのトップに”C”が格納される。即ち、出力ベクトルのメモリ参照”[esp]”が参照するアドレス(スタックポインタが指すスタックの先頭)には、定数Cが格納される。また、出力ベクトルのスタックポインタ”esp”は、入力ベクトルのスタックポインタからデクリメントされる。出力ベクトルに含まれる他の要素は、入力ベクトルから変更されない。この場合、図10Cに例示するように、命令列”push C”は、単一の変換行列”Tpush(C)”含む線形関数を用いた写像に変換可能である。
他の具体例として、命令列”pop eax”の、数理モデルへの変換について説明する(図10D)。この場合、出力ベクトルの実レジスタ”eax”に、入力ベクトルのスタックポインタ”[esp]”が指すアドレスの内容が格納される。また、出力ベクトルのスタックポインタ”esp”はインクリメント(例えば4バイト分加算)される。この場合、図10Dに例示するように、命令列”pop eax”は、単一の変換行列”Tpop(eax)”含む線形関数を用いた写像に変換可能である。
以下、x86アーキテクチャにおける”Mod R/M”バイトを含む命令を数理モデルに変換する方法について、図11に示す具体例を用いて説明する。表記を簡略化する観点から、図11に示す具体例においては、入力ベクトル、出力ベクトル、及び変換行列の各要素の内、命令の実行に関係しない要素については省略されている。
”Mod R/M”バイトは、オペコードの直後に配置され、オペコードで使用するレジスタと、アドレッシングモードとを指定するバイトである。
図11に示す具体例は、命令列”mov dword ptr [eax*2+ebx+4], 1000”を数理モデルに変換する例である。まず、”Mod R/M”を含む部分(アドレス演算)が、仮想レジスタ(”vreg1”)を用いて表現される(図11の(A))。即ち、”[eax*2+ebx+4]”により表されるアドレス計算の結果が、仮想レジスタ(”vreg1”)に格納される。図11における”T1”は、係るアドレス計算に関する変換行列である。上記のように導入された仮想レジスタが指し示すメモリ参照が、数理モデルとして表される(図11の(B))。即ち、仮想レジスタにより参照されるメモリ領域に、即値”1000”が格納される。図11における”T2”は、仮想レジスタにより参照されるメモリ領域に対する即値の代入(転送)を表す変換行列である。以上より、図11に例示した”Mod R/M”を含む命令が変換さる数理モデル(”T”)は、2つの変換行列(”T1”及び”T2”)の積として表される(図11の(C))。
上記説明した具体例以外の命令についても、例えば、当該命令(及び当該命令を含む命令列)と、当該命令が変換される線形関数との組み合わせが、上記変換情報に予め設定されてもよい。これにより、プログラム分析システム100は、例えば、図9に例示した命令(及び当該命令を含む命令列)を線形関数に変換することが可能である。
本実施形態におけるプログラム分析システム100は、実行コードに含まれる命令の内、例えば、図12に例示する命令を非線形関数に変換可能である。図12に例示する命令と、当該命令が変換される線形関数との組み合わせが、上記変換情報に設定されていてもよい。非線形関数に変換される命令は、図12に例示する命令に限定されず、プログラム分析システム100に適宜設定されていてもよい。
一つの具体例として、命令列”movzx eax、 bx”(ゼロ拡張を伴うロード(転送)命令)の、数理モデルへの変換(図13の(A)部分)について説明する。この場合、係る命令は、入力変数とビット幅とを引数として受け付ける非線形関数に変換される。図13の(A)における非線形関数”Fmovzx”は、例えば、入力変数を”x”、ビット幅を”b”とすると、下式のように実装されてもよい。なお、下式において”&”は、論理積演算をあらわす。変数”x”と、”(2
b−1)”との論理積を計算することで、”x”をゼロ拡張した値が得られる。
また、命令列”movsx eax、 byte ptr [bl]”(符号拡張を伴うロード(転送)命令)も、上記と同様に、入力変数とビット幅とを引数として受け付ける非線形関数に変換される(図13の(B)部分)。図13の(B)における非線形関数”Fmovsx”は、例えば、入力変数を”x”、ビット幅を”b”とすると、下式のように実装されてもよい。下式において、”F
bt(x、b)”は、”bt”命令を表す非線形関数である。変数”x”の符号を確認した結果に基づいて、符号拡張処理を実行することにより、”x”を符号拡張した値が得られる。
上記説明した具体例以外の命令についても、例えば、当該命令(及び当該命令を含む命令列)と、当該命令が変換される非線形関数との組み合わせが、上記変換情報に予め設定されてもよい。これにより、プログラム分析システム100は、例えば、図12に例示した命令(及び当該命令を含む命令列)を非線形関数に変換することが可能である。
以下、プログラム分析システム100による写像の統合処理について説明する。
プログラム分析システム100は、例えば、図14に示すように複数の命令列が存在する場合(1行乃至10行)、各命令列を、写像”T1”乃至”T10”を用いた数理モデルに変換する。
プログラム分析システム100(特には、因子抽出部104、因子探索部108、実行ファイル調整部112等)は、積の演算処理により写像を統合する。これにより、命令列の表現に用いられる写像の数が低減される。プログラム分析システム100は、係る写像の統合により、例えば、最小限の写像の合成で、命令列を表現することができる。以下、積演算による写像の統合処理について、図15に例示するフローチャートを参照して説明する。以下の処理は、プログラム分析システム100に含まれる、因子抽出部104、因子探索部108、実行ファイル調整部112等により実行されてよい。
具体的には、プログラム分析システム100は、連続する線形関数の積を演算する(ステップS1501)。プログラム分析システム100は、連続する非線形関数と他の関数との積を演算する(ステップS1502)。プログラム分析システム100は、他に積を演算可能な関数が存在する場合(ステップS1503においてYES)、ステップS1501に戻って処理を続行する。プログラム分析システム100は、他に積を演算可能な関数が存在しない場合、入出力ベクトルを正規化する(ステップS1504)。
以下、ステップS1501の処理について、図16乃至図19を参照して説明する。図16に模式的に示すように、二つの線形関数(”T1”、”T2”)が連続している場合、プログラム分析システム100は、これらを積を演算する。これにより、プログラム分析システム100は、二つの写像を、一つの写像”T”に統合する。
変数ベクトル”v1”は、線形関数”T1”の出力ベクトルであり、線形関数”T2”の入力ベクトルである。そこで、プログラム分析システム100は、線形関数”T1”の出力ベクトルと、線形関数”T2”の入力ベクトルと、についてそれぞれに含まれる要素の種類及び位置を揃えるように、変数ベクトル”v1”を調整する。また、線形関数”T1”及び”T2”、並びに、変数ベクトル”v0”及び”v2”の次元を、変数ベクトル”v1”に合わせて拡張する。具体的には、変数ベクトル”v1”に含まれる変数(要素)の種類と位置とに合わせるように、線形関数(”T1”、”T2”)の行と列とを拡張する。同様に、変数ベクトル”v0”及び”v2”の行を拡張する。以下、プログラム分析システム100による上記処理を、行列拡大処理と記載する場合がある(ステップS1701)。
プログラム分析システム100は、入力ベクトル及び出力ベクトルの各要素(変数)に、添え字を添付(関連付け)する。実行コードの内、”n”(”n”は自然数)行目の命令列から変換された数理モデルの出力ベクトルに含まれる要素には、添え字として”n”が添付される。”n”(”n”は自然数)行目の命令列から変換された数理モデルの入力ベクトルに含まれる要素には、添え字として”n−1”が添付される。なお、メモリ参照のアドレス部分(角括弧”[”、”]”に囲まれた部分)については、入力ベクトルのアドレス部分と、出力部分のアドレス部分とが(添え字も含めて)同じであってもよい。上記処理を、変数添え字添付処理と記載する場合がある。変数添え字添付処理において、プログラム分析システム100は、例えば、入力ベクトル及び出力ベクトルの各要素を表すデータに対して、添え字を表すデータを付加データとして関連付けてもよい。あるデータに対して付加データを関連付ける具体的な方法は、例えば、テーブル、構造体、ポインタを用いる方法等、適切な方法を選択してよい。
プログラム分析システム100は、ある命令から変換された数理モデルの出力ベクトルに含まれた要素(変数)とその添え字との組を、当該命令より後の命令から変換された数理モデルの出力ベクトルに含めてよい。例えば、”i”(”i”は自然数)番目の命令から変換された数理モデルの出力ベクトル”vi”に、要素”ai”(変数”a”と、その添え字”i”との組)が含まれる場合、プログラム分析システム100は、”i+1”番目以降の命令から変換された数理モデルの出力ベクトルに、要素(変数)”ai”を含めてよい。以下、上記処理を「変数伝搬処理」と記載する場合がある。
図18に示す具体例を用いて説明すると、命令列1801の1行目(”pop edx”)の出力ベクトルは、要素”edx”と、”esp”を含み、命令列1801の2行目(”add ecx edx”)の入力ベクトルは、要素”ecx”と、”edx”とを含む。これより、プログラム分析システム100は、要素”ecx”、”edx”及び”esp”を含むよう、変数ベクトル”v1”を調整する。プログラム分析システム100は、変数ベクトル”v1”に含まれる要素の種類と位置に合わせて、各命令列から変換された数理モデル(変換行列)”T1”及び”T2”の行と列とを拡張する。プログラム分析システム100は、数理モデル(変換行列)”T1”及び”T2”の入力ベクトル及び出力ベクトルに対して添え字を添付する。
プログラム分析システム100は、各命令列から変換された数理モデル(変換行列)”T1”と”T2”との積を演算する(ステップS1702)。図18に示す具体例では、係る積演算処理により、”T1”と”T2”とが統合され、2つの命令列が、一つの変換行列”T”により表される。
プログラム分析システム100は、ステップS1702に統合された変換行列の次元を削減する処理である、次元削減処理を実行する(ステップS1703)。係る次元削減処理には、例えば入力ベクトル”v0”の次元を削減することで、変換行列”T”の列を削減する処理が含まれてもよい。また、係る次元削減処理には、出力ベクトル”v2”の次元を削減することで、変換行列”T”の行を削減する処理が含まれてもよい。
プログラム分析システム100は、例えば、出力ベクトルに含まれる要素(変数)のうち、異なる添え字が添付された変数を削減してよい。具体的には、プログラム分析システム100は、以下の各処理を実行してよい。プログラム分析システム100は、出力ベクトルに含まれる変数が実レジスタ又はメモリ参照であり、異なる添字を持つ同じ変数が存在しない場合、その変数と添字との組は最終状態であると判定してよい。この場合、プログラム分析システム100は、係る変数に関する処理を終了してよい。プログラム分析システム100は、出力ベクトルに含まれる、ある変数とその添え字との組が最終状態ではなく、他の変数(例えばメモリ参照等)との関連を有しない場合、その変数と添え字との組を削除する。
プログラム分析システム100は、以下の変数の正規化処理と、状態の正規化処理とを実行する(ステップS1704)。変数の正規化処理は、定数であることが確定している変数を抽出し、定数項に移動する処理である。プログラム分析システム100は、変数の優先順位(例えば図20)に基づいて、変数ベクトルに出現する変数の種類を低減する。状態の正規化処理は、出力ベクトルに含まれる全てのメモリ参照を、最終状態の変数により表す処理である。なお、プログラム分析システム100は、ステップS1703乃至S1704の処理を、出力ベクトルが変化しなくなるまで繰り返してもよい。
図19に示す具体例を用いて説明する。図19に示す具体例において、プログラム分析システム100は、実行コード(図19の1901)に含まれる各命令列を数理モデル(図19の1902)に変換する。プログラム分析システム100は、上記説明した行列拡大処理(ステップS1701)及び積演算処理(ステップS1702)を実行し、統合された変換行列と、その入力ベクトル、出力ベクトルとを得る(図19の1903)。
出力ベクトルに含まれる変数”eax3”は、”eax1”に依存している。また、出力ベクトルに含まれる変数”eax1”は、定数”1000”に依存している。よって、変数”eax3”は、定数により表される。入力ベクトルの変数である”eax1”は、定数(”1000”)であることが確定していることから、入力ベクトルの変数を正規化することで、入力ベクトルの次元が縮小される。これにより、変換行列の列が縮小される(図19の1904)。
入力ベクトルの変数である”eax3”は、定数(”1004”)により表されることから、出力ベクトルの正規化と、状態の正規化と実行することで、変換行列の行が縮小される(図19の1905)。
以下、非線形関数を含む積演算(図15のステップS1502)について説明する。
一例として、合成された写像を表す数理モデル”T=T2×T1”において、数理モデル”T2”が非線形関数であり、数理モデル”T1”が線形関数である場合を想定する。線形関数”T1”の出力ベクトルに含まれる定数の集合と、非線形関数”T2”の入力ベクトルに含まれる変数の集合との論理積が空でない場合、非線形関数”T2”は、他の線形関数に変換できる可能性がある。この場合、プログラム分析システム100は、非線形関数”T2”を線形関数に変換してから、上記した線形関数同士の積演算を実行してよい。非線形関数”T2”を線形関数に変換できない場合、プログラム分析システム100は、入力ベクトルに対して線形関数”T1”を適用し、その結果に対して非線形関数”T2”を適用してよい。
具体例として、”T
1”がデータ代入(転送)命令(例えば、”mov ebx C”(Cは定数))から変換された線形関数であり、”T
2”が乗算命令(例えば”mul ebx”)から変換された非線形関数である場合を想定する。この場合、合成写像”T”は、”T=mul
○mov”(記号”
○”は、合成写像を表す)と表される。なお、”mul”命令を実行すると、レジスタ”eax”に格納された値と、”mul”命令に与えられたオペランドと乗算が行われ、その乗算結果の上位部分はレジスタ”edx”に、下位部分はレジスタ”eax”に格納されることを想定する。このような命令列は、例えば以下のような疑似コードにより表される。
例えば、”ebx=1”が成立する場合(例えば”mov ebx n(n:定数)”等の命令が実行された場合等)、”mul ebx”命令を実行しても、”eax”の値は変わらない。また、”ebx=0”の場合、”mul ebx”命令を実行すると、”eax”には”0”が格納される。いずれの場合においても、”edx”には”0”が格納される。これは、例えば、以下のような疑似コードにより表される。
上記の場合、”mov”命令から変換された線形関数の出力ベクトルに定数(この場合は”ebx=0”、”ebx=1”)が含まれる。即ち、この場合の定数の集合は”ebx”である。また、”mul”命令から変換された非線形関数の入力ベクトルには”ebx”、”eax”が含まれる(即ち、入力ベクトルの変数の集合には、”ebx”、”eax”が含まれる)。よって、線形関数の出力ベクトルに含まれる定数の集合(この場合は”ebx”)と、非線形関数の入力ベクトルに含まれる変数の集合(この場合は”eax”、”ebx”)とには、”ebx”が含まれる。この場合、”mul”命令から変換された非線形関数は、線形関数に変換可能である。なお、”ebx=0”または、”ebx=1”が成立しない場合、”mul”命令から変換された非線形関数は、線形関数には変換されない。
別の例として、合成された写像を表す数理モデル”T=T2×T1”において、数理モデル”T1”、”T2”がともに非線形関数である場合を想定する。この場合、逆射の定義から、一方の写像が他方の(偏)逆写像であるとき、これらの写像は恒等写像に変換され得る。
具体例として、”T
1”が乗算命令(例えば、”mul ebx”)から変換された非線形関数であり、”T
2”が除算命令(例えば”div ebx”)から変換された非線形関数である場合を想定する。この場合、合成写像”T”は、”T=div
○mul”(記号”
○”は、合成写像を表す)と表される。このような命令列は、例えば、以下のような疑似コードにより表される。
ここで、ebxが”0”(ゼロ)ではない場合、”eax”の値は変わらない。なぜなら、同じ値(”ebx”)を乗算した後に除算しているからである。また、”edx”には”0”が設定される。これは、例えば、以下のような疑似コードにより表される。
以上より、数理モデル”T1”、”T2”のうち、一方の写像が他方の逆写像であるとき、これらを合成した写像”T”は、入力ベクトルを写像した結果を更に逆写像する処理に相当することから、恒等写像であると考えられる。上記具体例では、”div”命令が”mul”命令の逆写像であることから、”T=div○mul”なる写像を恒等写像として扱うことが可能な場合がある。
プログラム分析システム100は、例えば、恒等写像を”nop”命令に相当する写像として扱い、当該写像に関する処理を実行せずともよい。プログラム分析システム100は、数理モデル”T1”、”T2”を恒等写像として扱えない場合、入力ベクトルに対して非線形関数”T1”を適用し、その結果に対して非線形関数”T2”を適用してよい。
以下、入出力ベクトルの正規化(図15のステップS1504)について説明する。プログラム分析システム100は、入力ベクトルに含まれる要素(変数)の優先順位に基づいて、入力ベクトルの行の順序を並び替え(ソート)する。プログラム分析システム100は、出力ベクトルに含まれる要素(変数)の優先順位に基づいて、出力ベクトルの行の順序を並び替え(ソート)する。変数の優先順位は、例えば、図20に例示するように、予め定められていてもよい。なお、図20に示す優先順位は、一つの具体例であり、変数の優先順位は適宜定められてよい。
また、プログラム分析システム100は、例えば、図21に例示するように、入力ベクトルの定数項が”1”となるように、当該入力ベクトルを調整する。
上記した処理により、プログラム分析システム100は、実行コードの命令列を、数理モデルに変換することができる。上記したように、実行コードから変換された数理モデルは抽象コードに相当する。プログラム分析システム100は、写像の合成処理を実行することにより、複数行からなる実行コードを、1以上の抽象コードに変換することができる。
[動作]
以下、図2、図3、図4及び図5の各図に例示するフローチャートを参照して、本実施形態におけるプログラム分析システム100の動作について説明する。
図2は、因子抽出部104の動作の具体例を表すフローチャートである。図2に例示する処理は、例えば、所定のタイミング(例えば、所定時間ごと)で実行されてもよい。
因子抽出部104は、脆弱性データベース101、マルウェアデータベース102、及び、システムデータベース103のそれぞれから検体(検体の実行コード)を読み込む(ステップS201)。
因子抽出部104は、検体に含まれる実行コード(例えば、機械語コード)を、抽象コードに変換する(ステップS202)。この際、因子抽出部104は、例えば、検体の実行コードに含まれる実行コードを、逆アセンブルなどの静的解析手法を用いて解析してもよい。因子抽出部104は、例えば、実行コードの解析結果(例えば、アセンブラコード)と、抽象コードとを関連付ける、上記説明した変換情報(例えば、変換テーブルや変換マップ等)を保持し、当該変換情報を用いて、実行コードを抽象コードに変換してもよい。抽象コードは、上記したように、抽象化された変数名により表される入力ベクトル及び出力ベクトルと、それらの間の写像を表す関数と、から構成される。以下、因子抽出部104が、上記各データベースに含まれる検体から変換した抽象コードを、「既知抽象コード」と記載する場合がある。
因子抽出部104は、例えば、実行コードを、特定の中間形式を用いて表されるデータ(中間データ)に変換し、当該変換されたデータを、更に抽象コードに変換してもよい。因子抽出部104は、例えば、実行コードを、SSA形式(static single assignment form)の中間データに変換してもよい。この場合、上記変換情報には、実行コードに含まれる命令列と、当該命令列から変換される中間データとの組み合わせと、ある中間データと、当該中間データから変換される数理モデルとの組み合わせとが含まれてもよい。
因子抽出部104は、実行コードから変換した数理モデルに対して、上記説明した写像の統合処理を実行してもよい。
因子抽出部104は、抽象コードを不可分な(互いに素な)因子コードに分解する(ステップS203)。因子コードは、実行コードを数理モデルに変換して表したデータである。ある因子コードと、他の因子コードとに、ある出力ベクトルの変数が共通して含まれるような依存関係が存在しない場合、それらの因子コードは、互いに素な因子コードである。因子コードは、例えば、1つ乃至2つの変数に対する演算を表す数理モデルである。抽象コードは、例えば、因子コードの集合によって表現され得る。
因子抽出部104は、何らかの手法を用いて、抽象コードを表す行列を分解することで、抽象コードを、因子コードに分解する。因子抽出部104は、例えば、周知の行列分解手法(例えば、LU分解、特異値分解(SVD:singular value decomposition)、主成分分解)等を用いて抽象コードを表す行列を分解した結果を用いて、抽象コードを因子コードに分解してもよい。抽象コードを表す行列を分解する方法は上記に限定されない。例えば、抽象コードを表す行列と、何らかのベクトルとの積の演算結果における各行が互いに素である場合、それらの各行を因子コードとして扱ってもよい。
因子抽出部104は、因子コードとその並び順、及び、仮想メモリ上のアドレスを因子データベース105に登録する(ステップS204)。因子抽出部104は、因子コードだけではなく、抽象コードを因子データベース105に登録してもよい。
図3は、成功状態登録部106の動作の具体例を示すフローチャートである。成功状態登録部106は、例えば、プログラム分析システム100の利用者からの要求に応じて処理を開始してよい。
成功状態登録部106は、保護対象であるシステムや装置(コンピュータ、インフラなど)に関する攻撃が成功した状態(成功状態)を表す情報を、プログラム分析システム100の利用者から受け付ける(ステップS301)。あるシステムに関する攻撃が成功した状態は、例えば、当該システムに関する制御が攻撃者に奪われた状態に相当する。攻撃が成功した状態を表す情報は、例えば、特定の変数、メモリ領域、ファイル等の状態を表す情報であってもよい。成功状態登録部は、例えば、攻撃が成功した状態を表す数理モデル表現を表す情報(データ)を、利用者から受け付けてもよい。成功状態登録部106は、例えば、利用者に対して、攻撃が成功した状態を表す数理モデルを作成するためのインタフェース等を提供してもよい。
成功状態登録部106は、利用者から提供された、攻撃が成功した状態を表す情報を、成功状態データベース107に登録する(ステップS302)。
図4は、因子探索部108の動作の具体例を示すフローチャートである。因子探索部108は、例えば、プログラム分析システム100の利用者からの要求に応じて処理を開始してよい。
因子探索部108は、検査対象である実行ファイル111の実行コード(例えば、機械語コード)を抽象コードに変換する(ステップS401)。実行ファイル111は、例えば、脆弱性データベース101、マルウェアデータベース102、及び、システムデータベース103のいずれにも登録されていない、未知の実行ファイルであってよい。
因子探索部108は、上記因子抽出部104と同様、実行コードに含まれる命令と、抽象コード(数理モデル)とを関連付ける変換情報(例えば、変換テーブルや変換マップ等)を保持し、当該変換情報を用いて、実行コードを抽象コードに変換してもよい。例えば、係る変換情報には、実行コードに含まれるある命令列と、当該命令列から変換される数理モデル(線形関数、非線形関数、外部関数等)とが関連付けて設定されていてもよい。
因子探索部108は、ステップS401において検査対象である実行ファイル111の実行コードから変換した抽象コードに、因子データベース105に登録された因子コード(既知因子コード)が含まれるか否かを確認する(ステップS402)。因子探索部108は、例えば、ステップS401において変換した抽象コードを因子コード(「分析対象因子コード」と記載する場合がある)に分解してもよい。因子探索部108は、因子データベース105を検索し、分解した因子コード(分析対象因子コード)に相当する因子コード(既知因子コード)が因子データベース105に登録されているか否かを確認してもよい。この際、因子探索部108は、因子データベース105に登録された因子コード(既知因子コード)のうち、脆弱性データベース101及びマルウェアデータベース102に登録された検体から抽出された因子コードを検索してもよい。
実行ファイル111から変換した抽象コードに、因子データベース105に登録された因子コードが含まれなかった場合(ステップS402においてNO)、因子探索部108は、係る抽象コードに可換性を有する因子コードが含まれるか確認する。可換性を有する因子コードとは、抽象コードに含まれる因子コードのうち、その位置や実行順序を並べ替えた場合に、並べ替える前と同等の実行結果が得られる因子コードである。因子探索部108は、例えば、抽象コードに含まれる1以上の因子コードを並べ替えても抽象コードの出力ベクトルが変わらない場合、当該1以上の因子コードを、可換性を有する因子コードであると判定してもよい。
実行ファイル111から変換した抽象コードに、可換性を有する因子コードが含まれる場合、因子探索部108は、当該抽象コードにおいて部分的に因子コードを並べ替える。そして、因子探索部108は、因子コードを並べ替えた後の抽象コードに、因子データベース105に登録された因子コードが含まれるか否かを確認する(ステップS403)。
因子データベース105に登録された因子コードが、ステップS403において並べ替えられた抽象コードに含まれない場合(ステップS404においてNO)、因子探索部108は、実行ファイル111に関する脆弱性が存在しないと判定し(ステップS406)、処理を終了してよい。
因子データベース105に登録された因子コードが、ステップS403において並べ替えられた抽象コードに含まれる場合(ステップS404においてYES)、因子探索部108は、ステップS405から処理を実行する。また、ステップS402においてYESの場合も、因子探索部108は、ステップS405から処理を実行する。
ステップS405において、因子探索部108は、実行ファイル111の最終的な動作状態である最終動作状態が、成功状態データベース107に登録された成功状態を表す情報に含まれるか否かを判定する(ステップS405)。最終動作状態は、例えば、実行ファイル111の実行が終了した際の状態として、実行ファイル111から変換された抽象コードにおける写像が実行された後の出力ベクトルの状態(より具体的には、当該出力ベクトルに含まれる要素)を表してもよい。
最終動作状態が成功状態と合致する(又は、最終動作状態に成功状態が含まれる)場合(ステップS405においてYES)、因子探索部108は、実行ファイル111に関する脆弱性が存在する、と判定する(ステップS407)。この場合、因子探索部108は、実行ファイル111に攻撃コードが含まれると判定してよい。ステップS405におおいてNOの場合、因子探索部108は、実行ファイル111に関する脆弱性が存在しない判定する(ステップS406)。この場合、因子探索部108は、実行ファイル111に攻撃コードが含まれないと判定してよい。因子探索部108は、上記判定結果を、判定結果提供部109に提供してよい。
図5は、判定結果提供部109の動作の一例を表すフローチャートである。判定結果提供部109は、因子探索部108における判定結果から、実行ファイル111に関する脆弱性の有無を確認し、当該判定結果を表す情報(データ)を生成する(ステップS501)。判定結果提供部109は、係る情報を文字乃至図表を用いて表現するデータを生成してもよい。
判定結果提供部109は、生成したデータを、出力装置110に提供する(ステップS502)。
以下、プログラム分析システム100が、変形例として、実行ファイル調整部112を含む場合の処理について説明する。
図6は、実行ファイル調整部112の動作の具体例を表すフローチャートである。
実行ファイル調整部112は、実行ファイル111の実行コードを抽象コードに変換する(ステップS601)。実行ファイル111は、例えば、利用者から提供されるマルウェアの検体であってもよい。実行ファイル調整部112は、上記因子抽出部104、因子探索部108と同様の処理により、実行ファイル111の実行コードを抽象コードに変換してもよい。また、実行ファイル調整部112は、抽象コードを、因子コードに分解してもよい。
実行ファイル調整部112は、実行ファイル111から変換した抽象コードと、因子データベース105に登録された因子コードとを比較し、因子データベース105に登録された因子コードを部分的に用いて、元の抽象コードの長さを短縮(即ち、コードサイズを低減)可能か確認する。この際、実行ファイル調整部112は、例えば、実行ファイル111から変換した抽象コードを部分的に置き換えても、最終的な出力ベクトルに影響しないよう、抽象コードを調整可能であるか確認してもよい。
実行ファイル調整部112は、元の抽象コードのコード長を短縮可能な場合、元の抽象コードの少なくとも一部を、因子データベース105に登録された因子コードに置き換える(ステップS602)。具体的には、実行ファイル調整部112は、例えば、実行ファイル111から変換した抽象コードの少なくとも一部を、システムデータベース103に登録された検体から抽出された因子コードに置き換える。これにより、あるシステムにおける通常の(正規の)実行コードに含まれる命令を用いて、実行ファイル111に含まれる実行コードの一部を置き換えることが可能である。
ステップS602において、実行ファイル調整部112は、因子データベース105に保持している因子コードの集合に対して、抽象コードの長さが最小になるまで上記処理を繰り返してよい。
実行ファイル調整部112は、ステップS602において置換された抽象コードを、実行コードに変換し、出力ファイル113を出力してもよい(ステップS603)。実行ファイル調整部112は、例えば、上記変換情報を参照して、抽象コードを、命令列に逆変換することで実行コードを生成してもよい。実行ファイル調整部112は、例えば、実行コードに対してアセンブル、リンク等の処理を実行することで実行ファイル111を生成してもよい。
[具体例]
以下、具体例を用いて、上記のように構成されたプログラム分析システム100について説明する。本具体例の構成は、図1A及び図1Bに例示する構成と同様である。
例えば、プログラム分析システム100の利用者は、メンテナンス作業等を通じて、脆弱性データベース101、マルウェアデータベース102、及び、システムデータベース103に、検体を登録する。
また、本具体例においては、プログラム分析システム100は、命令列と抽象コードとを関連付ける変換情報(辞書データ)として、例えば、図22に例示するようなデータを保持することを想定する。因子抽出部104、因子探索部108、及び、実行ファイル調整部112は、例えば、係る変換情報を用いて、各種実行コードを、抽象コードに変換することができる。因子抽出部104は、上記各データベースに登録された検体を解析し、因子データベース105に因子コードを登録する。本具体例においては、因子データベース105に、例えば、図23に例示するような成功状態を表す情報が登録されていることを想定する。図23に例示された因子コードにおいて、”m”、”n”には適切な数値が設定されてよい。図23に例示された因子コードは、例えば、”(mov DWORD PTR[esp+n],m)”と表される実行コードから変換された数理モデルであってもよい。
プログラム分析システム100の利用者は、成功状態登録部106を用いて、システムに対する攻撃が成功した状態を表す情報を成功状態データベース107に登録する。本具体例においては、成功状態データベース107に、例えば、図24に例示するような成功状態を表す情報が登録されていることを想定する。
本具体例においては、図25Aに例示するような実行コード2501により表される実行ファイル111を検査することを想定する。例えば、保護対象であるシステムにおいて発見された未知の実行ファイル(実行ファイル111)が、脆弱性を利用する不正プログラム(マルウェア等)であるか否か検査する場合、利用者は、実行ファイル111をプログラム分析システム100に提供する。因子探索部108は、提供された実行ファイル111を抽象コードに変換する。例えば、因子探索部108は、図25Aに例示する実行コードに含まれる12行の命令を、図22に例示する変換情報等を用いて写像に変換する。係る変換の結果、例えば、図25Aに例示する実行コードの各行は、図25Bに例示する数理モデルに変換可能である。因子探索部108は、例えば、図25Bに例示する各数理モデルについて、積演算による写像の統合処理を実行する。係る処理により、図25Aに例示する実行コードは、図26Aに例示する抽象コード2601に変換可能である。因子探索部108は、例えば、図26Aに例示する抽象コードを因子コードに分解することで、図26Bに例示する因子コード2602を得ることができる。
因子探索部108は、因子データベース105を検索し、分解した因子コードに相当する因子コードが因子データベース105に登録されているか否かを確認する。本具体例においては、因子コード2602の因子コード”([esp+392])=(1)×([[esp+4]+4])”に相当する因子コードが、因子データベース105に登録されている。
因子探索部108は実行コード2501の最終動作状態(即ち、抽象コード2601の出力ベクトルのうち、最終状態にある変数)と、成功状態データベース107に登録された、成功状態を表す情報とを比較する。本具体例においては、抽象コード2601の出力ベクトルのうち、”([esp+392])”について、”([esp+392])=(1)×([[esp+4]+4])”が成立する。そして、成功状態を表すデータとして、”([esp+n])=(1)×(m)”が成功状態データベース107に登録されている(図24)。以上より、因子探索部108は、実行コード2501について、マルウェアであると判定する。
因子探索部108は、上記判定結果を判定結果提供部109に提供する。判定結果提供部109は、上記判定結果を表す情報(データ)を生成し、出力装置110に提供する。プログラム分析システム100のユーザは、出力装置110の出力(例えば、画面表示等)を介して、実行ファイル111に関する検査結果を確認する。
以下、プログラム分析システム100の変形例として、利用者が、例えばペネトレーションテストを実施する目的で、実行ファイル111(実行コード2501)を実行ファイル調整部112に提供する場合を想定する。以下においては、システムデータベース103に、図27に例示する実行コード2701が、既知の実行コードとして登録されていることを想定する。係る実行コード2701は、例えば、あるシステムにおける通常の(正規の)の処理であってよい。また、実行コード2701は、図28Aに例示するように、抽象コード2801に変換可能であること、及び、当該抽象コード2801を分解した因子コード2802(図28B)が、因子データベース105に登録されていることを想定する。
実行ファイル調整部112は、因子探索部108と同様に、実行ファイル111(実行コード2501)を解析し、抽象コード2601と、因子コード2602とを得る。
実行ファイル調整部112は、因子コード2602と、因子データベース105に登録された因子コード2802とを比較する。この場合、因子コードのうち、”eax”、”[esp−8]”の項は共通している。即ち、因子コード2802のうち、”[esp−12]”、及び”edx”の項による影響を排除できれば、実行コード2701を用いて、実行コード2501の少なくとも一部を置換可能である。これより、実行ファイル調整部112は、実行コード2501の一部を、実行コード2701の呼出しに置換することで、実行コード2501のコード長を短縮する。
具体的には、実行ファイル調整部112は、一時退避メモリ領域”X”、”Y”を用いて、実行コード2501を、図29に例示する短縮された実行コード2901に変換する。実行コード2901においては、一時退避メモリ領域”X”、”Y”を用いて、”[esp−12]”、及び”edx”の値を一時的に対比する。そして、実行コード2701を呼び出す(”call”)することで、実行コード2701に実装された処理を実行する。そののち、一時退避メモリ領域”X”、”Y”に退避した”[esp−12]”、及び”edx”の値を元に戻す。これにより、実行コード2701の実行に伴う、”[esp−12]”、及び”edx”への影響を排除可能である。また、実行コード2901は、元の実行コード2501に比べてコード長が短縮されている。即ち、実行ファイル調整部112は、実行コード2501のコード長を短縮可能である。実行ファイル調整部112は、実行コード2901を含む出力ファイル113を出力してよい。
利用者が、例えば、出力ファイル113を用いて、検査対象のシステムに対するペネトレーションテストを実施可能である。出力ファイル113に含まれる実行コード2901は、実行コード2501よりもコードサイズが短い。また、実行コード2901における処理の大部分は、実行コード2701(システムにおける通常の処理)により実行される。即ち、出力ファイル113は、システムにおいて実行される通常の(正当な)処理との区別が容易ではなく、コードサイズが小さいという特徴を有する。係る出力ファイル113を用いることで、利用者は、より高度なテストを実行することが可能であると考えられる。
上記のように構成されたプログラム分析システム100は、ある実行コードが攻撃コードであるか否かを判定可能であり、未知の攻撃コードを検出することが可能である。その理由は、以下の通りである。プログラム分析システム100は、検査される実行コードから変換された数理モデル(因子コード)と、既知の脆弱性、マルウェア及びシステム等の検体から変換された数理(因子コード)モデルとを比較する。これにより、プログラム分析システム100は、検査される実行コードに、攻撃コードに相当する因子が含まれるか確認可能である。また、プログラム分析システム100は、検査される実行コードの最終動作状態と、あるシステムに関する攻撃が成功した状態である成功状態とを比較する。これにより、プログラム分析システム100は、検査される実行コードを実行することにより、なんらかの攻撃が成功するか否かを判定可能である。即ち、プログラム分析システム100は、実行コードに攻撃の因子が含まれるか否かと、当該実行コードが実行された状態が(既知の)攻撃成功状態にあるか否かという観点から、実行コードを検査する。これにより、プログラム分析システム100は、例えば、脆弱性が未知であるか既知であるかによらず、係る脆弱性を攻撃する実行コードを検出することが可能である。以上より、プログラム分析システム100によれば、例えば、未知の脆弱性を利用する実行コードを検出することにより、ゼロデイ攻撃を抑止することが期待される。
また、プログラム分析システム100の変形例においては、例えば、持続的に活動可能な不正プログラムによる活動を検知する能力を改善することが期待される。その理由は、以下の通りである。即ち、プログラム分析システム100は、持続的活動を実施する不正プログラムは、比較的コードサイズが小さいという特性を考慮して、検査対象の不正プログラムを構成する因子コードを置き換えることで、コードのサイズを削減する。これにより、プログラム分析システム100は、コードサイズが比較的小さい不正プログラムが侵入した場合を想定した検査(テスト)に適用可能な実行コードを生成可能である。即ち、プログラム分析システム100は、コードサイズが比較的小さい不正プログラムを用いたペネトレーションテストを実施することができる。
プログラム分析システム100を上記のように構成することで、検査対象のプログラムの内容を適切に分析することが可能であり、その結果を用いて、不正プログラムによる攻撃を抑制し得る。
<第2の実施形態>
以下、本開示に係る技術の基本的な実施形態である、第2の実施形態について説明する。
図30は、本実施形態におけるプログラム分析システム3000の機能的な構成を例示するブロック図である。図30に例示するように、本実施形態におけるプログラム分析システム3000は、因子コード保持部3001(因子コード保持手段)と、成功状態保持部3002(成功状態保持手段)と、因子探索部3003(因子探索手段)と、を備える。
因子コード保持部3001は、既知の実行コードを数理モデルに変換して表したデータである、既知因子コードを保持する。因子コード保持部3001は、例えば、データベースあるいはファイルシステムにおけるファイルを用いて実現可能である。因子コード保持部3001は、上記第1の実施形態における、因子データベース105と同様に構成されてもよい。
因子コード保持部3001には、例えば、上記第1の実施形態と同様、既知の脆弱性を攻撃する攻撃コードの検体、既知のマルウェアの検体、及び、システムにおける通常の(正規の)実行コードの検体等から抽出された既知因子コードが登録されてもよい。
成功状態保持部3002は、不正プログラムによる攻撃が成功した状態を表す成功状態情報を保持する。成功状態保持部3002は、例えば、データベースあるいはファイルシステムにおけるファイルを用いて実現可能である。成功状態保持部3002は、上記第1の実施形態における、成功状態データベース107と同様に構成されてもよい。
因子探索部3003は、検査対象の実行コードを数理モデルに変換して表したデータである、分析対象抽象コードを生成する。因子探索部3003は、生成した分析対象抽象コードに、因子コード保持部3001に保持された既知因子コードが含まれるか否かを判定する処理を実行する。また、因子探索部3003は、検査対象の実行コードの実行が終了した際の状態が、成功状態保持部3002に保持された成功状態情報に含まれるか否かを判定する処理を実行する。因子探索部3003は、これの処理の結果に応じて、検査対象の実行コードが不正プログラムであるか否かを判定する。
因子探索部3003は、例えば、分析対象抽象コードに、因子コード保持部3001に保持された既知因子コードが含まれるとともに、検査対象の実行コードの実行が終了した際の状態が、成功状態保持部3002に保持された成功状態情報に含まれる場合、検査対象の実行コードが不正プログラムであると判定してもよい。
上記数理モデルは、上記第1の実施形態と同様、ある実行コードに含まれる命令を、1以上の写像と、写像に関する入力ベクトル及び出力ベクトルとを用いて表すモデルであってもよい。係る数理モデルは、上記第1の実施形態と同様、線形関数、非線形関数、外部関数のいずれかにより表されてもよい。
因子探索部3003は、検査対象の実行コードに含まれる1以上の命令列を写像に変換し、変換された1以上の写像を積演算により統合することで、分析対象抽象コードを生成してもよい。
因子探索部3003は、例えば、検査対象の実行コードに含まれる命令と、当該命令を表す写像とを関連付ける変換情報を用いて、検査対象の実行コードに含まれる1以上の命令列を、写像に変換してもよい。
因子探索部3003は、例えば、上記第1の実施形態における因子探索部108と同様の機能を実現するよう構成されてもよい。
また、本実施形態におけるプログラム分析システム3000は、変形例として、実行ファイル調整部3004を更に備えてもよい(図31)。
実行ファイル調整部3004は、例えば、検査対象の実行コードを、変換情報を用いて分析対象抽象コードに変換するとともに、その分析対象抽象コードを更に分析対象因子コードに分解することができる。
実行ファイル調整部3004は、例えば、分析対象抽象コードに含まれる分析対象因子コードの少なくとも一部を、因子コード保持部3001に保持された既知因子コードに置換することで、検査対象の実行コードのサイズを低減可能か判定してよい。実行ファイル調整部3004は、検査対象の実行コードのサイズを低減可能である場合には、分析対象抽象コードに含まれる分析対象因子コードの少なくとも一部を、因子コード保持部3001に保持された既知因子コードに置換してよい。
本開示に係るプログラム分析システム3000を上記のように構成することで、例えば、未知の不正プログラムに起因した攻撃を抑止し得る。その理由は、プログラム分析システム3000(特には因子探索部3003)は、検査対象の実行コードをから取得した分析対象因子コードと、不正プログラムに含まれる既知因子コードとを比較することで、検査対象の実行コードに攻撃の因子が含まれるか否かを判定可能だからである。また、本開示に係るプログラム分析システムは、ある検査対象の実行コードを実行した後の状態が、攻撃が成功した状態(成功状態)にあるか否かを判定可能だからである。
また、本開示に係るプログラム分析システム3000をこのように構成することで、例えば、持続的に活動可能な不正プログラムによる活動を検知する能力が改善され得る。その理由は、以下の通りである。持続的活動を実施する不正プログラムは、他の不正プログラムと比べてコードサイズが小さいという特性があると考えられる。そこでプログラム分析システム3000(特には実行ファイル調整部3004)は、検査対象の実行コードを構成する分析対象因子コードを置き換えることで、検査対象の実行コードのサイズを低減する。これにより、係るプログラム分析システム3000は、コードサイズが比較的小さい不正プログラムが侵入した場合を想定した検査(テスト)に適用可能な出力ファイルを生成可能である。即ち、係るプログラム分析システム3000により、コードサイズが比較的小さい不正プログラムを用いたペネトレーションテストを実施することができる。
本開示に係るプログラム分析システム3000を上記のように構成することで、検査対象のプログラムの内容を適切に分析することが可能であり、その結果を用いて、不正プログラムによる攻撃を抑制し得る。
上記各実施形態においては、本開示に係る技術をプログラム分析システム(100、3000)に適用した例として説明した。上記各実施形態では、例えば、プログラム分析システム(100、3000)を動作させることによって、本開示に係るプログラム分析方法を実施することができる。本開示に係るプログラム分析方法を実施する方法は上記に限定されず、プログラム分析システム(100、3000)と同様の動作あるいは処理を実行可能な他の装置(例えば、コンピュータ等の情報処理装置)を用いて、本開示に係るプログラム分析方法を実施することも可能である。
本開示に係る技術は、例えば、マルウェア分析装置、又は、コンピュータを用いてマルウェア分析装置を実現可能なプログラム等の用途に適用可能である。また、本開示に係る技術は、例えば、マルウェアの分類及び亜種のマルウェアの生成といった用途に適用可能である。
<ハードウェア及びソフトウェア・プログラム(コンピュータ・プログラム)の構成>
以下、上記説明した各実施形態を実現可能なハードウェア構成について説明する。
以下の説明においては、上記各実施形態において説明したプログラム分析システム(100、3000)をまとめて、単に「プログラム分析システム」と記載する。また、これらプログラム分析システムの各構成要素を、単に「プログラム分析システムの構成要素」と記載する場合がある。
上記各実施形態において説明したプログラム分析システムは、1つ又は複数の専用のハードウェア装置により構成されてもよい。その場合、上記各図(図1A、図1B、図30、図31)に示した各構成要素は、その一部又は全部を統合したハードウェア(処理ロジックを実装した集積回路あるいは記憶デバイス等)を用いて実現されてもよい。
プログラム分析システムが専用のハードウェアにより実現される場合、係るプログラム分析システムの構成要素は、例えば、それぞれの機能を提供可能な回路構成(circuitry)により実現されてもよい。係る回路構成は、例えば、SoC(System on a Chip)等の集積回路や、当該集積回路を用いて実現されたチップセット等を含む。この場合、プログラム分析システムの構成要素が保持するデータは、例えば、SoCとして統合されたRAM(Random Access Memory)領域やフラッシュメモリ領域、あるいは、当該SoCに接続された記憶デバイス(半導体記憶装置等)に記憶されてもよい。また、この場合、プログラム分析システムの各構成要素を接続する通信回線としては、周知の通信バス等を採用してもよい。また、各構成要素を接続する通信回線は、それぞれの構成要素間をピアツーピアで接続してもよい。
また、上述したプログラム分析システムは、図32に例示するような汎用のハードウェア装置3200と、係るハードウェア装置3200によって実行される各種ソフトウェア・プログラム(コンピュータ・プログラム)とによって構成されてもよい。この場合、プログラム分析システムは、1台以上の適切な数の汎用のハードウェア装置3200と、ソフトウェア・プログラムとの組み合わせにより構成されてもよい。
図32における演算装置3201は、汎用のCPU(中央処理装置:Central Processing Unit)やマイクロプロセッサ等の演算処理装置である。演算装置3201は、例えば後述する不揮発性記憶装置3203に記憶された各種ソフトウェア・プログラムをメモリ3202に読み出し、係るソフトウェア・プログラムに従って処理を実行してもよい。例えば、上記各実施形態におけるプログラム分析システムの構成要素の機能は、演算装置3201により実行されるソフトウェア・プログラムを用いて実現されてもよい。
演算装置3201は、例えば、複数のCPUコアを備えたマルチコアCPUであってもよい。また演算装置3201は、1つのCPUコアが複数のスレッドを実行可能な、マルチスレッドCPUであってもよい。ハードウェア装置3200は、複数の演算装置3201を備えてもよい。
メモリ3202は、演算装置3201から参照可能な、RAM等のメモリデバイスであり、ソフトウェア・プログラムや各種データ等を記憶する。なお、メモリ3202は、揮発性のメモリであってもよい。
不揮発性記憶装置3203は、例えば磁気ディスクドライブや、フラッシュメモリによる半導体記憶装置等の、不揮発性の記憶装置(ストレージデバイス)である。不揮発性記憶装置3203は、各種ソフトウェア・プログラムやデータ等を記憶可能である。例えば、プログラム分析システムの各構成要素を実現可能なプログラムは、不揮発性記憶装置3203に記憶されてもよい。
ドライブ装置3204は、例えば、後述する記録媒体3205に対するデータの読み込みや書き込みを処理する装置である。
記録媒体3205は、例えば光ディスク、光磁気ディスク、半導体フラッシュメモリ等、データを記録可能な任意の記録媒体である。例えば、プログラム分析システムの各構成要素を実現可能なプログラムは、記録媒体3205に記録されていてもよい。
ネットワークインタフェース3206は、通信ネットワークとの間の通信データの送受信を制御する装置である。ネットワークインタフェース3206は、例えば、1以上の通信ポートを備え、係る通信ポートを介して、通信ネットワークとの間で通信データを送受信してもよい。ネットワークインタフェース3206は、複数の通信ポートを備えてもよい。
図32に例示するハードウェア装置3200の構成要素は、例えば、適切な通信方法(通信バス等)を用いて、通信可能に接続されていてもよい。
上述した各実施形態を例に説明した本開示におけるプログラム分析システム、あるいはその構成要素は、例えば、図32に例示するハードウェア装置3200に対して、上記各実施形態において説明した機能を実現可能なソフトウェア・プログラムを供給することにより、実現されてもよい。
より具体的には、例えば、係るハードウェア装置3200に対して供給したソフトウェア・プログラムを、演算装置3201が実行することによって、本開示に関する技術が実現されてもよい。この場合、係るハードウェア装置3200で稼働しているオペレーティングシステムや、データベース管理ソフト、ネットワークソフト、仮想環境基盤等のミドルウェアなどが各処理の一部を実行してもよい。
上述した各実施形態において、上記各図に示した各部は、上述したハードウェアにより実行されるソフトウェア・プログラムの機能(処理)単位である、ソフトウェアモジュールとして実現することができる。ただし、これらの図面に示した各ソフトウェアモジュールの区分けは、説明の便宜上の構成であり、実装に際しては、様々な構成が想定され得る。
図1A、図1B、図30及び図31の各図に例示したプログラム分析システムの各構成要素をソフトウェアモジュールとして実現する場合、例えば、これらのソフトウェアモジュールが不揮発性記憶装置3203に記憶されてもよい。そして、演算装置3201がそれぞれの処理を実行する際に、これらのソフトウェアモジュールをメモリ3202に読み出してもよい。
また、これらのソフトウェアモジュールは、共有メモリやプロセス間通信等の適宜の方法により、相互に各種データを伝達できるように構成されてもよい。このような構成により、これらのソフトウェアモジュールは、相互に通信可能に接続される。
更に、上記ソフトウェア・プログラムは記録媒体3205に記録されてもよい。この場合、上記ソフトウェア・プログラムは、プログラム分析システムの出荷段階、あるいは運用段階等において、適宜ドライブ装置3204を通じて不揮発性記憶装置3203に格納されるよう構成されてもよい。
なお、上記の場合において、上記ハードウェア装置3200への各種ソフトウェア・プログラムの供給方法は、出荷前の製造段階、あるいは出荷後のメンテナンス段階等において、適当な治具(ツール)を利用して当該装置内にインストールする方法を採用してもよい。また、各種ソフトウェア・プログラムの供給方法は、インターネット等の通信回線を介して外部からダウンロードする方法等のように、現在では一般的な手順を採用してもよい。
そして、このような場合において、本開示に関する技術は、係るソフトウェア・プログラムを構成するコード、あるいは係るコードが記録されたところの、コンピュータ読み取り可能な記録媒体によって構成されると捉えることができる。この場合、係る記録媒体は、ハードウェア装置3200と独立した媒体に限らず、LAN(Local Area Network)やインターネットなどにより伝送されたソフトウェア・プログラムをダウンロードして記憶又は一時記憶した記録媒体を含む。
また、上述したプログラム分析システムの構成要素は、図32に例示するハードウェア装置3200を仮想化した仮想化環境と、当該仮想化環境において実行される各種ソフトウェア・プログラム(コンピュータ・プログラム)とによって構成されてもよい。この場合、図32に例示するハードウェア装置3200の構成要素は、当該仮想化環境における仮想デバイスとして提供される。なお、この場合も、図32に例示するハードウェア装置3200を物理的な装置として構成した場合と同様の構成にて、本開示に関する技術を実現可能である。
以上、本開示に関する技術を、上述した模範的な実施形態に適用した例として説明した。しかしながら、本開示の技術的範囲は、上述した各実施形態に記載した範囲には限定されない。当業者には、係る実施形態に対して多様な変更又は改良を加えることが可能であることは明らかである。そのような場合、係る変更又は改良を加えた新たな実施形態も、本開示の技術的範囲に含まれ得る。上述した各実施形態を組み合わせた実施形態も本開示の技術的範囲に含まれる。更に、上述した各実施形態と、上述した各実施形態に変更又は改良を加えた新たな実施形態とを組み合わせた実施形態も、本開示の技術的範囲に含まれ得る。そしてこのことは、請求の範囲に記載した事項から明らかである。
なお、上述した実施形態及びその変形例の一部又は全部は、以下の付記のようにも記載されうる。しかしながら、上述した実施形態及びその変形例により例示的に説明した本開示に係る技術は、以下には限られない。
(付記1)
既知の実行コードを数理モデルに変換して表したデータである、既知因子コードを保持する因子コード保持手段と、
不正プログラムによる攻撃が成功した状態を表す成功状態情報を保持する成功状態保持手段と、
検査対象の実行コードを上記数理モデルに変換して表したデータである、分析対象抽象コードを生成し、上記分析対象抽象コードに、上記因子コード保持手段に保持された上記既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する因子探索手段と、を備える
プログラム分析システム。
(付記2)
上記因子探索手段は、上記分析対象抽象コードに、上記因子コード保持手段に保持された上記既知因子コードが含まれるとともに、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれる場合、上記検査対象の実行コードが不正プログラムであると判定する
付記1に記載のプログラム分析システム。
(付記3)
上記因子探索手段は、上記因子コード保持手段に保持された上記既知因子コードが、上記分析対象抽象コードに含まれないと判定した場合には、
上記分析対象抽象コードを、互いに素な因子コードである分析対象因子コードに更に分解し、
分解された上記分析対象因子コードの少なくとも一部を並べ替えることで、並べ替える前の上記分析対象抽象コードと同等の実行結果が得られる場合には、上記分析対象因子コードの少なくとも一部を並べ替えた後の上記分析対象抽象コードに、上記既知因子コードが含まれるか否かを判定する処理を更に実行し、
上記分析対象因子コードの少なくとも一部を並べ替えた後の上記分析対象抽象コードに、上記既知因子コードが含まれるとともに、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれる場合、上記検査対象の実行コードが不正プログラムであると判定する
付記2に記載のプログラム分析システム。
(付記4)
上記数理モデルは、ある実行コードに含まれる命令を、1以上の写像と、上記写像に関する入力ベクトル及び出力ベクトルとを用いて表すモデルであり、
上記因子探索手段は、上記検査対象の実行コードに含まれる1以上の命令列を上記写像に変換し、変換された1以上の上記写像を積演算により統合することで、上記分析対象抽象コードを生成する
付記1乃至付記3のいずれかに記載のプログラム分析システム。
(付記5)
上記数理モデルにおける上記入力ベクトル及び上記出力ベクトルの要素は、上記検査対象の実行コードが実行される情報処理装置を構成する演算装置に実装されたレジスタの内容を表す情報と、上記検査対象の実行コードが実行される上記情報処理装置を構成するメモリの特定のアドレスの内容を表す情報と、を少なくとも含む、上記検査対象の実行コードが実行される上記情報処理装置の状態を表す情報であり、
上記因子探索手段は、上記検査対象の実行コードの実行が終了した際の状態を表す上記出力ベクトルの要素が、上記成功状態保持手段に保持された上記成功状態情報に含まれるか否かを判定する
付記4に記載のプログラム分析システム。
(付記6)
上記因子探索手段は、実行コードに含まれる命令と、当該命令を表す上記数理モデルである上記写像とを関連付ける変換情報を用いて、上記検査対象の実行コードに含まれる1以上の命令列を上記写像に変換する
付記4又は付記5に記載のプログラム分析システム。
(付記7)
脆弱性を利用した攻撃を実行する実行コードの検体を保持する脆弱性データ保持手段と、
既知の不正プログラムの検体を保持する不正プログラムデータ保持手段と、
上記脆弱性データ保持手段に保持された検体と、不正プログラムデータ保持部に保持された検体と、の少なくともいずれかの実行コードを、上記変換情報を用いて上記数理モデルに変換して表したデータである既知抽象コードを生成し、上記既知抽象コードから分解された上記既知因子コードを上記因子コード保持手段に提供する因子抽出手段と、を更に備え、
上記因子探索手段は、上記分析対象抽象コードに、上記脆弱性データ保持手段に保持された検体から取得された上記既知因子コードと、上記不正プログラムデータ保持部に保持された検体から取得された上記既知因子コードと、の少なくとも何れかが含まれるとともに、上記検査対象の実行コードの実行が終了した際の状態が、上記成功状態保持手段に保持された上記成功状態情報に含まれる場合、上記検査対象の実行コードが不正プログラムであると判定する
付記6に記載のプログラム分析システム。
(付記8)
正常に稼働しているシステムにおいて実行される実行コードの検体を保持するシステムデータ保持手段と、
上記システムデータ保持手段に保持された検体の実行コードを、上記変換情報を用いて上記数理モデルに変換して表したデータである既知抽象コードを生成し、上記既知抽象コードから分解された上記既知因子コードを上記因子コード保持手段に提供する因子抽出手段と、
上記検査対象の実行コードを、上記変換情報を用いて上記分析対象抽象コードに変換するとともに、
上記分析対象抽象コードの少なくとも一部を、上記システムデータ保持手段に保持された検体の実行コードから取得した上記既知因子コードに置換することで、元の上記検査対象の実行コードよりもコードサイズが低減された実行コードを生成する実行ファイル調整手段と、を更に備える
付記6に記載のプログラム分析システム。
(付記9)
上記写像が、単一の変換行列を有する線形関数により表される場合、
上記因子探索手段は、上記実行コードに含まれる複数の上記命令列から変換されたそれぞれの上記写像に含まれる上記変換行列の積を演算することにより、上記実行コードに含まれる複数の上記命令列から変換された上記写像を統合する
付記4乃至付記8のいずれかに記載のプログラム分析システム。
(付記10)
検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成し、
上記分析対象抽象コードに、既知の実行コードを上記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する
プログラム分析方法。
(付記11)
検査対象の実行コードを数理モデルに変換して表したデータである分析対象抽象コードを生成する処理と、
上記分析対象抽象コードに、既知の実行コードを上記数理モデルに変換して表したデータである既知因子コードが含まれるか否かを判定する処理と、上記検査対象の実行コードの実行が終了した際の状態が、不正プログラムによる攻撃が成功した状態を表す成功状態情報に含まれるか否かを判定する処理と、を少なくとも実行することにより、上記検査対象の実行コードが不正プログラムであるか否かを判定する処理と、をコンピュータに実行させる
コンピュータ・プログラム。
(付記12)
攻撃の成功状態を入力する入力手段と、上記成功状態を記憶する手段と、既知の脆弱性の実行コードを記憶する記憶手段と、上記既知の脆弱性の実行コードから、実行コードの少なくとも一部を表すことが可能なデータである因子を抽出する手段と、既知のマルウェアの実行コードを記憶する記憶手段と、上記既知のマルウェアの実行コードに含まれる上記因子を抽出する手段と、上記因子を記憶する記憶手段と、任意の実行コードから上記因子を探索する探索手段と、1以上の上記因子が他の上記因子の部分集合によって同等の動作を保ちつつ表現され得るかを判定する判定手段と、上記因子を他の上記因子の部分集合によって置換した場合の最終的な動作状態が上記成功状態に存在するかを判定する判定手段と、上記判定の結果を表示する表示手段と、を備えるマルウェア対策システム。
(付記13)
既知のシステムを記憶する記憶手段と、上記既知のシステムの実行コードから上記因子を抽出する手段と、抽出した上記因子を他の上記因子の部分集合へ置換することにより、上記既知のシステムの実行コードを最小化する手段と、上記最小化された実行コードを出力する手段と、を更に備える、付記12に記載のマルウェア対策システム。
この出願は、2016年4月26日に出願された日本出願特願2016−088278を基礎とする優先権を主張し、その開示の全てをここに取り込む。