IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 日本電信電話株式会社の特許一覧

特許7568130解析機能付与方法、解析機能付与装置及び解析機能付与プログラム
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-10-07
(45)【発行日】2024-10-16
(54)【発明の名称】解析機能付与方法、解析機能付与装置及び解析機能付与プログラム
(51)【国際特許分類】
   G06F 21/56 20130101AFI20241008BHJP
【FI】
G06F21/56 360
【請求項の数】 7
(21)【出願番号】P 2023553919
(86)(22)【出願日】2021-10-18
(86)【国際出願番号】 JP2021038501
(87)【国際公開番号】W WO2023067667
(87)【国際公開日】2023-04-27
【審査請求日】2024-04-04
(73)【特許権者】
【識別番号】000004226
【氏名又は名称】日本電信電話株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】碓井 利宣
(72)【発明者】
【氏名】幾世 知範
(72)【発明者】
【氏名】川古谷 裕平
(72)【発明者】
【氏名】岩村 誠
【審査官】平井 誠
(56)【参考文献】
【文献】国際公開第2021/070393(WO,A1)
【文献】国際公開第2020/075335(WO,A1)
【文献】欧州特許出願公開第3543883(EP,A1)
【文献】KOLBITSCH, Clemens et al.,The power of procrastination: detection and mitigation of execution-stalling malicious code,CCS '11,2011年10月17日,pages 285-296
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/56
(57)【特許請求の範囲】
【請求項1】
解析機能付与装置が実行する解析機能付与方法であって、
スクリプトエンジンの仮想機械を解析し、次に実行される前記仮想機械の命令を指し示す変数である仮想プログラムカウンタ、及び実行状態の条件分岐時に分岐がなされるか否かのフラグを保持する領域である条件分岐フラグを取得する第1の解析工程と、
前記第1の解析工程における解析によって得られたアーキテクチャ情報である、前記仮想プログラムカウンタ及び前記条件分岐フラグに基づいて、前記スクリプトエンジンに、繰り返し実行された回数が閾値以上である命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含むフックを施して解析機能を付与する付与工程と、
を含んだことを特徴とする解析機能付与方法。
【請求項2】
前記付与工程は、2回以上繰り返して実行された同一のVPCの並びを前記命令列として検出する処理を含むフックを施して解析機能を付与することを特徴とする請求項1に記載の解析機能付与方法。
【請求項3】
解析機能付与装置が実行する解析機能付与方法であって、
スクリプトエンジンの仮想機械を解析し、次に実行される前記仮想機械の命令を指し示す変数である仮想プログラムカウンタを取得する第1の解析工程と、
前記仮想機械の命令の体系である命令セットアーキテクチャを解析して、分岐を発生させる仮想機械命令である分岐仮想機械命令を取得する第2の解析工程と、
前記第1の解析工程における解析によって得られたアーキテクチャ情報である前記仮想プログラムカウンタに基づいて、前記スクリプトエンジンに、分岐仮想機械命令の実行前後の前記仮想プログラムカウンタを対応付けた仮想機械ブランチトレースを構築し、繰り返しの態様が所定の条件を満たす命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含むフックを施して解析機能を付与する付与工程と、
を含んだことを特徴とする解析機能付与方法。
【請求項4】
前記第1の解析工程は、テスト用のスクリプトを用いた解析を実施することを特徴とする請求項1から3のいずれか1項に記載の解析機能付与方法。
【請求項5】
スクリプトエンジンの仮想機械を解析し、次に実行される前記仮想機械の命令を指し示す変数である仮想プログラムカウンタ、及び実行状態の条件分岐時に分岐がなされるか否かのフラグを保持する領域である条件分岐フラグを取得する第1の解析部と、
前記第1の解析部による解析によって得られたアーキテクチャ情報である、前記仮想プログラムカウンタ及び前記条件分岐フラグに基づいて、前記スクリプトエンジンに、繰り返し実行された回数が閾値以上である命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含むフックを施して解析機能を付与する付与部と、
を有することを特徴とする解析機能付与装置。
【請求項6】
スクリプトエンジンの仮想機械を解析し、次に実行される前記仮想機械の命令を指し示す変数である仮想プログラムカウンタを取得する第1の解析部と、
前記仮想機械の命令の体系である命令セットアーキテクチャを解析して、分岐を発生させる仮想機械命令である分岐仮想機械命令を取得する第2の解析部と、
前記第1の解析部による解析によって得られたアーキテクチャ情報である前記仮想プログラムカウンタに基づいて、前記スクリプトエンジンに、分岐仮想機械命令の実行前後の前記仮想プログラムカウンタを対応付けた仮想機械ブランチトレースを構築し、繰り返しの態様が所定の条件を満たす命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含むフックを施して解析機能を付与する付与部と、
を有することを特徴とする解析機能付与装置。
【請求項7】
コンピュータを、請求項5又は6に記載の解析機能付与装置として機能させるための解析機能付与プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、解析機能付与方法、解析機能付与装置及び解析機能付与プログラムに関する。
【背景技術】
【0002】
マルウェアを用いたスパム(マルスパム)やファイルレスマルウェアなどの多様な攻撃の形態が生じるにともなって、悪性な挙動を示すスクリプト(悪性スクリプト)による攻撃の脅威が顕在化している。
【0003】
悪性スクリプトとは、悪意のある挙動を持ったスクリプトであり、スクリプトエンジンの提供する機能を悪用して攻撃を実現するプログラムである。一般に、オペレーティングシステム(Operating System:OS)がデフォルトで有するスクリプトエンジンや、Webブラウザや文書ファイルのビューアなど、特定のアプリケーションが有するスクリプトエンジンを用いて攻撃が実施される。
【0004】
こうしたスクリプトエンジンの多くは、ユーザの許可が必要な場合もあるものの、ファイル操作やネットワーク通信、プロセスの起動など、システムを介した挙動も実現可能である。したがって、悪性スクリプトを用いた攻撃は、実行ファイルのマルウェアを用いた攻撃と同様に、ユーザに対しての脅威となる。
【0005】
この悪性スクリプトによる攻撃に対策を講じるためには、スクリプトの持つ挙動を正確に把握する必要がある。したがって、スクリプトを解析することで、その挙動を明らかにする技術が希求される。
【0006】
悪性スクリプトを解析する際に生じる問題として、コードの難読化がある。悪性スクリプトの多くは、難読化と呼ばれる、解析を妨害する処理が施されている。難読化は、故意にコードの複雑さを高めることで、コードの表層的な情報に基づく解析を困難にする。すなわち、スクリプトを実行せずに、コードから得られる情報で解析する、静的解析と呼ばれる解析方法を妨害する。
【0007】
特に、実行するコードの一部を外部から動的に取得する場合は、そのコードは実行しなければ得られないため、静的には解析できない。したがって、静的解析はその原理上、不可能となる。
【0008】
一方で、スクリプトを実行し、その振る舞いを監視することで挙動を知る動的解析と呼ばれる手法は、前述のような難読化の影響を受けない。このため、悪性スクリプトの解析においては、動的解析に基づく手法が主に用いられている。
【0009】
一般的な動的解析では、解析環境で悪性スクリプトを実行し、その挙動を監視することにより、悪性スクリプト中で実行された単一の実行経路の挙動のみが得られる。このため、解析環境で実行されなかった経路の挙動は得ることができないという問題がある。
【0010】
言い換えると、特定の条件下でしか実行されない経路を有する悪性スクリプトについては、動的解析によっても、全ての挙動を解析しきれないという問題がある。
【0011】
特定の条件下でしか実行されない経路がある場合として、例えば、指令サーバからの指令によってその先の実行経路が決まる場合や、解析妨害によって解析環境では悪性な挙動を示さないようになっている場合がある。
【0012】
前者は、指令サーバからの指令がなければ、その先の実行経路が決定されず、悪性な挙動を持った経路が実行されない場合である。悪性スクリプトを検出して解析する際には、既に攻撃者が撤退して指令サーバがなくなっている場合も少なくないため、そのような場合には、悪性な挙動を観測できない。
【0013】
後者は、悪性スクリプトが、自身が実行されている環境の情報を取得し、それが特定の条件を満たしていなければ、悪性な挙動を示さないという解析妨害である。例えば、解析環境に高頻度に見られる特徴が見られた場合には、自分が解析されていると判断して、実行を中断するという解析妨害に用いられる。
【0014】
図37は、解析妨害の一例を示すコード片を示す図である。このコード片は、実行されている環境のCPU(Central Processing Unit)のコア数を取得し、それが2以上かつ8以下でなければ、解析環境の可能性が高いと判断して、実行を終了するという解析妨害を持つ。さもなければ、解析環境ではないと判断して、悪性な挙動を示す。
【0015】
このような特定の条件下でしか実行されない経路の挙動を捉えるためには、複数の実行経路を実行するマルチパス実行が必要となる。
【0016】
マルチパス実行では、実行が条件分岐に到達した際に、実行状態を分岐させ、分岐した各々の実行状態が、分岐のそれぞれの実行経路を辿るようにする。これにより、条件分岐で発生する二つの実行経路の両方を実行する。
【0017】
マルチパス実行の実現について、例えば、非特許文献1には、JavaScript(登録商標)に対して、マルチパス実行の一種であるシンボリック実行を実現する手法が記載されている。この手法によれば、JavaScriptのスクリプトの条件分岐において、実行可能な経路を網羅的に辿り、挙動を観測できる。
【0018】
また、非特許文献2には、JavaScriptに対して、マルチパス実行の一種である経路強制実行を実現する手法が記載されている。この手法によれば、JavaScriptのスクリプトの条件分岐において、全ての経路を網羅的に辿り、挙動を観測できる。
【0019】
非特許文献3には、スクリプトエンジンに予め手動で改造を施した上で、そのスクリプトエンジンをバイナリ向けのシンボリック実行基盤の上で実行することで、スクリプトエンジン上で実行されているスクリプトに対して、スクリプトエンジン越しにシンボリック実行を実現する手法が記載されている。この手法によれば、手動で改造を施せるスクリプトエンジンがあれば、どのようなスクリプト言語でも汎用的にシンボリック実行を実現し、実行可能な経路を網羅的に辿って、挙動を観測できる。
【0020】
そして、非特許文献4には、マルウェアが自身のプログラムの難読化にしばしば用いる仮想機械(Virtual Machine:VM)を解析する手法が記載されている。この手法によれば、VMを解析することで、そのアーキテクチャの情報を取得できる。スクリプトエンジンにおいてスクリプトの実行を司るのはVMであるため、この手法の考え方を一部転用できる。
【0021】
非特許文献5には、スクリプトエンジンを解析し、得られたアーキテクチャの情報に基づいて、マルチパス実行機能を実現するコードを追加することにより、スクリプトのマルチパス実行を可能にしている。この手法によれば、多様なスクリプトの言語やエンジンに対して、マルチパス実行を実現できる。
【先行技術文献】
【非特許文献】
【0022】
【文献】Prateek Saxena, et al, “A Symbolic Execution Framework for JavaScript”, 2010 IEEE Symposium on Security and Privacy.
【文献】Kyungtae Kim, et al, “J-Force: Forced Execution on JavaScript”.
【文献】Stefan Bucur, et al, “Prototyping Symbolic Execution Engines for Interpreted Languages”.
【文献】Monirul Sharif, et al, “Automatic Reverse Engineering of Malware Emulators”, 2009 30th IEEE Symposium on Security and Privacy.
【文献】碓井利宣, 古川和祈, 大月勇人, 幾世知範, 川古谷裕平, 岩村誠, 三好潤, 松浦幹太, “スクリプト実行環境に対するマルチパス実行機能の自動付与手法”, 2019年コンピュータセキュリティシンポジウム (CSS2019), pp.961-968, 2019.
【文献】Clemens Kolbitsch et al., “The Power of Procrastination: Detection and Mitigation of Execution-Stalling Malicious Code”, 2011 18th ACM conference on Computer and Communications Security
【発明の概要】
【発明が解決しようとする課題】
【0023】
ここで、攻撃者が意図的に実行に時間を要する長大なループを含むコードを用いることで、解析の実行を遅延させて、解析を妨害する場合がある。このようなコードは、ストーリングコード(Stalling Code)と呼ばれ、不要な命令の繰り返しによって実行に遅延を引き起こすものである。一般的な動的マルウェア解析サンドボックスは、規定の時間内に観測された挙動のみを解析するため、こうした実行の遅延によって、本来解析するべき挙動に至らずに解析が終了してしまう。そのため、ストーリングコードのループ(ストーリングループ)が存在する場合であっても、解析の実行を継続することができる技術が要望されている。
【0024】
また、経路強制実行によるマルチパス実行では、実行経路を強制することによって、通常の実行では発生し得ない無限ループが発生し、実行が停止する場合が見受けられる。無限ループが発生すると解析の実行が停止するため、無限ループが発生した場合であっても、解析の実行を継続することができる技術が要望されている。
【0025】
ここで、長大なループを一定回数以上続くループとみなせば、無限ループは長大なループの一例であるということができる。このため、ここでは長大なループは、ストーリングループ及び無限ループの両方を含む概念であるものとする。例えば、以降の説明における「無限ループ」は、「長大なループ」又は「ストーリングループ」に適宜置き換えられてもよい。
【0026】
本発明は、上記に鑑みてなされたものであって、スクリプトエンジンに対して、長大なループによる実行の遅延又は停止を抑制した実行機能の付与を実現できる解析機能付与方法、解析機能付与装置及び解析機能付与プログラムを提供することを目的とする。
【課題を解決するための手段】
【0027】
上述した課題を解決し、目的を達成するために、本発明の解析機能付与方法は、解析機能付与装置が実行する解析機能付与方法であって、スクリプトエンジンの仮想機械を解析し、及び、次に実行される仮想機械の命令を指し示す変数である仮想プログラムカウンタを取得する第1の解析工程と、仮想機械の命令の体系である命令セットアーキテクチャを解析して、分岐を発生させる仮想機械命令である分岐仮想機械命令を取得する第2の解析工程と、第1の解析工程及び第2の解析工程における解析によって得られたアーキテクチャ情報である、仮想プログラムカウンタ及び分岐仮想機械命令に基づいて、スクリプトエンジンに、繰り返し実行された回数が閾値以上である命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含むフックを施して解析機能を付与する付与工程と、を含んだことを特徴とする。
【発明の効果】
【0028】
本発明によれば、スクリプトエンジンに対して、長大なループによる実行の遅延又は停止を抑制した実行機能の付与を実現できる。
【図面の簡単な説明】
【0029】
図1図1は、例外ハンドラの一例を説明する図である。
図2図2は、スクリプトAPIのフックを用いたハイパーバイザコールの一例を示す図である。
図3図3は、実施の形態に係る解析機能付与装置の構成の一例を説明する図である。
図4図4は、仮想プログラムカウンタ(VPC)の検出に用いるテストスクリプトの一例を示す図である。
図5図5は、分岐VM命令検出に用いるテストスクリプトの一例を示す図である。
図6図6は、実行トレースの一例を示す図である。
図7図7は、VM実行トレースの一例を示す図である。
図8図8は、VM命令境界検出部の処理を説明する図である。
図9図9は、仮想プログラムカウンタ検出部の処理を説明する図である。
図10図10は、ディスパッチャ検出部の処理を説明する図である。
図11図11は、分岐VM命令検出部の処理を説明する図である。
図12図12は、無限ループ検出処理を説明する図である。
図13図13は、無限ループ検出処理を説明する図である。
図14図14は、無限ループ検出処理を説明する図である。
図15図15は、無限ループスキップ処理を説明する図である。
図16図16は、無限ループスキップ処理を説明する図である。
図17図17は、VMブランチトレース構築処理を説明する図である。
図18図18は、制御フローグラフ構築処理を説明する図である。
図19図19は、実施の形態に係る解析機能付与処理の処理手順を示すフローチャートである。
図20図20は、実施の形態に係る解析機能付与処理の処理手順を示すフローチャートである。
図21図21は、図19及び図20に示す実行トレース取得処理の処理手順を示すフローチャートである。
図22図22は、図19及び図20に示すフック・タップポイント検出処理の処理手順を示すフローチャートである。
図23図23は、図20に示すVM命令境界検出処理の処理手順を示すフローチャートである。
図24図24は、図19及び図20に示す仮想プログラムカウンタ検出処理の処理手順を示すフローチャートである。
図25図25は、図19に示す条件分岐フラグ検出処理の処理手順を示すフローチャートである。
図26図26は、図20に示すディスパッチャ検出処理の処理手順を示すフローチャートである。
図27図27は、図20に示すVM実行トレース取得処理の処理手順を示すフローチャートである。
図28図28は、図20に示す分岐VM命令検出処理の処理手順を示すフローチャートである。
図29図29は、図19に示すフック挿入処理の処理手順を示すフローチャートである。
図30図30は、無限ループ検出処理の処理手順を示すフローチャートである。
図31図31は、無限ループスキップ処理の処理手順を示すフローチャートである。
図32図32は、図20に示すフック挿入処理の処理手順を示すフローチャートである。
図33図33は、VMブランチトレース構築処理の処理手順を示すフローチャートである。
図34図34は、制御フローグラフ構築処理の処理手順を示すフローチャートである。
図35図35は、例外ハンドラ挿入処理の処理手順を示すフローチャートである。
図36図36は、プログラムが実行されることにより、解析機能付与装置が実現されるコンピュータの一例を示す図である。
図37図37は、解析妨害の一例を示すコード片を示す図である。
【発明を実施するための形態】
【0030】
以下に、本願に係る解析機能付与方法、解析機能付与装置及び解析機能付与プログラムの実施形態を図面に基づいて詳細に説明する。また、本発明は、以下に説明する実施形態により限定されるものではない。
【0031】
[実施の形態]
実施の形態に係る解析機能付与装置は、スクリプトエンジンに適用できる解析機能付与装置である。
【0032】
本実施の形態に係る解析機能付与装置は、スクリプトエンジンのバイナリを監視しながらテストスクリプトを実行して、ブランチトレースとメモリアクセストレースとを実行トレースとして取得する。
【0033】
そして、解析機能付与装置は、この実行トレースに基づいて仮想機械を解析し、フックポイント、タップポイント、次に実行されるVM命令を指し示す変数である仮想プログラムカウンタ(VPC)、VM命令の境界、ディスパッチャ、条件分岐フラグのアーキテクチャ情報を取得する。なお、これらはいずれも、スクリプトエンジンの構成要素であり、アーキテクチャに関する情報であって、アーキテクチャ情報DB132(後述)に格納される。
【0034】
さらに、解析機能付与装置は、テストスクリプトを実行してVM実行トレースを取得し、このVM実行トレースを用いてVPCの変化量(オフセット)を検出する。これによって、解析機能付与装置は、VPCの変化量を、アーキテクチャ情報として取得する。
【0035】
そして、解析機能付与装置は、取得したアーキテクチャ情報を基に、スクリプトエンジンのフックポイントを基にフックハンドラを用いたフックを挿入する。さらに、解析機能付与装置は、解析対象のスクリプトに、例外ハンドラを挿入し、例外処理機能を付与する。
【0036】
図1は、例外ハンドラの一例を説明する図である。図2は、スクリプトAPIのフックを用いたハイパーバイザコールの一例を示す図である。解析機能付与装置は、図1に示すように、解析対象のスクリプトのエントリーポイントに対し、E1~E3の枠部分の内容を実行前に静的に追加する(図1の(1),(2))。
【0037】
具体的には、解析機能付与装置は、図1に示すように、解析対象のスクリプトのエントリーポイントに対し、「try」及び「catch」のコードを追加し(枠E1,E2)、枠E3の3行目のように、例外が発生した場合には、スクリプトAPIをフックする「hooked_script_API(e)」コードを追加する。これによって、例外時には、スクリプトAPIをフックしハイパーバイザコールとして利用して例外のスキップを行う(図1の(3))。すなわち、解析機能付与装置は、図2に示すように、スクリプトAPIのフックによってハイパーバイザコール相当を実現する(図2の(1))ことで、例外が発生した命令、関数、基本ブロック等のスキップを行う。
【0038】
このように、解析機能付与装置は、例外を捕捉し、解析対象のスクリプトに例外ハンドラを挿入することで、例外の発生した箇所の先に強制的に実行を進めさせることで、意図しない実行の停止を防ぎつつ、解析を継続する。
【0039】
さらに、解析機能付与装置は、取得したアーキテクチャ情報を基に、スクリプトエンジンのフックポイントを基にフックハンドラを用いたフックを挿入する。フックハンドラには、繰り返し実行された回数が閾値以上である命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させることで、無限ループの発生した命令列をスキップする機能が追加される。これによって、解析機能付与装置は、無限ループが発生した場合にはVM領域に処理を移行し、フックハンドラにおいて指示された、無限ループが発生した命令列のスキップを行うことで、実行の遅延又は停止を抑制する。
【0040】
[解析機能付与装置の構成]
図3を参照して、実施の形態に係る解析機能付与装置10の構成について具体的に説明する。図3は、実施の形態に係る解析機能付与装置の構成の一例を説明する図である。
【0041】
図3に示すように、解析機能付与装置10は、入力部11、制御部12、記憶部13、出力部14を有する。そして、解析機能付与装置10は、テストスクリプト、スクリプトエンジンバイナリ及び解析対象スクリプトの入力を受け付ける。
【0042】
入力部11は、キーボードやマウス等の入力デバイスで構成され、外部からの情報の入力を受け付け、制御部12に入力する。また、入力部11は、有線接続、或いは、ネットワーク等を介して接続された他の装置との間で、各種情報を送受信する通信インタフェースを有し、他の装置から送信された情報の入力を受け付ける。入力部11は、テストスクリプト、スクリプトエンジンバイナリ及び解析対象スクリプトの入力を受け付け、制御部12に出力する。テストスクリプトは、スクリプトエンジンを動的解析して実行トレース及びVM実行トレースを取得する際に、入力されるスクリプトである。なお、テストスクリプトの詳細は後述する。スクリプトエンジンバイナリは、スクリプトエンジンを構成する実行可能ファイルである。スクリプトエンジンバイナリは、複数の実行可能ファイルによって構成される場合がある。解析対象スクリプトは、解析対象のスクリプトである。
【0043】
制御部12は、各種の処理手順などを規定したプログラム及び所要データを格納するための内部メモリを有し、これらによって種々の処理を実行する。例えば、制御部12は、CPU(Central Processing Unit)やMPU(Micro Processing Unit)などの電子回路である。制御部12は、仮想機械解析部121(第1の解析部)、命令セットアーキテクチャ解析部122及び解析機能付与部123(付与部)を有する。
【0044】
仮想機械解析部121は、スクリプトエンジンのVMを解析する。仮想機械解析部121は、実行時の条件を変えて複数の実行トレースを取得し、差分実行解析を用いて複数の実行トレースを解析し、フックポイント、タップポイント、VPCを取得する。また、仮想機械解析部121は、スクリプトエンジンバイナリを静的解析して、VM命令の境界およびディスパッチャを取得する。仮想機械解析部121は、実行トレース取得部1211、フックポイント・タップポイント検出部1212、VM命令境界検出部1213、仮想プログラムカウンタ検出部1214、ディスパッチャ検出部1215、条件分岐フラグ検出部1216を有する。
【0045】
実行トレース取得部1211は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け付ける。実行トレース取得部1211は、スクリプトエンジンバイナリの実行を監視しながら、テストスクリプトを実行することで、実行トレースを取得する。
【0046】
実行トレースは、ブランチトレースとメモリアクセストレースとによって構成される。ブランチトレースは、実行の際の分岐命令の種類と、分岐元アドレスと分岐先アドレスを記録する。メモリアクセストレースは、メモリ操作の種類と、操作対象のメモリアドレスを記録する。ブランチトレース及びメモリアクセストレースは、命令フックによって取得可能であることが知られている。実行トレース取得部1211が取得した実行トレースは、実行トレースDB131に格納される。
【0047】
フックポイント・タップポイント検出部1212は、実行トレース取得部1211によって取得された実行トレースに基づいて仮想機械を解析し、フックポイント、タップポイントを検出する。ここで、フックポイントとは、フックを施して解析用コードを挿入する箇所である。実施の形態においては、スクリプトエンジンの内部実装が持つ関数(内部関数と呼ぶ)を単位とし、フックはこの内部関数の先頭に施されるものとする。また、タップポイントとは、解析用コードによってログ出力するメモリ監視箇所であり、内部関数の引数のいずれかであるとする。
【0048】
フックポイント・タップポイント検出部1212は、実行トレースDB131に格納された実行トレースを取り出して解析し、フックポイントの候補を発見する。フックポイント・タップポイント検出部1212は、実行トレースに対して、解析対象に関連したシステムAPIの呼び出しを探索し、そこからのバックトレースによってフックポイント候補を検出する。フックポイント・タップポイント検出部1212は、解析対象の言語要素に対応したシステムAPIからのバックトレースを適用してフックポイントを検出する。
【0049】
フックポイント・タップポイント検出部1212は、取得条件の異なる複数の実行トレースの差分を抽出し、特定の条件を満たす部分を発見することでフックポイント候補を検出する。フックポイント・タップポイント検出部1212は、複数の条件を変えた実行トレースの間に見られる差分に基づいてフックポイントを検出する。この際、フックポイント・タップポイント検出部1212は、相同性の高い系列が特定の回数出現することを検出するアルゴリズム(例えば、Smith-Watermanアルゴリズム)を用いてフックポイントを検出する。
【0050】
フックポイント・タップポイント検出部1212は、得られたフックポイント候補にフックを施し、そのフックが施された関数の引数のメモリを探索することで、タップポイントを検出する。フックポイント・タップポイント検出部1212は、フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出する。また、フックポイント・タップポイント検出部1212は、タップポイントを持ったフックポイント候補を、フックポイントとして確定する。なお、フックポイント・タップポイント検出部1212の処理の詳細は、国際公開第2020/075335号を参照されたい。
【0051】
VM命令境界検出部1213は、実行トレースをクラスタリングして、各VM命令の境界を検出する。VM命令境界検出部1213は、実行トレースをクラスタリングして、実行回数が閾値以上のクラスタをVM命令として検出する。クラスタリングでは、複数回実行される連続したコード領域を検出する。これには、例えば、実行された命令間のコード上の距離が近いものをまとめてもよいし、実行されたコードブロックの共通部分列を探してもよいし、他の方法によってもよい。解析機能付与装置10は、検出したVM命令を構成する連続した命令列の開始点と終了点とを境界として検出する。ここで検出したVM命令の境界は、VPC検出、ディスパッチャ検出において用いられる。
【0052】
仮想プログラムカウンタ検出部1214は、実行トレースDB131に格納された第1のテストスクリプトに対する実行トレースを取り出して解析し、VPCを検出する。仮想プログラムカウンタ検出部1214は、メモリの読み込み回数に着目した差分実行解析を用いて複数の実行トレースを解析し、VPCを検出する。仮想プログラムカウンタ検出部1214は、各VM命令の実行後には、必ずVPCを保持するメモリへの読み込みが発生することを利用し、この読み込み先を発見することで、VPCを検出する。
【0053】
このため、仮想プログラムカウンタ検出部1214は、VPCの検出として、メモリの読み込み回数に着目した差分実行解析を用いる。仮想プログラムカウンタ検出部1214は、テストスクリプトを用いて取得された複数のテストスクリプトの実行トレースを比較し、メモリ読み込み回数が、繰り返される回数及び繰り返される文の数との双方の増減に比例して変化するメモリを発見する。そして、仮想プログラムカウンタ検出部1214は、各VM命令の境界を参照して、読み込んだメモリの値が常にVM命令の開始点を指しているものに絞り込む。仮想プログラムカウンタ検出部1214は、このメモリをVPCとして検出する。
【0054】
ディスパッチャ検出部1215は、VM命令境界検出部1213が検出したVM命令の境界を基に、スクリプトエンジンバイナリから各VM命令部分を切り出し、各VM命令間で類似度が高い部分をディスパッチャとして検出する。前提として、ディスパッチャは、ポインタキャッシュの参照と次のVM命令ハンドラのポインタへのジャンプで実現される。ディスパッチャは、各々のVM命令ハンドラの後部に分散的に配置されており、一般にそれらのコードの同一性は高い。こうしたVM命令ハンドラの後部に存在し、同一性の高いコードを探すことで、解析機能付与装置は、所定の方法でディスパッチャを検出する。類似度の高い部分の検出には、たとえば系列アライメントアルゴリズムを用いてもよく、その他の方法によってもよい。
【0055】
条件分岐フラグ検出部1216は、実行トレースDB131に格納された第2のテストスクリプトに対する実行トレースを取り出して解析し、条件分岐フラグを発見する。条件分岐フラグ検出部1216は、メモリの読み込み回数に着目した差分実行解析を用いて、複数の実行トレースを解析し、条件分岐フラグを検出する。条件分岐フラグ検出部1216は、様々なパターンで条件分岐を実行し、その際のメモリの変化のパターンをテストスクリプト上の条件分岐のパターンと照らし合わせることで、条件分岐フラグを格納するメモリを検出する。
【0056】
命令セットアーキテクチャ解析部122は、VMの命令の体系である命令セットアーキテクチャを解析する。命令セットアーキテクチャ解析部122は、VM実行トレース取得部1221(第1の取得部)、分岐VM命令検出部1222(第1の検出部)及びVPCオフセット検出部1223を有する。
【0057】
VM実行トレース取得部1221は、実行トレース取得部1211と同じく、テストスクリプト及びスクリプトエンジンバイナリを入力として受け付ける。VM実行トレース取得部1221は、VPCの監視と、ディスパッチャがディスパッチするVM命令ハンドラのポインタの監視により、VM実行トレースを取得する。VM実行トレース取得部1221は、スクリプトエンジンバイナリの実行を監視しながら、テストスクリプトを実行することで、VM上で実行された実行トレースであるVM実行トレースを取得する。VM実行トレース取得部1221は、分岐VM命令の検出において、多数のテストスクリプトを実行して、VM実行トレースを取得する。VM実行トレース取得部1221は、VM命令へのポインタとVM命令とを紐づけ、各々に識別子としてVMオペコードを仮想的に割り振る。
【0058】
VM実行トレースは、実行されたVM命令ハンドラのポインタと、VPCを記録したものである。具体的には、VM実行トレースは、実行されたVM命令ごとのVPCとVMオペコードで構成される。VPCの記録は、仮想プログラムカウンタ検出部1214で検出されたVPCのメモリを監視することで実現できる。VMオペコードは、VM命令へのポインタとVM命令とを紐づけた各々に仮想的に割り振られた識別子である。VM実行トレース取得部1221が取得したVM実行トレースは、VM実行トレースDB133に格納される。
【0059】
分岐VM命令検出部1222は、VM実行トレースDB133に格納されたVM実行トレースを取り出して解析し、分岐VM命令を検出する。分岐VM命令検出部1222は、識別子として割り振られたVMオペコードごとに、その実行の前後でのVPCの変化量を収集する。VMオペコードが分岐VM命令以外のものの場合、VPCの変化量は、ほぼ一定である。一方、VMオペコードが分岐VM命令のものの場合、VPCは分岐先によってばらつきが生じる。
【0060】
そこで、分岐VM命令検出部1222は、VM実行トレースのVMオペコードごとの仮想プログラムカウンタの変化量のばらつきによって、分岐VM命令を検出する。分岐VM命令検出部1222は、分岐VM命令とそれ以外のVM命令とではVPCの値のばらつきの大きさが異なることに着目し、閾値を決めて、よりVPCの値のばらつきの大きいものを分岐VM命令として検出する。具体的には、分岐VM命令検出部1222は、VMオペコードごとVPCの変化量のばらつきを分散で評価し、分散が一定の閾値以上のものを、分岐VM命令として検出する。
【0061】
VPCオフセット検出部1223は、VM実行トレース取得部によって取得され、VM実行トレースDB133に格納されたVM実行トレースを取り出してVM実行トレースのログを解析する。VPCオフセット検出部1223は、VM実行トレースから、VM命令のオペコードと、VM命令の実行前後でのVPCの変化量とを、組として取得する。オフセットoは、VM命令の実行前のVPCの値をpprev、実行後の値をpnextとして、o=pnext-pprevで算出される。
【0062】
フック挿入部1231は、スクリプトエンジンにフックを挿入する。フック挿入部1231は、仮想機械解析部121による解析によって得られたアーキテクチャ情報に基づいて、スクリプトエンジンにフックを施す。フック挿入部1231は、フックポイント及びタップポイントを受け取り、フックポイント及びタップポイントに基づいて、スクリプトエンジンに、フックハンドラを用いてフックを挿入して解析機能を付与する。フックハンドラは、繰り返し実行された回数が閾値以上である命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含む。
【0063】
具体的には、フック挿入部1231は、フックハンドラに、無限ループ検出処理及び無限ループスキップ処理を追加する。これによって、フックには、無限ループが発生した場合にはVM領域に処理を移行し、フックハンドラにおいて指示された、無限ループが発生した命令列をスキップする機能が追加される。
【0064】
例外ハンドラ挿入部1232は、解析対象のスクリプトに、例外ハンドラを挿入し、例外処理機能を付与する。例外ハンドラは、例外の発生を捕捉した場合に、VM領域に強制的に処理を移す機能を有する。例外ハンドラ挿入部1232は、解析対象のスクリプトを解析し、各エントリーポイントに、エントリーポイント以降のコードでの例外を捕捉できるようして例外ハンドラのコード(例えば、図1参照)を追加することで、例外ハンドラを挿入する。
【0065】
記憶部13は、RAM(Random Access Memory)、フラッシュメモリ(Flash Memory)等の半導体メモリ素子、または、ハードディスク、光ディスク等の記憶装置によって実現され、解析機能付与装置10を動作させる処理プログラムや、処理プログラムの実行中に使用されるデータなどが記憶される。記憶部13は、実行トレースデータベース(DB)131、VM実行トレースDB133及び、仮想機械解析部121によって取得されたアーキテクチャ情報を記憶するアーキテクチャ情報DB132を有する。
【0066】
実行トレースDB131及びVM実行トレースDB133は、実行トレース取得部1211及びVM実行トレース取得部1221によって取得された実行トレースを格納する。実行トレースDB131及びVM実行トレースDB133は、解析機能付与装置10によって管理される。もちろん、実行トレースDB131及びVM実行トレースDB133は、他の装置(サーバ等)によって管理されていてもよく、この場合には、実行トレース取得部1211は、出力部14の通信インタフェースを介して、取得した実行トレース及びVM実行トレースを、実行トレースDB131及びVM実行トレースDB133の管理サーバ等に出力して、実行トレースDB131及びVM実行トレースDB133に記憶させる。
【0067】
出力部14は、例えば、液晶ディスプレイやプリンタ等であって、解析機能付与装置10に関する情報を含む各種情報を出力する。また、出力部14は、外部装置との間で、各種データの入出力を司るインタフェースであってもよく、外部装置に各種情報を出力してもよい。
【0068】
[テストスクリプトの構成]
テストスクリプトについて説明する。テストスクリプトは、スクリプトエンジンを動的解析する際に入力されるスクリプトである。このテストスクリプトは、分岐命令の実行やメモリ読み書きの回数に着目し、異なる回数のテストスクリプトを実行したときに生じるスクリプトエンジンの挙動の差分を捉えるために用いられる。このテストスクリプトは、解析の事前に準備するものであり、手動で作成するものである。この作成には、対象のスクリプト言語の仕様に関する知識が必要となる。
【0069】
図4は、仮想プログラムカウンタ(VPC)の検出に用いるテストスクリプト(第1のテストスクリプト)の一例を示す図である。第1のテストスクリプトでは、繰り返し処理を用いる(2行目)。第1のテストスクリプトでは、テストスクリプト内の繰り返し回数(2行目)や繰り返される文の数(3行目から5行目)を増減させることで、実行時の条件を変更し、差分を発生させる。
【0070】
図5は、分岐VM命令検出に用いるテストスクリプト(第2のテストスクリプト)の一例を示す図である。第2のテストスクリプトでは、複数回の条件分岐を用いる(4行目から8行目)。第2のテストスクリプトにおいて、この複数回の条件分岐では、特定の順序のパターンで分岐がなされたり、なされなかったりするように、分岐条件を制御する(1行目、5行目)。第2のテストスクリプトでは、条件分岐の回数や、分岐の成否の順序パターンを変更し、差分を発生させる。
【0071】
[実行トレースの構成]
次に、実行トレースについて説明する。図6は、実行トレースの一例を示す図である。実行トレースは、前述の通り、ブランチトレースとメモリアクセストレースによって構成されている。図6は、実行トレースの一部を切り出したものである。以降、図6を用いて実行トレースの構成を示す。
【0072】
実行トレースは、traceという要素を有する。traceには、そのログ行がブランチトレースか、メモリアクセストレースかが示される。
【0073】
ブランチトレースのログ行は、例えば、図6の1行目から10行目に記載の書式になっており、type、src、dstの三つの要素からなる。typeは、実行された分岐命令がcall命令によるものか、jmp命令によるものか、ret命令によるものかを示す。また、srcは、分岐元のアドレスを示し、dstは、分岐先のアドレスを示す。
【0074】
メモリアクセストレースのログ行は、例えば、図6の11行目から13行目に記載の書式になっており、type、target、valueの三つの要素からなる。typeは、メモリアクセスが読み込みか書き込みかを示す。targetは、メモリアクセスの対象となるメモリアドレスを示す。また、valueには、メモリアクセスの結果の値が格納される。
【0075】
[VM実行トレースの構成]
次に、VM実行トレースについて説明する。図7は、VM実行トレースの一例を示す図である。VM実行トレースは、前述の通り、VMオペコードとVPCとを記録したものである。図7は、VM実行トレースの一部を切り出したものである。以降、図7を用いてVM実行トレースの構成を示す。
【0076】
VM実行トレースのログ行は、例えば、図7に記載の書式になっており、vpc及びvmop(vm opcode)の二つの要素からなる。vpcは、VPCの値を示す。また、vmopは、ポインタキャッシュから取得された、実行されるVM命令ハンドラの先頭を指すポインタごとに仮想的に割り振られたVMオペコードの値を示す。
【0077】
[VM命令境界検出部の処理]
次に、VM命令境界検出部1213の処理について説明する。図8は、VM命令境界検出部1213の処理を説明する図である。
【0078】
VM命令境界検出部1213は、各VM命令の境界を検出する。この時、VM命令境界検出部1213は、インタプリタループを持たないためにVM命令の境界の把握が難しいスレッデッドコード型VMのために、VM命令とその境界の検出を行う。具体的には、VM命令境界検出部1213は、実行トレースDB131から実行トレースを取り出す。そして、図8に示すように、VM命令境界検出部1213は、実行トレースを、所定の方法でクラスタリングして、実行回数が閾値以上のクラスタをVM命令(例えば、VM命令ハンドラ1~3)として検出する。VM命令境界検出部1213は、VM命令を構成する連続した命令列の開始点と終了点とを境界として検出する。
【0079】
[仮想プログラムカウンタ検出部の処理]
次に、仮想プログラムカウンタ検出部1214の処理について説明する。仮想プログラムカウンタ検出部1214は、VPC、ポインタキャッシュの検出を行う。仮想プログラムカウンタの検出は、取得した実行トレースのメモリアクセストレースのログを解析することで実現される。仮想プログラムカウンタ検出部1214は、メモリの読み込み回数に着目した差分実行解析を用いる。図9は、仮想プログラムカウンタ検出部1214の処理を説明する図である。
【0080】
仮想プログラムカウンタ検出部1214は、実行トレースDB131から第1のテストスクリプトによる実行トレースを一つ取り出す。VPCの読み込みの回数は、テストスクリプト内の繰り返し回数及び、繰り返し処理の中の文の数に比例する。繰り返しの回数をN、繰り返される文の数をMとしたとき、概ねMN程度のVPCの読み込みが発生する。このため、仮想プログラムカウンタ検出部1214は、N及びMをそれぞれ2Nと2M、3Nと3Mと増やした第1のテストスクリプトに対する実行トレースにおいて、4MN、9MNという増え方をしたメモリを抽出する。具体的には、図9に示すように、仮想プログラムカウンタ検出部1214は、1VM命令実行毎にRead/Writeがあり、単調増加するメモリ領域を抽出する(図9の(1))。
【0081】
そして、仮想プログラムカウンタ検出部1214は、読み込んだメモリの値が常にVM命令の開始点を指しているものを、VPCとして検出する。具体的には、仮想プログラムカウンタ検出部1214は、VPCの指し先とVM命令ハンドラのアドレスとを照合して、一致するメモリ領域に絞り込む(図9の(2))。
【0082】
[ディスパッチャ検出部の処理]
次に、ディスパッチャ検出部1215の処理について説明する。ディスパッチャ検出部1215は、スクリプトエンジンのバイナリを所定の手法で解析することで、ディスパッチャを検出する。図10は、ディスパッチャ検出部1215の処理を説明する図である。
【0083】
ディスパッチャ検出部1215は、ディスパッチャの検出を行う。ディスパッチャ検出部1215は、VM命令境界検出部1213が検出したVM命令の境界を基に、スクリプトエンジンバイナリから各VM命令部分を切り出す。そして、ディスパッチャ検出部1215は、ディスパッチャのコードの類似性は高いとした仮定の基(図10の(1))、各VM命令間でコード間の類似度を算出し、全VM命令間で類似度が高い部分を、ディスパッチャとして検出する。ディスパッチャ検出部1215は、VM命令の後半部で共通的に実行されるコードを、ディスパッチャとして検出できる(図10の(1))。
【0084】
[条件分岐フラグ検出部の処理]
次に、条件分岐フラグ検出部1216の処理について説明する。条件分岐フラグ検出部1216は、メモリアクセスを解析することで、条件分岐フラグを検出する。
【0085】
条件分岐フラグ検出部1216は、第2のテストスクリプトを用いて得られた実行トレースを用いる。条件分岐フラグ検出部1216は、テストスクリプトを解析して、二段階の絞り込みをすることで、条件分岐フラグを検出する。条件分岐フラグには、分岐がなされるか、なされないかの二つの状態がある。また、条件分岐フラグは、条件分岐の回数に比例した回数、読み込まれると考えられる。
【0086】
このことから、条件分岐フラグ検出部1216は、一段階目の絞り込みとして、条件分岐の回数に比例した回数のメモリ読み込みがあるメモリを抽出する。そして、条件分岐フラグ検出部1216は、二段階目の絞り込みとして、各メモリ読み込み時の値が、テストスクリプトの条件分岐と対応付くように二つの値を行き来しているメモリを抽出する。
【0087】
例えば、条件分岐フラグが、分岐がなされる場合をX、なされない場合をYで保持している場合、図5の第2のテストスクリプトでは、条件分岐の順序のパターンはなされる、なされない、なされる、なされる、なされないとなる。このため、条件分岐フラグ検出部1216は、X、Y、X、X、Yと二つの値を行き来しているメモリアドレスを抽出する。条件分岐フラグ検出部1216は、これを分岐の回数を変更しながら繰り返すことにより、条件分岐フラグを検出する。
【0088】
[分岐VM命令検出部の処理]
次に、分岐VM命令検出部1222の処理について説明する。分岐VM命令検出部1222は、取得したVM実行トレースのログを解析することで分岐VM命令を検出する。ここでのテストスクリプトは、分岐VM命令が含まれていればよいため、分岐の制御構文を含むスクリプトでありさえすればどのようなものでもよい。例えば、インターネット上から収集したり、公式ドキュメントから取得したりしてテストスクリプトを準備する。
【0089】
まず、分岐VM命令検出部1222は、VM実行トレースDB133の各VM実行トレースに対し、VM命令へのポインタとVM命令とを紐づけ、各々に識別子として、VMオペコードを仮想的に割り振る。図11は、分岐VM命令検出部1222の処理を説明する図である。
【0090】
ここで、あるVM命令が分岐命令のとき、VPCの変化量は、分岐先に依存して変化する。一方、分岐命令以外のときは、VPCの変化量は、VM命令のサイズに依存して変化する。このため、VM命令のオペコードとVM命令へのポインタとの組を収集し、オペコードごとにVPCの変化量を見たとき、分岐命令であれば分岐先によってVPCの変化量にばらつきがみられる。
【0091】
したがって、分岐VM命令検出部1222は、このVM命令へのポインタのばらつきを評価するため、分散を用いる。分岐VM命令検出部1222は、VMオペコード毎にVPCの変化量の分散を算出し、算出した分散が閾値よりも大きいVMオペコードのみに絞り込む。これによって、分岐VM命令検出部1222は、ポインタとVM命令を対応付けつつ、VPCの変化量にばらつきのあるVM命令(図11の例では、VM命令ハンドラ3)を、分岐VM命令として検出する(図11の(1))。
【0092】
あるオペコードに対するVPCの変化量の集合OをO={o,o,・・・,o}(VPCoの平均は(1)式を参照)とし、tを閾値としたとき、分岐命令か否かは、分散s((2)式を参照)を基に、(3)式のように判定される。これによって、分岐VM命令検出部1222は、分岐VM命令を検出する。
【0093】
【数1】
【0094】
【数2】
【0095】
【数3】
【0096】
なお、分岐以外のVM命令では、ばらつきがほとんど見られず、分岐VM命令とそれ以外のVM命令との境界は明確であることが多い。このため、閾値として、例えば、得られた分散の値を数直線上にプロットして、できた二つの群を分割可能な値が設定される。
【0097】
[フック挿入部の処理]
次に、フック挿入部1231の処理を説明する。フック挿入部1231は、スクリプトエンジンバイナリと、ここまでの処理で検出されたフックポイント及びタップポイントを入力として受け付ける。フック挿入部1231は、スクリプトエンジンに対して、フックポイントにフックハンドラを用いたフックを挿入する。
【0098】
ここで、フック挿入部1231は、フック時に、フックに対応した言語要素が実行され、その引数としてのタップポイントのメモリがログ出力されるように、解析用のコードを挿入する。この解析用のコードは、フックポイントとタップポイントとが判明していれば、容易に生成できる。これによって、スクリプトが実行された際に、その挙動がログ出力されるようになり、解析機能の付与が実現される。なお、フック挿入部1231は、フックポイントが検出されていない場合であっても、フックを施すことができる。
【0099】
この際、フック挿入部1231は、フックハンドラに、無限ループ検出処理及び無限ループスキップ処理を追加する。
【0100】
図12図13及び図14は、無限ループ検出処理を説明する図である。図12に示すように、無限ループ検出処理は、定常的にVPCをトレースしておく(図12の(1))。また、無限ループ検出処理には、あらかじめ閾値が指定されているものとする。
【0101】
そして、図13に示すように、無限ループ検出処理は、繰り返し実行されるVPCの並びをループとして検出する(図13の(2))。例えば、無限ループ検出処理は、同一のVPCの並びが2回以上繰り返し実行されている場合にループとして検出する。
【0102】
ここで、図14に示すように、無限ループ検出処理は、ループの繰り返し回数をカウントし、繰り返し回数が閾値以上である場合に当該ループを無限ループとして検出する(図14の(3))。
【0103】
図15及び図16は、無限ループスキップ処理を説明する図である。図15に示すように、無限ループスキップ処理は、VPCのトレースから無限ループの終端を検出し、当該終端まで命令を実行する(図15の(1))。
【0104】
そして、図16に示すように、無限ループスキップ処理は、条件分岐フラグを書き換えて実行することで無限ループをスキップする(図16の(2))。例えば、無限ループスキップ処理は、条件分岐フラグを、ループが行われないことを意味する値に強制的に書き換える。
【0105】
(制御フローグラフを用いた方法)
上記の無限ループ検出処理と無限ループスキップ処理を含む無限ループ解消機能とは別に、フック挿入部1231は、制御フローグラフを用いた無限ループ解消機能を付与することができる。
【0106】
制御フローグラフを用いた無限ループ解消機能は、制御フローグラフを構築し、例えば非特許文献6に記載の方法で繰り返しの態様が所定の条件を満たす命令列(無限ループ)を検出し、検出した無限ループに対して無限ループスキップ処理を行うことができる。
【0107】
なお、非特許文献6には、制御フローグラフの構築が可能なバイナリプログラムに対して無限ループの検出及びスキップを行うことが記載されている。
【0108】
一方で、スクリプトについては、未知のバイトコードの解析を要することから制御フローグラフの構築が困難である。そのため、スクリプトに対して非特許文献6に記載の方法を適用することは難しい。
【0109】
これに対し、実施形態の制御フローグラフを用いた方法は、スクリプトに対して有効である点で非特許文献6に記載の方法とは異なる。
【0110】
ここで、図17及び図18を用いて、制御フローグラフの構築するための方法を説明する。
【0111】
この際、フック挿入部1231は、フックハンドラに、VMブランチトレースを構築するVMブランチトレース構築処理、制御フローグラフを構築する制御フローグラフ構築処理、無限ループを検出する無限ループ検出処理、及び、無限ループをスキップする無限ループスキップ処理を追加する。
【0112】
図17は、VMブランチトレース構築処理を説明する図である。VMブランチトレース構築処理では、図17に示すように、実行されたVM命令のオペコードと、VPCを記録したVM実行トレース41から分岐VM命令を検出する(図17の(1))。分岐VM命令は、分岐VM命令検出部1222によって検出された分岐VM命令リスト42を参照することで認識することができる。
【0113】
そして、VMブランチトレース構築処理では、検出した分岐VM命令の実行前後のVPCを対応付けたVMブランチトレース43を構築する(図17の(2))。VMブランチトレース構築処理では、例えば、VM実行トレースの行R41から分岐VM命令「0x1f」を検出し、行R41及び行R42の次の行R42を基に、行R61に示すVMブランチトレースを構築する。すなわち、VMブランチトレース構築処理では、行R41のVPC「0x555c7e48」と、行R42のVPC「0x555c82a0」とを対応付ける。
【0114】
同様に、VMブランチトレース構築処理では、VM実行トレースの行R51から分岐VM命令「0x21」を検出すると、この行R51及び次の行R52を基に、行R51の分岐元のVPC「0x555c832c」と、行R52の分岐元のVPC「0x555c7514」とを対応付ける(行R71)。
【0115】
図18は、制御フローグラフ構築処理を説明する図である。制御フローグラフ構築処理では、VMブランチトレース構築処理において構築したVMブランチトレース43を用いて、基本ブロックをノードとし、VMブランチトレース43の各分岐をエッジとした制御フローグラフを構築する(図18の(1))。
【0116】
具体的には、制御フローグラフ構築処理では、VMブランチトレース43の行R61に示す分岐をエッジE61とし、エッジE61の分岐元の基本ブロックをノードN61とし、エッジE61の分岐先の基本ブロックをノードN62とする。
【0117】
そして、VMブランチトレース43の行R71に示す分岐をエッジE71とし、エッジ71の分岐元の小本ブロックをノードN71とし、エッジE71の分岐先の基本ブロックをノードN72とする。なお、図18の制御フローグラフの例では、ノードN71には、エッジE71のほかにエッジE72に示す分岐があり、この分岐先の基本ブロックはノードN73で示されている。このように、制御フローグラフ構築処理では、VMブランチトレースを基に、基本ブロックの分岐をグラフ構造で表現した制御フローグラフを構築する。
【0118】
[解析機能付与装置の処理手順]
次に、解析機能付与装置10による解析機能付与処理の処理手順について説明する。図19は、実施の形態に係る解析機能付与処理の処理手順を示すフローチャートである。
【0119】
まず、入力部11は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け取る(ステップS1)。
【0120】
そして、実行トレース取得部1211は、スクリプトエンジンのバイナリを監視しながらテストスクリプトを実行してブランチトレースとメモリアクセストレースを取得する実行トレース取得処理を行う(ステップS2)。
【0121】
フックポイント・タップポイント検出部1212は、実行トレース取得部1211によって取得された実行トレースに基づいて仮想機械を解析し、フックポイント、タップポイントを検出するフック・タップポイント検出処理を行う(ステップS3)。
【0122】
仮想プログラムカウンタ検出部1214は、実行トレースDB131に格納された第1のテストスクリプトに対する実行トレースを取り出して解析し、VPCを発見する仮想プログラムカウンタ検出処理を行う(ステップS4)。
【0123】
条件分岐フラグ検出部1216は、実行トレースDB131に格納されたテストスクリプトに対する実行トレースを取り出して解析し、条件分岐フラグを発見する条件分岐検出処理を行う(ステップS5)。
【0124】
フック挿入部1231は、ステップS1~ステップS5の処理において取得されたアーキテクチャ情報を基に、スクリプトエンジンにフックを挿入するフック挿入処理を行う(ステップS6)。
【0125】
そして、出力部124は、無限ループ解消機能が付与されたスクリプトエンジンバイナリを出力する(ステップS7)。
【0126】
また、図20を用いて、制御フローグラフを用いた無限ループ解消機能を付与する場合の、解析機能付与装置10による解析機能付与処理の処理手順を説明する。図20は、実施の形態に係る解析機能付与処理の処理手順を示すフローチャートである。
【0127】
まず、入力部11は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け取る(ステップS11)。
【0128】
そして、実行トレース取得部1211は、スクリプトエンジンのバイナリを監視しながらテストスクリプトを実行してブランチトレースとメモリアクセストレースを取得する実行トレース取得処理を行う(ステップS12)。
【0129】
フックポイント・タップポイント検出部1212は、実行トレース取得部1211によって取得された実行トレースに基づいて仮想機械を解析し、フックポイント、タップポイントを検出するフック・タップポイント検出処理を行う(ステップS13)。
【0130】
VM命令境界検出部1213は、VM命令を検出し、VM命令の境界を検出するVM命令境界検出処理を行う(ステップS14)。仮想プログラムカウンタ検出部1214は、実行トレースDB131に格納された第1のテストスクリプトに対する実行トレースを取り出して解析し、VPCを発見する仮想プログラムカウンタ検出処理を行う(ステップS15)。
【0131】
ディスパッチャ検出部1215は、スクリプトエンジンバイナリから各VM命令部分を切り出し、各VM命令間で類似度が高い部分をディスパッチャとして検出するディスパッチャ検出処理を行う(ステップS16)。
【0132】
VM実行トレース取得部1221は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け付け、スクリプトエンジンバイナリの実行を監視しながら、テストスクリプトを実行することで、VM実行トレースを取得するVM実行トレース取得処理を行う(ステップS17)。
【0133】
分岐VM命令検出部1222は、VM実行トレースDB133に格納されたVM実行トレースを取り出して解析し、分岐VM命令を検出する分岐VM命令検出処理を行う(ステップS18)。
【0134】
フック挿入部1231は、ステップS11~ステップS18の処理において取得されたアーキテクチャ情報を基に、スクリプトエンジンにフックを挿入するフック挿入処理を行う(ステップS19)。
【0135】
そして、出力部14は、無限ループ解消機能が付与されたスクリプトエンジンバイナリを出力する(ステップS20)。
【0136】
[実行トレース取得処理の処理手順]
次に、図19及び図20に示す実行トレース取得処理の流れについて説明する。図21は、図19及び図20に示す実行トレース取得処理の処理手順を示すフローチャートである。
【0137】
まず、実行トレース取得部1211は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け取る(ステップS21)。そして、実行トレース取得部1211は、受け取ったスクリプトエンジンに対して、ブランチトレースを取得するためのフックを施す(ステップS22)。また、実行トレース取得部1211は、受け取ったスクリプトエンジンに対して、メモリアクセストレースを取得するためのフックも施す(ステップS23)。
【0138】
そして、実行トレース取得部1211は、その状態で受け取ったテストスクリプトをスクリプトエンジンに入力して実行させ(ステップS24)、それによって取得される実行トレースを実行トレースDB131に格納する(ステップS25)。
【0139】
実行トレース取得部1211は、入力されたテストスクリプトを全て実行し終えているか否かを判定する(ステップS26)。実行トレース取得部1211は、入力されたテストスクリプトを全て実行し終えている場合(ステップS26:Yes)、処理を終了する。これに対し、実行トレース取得部1211は、入力されたテストスクリプトを全て実行していない場合(ステップS26:No)、ステップS24のテストスクリプトの実行に戻って処理を続ける。
【0140】
[フック・タップポイント検出処理の処理手順]
図22は、図19及び図20に示すフック・タップポイント検出処理の処理手順を示すフローチャートである。
【0141】
図22に示すように、フック・タップポイント検出処理において、フックポイント・タップポイント検出部1212は、フックポイント候補を検出する(ステップS31)。フックポイント・タップポイント検出部1212は、フックポイント候補が検出された場合(ステップS32:Yes)、ステップS35に進む。一方、フックポイント候補が検出されなかった場合(ステップS32:No)、フックポイント・タップポイント検出部1212は、複数の条件を変えた実行トレースの間に見られる差分に基づいてフックポイントを検出する差分実行解析処理を実施する(ステップS33)。
【0142】
そして、フックポイント・タップポイント検出部121210は、フックポイント候補が検出されなかった場合(ステップS34:No)、フックポイント候補がないため、処理を終了する。一方、フックポイント・タップポイント検出部1212は、フックポイント候補が検出された場合(ステップS34:Yes)、ステップS35に進む。フックポイント・タップポイント検出部1212は、タップポイントを検出する(ステップS35)。
【0143】
[VM命令境界検出処理の処理手順]
次に、図20に示すVM命令境界検出処理の流れについて説明する。図23は、図20に示すVM命令境界検出処理の処理手順を示すフローチャートである。
【0144】
まず、VM命令境界検出部1213は、実行トレースDB131から実行トレースを取り出す(ステップS41)。VM命令境界検出部1213は、実行トレースを所定の方法でクラスタリングする(ステップS42)。クラスタリングは、いずれの手法を用いてもよい。
【0145】
VM命令境界検出部1213は、実行回数が閾値以上のクラスタをVM命令として検出する(ステップS43)。そして、VM命令境界検出部1213は、VM命令を構成する連続した命令列の開始点と終了点とを境界とする(ステップS44)。VM命令境界検出部1213は、VM命令の境界を返り値として出力して(ステップS45)、VM命令境界検出処理を終了する。
【0146】
[仮想プログラムカウンタ検出処理の処理手順]
次に、図19及び図20に示す仮想プログラムカウンタ検出処理の流れについて説明する。図24は、図19及び図20に示す仮想プログラムカウンタ検出処理の処理手順を示すフローチャートである。
【0147】
まず、仮想プログラムカウンタ検出部1214は、実行トレースDB131から第1のテストスクリプトによる実行トレースを一つ取り出す(ステップS51)。続いて、仮想プログラムカウンタ検出部1214は、実行トレースのうちのメモリアクセストレースに着目し、メモリ読み込み先ごとに読み込み回数を数え上げる(ステップS52)。
【0148】
仮想プログラムカウンタ検出部1214は、実行トレースの取得に用いた第1のテストスクリプトを入力として受け取り(ステップS53)、その第1のテストスクリプトを解析して繰り返しの回数と繰り返される文の数とを取得する(ステップS54)。
【0149】
続いて、仮想プログラムカウンタ検出部1214は、実行トレースDB131から、繰り返し回数や繰り返される文の数の異なる第1のテストスクリプトによる実行トレースを、さらに一つ取り出す(ステップS55)。そして、仮想プログラムカウンタ検出部1214は、メモリアクセストレースに着目し、メモリ読み込み先ごとに読み込み回数を数え上げる(ステップS56)。また、仮想プログラムカウンタ検出部1214は、実行トレースの取得に用いた第1のテストスクリプトを入力として受け取り(ステップS57)、テストスクリプトを解析して、繰り返しの回数と繰り返される文の数とを取得する(ステップS58)。
【0150】
ここで、仮想プログラムカウンタ検出部1214は、繰り返し回数や繰り返される文の増減に比例して読み込み回数が変化するメモリ読み込み先のみに絞り込む(ステップS59)。さらに、仮想プログラムカウンタ検出部1214は、ステップS59において絞り込んだメモリ読み込み先を、読み込んだメモリの値が常にVM命令の開始点を指しているものに絞り込む(ステップS60)。
【0151】
そして、仮想プログラムカウンタ検出部1214は、メモリ読み込み先を一つのみに絞り込めたか否かを判定する(ステップS61)。仮想プログラムカウンタ検出部1214は、メモリ読み込み先を一つのみに絞り込めていない場合(ステップS61:No)、ステップS55に戻り、次の実行トレースを一つ取り出して処理を継続する。一方、仮想プログラムカウンタ検出部1214は、メモリ読み込み先を一つのみに絞り込めた場合(ステップS61:Yes)、絞り込まれたメモリ読み込み先を仮想プログラムカウンタとしてアーキテクチャ情報DB132に格納して(ステップS62)、処理を終了する。
【0152】
[条件分岐フラグ検出処理の処理手順]
次に、図19に示す条件分岐フラグ検出処理の流れについて説明する。図25は、図19に示す条件分岐フラグ検出処理の処理手順を示すフローチャートである。
【0153】
まず、条件分岐フラグ検出部1216は、実行トレースDB131から複数回の条件分岐を用いる第2のテストスクリプトによる実行トレースを一つ取り出す(ステップS71)。そして、条件分岐フラグ検出部1216は、メモリアクセストレースに着目し、メモリ読み込み先ごとに読み込み回数を数え上げる(ステップS72)。
【0154】
また、条件分岐フラグ検出部1216は、実行トレースの取得に用いた第2のテストスクリプトを、入力として受け取り(ステップS73)、この第2のテストスクリプトを解析して、条件分岐の回数とTrue/Falseの順序パターンを取得する(ステップS74)。そして、条件分岐フラグ検出部1216は、条件分岐の回数に比例して読み込み回数が変化するメモリ読み込み先のみに絞り込む(ステップS75)。さらに、条件分岐フラグ検出部1216は、読み込んだメモリの値がTrue/Falseの順序パターンに合わせて二つの値を行き来しているメモリ読み込み先のみに絞り込む(ステップS76)。
【0155】
条件分岐フラグ検出部1216は、メモリ読み込み先を一つのみに絞り込めたか否かを判定する(ステップS77)。条件分岐フラグ検出部1216は、メモリ読み込み先を一つのみに絞り込めていない場合(ステップS77:No)、ステップS71に戻り、次の実行トレースを一つ取り出して処理を継続する。一方、条件分岐フラグ検出部1216は、メモリ読み込み先を一つのみに絞り込めた場合(ステップS77:Yes)、絞り込まれた読み込み先を仮想プログラムカウンタとしてアーキテクチャ情報DB132に格納し(ステップS78)、処理を終了する。
【0156】
[ディスパッチャ検出処理の処理手順]
次に、図20に示すディスパッチャ検出処理の流れについて説明する。図26は、図20に示すディスパッチャ検出処理の処理手順を示すフローチャートである。
【0157】
まず、ディスパッチャ検出部1215は、スクリプトエンジンバイナリを入力として受け取る(ステップS81)。ディスパッチャ検出部1215は、VM命令境界検出部1213から、VM命令の境界を受け取る(ステップS82)。
【0158】
ディスパッチャ検出部1215は、VM命令境界検出部1213から受け取ったVM命令の境界を基に、スクリプトエンジンバイナリから各VM命令部分を切り出す(ステップS83)。ディスパッチャ検出部1215は、各VM命令間でコード間の類似度を所定の方法で算出する(ステップS84)。類似度の算出手法は、コード間の類似度を算出できる手法であれば、どの手法でもよい。
【0159】
ディスパッチャ検出部1215は、ステップS84において算出した類似度を基に、全VM命令間で類似度が高い部分を取り出す(ステップS85)。そして、ディスパッチャ検出部1215は、VM命令の終端部分であるかを判定する(ステップS86)。
【0160】
VM命令の終端部分でない場合(ステップS86:No)、ディスパッチャ検出部1215は、ステップS85に戻り処理を続ける。また、VM命令の終端部分である場合(ステップS86:Yes)、ディスパッチャ検出部1215は、取り出した部分をディスパッチャとして出力して(ステップS87)、処理を終了する。
【0161】
[VM実行トレース取得処理の処理手順]
次に、図20に示すVM実行トレース取得処理の流れについて説明する。図27は、図20に示すVM実行トレース取得処理の処理手順を示すフローチャートである。
【0162】
まず、VM実行トレース取得部1221は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け取る(ステップS91)。そして、VM実行トレース取得部1221は、受け取ったスクリプトエンジンに対して、VPC及びVMオペコードを記録するためのフックを施す(ステップS92)。
【0163】
VM実行トレース取得部1221は、その状態で受け取ったテストスクリプトをスクリプトエンジンに入力して実行させ(ステップS93)、それによって取得されるVM実行トレースをVM実行トレースDB133に格納する(ステップS94)。
【0164】
VM実行トレース取得部1221は、入力されたテストスクリプトを全て実行したか否かを判定する(ステップS95)。VM実行トレース取得部1221は、入力されたテストスクリプトを全て実行し終えている場合(ステップS95:Yes)、処理を終了する。VM実行トレース取得部1221は、入力されたテストスクリプトを全て実行し終えていない場合(ステップS95:No)、ステップS93のテストスクリプトの実行に戻って処理を続ける。
【0165】
[分岐VM命令検出処理の処理手順]
次に、図20に示す分岐VM命令検出処理の流れについて説明する。図28は、図20に示す分岐VM命令検出処理の処理手順を示すフローチャートである。
【0166】
まず、分岐VM命令検出部1222は、VM実行トレースDB133から、VM実行トレースを一つ取り出す(ステップS101)。分岐VM命令検出部1222は、VM命令へのポインタとVM命令を紐付け、各々に識別子としてVMオペコードを割り振る(ステップS102)。そして、分岐VM命令検出部1222は、VMオペコードごとに、実行の前後でのVPCの変化量を集計する(ステップS103)。
【0167】
分岐VM命令検出部1222は、VM実行トレースDB133の全てのVM実行トレースを処理し終えたか否かを判定する(ステップS104)。VM実行トレースDB133の全てのVM実行トレースを処理し終えていない場合(ステップS104:No)、分岐VM命令検出部1222は、ステップS101に戻り、次のVM実行トレースを一つ取り出して処理する。
【0168】
VM実行トレースDB133の全てのVM実行トレースを処理し終えている場合(ステップS104:Yes)、分岐VM命令検出部1222は、VMオペコードごとにVPCの変化量の分散を算出する(ステップS105)。そして、分岐VM命令検出部1222は、閾値を入力として受け取る(ステップS106)。分岐VM命令検出部1222は、分散が閾値よりも大きいVMオペコードのみに絞り込み(ステップS107)、それらを分岐VM命令としてアーキテクチャ情報DB132に格納して(ステップS108)、処理を終了する。
【0169】
[フック挿入処理]
次に、図19に示すフック挿入処理の流れについて説明する。図29は、図19に示すフック挿入処理の処理手順を示すフローチャートである。
【0170】
まず、フック挿入部1231は、フックポイント・タップポイント検出部1212によって検出されたフックポイント及びタップポイントを入力として受け取り、(ステップS111)、フックハンドラを準備する(ステップS112)。
【0171】
フック挿入部1231は、フックハンドラにVPCトレース処理を追加する(ステップS113)。フック挿入部1231は、フックハンドラに無限ループ検出処理を追加する(ステップS114)。フック挿入部1231は、フックハンドラに無限ループスキップ処理を追加する(ステップS115)。フック挿入部1231は、フックポイントにフックハンドラを用いたフックを挿入する(ステップS116)。
【0172】
図30は、無限ループ検出処理の処理手順を示すフローチャートである。まず、無限ループ検出処理は、無限ループと判定するループ回数の閾値を入力として受け取る(ステップS121)。閾値は、ユーザによって指定されてもよい。
【0173】
次に、無限ループ検出処理は、連続したVPCの値を監視し、繰り返し実行される命令列をループとして検出する(ステップS122)。そして、無限ループ検出処理は、ループの繰り返し回数をカウントする(ステップS123)。
【0174】
ここで、ループ回数が無限ループ判定の閾値を超えていない場合(ステップS124:No)、無限ループ検出処理は、ステップS122に戻り処理を繰り替えす。
【0175】
一方、ループ回数が無限ループ判定の閾値を超えた場合(ステップS124:Yes)、無限ループ検出処理は、無限ループスキップ処理に移行する(ステップS125)。
【0176】
図31は、無限ループスキップ処理の処理手順を示すフローチャートである。まず、無限ループスキップ処理は、VPCと条件分岐フラグを入力として受け取る(ステップS131)。
【0177】
次に、無限ループスキップ処理は、繰り返し実行される命令列からループの終端となるVPCの値を検出する(ステップS132)。
【0178】
そして、無限ループスキップ処理は、ループの終端の条件分岐命令まで実行する(ステップS133)。さらに、無限ループスキップ処理は、条件分岐フラグを書き換えて(ステップS134)、ループの終端の条件分岐命令を実行する(ステップS135)。
【0179】
例えば、分岐がなされない限り繰り返される命令列において、条件分岐フラグの値が分岐がなされないことを示すYである場合を考える。
【0180】
この場合、無限ループスキップ処理は、ステップS134において、条件分岐フラグの値を分岐がなされることを示すXに強制的に書き換える。その結果、終端の条件分岐命令においては分岐がなされるとの判定がされ、命令列の繰り返し、すなわち無限ループがスキップされる。
【0181】
図32は、図20に示すフック挿入処理の処理手順を示すフローチャートである。まず、フック挿入部1231は、フックポイント・タップポイント検出部1212によって検出されたフックポイント及びタップポイントを入力として受け取り、(ステップS141)、フックハンドラを準備する(ステップS142)。
【0182】
フック挿入部1231は、フックハンドラにVMブランチトレース構築処理を追加する(ステップS143)。フック挿入部1231は、フックハンドラに制御フローグラフ構築処理を追加する(ステップS144)。フック挿入部1231は、フックハンドラに無限ループ解消機能を追加する(ステップS145)。フック挿入部1231は、フックポイントにフックハンドラを用いたフックを挿入する(ステップS146)。
【0183】
[VMブランチトレース構築処理]
図33は、VMブランチトレース構築処理の処理手順を示すフローチャートである。VMブランチトレース構築処理では、VM実行トレースとVM分岐命令リストとを入力として受け取る(ステップS151)。
【0184】
VMブランチトレース構築処理では、VM実行トレースのエントリを取り出す(ステップS152)。VMブランチトレース構築処理では、VMオペコードがVM分岐命令リストに存在するか判定する(ステップS153)。
【0185】
VMブランチトレース構築処理では、VMオペコードがVM分岐命令リストに存在する場合(ステップS153:Yes)、VPCを分岐元とし、次のエントリのVPCを分岐先としてVMブランチトレースに保存する(ステップS154)。
【0186】
VMブランチトレース構築処理では、VMオペコードがVM分岐命令リストに存在しない場合(ステップS153:No)、または、ステップS154終了後、VM実行トレースの全てのエントリを処理したか否かを判定する(ステップS155)。
【0187】
VMブランチトレース構築処理では、VM実行トレースの全てのエントリを処理していない場合(ステップS155:No)、VM実行トレースの次のエントリを取り出す(ステップS156)。そして、VMブランチトレース構築処理では、ステップS153に戻り、次のエントリについて、VMオペコードがVM分岐命令リストに存在するか判定する。
【0188】
一方、VMブランチトレース構築処理では、VM実行トレースの全てのエントリを処理した場合(ステップS155:Yes)、VMブランチトレースを出力する(ステップS157)。
【0189】
[制御フローグラフ構築処理]
図34は、制御フローグラフ構築処理の処理手順を示すフローチャートである。制御フローグラフ構築処理では、VMブランチトレースを入力として受け取ると(ステップS161)、VMブランチトレースのエントリを取り出す(ステップS162)。
【0190】
制御フローグラフ構築処理では、分岐先アドレスを起点とする基本ブロックをノードとして制御フローグラフに追加する(ステップS163)。制御フローグラフ構築処理では、分岐元アドレスから分岐先アドレスへのエッジを制御フローグラフに追加する(ステップS164)。制御フローグラフ構築処理では、VMブランチトレースの全てのエントリを処理したか否かを判定する(ステップS165)。
【0191】
制御フローグラフ構築処理では、VMブランチトレースの全てのエントリを処理していない場合(ステップS165:No)、VM実行トレースの次のエントリを取り出す(ステップS166)。そして、制御フローグラフ構築処理では、ステップS163に戻り、次のエントリについて、分岐先アドレスを起点とする基本ブロックをノードとして制御フローグラフに追加する。
【0192】
制御フローグラフ構築処理では、VMブランチトレースの全てのエントリを処理した場合(ステップS165:Yes)、構築した制御フローグラフを出力する(ステップS167)。
【0193】
[例外ハンドラ挿入処理]
例外ハンドラ挿入処理の流れについて説明する。図35は、例外ハンドラ挿入処理の処理手順を示すフローチャートである。なお、図19及び図20のいずれにも例外ハンドラ挿入処理は含まれない。
【0194】
例外ハンドラ挿入部1232は、解析対象のスクリプトを入力として受け取る(ステップS171)。例外ハンドラ挿入部1232は、解析対象のスクリプトを所定の方法で解析し、エントリーポイントを取り出す(ステップS172)。
【0195】
例外ハンドラ挿入部1232は、エントリーポイントを一つ取り出す(ステップS173)。例外ハンドラ挿入部1232は、エントリーポイント以降のコードでの例外を捕捉できるようにして例外ハンドラのコード(例えば、図1参照)を追加する(ステップS174)。
【0196】
例外ハンドラ挿入部1232は、全てのエントリーポイントに例外ハンドラを追加したか否かを判定する(ステップS175)。全てのエントリーポイントに例外ハンドラを追加していない場合(ステップS175:No)、例外ハンドラ挿入部1232は、次のエントリーポイントを取り出し(ステップS176)、ステップS174に進んで、例外ハンドラのコードを追加する。
【0197】
例外ハンドラ挿入部1232は、全てのエントリーポイントに例外ハンドラを追加した場合(ステップS175:Yes)、処理を終了する。
【0198】
なお、実施形態では、図3で示した機能部の一部を利用して無限ループ解消機能の付与を行うことができる。特に、実施形態における解析機能付与装置10は、VPCオフセット検出部1223及び例外ハンドラ挿入部1232を備えないものであってもよい。
【0199】
[実施の形態の効果]
このように、実施の形態に係る解析機能付与装置10は、スクリプトエンジンのバイナリを監視しながらテストスクリプトを実行し、ブランチトレースとメモリアクセストレースを実行トレースとして取得する。解析機能付与装置10は、その実行トレースに基づいて仮想機械を解析し、タップポイント、VPC、VM命令境界、ディスパッチャのアーキテクチャ情報を取得する。さらに、解析機能付与装置10は、テストスクリプトを実行してVM実行トレースを取得し、そのVM実行トレースを用いて命令セットアーキテクチャを解析して分岐VM命令をアーキテクチャ情報として取得する。
【0200】
そして、解析機能付与装置10は、得られたアーキテクチャ情報を基に、スクリプトエンジンに、繰り返し実行された回数が閾値以上である命令列を検出し、前記命令列の終端の条件分岐に関する条件を書き換えることにより前記命令列の実行を中止させる処理を含むフックを施して、無限ループ解消機能を含む解析機能を付与する。
【0201】
また、解析機能付与装置10では、多様なスクリプトエンジンに対して、テストスクリプトさえ用意すれば自動で無限ループ解消機能を付与できるため、個別の設計や実行を要することなく、無限ループ解消機能の付与を実現できる。
【0202】
上述したように、解析機能付与装置10は、多種多様なスクリプト言語で記述される悪性スクリプトの挙動の解析に有用であり、無限ループを用いて実行の遅延又は停止を引き起こす悪性スクリプトに対して、その影響を受けずに、挙動を解析することに適している。このため、解析機能付与装置10を用いて、様々なスクリプトエンジンに無限ループ解消機能を付与することで、無限ループによる実行の遅延又は停止を抑制しながら、悪性スクリプトの挙動を解析できるため、検知などの対策に生かすことが可能である。
【0203】
なお、解析機能付与装置10は、実行経路の強制によるマルチパス実行においても同様に、無限ループを捕捉し、意図しない実行の遅延又は停止を防ぎつつ解析を継続することが可能である。
【0204】
[実施形態のシステム構成について]
図3に示す解析機能付与装置10の各構成要素は機能概念的なものであり、必ずしも物理的に図示のように構成されていることを要しない。すなわち、解析機能付与装置10の機能の分散及び統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散または統合して構成することができる。
【0205】
また、解析機能付与装置10においておこなわれる各処理は、全部または任意の一部が、CPU及びCPUにより解析実行されるプログラムにて実現されてもよい。また、解析機能付与装置10においておこなわれる各処理は、ワイヤードロジックによるハードウェアとして実現されてもよい。
【0206】
また、実施の形態において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的に行うこともできる。もしくは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的に行うこともできる。この他、上述及び図示の処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて適宜変更することができる。
【0207】
[プログラム]
図36は、プログラムが実行されることにより、解析機能付与装置10が実現されるコンピュータの一例を示す図である。コンピュータ1000は、例えば、メモリ1010、CPU1020を有する。また、コンピュータ1000は、ハードディスクドライブインタフェース1030、ディスクドライブインタフェース1040、シリアルポートインタフェース1050、ビデオアダプタ1060、ネットワークインタフェース1070を有する。これらの各部は、バス1080によって接続される。
【0208】
メモリ1010は、ROM1011及びRAM1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、ディスクドライブ1100に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ1100に挿入される。シリアルポートインタフェース1050は、例えばマウス1110、キーボード1120に接続される。ビデオアダプタ1060は、例えばディスプレイ1130に接続される。
【0209】
ハードディスクドライブ1090は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093、プログラムデータ1094を記憶する。すなわち、解析機能付与装置10の各処理を規定するプログラムは、コンピュータ1000により実行可能なコードが記述されたプログラムモジュール1093として実装される。プログラムモジュール1093は、例えばハードディスクドライブ1090に記憶される。例えば、解析機能付与装置10における機能構成と同様の処理を実行するためのプログラムモジュール1093が、ハードディスクドライブ1090に記憶される。なお、ハードディスクドライブ1090は、SSD(Solid State Drive)により代替されてもよい。
【0210】
また、上述した実施の形態の処理で用いられる設定データは、プログラムデータ1094として、例えばメモリ1010やハードディスクドライブ1090に記憶される。そして、CPU1020が、メモリ1010やハードディスクドライブ1090に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出して実行する。
【0211】
なお、プログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1090に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、プログラムモジュール1093及びプログラムデータ1094は、ネットワーク(LAN(Local Area Network)、WAN(Wide Area Network)等)を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール1093及びプログラムデータ1094は、他のコンピュータから、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。
【0212】
以上、本発明者によってなされた発明を適用した実施の形態について説明したが、本実施の形態による本発明の開示の一部をなす記述及び図面により本発明は限定されることはない。すなわち、本実施の形態に基づいて当業者等によりなされる他の実施の形態、実施例及び運用技術等はすべて本発明の範疇に含まれる。
【符号の説明】
【0213】
10 解析機能付与装置
11 入力部
12 制御部
13 記憶部
14 出力部
121 仮想機械解析部
122 命令セットアーキテクチャ解析部
123 解析機能付与部
131 実行トレースDB
132 アーキテクチャ情報DB
133 VM実行トレースDB
1211 実行トレース取得部
1212 フックポイント・タップポイント検出部
1213 VM命令境界検出部
1214 仮想プログラムカウンタ検出部
1215 ディスパッチャ検出部
1216 条件分岐フラグ検出部
1221 VM実行トレース取得部
1222 分岐VM命令検出部
1223 VPCオフセット検出部
1231 フック挿入部
1232 例外ハンドラ挿入部
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24
図25
図26
図27
図28
図29
図30
図31
図32
図33
図34
図35
図36
図37