(57)【要約】  ブラウザエミュレータマネージャ（２３）のプログラム解析部（２７３）は、ウェブコンテンツに含まれるコードの構文解析を行うことにより、コードを網羅的に探索し、他のサイトへの転送コードまたはコンテンツ取得コードを探索し、探索の結果発見されたコードに使用されるオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかを特定する。そして、プログラム解析部（２７３）は、特定したオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかを基に、転送コードまたはコンテンツ取得コードと依存関係を持つコードを抽出する。
2016060110.tif 000002
【特許請求の範囲】
【請求項１】
ウェブコンテンツに含まれるコードを解析する解析装置であって、
前記ウェブコンテンツに含まれるコードの構文解析を行うことにより、前記コードから、他のサイトへの転送コードまたはコンテンツ取得コードを探索し、前記探索の結果発見された転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかを特定する構文解析部と、
前記特定したオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかをもとに前記転送コードまたはコンテンツ取得コードと依存関係を持つコードを抽出するプログラムスライシング部と
を備えることを特徴とする解析装置。
【請求項２】
前記構文解析部による探索の結果、前記転送コードまたはコンテンツ取得コードが発見されたとき、前記ウェブコンテンツに含まれるコードの各文をノードとし、前記ノード間におけるデータ依存関係および制御依存関係を示したプログラム依存グラフを構築し、前記プログラム依存グラフを用いて、前記発見された前記転送コードまたはコンテンツ取得コードに対応するノードを特定するプログラム依存グラフ構築部をさらに備え、
前記プログラムスライシング部は、
前記プログラム依存グラフ構築部により特定されたノードをスライシング基準とし、前記コードに対し、前記プログラム依存グラフにおけるデータ依存関係に基づく逆方向スライスを行うことにより、前記転送コードまたはコンテンツ取得コードと依存関係を持つコードを抽出すること
を特徴とする請求項１に記載の解析装置。
【請求項３】
前記プログラムスライシング部による逆方向スライスにより抽出されたコードを、スクリプトインタプリタ部に解釈させ、前記解釈の過程で、前記転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、関数に代入される値、引数の少なくともいずれかを監視し、前記転送コードまたはコンテンツ取得コードの実行によりアクセスするウェブサイトのＵＲＬ（Uniform  Resource  Locator）を抽出するスライス実行部をさらに備えること
を特徴とする請求項２に記載の解析装置。
【請求項４】
前記スライス実行部により抽出されたＵＲＬにアクセスすることで取得されたウェブコンテンツに含まれるコードに対して、前記構文解析部、前記プログラム依存グラフ構築部、前記プログラムスライシング部および前記スライス実行部による処理を実行すること
を特徴とする請求項３に記載の解析装置。
【請求項５】
ウェブコンテンツに含まれるコードを解析する解析方法であって、
前記ウェブコンテンツに含まれるコードの構文解析を行うことにより、前記コードから、他のサイトへの転送コードまたはコンテンツ取得コードを探索するステップと、
前記探索の結果発見された転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかを特定するステップと、
前記特定したオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかをもとに前記転送コードまたはコンテンツ取得コードと依存関係を持つコードを抽出するステップと
を含んだことを特徴とする解析方法。
【請求項６】
ウェブコンテンツに含まれるコードを解析する解析プログラムであって、
前記ウェブコンテンツに含まれるコードの構文解析を行うことにより、前記コードから、他のサイトへの転送コードまたはコンテンツ取得コードを探索するステップと、
前記探索の結果発見された転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかを特定するステップと、
前記特定したオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかをもとに前記転送コードまたはコンテンツ取得コードと依存関係を持つコードを抽出するステップと
をコンピュータに実行させることを特徴とする解析プログラム。
【請求項７】
ウェブコンテンツに含まれるコードを解析する解析装置であって、
前記コードの各文をノードとし、前記文同士のデータ依存関係および制御依存関係をエッジとして示したプログラム依存グラフを構築するプログラム依存グラフ構築部と、
前記プログラム依存グラフにおける転送コードまたは条件分岐文を示すノードをスライシング基準とし、前記プログラム依存グラフにおける前記スライシング基準から前記データ依存関係のエッジを辿ることで、前記スライシング基準の変数の定義参照に関連する文を抽出し、前記抽出した文それぞれから制御依存関係を示すエッジを所定数以下辿ることで、抽出した文の制御フローに関連する文を抽出し、前記スライシング基準と依存関係を持つ文をスライスとして抽出するプログラムスライシング部と
を備えることを特徴とする解析装置。
【請求項８】
前記プログラムスライシング部は、前記プログラム依存グラフの転送コードを示すノードをスライシング基準としてスライスを抽出し、
前記解析装置は、さらに、
前記抽出されたスライスがコードの実行経路を複数含む場合、前記スライスを構文解析することで、前記実行経路ごとのスライスを抽出する実行経路探索部と、
前記抽出されたスライスそれぞれをスクリプトインタプリタ部に解釈させ、前記解釈の過程で、前記転送コードに使用されるオブジェクト、オブジェクトのプロパティ、関数に代入される値、引数の少なくともいずれかを監視し、前記スライスの実行によりアクセスするウェブサイトのＵＲＬ（Uniform  Resource  Locator）を抽出するスライス実行部と、
を備えることを特徴とする請求項７に記載の解析装置。
【請求項９】
前記プログラムスライシング部は、前記プログラム依存グラフに条件分岐文を示すノードが含まれていた場合、前記条件分岐文を示すノードをスライシング基準としてスライスを抽出し、
前記解析装置は、さらに、
前記抽出されたスライスをスクリプトインタプリタ部に解釈させ、前記解釈の過程で、文字列操作に関連するオブジェクト、オブジェクトのプロパティ、関数に代入される値、引数の少なくともいずれかを監視し、前記スライスの実行において使用されるクライアント環境情報を特定するスライス実行部
を備えることを特徴とする請求項７に記載の解析装置。
【請求項１０】
前記スライス実行部により前記ＵＲＬを抽出できた場合において、前記プログラム依存グラフに条件分岐文を示すノードが含まれていたとき、
前記プログラムスライシング部は、前記プログラム依存グラフの条件分岐文を示すノードをスライシング基準としてスライスを抽出し、
前記スライス実行部は、前記抽出されたスライスをスクリプトインタプリタ部に解釈させ、前記解釈の過程で、文字列操作に関連するオブジェクト、オブジェクトのプロパティ、関数に代入される値、引数の少なくともいずれかを監視し、前記スライスの実行において使用されるクライアント環境情報を特定し、抽出した前記ＵＲＬと前記クライアント環境情報を関連付けること
を特徴とする請求項８に記載の解析装置。
【請求項１１】
ウェブコンテンツに含まれるコードを解析する解析方法であって、
前記コードの各文をノードとし、前記文同士のデータ依存関係および制御依存関係をエッジとして示したプログラム依存グラフを構築するステップと、
前記プログラム依存グラフにおける転送コードまたは条件分岐文を示すノードをスライシング基準とし、前記プログラム依存グラフにおける前記スライシング基準から前記データ依存関係のエッジを辿ることで、前記スライシング基準の変数の定義参照に関連する文を抽出し、前記抽出した文それぞれから制御依存関係を示すエッジを所定数以下辿ることで、抽出した文の制御フローに関連する文を抽出し、前記スライシング基準と依存関係を持つ文をスライスとして抽出するステップと
を含んだことを特徴とする解析方法。
【請求項１２】
ウェブコンテンツに含まれるコードを解析する解析プログラムであって、
前記コードの各文をノードとし、前記文同士のデータ依存関係および制御依存関係をエッジとして示したプログラム依存グラフを構築するステップと、
前記プログラム依存グラフにおける転送コードまたは条件分岐文を示すノードをスライシング基準とし、前記プログラム依存グラフにおける前記スライシング基準から前記データ依存関係のエッジを辿ることで、前記スライシング基準の変数の定義参照に関連する文を抽出し、前記抽出した文それぞれから制御依存関係を示すエッジを所定数以下辿ることで、抽出した文の制御フローに関連する文を抽出し、前記スライシング基準と依存関係を持つ文をスライスとして抽出するステップと
をコンピュータに実行させることを特徴とする解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、解析装置、解析方法、および、解析プログラムに関する。
【背景技術】
【０００２】
従来、ドライブバイダウンロード攻撃等のサイバー攻撃に対して、悪性なコードをブラウザのエミュレータ（以下、ブラウザエミュレータと呼ぶ。）で実行し、実行結果を解析することで悪性なコードを検知する手法が知られている（例えば、非特許文献１、非特許文献２参照）。【０００３】
このドライブバイダウンロード攻撃（Drive-by  Download攻撃）は、JavaScript（登録商標）等のコードを用いて、複数のウェブサイト（以下、踏台ＵＲＬ（Uniform  Resource  Locator）と呼ぶ。）を経由した後、攻撃コードを実行する悪性なウェブサイト（以下、攻撃ＵＲＬと呼ぶ。）へクライアントを転送する。クライアントが攻撃ＵＲＬにアクセスすると、ブラウザやブラウザのプラグイン（以下、プラグインと呼ぶ。）の脆弱性を悪用する攻撃コードが実行され、クライアントはコンピュータウィルス等の悪性プログラムをダウンロード、インストールしてしまう。【０００４】
ブラウザエミュレータは、ウェブサイトに含まれるコードの実行を関数単位で監視し、脆弱性を有するブラウザやプラグインの関数の不正な利用を検知することで、悪性なコードを検知している。悪性なコードは、ブラウザやプラグインが用意する関数の脆弱性を悪用し、長い文字列や大きな数値を入力することで、コンピュータのメモリ領域を不正に書き換えるバッファオーバーフローや、メモリの割り当て方法を不正に操作するヒープスプレーを引き起こし、攻撃コードを実行する。そのため、ブラウザエミュレータは、コードにおける脆弱なプラグインの使用や関数への文字列入力、数値入力を監視することで、悪性なコードを検知している。【０００５】
例えば、ブラウザエミュレータは、Internet  Explorer（登録商標）のプラグインであるActiveX（登録商標）に着目し、脆弱なActiveX（登録商標）コンポーネントの関数に対する攻撃コードをあらかじめシグネチャとして用意するとともに、コード実行時にシグネチャにマッチした場合、そのウェブサイトを悪性ウェブサイトと判定する（非特許文献１参照）。【０００６】
また、ブラウザエミュレータは、JavaScript（登録商標）の文字列を操作する関数（例えば、substring()）やコードを動的生成する関数（例えば、eval()）の実行回数や関数で用いる引数情報を収集し、収集した情報に基づいた機械学習による検知手法も考案されている（非特許文献２参照）。【０００７】
一方で、悪性なコードでは、幅広いアプリケーション（例えば、ブラウザはInternet  Explorer（登録商標）、Firefox（登録商標）、Opera（登録商標）等、プラグインはAdobe  Acrobat（登録商標）、Adobe  Flash  Player（登録商標）、Oracle  JRE（登録商標）等）の脆弱性が悪用される。悪用される脆弱性の種類は、ＯＳ（Operating  System）やブラウザ、プラグインの種類やバージョン（以下、クライアント環境と呼ぶ。）ごとに細分化しており、多岐にわたる。【０００８】
また、JavaScript（登録商標）では、ウェブサイトにアクセスしてきたクライアント環境を識別するブラウザフィンガープリンティング（Browser  Fingerprinting）を用いることで、クライアント環境情報を取得することができる。【０００９】
ドライブバイダウンロード攻撃における踏台ＵＲＬでは、このブラウザフィンガープリンティングを利用してクライアント環境情報を取得し、クライアント環境情報に基づいた制御文によって、攻撃対象となるクライアント環境を持つクライアントのみに、攻撃ＵＲＬへ転送するコード（以下、転送コードと呼ぶ。）や、攻撃コードを含んだコンテンツを取得するＨＴＭＬ（HyperText  Markup  Language）タグの挿入コード（以下、コンテンツ取得コードと呼ぶ。）を実行する（以下、環境依存攻撃と呼ぶ。非特許文献３参照）。したがって、上述した従来技術では、ブラウザエミュレータに設定されるクライアント環境が攻撃対象のクライアント環境とは異なる場合、攻撃ＵＲＬまで到達できないため、悪性なコードの検知技術が有効に機能しない。【００１０】
一方で、抽象構文木やプログラムスライシングといった技術を用いて、コードを網羅的に解析し、JavaScript（登録商標）に埋め込まれているＵＲＬを抽出する手法が提案されている（非特許文献４参照）。抽象構文木（Abstract  Syntax  Tree,  AST）とは、プログラム構造を抽象的な木構造で表すデータ構造である。抽象構文木を探索することで、プログラムを網羅的に解析できる。すなわち、プログラム構造に依存せずコードを解析できるため、JavaScript（登録商標）の制御文によって実行されないようなコードも静的解析することができる。【００１１】
また、プログラムスライシング（Program  Slicing）とは、スライシング基準（Slicing  Criteria）<s,v>と呼ばれる、プログラム内の任意の文sにおいて着目する変数vに関連する一部の文集合をプログラムから抽出する技術である（非特許文献５参照）。スライシング基準にしたがって抽出された文集合はスライス（Slice）と呼ばれる。このスライスを抽出する手法として、データフローに基づいたプログラムスライシング手法や依存グラフに基づいたプログラムスライシング手法が知られている。【００１２】
非特許文献４では、ウェブサイトにアクセスした際に取得したJavaScript（登録商標）全体の抽象構文木を用いて、ＵＲＬが使用されるようなコードを特定する。その後、プログラムスライシングを用いてＵＲＬに関係のないコードを除去した上で、JavaScript（登録商標）インタプリタによるコードの実行を行っている。しかし、独自のJavaScript（登録商標）インタプリタに手法を実装しており、クライアントのプラグイン情報を参照するコードには対応していない。また、検索エンジンのカバレッジ向上を目的としているため、攻撃ＵＲＬとして使用される可能性の低い、aタグやformタグ等に使用するＵＲＬも抽出している。
【先行技術文献】
【非特許文献】
【００１３】
【非特許文献１】Jose  Nazario、“PhoneyC:  A  Virtual  Client  Honeypot”、In  Proceedings  of  the  USENIX  Workshop  on  Large-Scale  Exploits  and  Emergent  Threats  (LEET)、April  2009、［平成２６年９月２日検索］、インターネット＜URL：https://www.usenix.org/legacy/events/leet09/tech/full_papers/nazario/nazario.pdf＞
【非特許文献２】Marco  Cova、Christopher  Kruegel、Giovanni  Vigna、“Detection  and  Analysis  of  Drive-by-Download  Attacks  and  Malicious  JavaScript  Code”、In  Proceedings  of  the  World  Wide  Web  Conference  (WWW)、April  2010、［平成２６年９月２日検索］、インターネット＜URL：http://www.cs.ucsb.edu/~vigna/publications/2010_cova_kruegel_vigna_Wepawet.pdf＞
【非特許文献３】高田雄太、秋山満昭、針生剛男、“ドライブバイダウンロード攻撃に使用される悪性なJavaScriptの実態調査”、電子情報通信学会、情報通信システムセキュリティ研究会、2014年3月、［平成２６年９月２日検索］、インターネット＜URL:http://www.ieice.org/ken/paper/20140327QBlZ/＞
【非特許文献４】Qi  Wang、Jingyu  Zhou、Yizhou  Zhang、Jianjun  Zhao、“Extracting  URLs  from  JavaScript  via  Program  Analysis”、In  Proceedings  of  the  9th  joint  meeting  of  the  European  Software  Engineering  Conference  and  the  ACM  SIGSOFT  Symposium  on  the  Foundations  of  Software  Engineering、August  2013、[平成２６年９月２日検索］、インターネット＜URL:http://stap.sjtu.edu.cn/images/2/2e/ExtractingAnalysis.pdf＞
【非特許文献５】Mark  Weiser、“PROGRAM  SLICING”、In  Proceedings  of  the  5th  International  Conference  on  Software  Engineering、1981、［平成２６年９月２日検索］、インターネット＜URL:http://dl.acm.org/citation.cfm?id=802557＞
【発明の概要】
【発明が解決しようとする課題】
【００１４】
従来技術は、コードの制御文に依存する転送コードやコンテンツ取得コードを考慮していないため、例えば、ドライブバイダウンロード攻撃を行うコードの制御文によって、踏台ＵＲＬや攻撃ＵＲＬへ転送されないという問題があった。その結果、悪性コードの検知技術が有効に機能せず、悪性コードを検知できないおそれがあった。【００１５】
例えば、ある踏台ＵＲＬにおいて、ブラウザフィンガープリンティングを用いてJRE（登録商標）のバージョン情報を取得し、JRE（登録商標）バージョン７に対してのみ、攻撃ＵＲＬへの転送コードを実行するよう制御を加えたJavaScript（登録商標）コードが使用された場合に、JRE（登録商標）をインストールしていないクライアント環境やJRE（登録商標）バージョン７以外のJRE（登録商標）をインストールしたクライアント環境では、転送コードを実行することができない。その結果、クライアントからのアクセスは踏台ＵＲＬや攻撃ＵＲＬに転送されないので、悪性コードの検知技術が有効に機能せず、悪性コードを検知できない。【００１６】
そこで、本発明は前記した問題を解決し、クライアント環境に依存してドライブバイダウンロード攻撃を行うコードを解析することを課題とする。
【課題を解決するための手段】
【００１７】
前記した課題を解決するため、本発明は、ウェブコンテンツに含まれるコードを解析する解析装置であって、前記ウェブコンテンツに含まれるコードの構文解析を行うことにより、前記コードから、他のサイトへの転送コードまたはコンテンツ取得コードを探索し、前記探索の結果発見された転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかを特定する構文解析部と、前記特定したオブジェクト、オブジェクトのプロパティ、および、関数の少なくともいずれかをもとに前記転送コードまたはコンテンツ取得コードと依存関係を持つコードを抽出するプログラムスライシング部とを備えることを特徴とする。
【発明の効果】
【００１８】
本発明によれば、クライアント環境に依存してドライブバイダウンロード攻撃を行うコードを解析できる。その結果、例えば、当該コードからドライブバイダウンロード攻撃において攻撃ＵＲＬや踏台ＵＲＬに用いられる可能性の高いＵＲＬを抽出できる。
【図面の簡単な説明】
【００１９】
【図１】図１は、システムの構成例を示す図である。
【図２】図２は、ブラウザエミュレータマネージャの構成例を示す図である。
【図３】図３は、プログラム解析部による解析対象のコードの例を示す図である。
【図４】図４は、転送コードおよびコンテンツ取得コードの例を示す図である。
【図５】図５は、抽象構文木の例を示す図である。
【図６】図６は、プログラム依存グラフの例を示す図である。
【図７】図７は、スライスの例を示す図である。
【図８】図８は、解析情報データベースに登録される解析情報の例を示す図である。
【図９】図９は、システムの処理手順の例を示すフローチャートである。
【図１０】図１０は、図９のコード解析の処理手順の例を示すフローチャートである。
【図１１】図１１は、図９のコード解析の処理手順の例を示すフローチャートである。
【図１２】図１２は、システムの構成例を示す図である。
【図１３】図１３は、ブラウザエミュレータマネージャの構成例を示す図である。
【図１４】図１４は、プログラム解析部による解析対象のコードの例を示す図である。
【図１５】図１５は、スクリプト転送コード、タグ転送コード、コードに使用されるＨＴＭＬタグとその属性名のペアの例を示す図である。
【図１６】図１６は、プログラム依存グラフの例を示す図である。
【図１７】図１７は、スライシング基準＜14，location.href＞で抽出対象となるノードの例を示す図である。
【図１８】図１８は、スライシング基準＜14，location.href＞で抽出されるスライスを説明するための図である。
【図１９】図１９は、実行経路探索部により抽出されるスライスを説明するための図である。
【図２０】図２０は、スライシング基準＜5，if＞で抽出対象となるノードの例を示す図である。
【図２１】図２１は、スライシング基準＜5，if＞で抽出されるスライスを説明するための図である。
【図２２】図２２は、解析情報データベースに記憶される解析情報の例を示す図である。
【図２３】図２３は、システムの処理手順の例を示すフローチャートである。
【図２４】図２４は、図２３のコード解析の処理手順の例を示すフローチャートである。
【図２５】図２５は、図２３のコード解析の処理手順の例を示すフローチャートである。
【図２６】図２６は、図２３のコード解析の処理手順の例を示すフローチャートである。
【図２７】図２７は、図２５および図２６のスライスの抽出の処理手順の例を示すフローチャートである。
【図２８】図２８は、解析プログラムを実行するコンピュータを示す図である。
【発明を実施するための形態】
【００２０】
以下、図面を参照しながら、本発明を実施するための形態（実施形態）について説明する。本発明は本実施形態に限定されない。
【００２１】
［第１の実施形態］
まず、図１を用いて第１の実施形態のシステムの構成例を説明する。システムは、例えば、図１に示すようにネットワーク１とネットワーク２とを備える。ネットワーク１とネットワーク２とはパケット転送装置３により接続される。
【００２２】
ネットワーク１は、解析対象ウェブサイト１２を備える。ネットワーク１は、インターネットのように広域なネットワークであってもよいし、法人ネットワークのように中小規模なネットワークや、クラウド環境やホスティング環境のネットワークであってもよい。
【００２３】
解析対象ウェブサイト１２は、ブラウザエミュレータマネージャ（解析装置）２３による解析対象のウェブサイトである。この解析対象ウェブサイト１２は、例えば、公開されている悪性ウェブサイトのブラックリストに掲載されているウェブサイト等である。
【００２４】
また、ネットワーク２は、ブラウザエミュレータマネージャ２３と、解析情報データベース２４とを備える。ネットワーク２は、ローカルエリアネットワークのように小規模なネットワークであってもよいし、法人ネットワークのように中小規模なネットワークである場合やクラウド環境やホスティング環境のネットワークであってもよい。
【００２５】
ブラウザエミュレータマネージャ２３は、１以上のブラウザエミュレータ２５を管理し、このブラウザエミュレータ２５に所定のウェブサイト（解析対象ウェブサイト１２）へアクセスさせる。そして、ブラウザエミュレータマネージャ２３は、ブラウザエミュレータ２５がアクセスしたウェブサイトのＵＲＬや、当該ウェブサイトから取得したコードの解析により得られたＵＲＬ等を解析情報データベース２４へ蓄積する。
【００２６】
ブラウザエミュレータ２５は、ブラウザの動作を模擬する装置である。このブラウザエミュレータ２５は、例えば、ハニーネットプロジェクトが提供しているブラウザエミュレータや、オープンソースとして開発されたHtmlUnitやSeleniumが適用できる。このブラウザエミュレータ２５の詳細は後記する。なお、図１においてブラウザエミュレータ２５はブラウザエミュレータマネージャ２３内に構築されるように描かれているが、ブラウザエミュレータマネージャ２３外に構築されてももちろんよい。
【００２７】
解析情報データベース２４は、ブラウザエミュレータ２５がアクセスしたウェブサイトのＵＲＬや、当該ウェブサイトから取得したコードの解析により得られたＵＲＬ等を蓄積（保存）する。この解析情報データベース２４におけるデータの保存は、ＲＤＢＭＳ（Relational  DataBase  Management  System）を用いてもよいし、テキスト形式で保存してもよい。この解析情報データベース２４の詳細は後記する。
【００２８】
なお、本実施形態では、ブラウザエミュレータ２５、ブラウザエミュレータマネージャ２３および解析情報データベース２４を同じネットワークに配置しているが、それぞれ別ネットワークに配置してもよい。また、各構成をセキュアに接続するため、既存の暗号技術を適用して通信情報を暗号化したり、各装置が配置されたネットワーク間または各構成間をＶＰＮ（Virtual  Private  Network）で接続したりしてもよい。
【００２９】
次に、図２を用いてブラウザエミュレータマネージャ２３およびブラウザエミュレータ２５を詳細に説明する。ブラウザエミュレータマネージャ２３はブラウザエミュレータ２５および制御部２７を備える。制御部２７は、ホストシステム２６上でブラウザエミュレータ２５を動作させる。このホストシステム２６は、例えば、ブラウザエミュレータマネージャ２３が備えるＯＳを用いる。制御部２７の詳細は後記する。
【００３０】
（ブラウザエミュレータ）
次に、ブラウザエミュレータ２５を説明する。ブラウザエミュレータ２５は、クライアント環境模擬部２５１と、アクセス部２５２と、ＨＴＭＬ／ＣＳＳ（HyperText  Markup  Language／Cascading  Style  Sheets）パーサ２５３と、スクリプトインタプリタ部２５４とを備える。
【００３１】
クライアント環境模擬部２５１は、ブラウザエミュレータ２５が模擬すべきクライアント環境（例えば、ＯＳ、ブラウザ、プラグイン等）の情報を設定する。
【００３２】
アクセス部２５２は、ウェブサイト（例えば、図１の解析対象ウェブサイト１２）と、ＨＴＴＰ（HyperText  Transfer  Protocol）またはＨＴＴＰＳ（HyperText  Transfer  Protocol  Secure）による通信を行い、当該ウェブサイトからウェブコンテンツを取得する。ここでアクセス部２５２は、ＨＴＴＰまたはＨＴＴＰＳによる通信時、ＨＴＴＰヘッダのUser-Agentフィールドに、クライアント環境模擬部２５１で設定したクライアント環境を使用する。これによりブラウザエミュレータ２５は、クライアント環境を模擬する。このアクセス部２５２には、例えば、フリーソフトウェアとして開発されたcURLを用いる。
【００３３】
また、アクセス部２５２は、ウェブサイトへのアクセス結果をアクセスログに記録する。例えば、アクセス部２５２は、アクセスしたウェブサイトのＵＲＬや、アクセスした日時をアクセスログに記録する。また、アクセス部２５２は当該ウェブサイトへアクセスした結果、別のウェブサイトに遷移した場合、その遷移先のＵＲＬ等もアクセスログに記録する。
【００３４】
ＨＴＭＬ／ＣＳＳパーサ２５３は、アクセス部２５２で取得したウェブコンテンツを解釈する。また、ＨＴＭＬ／ＣＳＳパーサ２５３は、ウェブコンテンツを解釈した結果、当該ウェブコンテンツにコードが含まれる場合、スクリプトインタプリタ部２５４を用いてコードを解釈する。
【００３５】
スクリプトインタプリタ部２５４は、ウェブコンテンツに含まれるコードを解釈する。例えば、コードがJavaScript（登録商標）により記述されている場合、スクリプトインタプリタ部２５４は、オープンソースとして開発されたSpiderMonkeyやV8  JavaScript（登録商標）Engine等のJavaScript（登録商標）インタプリタ、Java（登録商標）で記述されたJavaScript（登録商標）インタプリタであるRhino等を用いてコードを解釈する。
【００３６】
（制御部）
次に、制御部２７を説明する。制御部２７は、ＵＲＬリスト作成部２７１と、アクセス指示部２７２と、プログラム解析部２７３と、登録処理部２７８と、ＵＲＬ解析部２７９とを備える。
【００３７】
ＵＲＬリスト作成部２７１は、各ブラウザエミュレータ２５が巡回するウェブサイト（解析対象ウェブサイト１２）のＵＲＬリストである巡回対象ＵＲＬリストを作成する。例えば、ＵＲＬリスト作成部２７１は、公開されている悪性ウェブサイトのブラックリストに掲載されているウェブサイトのＵＲＬをもとに巡回対象ＵＲＬリストを作成する。
【００３８】
アクセス指示部２７２は、各ブラウザエミュレータ２５のアクセス部２５２へ巡回対象ＵＲＬリスト（ＵＲＬリスト）に示されるＵＲＬへのアクセスを指示する。
【００３９】
プログラム解析部２７３は、アクセス先のウェブサイトから取得したウェブコンテンツに含まれるプログラム（コード）の解析を行う。このプログラム解析部２７３の詳細は後記する。
【００４０】
登録処理部２７８は、各ブラウザエミュレータ２５のアクセスログを取得し、解析情報データベース２４に登録する。また、登録処理部２７８は、プログラム解析部２７３によるコードの解析（後記するスライスの実行）により得られたＵＲＬを解析情報データベース２４に登録する。
【００４１】
ＵＲＬ解析部２７９は、解析情報データベース２４に蓄積されたアクセスログやコード解析により得られたＵＲＬ（解析情報）を解析し、その解析結果を出力する。例えば、ＵＲＬ解析部２７９は、アクセスログに含まれるＵＲＬや、コード解析により得られたＵＲＬから、攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬを抽出し、出力する。
【００４２】
次に、プログラム解析部２７３を詳細に説明する。プログラム解析部２７３は、構文解析部２７４と、プログラム依存グラフ構築部２７５と、プログラムスライシング部（抽出部）２７６と、スライス実行部２７７とを備える。
【００４３】
構文解析部２７４は、ブラウザエミュレータ２５により取得されたウェブコンテンツに含まれるコードの構文解析を行う。具体的には、ブラウザエミュレータ２５のスクリプトインタプリタ部２５４がウェブコンテンツに含まれるコードのスクリプトを解釈する過程で、スクリプトの構文解析を行い、ウェブコンテンツに含まれるコードから、他のサイトへの転送コードまたはコンテンツ取得コードを探索する。そして、構文解析部２７４は、探索の結果発見された転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、関数を特定する。
【００４４】
この構文解析の具体例を説明する。ここでの解析対象のコードは、例えば、図３に示すようなJavaScript（登録商標）により記述されたコードであるものとする。なお、図３に示すコードはJREのバージョン情報をもとに制御命令を実行後、他のサイトへの転送を実行する転送コード、または、他のサイトからコンテンツを取得するコンテンツ取得コードを実行するコードである。また、構文解析部２７４が探索対象とする転送コードおよびコンテンツ取得コードは、図４の符号４０１および符号４０２に示すコードであるものとする。なお、符号４０２に示すコンテンツ取得コードは、所定のＨＴＭＬタグにおいて所定の属性名に代入されるＵＲＬをもとに、外部コンテンツを取得するコードである。このコンテンツ取得コードで使用されるＨＴＭＬタグとその外部コンテンツのＵＲＬを指定する属性名のペアは、例えば、符号４０３に示すＨＴＭＬタグおよび属性名のペアであるものとする。これらのコードに関する情報（探索対象コード情報）は、ブラウザエミュレータマネージャ２３の記憶部（図示省略）の所定領域に記憶され、管理者等が適宜設定可能である。
【００４５】
例えば、構文解析部２７４は、図３のコードの制御文部分（図３の５行目から１２行目まで）を、Rhinoに搭載されているJavaScript（登録商標）コードの抽象構文木解析機能を用いて図５に示す抽象構文木に変換する。この抽象構文木における各ノード（以下、ASTノードと呼ぶ。）に記されているラベルについて説明する。
【００４６】
IfStatementは、JavaScript（登録商標）におけるif文を意味し、子ASTノードの左から条件文、THEN文、ELSE文を意味している。Scopeは、コード中のスコープの範囲（｛｝）を表しており、ExpressionStatementは、文の終わりを示すセミコロン（;）を含む文一行を表している。７行目に該当する抽象構文木に含まれるFunctionCallは、関数実行を意味し、子ASTノードの左から、関数名、引数１、引数２・・・と続く。FunctionCallの関数名にあたるPropertyGetは、オブジェクトのプロパティ参照を意味し、Nameは、オブジェクト名や関数名、プロパティ名を意味する。FunctionCallの引数１にあたるStringLiteralは文字列を表している。さらに引数２のInfixExpressionは二項演算を意味し、子ASTノードはそれぞれ左辺と右辺を表している。図３のコードの１１行目に該当する抽象構文木に含まれるAssignmentは、代入文を意味し、子ASTノードはそれぞれ左辺と右辺を意味する。また、図５における三角形のノードのSubTree1〜3は、SubTree1が図３のコードの５行目の条件文、SubTree2が図３のコードの６行目の文、SubTree3が図３のコードの８行目の文を表しており、他と同様に抽象構文木が含まれる。
【００４７】
例えば、構文解析部２７４は、図５に示す抽象構文木から、図４に示す転送コードおよびコンテンツ取得コードに関連するASTノードとして、図５中の太線で強調したASTノード（setAttribute、location、hrefのASTノード）を探索する。
【００４８】
構文解析部２７４は、このように抽象構文木を網羅的に探索することで、制御文により実行されない転送コードやコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、関数についても特定できる。
【００４９】
なお、構文解析部２７４は、上記の方法以外の方法でコードの構文解析を行ってももちろんよい。
【００５０】
図２のプログラム依存グラフ構築部２７５は、構文解析部２７４による探索の結果、探索対象のコード（つまり、転送コードまたはコンテンツ転送コード）が発見されたとき、ウェブコンテンツから取得したコードの各文をノードとし、ノード間におけるデータ依存関係および制御依存関係を示したプログラム依存グラフを構築する。そして、プログラム依存グラフ構築部２７５は構築したプログラム依存グラフを用いて、発見された転送コードまたはコンテンツ転送コードに関連するノードを特定する。
【００５１】
例えば、プログラム依存グラフ構築部２７５は、JavaScript（登録商標）コードにおける変数定義文、代入文、関数定義文、関数実行文、リターン文、条件分岐文、ループ文、例外処理文等をプログラム依存グラフ（Program  Dependence  Graph）におけるノード（以下、PDGノードと呼ぶ。）とし、ノード間のデータ依存関係や制御依存関係をエッジ（以下、PDGエッジと呼ぶ。）としたプログラム依存グラフを構築する。
【００５２】
例えば、プログラム依存グラフ構築部２７５は、図３に示すコードから、図６に示すプログラム依存グラフを構築する。図６に示すプログラム依存グラフの各PDGノードに記されているラベルについて説明する。VariableInitializerは、変数定義を意味し、定義対象となる変数名も併記している。IfStatement、Assignment、FunctionCallは、図５に示した抽象構文木におけるラベルの意味と同じであり、条件文やオブジェクト名、関数名を併記している。また、図６に示すプログラム依存グラフの実線矢印で示すPDGエッジはデータ依存関係を表しており、破線矢印で示すPDGエッジは制御依存関係を表している。例えば、図６に示すプログラム依存グラフにおいて、FunctionCall  ifr.setAttributeは、VariableInitializer  src、VariableInitializer  jre、VariableInitializer  ifrとデータ依存関係があり、また、IfStatement  jre[1]==“6”と制御依存関係があることを示す。
【００５３】
プログラム依存グラフ構築部２７５は、このようなプログラム依存グラフから、構文解析部２７４で特定したコード（ASTノード）に関連するPDGノードを特定する。例えば、構文解析部２７４が図５に示す抽象構文木において太線で強調したASTノード（setAttribute、location、href）を特定した場合、プログラム依存グラフ構築部２７５は、このASTノードに関連するPDGノードとして図６の太線で強調したPDGノード（FunctionCall  ifr.setAttribute、Assignment  location.href）を特定する。
【００５４】
図２のプログラムスライシング部２７６は、ウェブコンテンツから取得したコードのうち、プログラム依存グラフ構築部２７５により特定されたプログラム依存グラフのノード（例えば、図６の太線で強調したPDGノード）の文をスライシング基準とし、プログラム依存グラフから、スライスを抽出する。つまり、プログラムスライシング部２７６は、プログラム依存グラフにおけるデータ依存関係（図６の実線矢印参照）を用いて逆方向スライスを適用し、転送コードまたはコンテンツ取得コードに関連するスライスを抽出する。なお、一般的に、スライスを抽出するときには、プログラム依存グラフにおける制御依存関係を考慮するが、プログラムスライシング部２７６は、プログラム依存グラフにおける制御依存関係は考慮せず、データ依存関係を考慮した逆方向スライスを適用することで、コードの制御文に依存しないスライスを抽出する。
【００５５】
プログラムスライシング部２７６は、例えば、図６に示すプログラム依存グラフを用いて、太線で強調したPDGノード（FunctionCall  ifr.setAttribute、Assignment  location.href）の文をスライシング基準（図３に示すコードの７行目のsetAttribute()：＜7,setAttribute＞と１１行目のlocation.href：＜11,location.href＞）とし、スライスを抽出する。例えば、プログラムスライシング部２７６はスライシング基準＜7,setAttribute＞により、図３に示すコードの７行目のsetAttributeの文とデータ依存関係のある文をスライスとして抽出する（図７の符号７０１→符号７０２参照）。なお、ここでは説明を省略するが、プログラムスライシング部２７６は、スライシング基準＜11,location.href＞についても同様に、スライスを抽出する。
【００５６】
図２のスライス実行部２７７は、プログラムスライシング部２７６で抽出したスライスをスクリプトインタプリタ部２５４に実行させる。つまり、スライス実行部２７７はプログラムスライシング部２７６で抽出したスライスをスクリプトインタプリタ部２５４に解釈させ、その解釈の過程で、転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、関数に代入される値の引数を監視し、ＵＲＬを抽出する。
【００５７】
例えば、ブラウザエミュレータ２５がJRE（登録商標）バージョン７がインストールされたクライアント環境を模擬している場合を考える。この場合、スライス実行部２７７は、ブラウザエミュレータ２５のスクリプトインタプリタ部２５４に図７の符号７０２に示すスライスを実行させ、転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、関数に代入される値の引数を監視すると、例えば、監視しているsetAttribute()関数の引数２から、http://example.com/exploit/?jre=7というＵＲＬを抽出する。
【００５８】
ただし、スライス実行部２７７は、ＤＯＭ（Document  Object  Model）を操作するコードを実行できるよう、ＤＯＭの読み込みが完了したタイミング（例えば、Firefox（登録商標）、Google  Chrome（登録商標）におけるDOMContentLoadedイベントの直前）で、スライスを実行する。また、スライス実行部２７７は、スライスを実行した結果が本来のJavaScript（登録商標）等の処理に影響を与えないよう、スライスを実行する時点のＤＯＭ情報（ＤＯＭツリーの構造や値）およびJavaScript（登録商標）のコンテキスト情報（例えば、変数定義や関数定義等）は、スライス実行用に複製し、スライスを実行した後は破棄するものとする。
【００５９】
また、ブラウザエミュレータ２５のアクセス部２５２は、スライスの実行により抽出されたＵＲＬ（例えば、図８に示す解析情報の「スライス」が「１」のＵＲＬ）にアクセスすることで、さらにウェブコンテンツを取得し、取得したウェブコンテンツにコードが含まれていた場合は、上記と同様にスクリプトインタプリタ部２５４によるスクリプトの解釈と、構文解析部２７４、プログラム依存グラフ構築部２７５、プログラムスライシング部２７６およびスライス実行部２７７による処理とを実行する。つまり、ブラウザエミュレータマネージャ２３は、スライスの実行により抽出されたＵＲＬに対し再帰的な解析を行う。これにより、ブラウザエミュレータマネージャ２３は攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬをより多く抽出することができる。
【００６０】
なお、ブラウザエミュレータマネージャ２３が上記のようなスライスの実行により抽出されたＵＲＬに対し再帰的な解析を行うか否かは、監視対象のオブジェクトやオブジェクトのプロパティ、関数に応じて、システムの管理者等が適宜設定するようにしてもよい。
【００６１】
（解析情報データベース）
次に解析情報データベース２４を説明する。前記したとおり、解析情報データベース２４は、解析情報を記憶する。解析情報は、例えば、図８に示すとおり、解析情報の識別情報である解析ＩＤ、ブラウザエミュレータ２５が解析対象ウェブサイトのＵＲＬにアクセスした際にアクセスしたＵＲＬである「アクセスＵＲＬ」、当該ＵＲＬにアクセスした日時を示す「タイムスタンプ」、当該ＵＲＬがプログラムスライシングによって抽出されたＵＲＬか否かを表す「スライス」等を対応付けた情報である。なお、この解析情報における「スライス」の項目が「１」のＵＲＬは当該ＵＲＬがプログラムスライシングにより抽出されたＵＲＬであることを示し、「スライス」の項目が「０」のＵＲＬは当該ＵＲＬがプログラムスライシングにより抽出されたＵＲＬではないことを示す。また、「アクセスＵＲＬ」は、解析対象ウェブサイトのＵＲＬのみならず、当該ＵＲＬへのアクセスにより転送されたウェブサイトのＵＲＬも含む。なお、解析情報は、上記以外の情報を含んでいてももちろんよい。
【００６２】
以上説明したシステムによれば、ウェブコンテンツから取得したコードを網羅的に探索し、転送コードやコンテンツ取得コードを特定する。そして、その特定した転送コードやコンテンツ取得コードからＵＲＬを抽出する。その結果、システムは、クライアントの環境に依存して行われるドライブバイダウンロード攻撃において攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬを抽出することができる。
【００６３】
（処理手順）
次に、図９を用いて、システムの処理手順の例を説明する。まず、ＵＲＬリスト作成部２７１は、巡回対象ＵＲＬリストを作成する（Ｓ１）。例えば、ＵＲＬリスト作成部２７１は、公開されている悪性ウェブサイトのブラックリストをもとに巡回対象ＵＲＬリストを作成する。
【００６４】
そして、アクセス指示部２７２は、ブラウザエミュレータ２５に巡回対象ＵＲＬリストのＵＲＬを入力し（Ｓ２）、ブラウザエミュレータ２５はアクセス部２５２で、Ｓ２で入力されたＵＲＬにアクセスする（Ｓ３）。そして、アクセス部２５２は、アクセス先のＵＲＬからウェブコンテンツを取得する。
【００６５】
なお、Ｓ２においてアクセス指示部２７２は、１つのブラウザエミュレータ２５に複数のＵＲＬへアクセスさせてもよいし、複数のブラウザエミュレータ２５にそれぞれ異なるＵＲＬへアクセスさせるようにしてもよい。
【００６６】
Ｓ３の後、ブラウザエミュレータ２５のＨＴＭＬ／ＣＳＳパーサ２５３は、取得したウェブコンテンツを解釈し、スクリプトインタプリタ部２５４において取得したウェブコンテンツにコードが含まれていれば、このコードを解釈し、プログラム解析部２７３においてコード解析を行う（Ｓ４）。このコード解析の詳細は後記する。
【００６７】
Ｓ４の後、アクセス部２５２はアクセスログを出力する（Ｓ５）。つまり、アクセス部２５２は、アクセス指示部２７２により入力されたＵＲＬへのアクセス結果をアクセスログとして出力する。そして、登録処理部２７８は、Ｓ５で出力されたアクセスログ、Ｓ４のコード解析により出力されたＵＲＬを整形し（Ｓ６）、整形されたデータを解析情報データベース２４（図８参照）に蓄積する（Ｓ７）。
【００６８】
ここで、スライス実行部２７７によるスライスの実行により抽出されたＵＲＬを解析する旨が設定されていれば（Ｓ８でＹｅｓ）、アクセス指示部２７２は、解析情報データベース２４の解析情報からスライスの実行により抽出されたＵＲＬを読み出し、当該ＵＲＬを巡回対象ＵＲＬのＵＲＬとしてＳ２以降の処理を行う。つまり、ブラウザエミュレータマネージャ２３はスライスの実行により抽出されたＵＲＬに対し再帰的な解析を行う。
【００６９】
なお、Ｓ８において、スライスの実行により抽出されたＵＲＬを解析する旨が設定されておらず（Ｓ８でＮｏ）、巡回対象ＵＲＬリストに次の巡回ＵＲＬが存在すれば（Ｓ９でＹｅｓ）、Ｓ２へ戻る。一方、巡回対象ＵＲＬリストに次の巡回ＵＲＬが存在しなければ（Ｓ９でＮｏ）、処理を終了する。
【００７０】
上記のようにして解析情報データベース２４に解析情報が蓄積されると、ＵＲＬ解析部２７９は、解析情報のＵＲＬの解析処理を行い、例えば、攻撃ＵＲＬや踏台ＵＲＬである可能性の高いＵＲＬを抽出する。
【００７１】
次に、図１０および図１１を用いて、図９のＳ４のコード解析処理を詳細に説明する。ここでは、構文解析部２７４がコードの構文解析を行う際に、抽象構文木（図５参照）を用いる場合を例に説明する。
【００７２】
まず、構文解析部２７４はウェブコンテンツから取得したコードを抽象構文木（図５参照）に変換する（図１０のＳ１１）。ここで、抽象構文木に探索対象となる抽象構文木ノードが存在した場合（Ｓ１２でＹｅｓ）、プログラム依存グラフ構築部２７５は、プログラム依存グラフ（図６参照）を構築する（Ｓ１３）。一方、抽象構文木に探索対象となる抽象構文木ノードが存在しない場合（Ｓ１２でＮｏ）、図１１のＳ１８へ進む。
【００７３】
また、Ｓ１３の後、探索対象となる抽象構文木ノードが転送コードまたはコンテンツ取得コードに関連するノードである場合（Ｓ１４でＹｅｓ）、プログラム依存グラフ構築部２７５は、その抽象構文木ノードに関連するプログラム依存グラフノードを特定する（Ｓ１５）。そして、プログラム依存グラフ構築部２７５は、Ｓ１５で特定したプログラム依存グラフノードを、スライシング基準に使用するノードとして保持する（Ｓ１６）。一方、Ｓ１４において探索対象となる抽象構文木ノードが転送コード、コンテンツ取得コードいずれにも関連しないノードである場合（Ｓ１４でＮｏ）、Ｓ１７へ進む。
【００７４】
Ｓ１７においてプログラム依存グラフ構築部２７５が、次の探索対象となる抽象構文木ノードが存在すると判断したとき（Ｓ１７でＹｅｓ）、Ｓ１３へ戻る。一方、次の探索対象となる抽象構文木ノードが存在しない判断したとき（Ｓ１７でＮｏ）、図１１のＳ１８へ進む。
【００７５】
図１１のＳ１８において、プログラム依存グラフ構築部２７５が、スライシング基準として保持したプログラム依存グラフノードが存在すると判断したとき（Ｓ１８でＹｅｓ）、プログラムスライシング部２７６は、Ｓ１６で保持したプログラム依存グラフノードの文をスライシング基準とし、スライスの抽出を行う（Ｓ１９）。なお、Ｓ１８においてプログラム依存グラフ構築部２７５が、スライシング基準として保持したプログラム依存グラフノードは存在しないと判断したとき（Ｓ１８でＮｏ）、処理を終了する。
【００７６】
Ｓ１９の後、スライス実行部２７７は、Ｓ１９で抽出されたスライスを実行し（Ｓ２０）、転送コードやコンテンツ取得コードに使用されるオブジェクトやオブジェクトのプロパティ、関数に代入される値や引数からＵＲＬを抽出し、出力する（Ｓ２１）。Ｓ２１の後、次のスライシング基準となるプログラム依存グラフノードがまだ存在すれば（Ｓ２２でＹｅｓ）、Ｓ１９へ戻り、次のスライシング基準となるプログラム依存グラフノードが存在しなければ（Ｓ２２でＮｏ）、処理を終了する。
【００７７】
以上説明したシステムによれば、ウェブコンテンツから取得したコードを網羅的に探索し、転送コードやコンテンツ取得コードを特定する。そして、その特定した転送コードやコンテンツ取得コードからＵＲＬを抽出する。その結果、システムは、クライアントの環境に依存して行われるドライブバイダウンロード攻撃において攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬを抽出することができる。
【００７８】
なお、構文解析部２７４において特定するオブジェクト、オブジェクトのプロパティ、関数は、転送コードやコンテンツ取得コードに関するものに限定されず、目的に応じて適宜変更可能である。
【００７９】
また、プログラム依存グラフ構築部２７５において、JavaScript（登録商標）コードの文のうち、プログラム依存グラフにおけるプログラム依存グラフノードとする文は、変数定義文、代入文、関数定義文、関数実行文、リターン文、条件分岐文、ループ文、例外処理文等としたが、これら以外にも、システムの管理者等が適宜追加、変更してもよい。
【００８０】
なお、プログラム解析部２７３がコード解析の結果、出力する情報はＵＲＬ以外の情報であってもよい。例えば、攻撃コードに使用されるオブジェクトやオブジェクトのプロパティ、関数の情報が事前に分かっていれば、プログラム解析部２７３は、これらの情報を用いて攻撃コードを特定し、特定した攻撃コードに使用される各種情報を出力してもよい。
【００８１】
また、システムは、ブラウザエミュレータ２５を用いて解析対象ウェブサイト１２にアクセスすることとしたが、ブラウザエミュレータ２５以外（例えば、実際のクライアント環境）を用いて解析対象ウェブサイト１２にアクセスしてもよい。
【００８２】
また、システムのプログラムスライシング部２７６は、プログラム依存グラフ構築部２７５により構築されたプログラム依存グラフにおける制御依存関係を考慮せず、データ依存関係に基づきスライスを抽出することとしたが、これに限定されない。例えば、プログラムスライシング部２７６は、プログラム依存グラフにおける制御依存関係の一部とデータ依存関係とを用いてスライスを抽出してもよい。さらに、プログラムスライシング部２７６は、プログラム依存グラフを用いてスライスを抽出することとしたが、各コードの制御依存関係とデータ依存関係とが把握できれば、プログラム依存グラフを用いなくてもよい。
【００８３】
［第２の実施形態］
次に、図１２を用いて第２の実施形態のシステムの構成例を説明する。第２の実施形態では、制御依存関係を考慮に入れたスライスの抽出方法ならびに転送されるために必要なクライアント環境を特定する方法を説明する。第２の実施形態は、抽出したスライスに実行経路が含まれる場合に、網羅的にＵＲＬを抽出するため、実行経路ごとにスライスを抽出する実行経路探索部２７０ａと、抽出した攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬへ転送されるために必要なクライアント環境を特定するため、プログラム依存グラフにおける条件分岐文を示すノードもスライシング基準として加えるプログラムスライシング部２７６ａと、を備えることを特徴とする。システムは、例えば、図１２に示すようにネットワーク１ａとネットワーク２ａとを備える。ネットワーク１ａとネットワーク２ａとはパケット転送装置３ａにより接続される。
【００８４】
ネットワーク１ａは、解析対象ウェブサイト１２ａを備える。ネットワーク１ａは、インターネットのように広域なネットワークであってもよいし、法人ネットワークのように中小規模なネットワークや、クラウド環境やホスティング環境のネットワークであってもよい。
【００８５】
解析対象ウェブサイト１２ａは、ブラウザエミュレータマネージャ（解析装置）２３ａによる解析対象のウェブサイトである。この解析対象ウェブサイト１２ａは、例えば、公開されている悪性ウェブサイトのブラックリストに掲載されているウェブサイト等である。
【００８６】
また、ネットワーク２ａは、ブラウザエミュレータマネージャ２３ａと、解析情報データベース２４ａとを備える。ネットワーク２ａは、ローカルエリアネットワークのように小規模なネットワークであってもよいし、法人ネットワークのように中小規模なネットワークである場合やクラウド環境やホスティング環境のネットワークであってもよい。
【００８７】
ブラウザエミュレータマネージャ２３ａは、１以上のブラウザエミュレータ２５ａを管理し、このブラウザエミュレータ２５ａに所定のウェブサイト（解析対象ウェブサイト１２ａ）へアクセスさせる。そして、ブラウザエミュレータマネージャ２３ａは、ブラウザエミュレータ２５ａがアクセスしたウェブサイトのＵＲＬや、当該ウェブサイトから取得したコードの解析により得られたＵＲＬ等を解析情報データベース２４ａへ蓄積する。
【００８８】
ブラウザエミュレータ２５ａは、ブラウザの動作を模擬する装置である。このブラウザエミュレータ２５ａは、例えば、ハニーネットプロジェクトが提供しているブラウザエミュレータ（http://www.honeynet.org/node/827参照）や、オープンソースとして開発されたHtmlUnitやSeleniumが適用できる。このブラウザエミュレータ２５ａの詳細は後記する。なお、図１２においてブラウザエミュレータ２５ａはブラウザエミュレータマネージャ２３ａ内に構築されるように描かれているが、ブラウザエミュレータマネージャ２３ａ外に構築されてももちろんよい。
【００８９】
解析情報データベース２４ａは、ブラウザエミュレータ２５ａがアクセスしたウェブサイトのＵＲＬや、当該ウェブサイトから取得したコードの解析により得られたＵＲＬ等を蓄積（保存）する。この解析情報データベース２４ａにおけるデータの保存は、ＲＤＢＭS（Relational  DataBase  Management  System）を用いてもよいし、テキスト形式で保存してもよい。この解析情報データベース２４ａの詳細は後記する。
【００９０】
なお、本実施形態では、ブラウザエミュレータ２５ａ、ブラウザエミュレータマネージャ２３ａおよび解析情報データベース２４ａを同じネットワークに配置しているが、それぞれ別ネットワークに配置してもよい。また、各構成をセキュアに接続するため、既存の暗号技術を適用して通信情報を暗号化したり、各装置が配置されたネットワーク間または各構成間をＶＰＮ（Virtual  Private  Network）で接続したりしてもよい。
【００９１】
次に、図１３を用いてブラウザエミュレータマネージャ２３ａおよびブラウザエミュレータ２５ａを詳細に説明する。ブラウザエミュレータマネージャ２３ａはブラウザエミュレータ２５ａおよび制御部２７ａを備える。制御部２７ａは、ホストシステム２６ａ上でブラウザエミュレータ２５ａを動作させる。このホストシステム２６ａは、例えば、ブラウザエミュレータマネージャ２３ａが備えるＯＳを用いる。制御部２７ａの詳細は後記する。
【００９２】
（ブラウザエミュレータ）
次に、ブラウザエミュレータ２５ａを説明する。ブラウザエミュレータ２５ａは、クライアント環境模擬部２５１ａと、アクセス部２５２ａと、ＨＴＭＬ／ＣＳＳ（HyperText  Markup  Language／Cascading  Style  Sheets）パーサ２５３ａと、スクリプトインタプリタ部２５４ａとを備える。
【００９３】
クライアント環境模擬部２５１ａは、ブラウザエミュレータ２５ａが模擬すべきクライアント環境（例えば、ＯＳ、ブラウザ、プラグイン等）の情報を設定する。
【００９４】
アクセス部２５２ａは、ウェブサイト（例えば、図１２の解析対象ウェブサイト１２ａ）と、ＨＴＴＰ（HyperText  Transfer  Protocol）またはＨＴＴＰＳ（HyperText  Transfer  Protocol  Secure）による通信を行い、当該ウェブサイトからウェブコンテンツを取得する。ここでアクセス部２５２ａは、ＨＴＴＰまたはＨＴＴＰＳによる通信時、ＨＴＴＰヘッダのUser-Agentフィールドに、クライアント環境模擬部２５１ａで設定したクライアント環境を使用する。これによりブラウザエミュレータ２５ａは、クライアント環境を模擬する。このアクセス部２５２ａには、例えば、フリーソフトウェアとして開発されたcURLを用いる。
【００９５】
また、アクセス部２５２ａは、ウェブサイトへのアクセス結果をアクセスログに記録する。例えば、アクセス部２５２ａは、アクセスしたウェブサイトのＵＲＬや、アクセスした日時をアクセスログに記録する。また、アクセス部２５２ａは当該ウェブサイトへアクセスした結果、別のウェブサイトに遷移した場合、その遷移先のＵＲＬ等もアクセスログに記録する。
【００９６】
ＨＴＭＬ／ＣＳＳパーサ２５３ａは、アクセス部２５２ａで取得したウェブコンテンツを解釈するコンテンツパーサである。また、ＨＴＭＬ／ＣＳＳパーサ２５３ａは、ウェブコンテンツを解釈した結果、当該ウェブコンテンツにコードが含まれる場合、スクリプトインタプリタ部２５４ａを用いてコードを解釈する。
【００９７】
スクリプトインタプリタ部２５４ａは、ウェブコンテンツに含まれるコードを解釈する。例えば、コードがJavaScript（登録商標）により記述されている場合、スクリプトインタプリタ部２５４ａは、オープンソースとして開発されたSpiderMonkeyやV8  JavaScript（登録商標）Engine等のJavaScript（登録商標）インタプリタ、Java（登録商標）で記述されたJavaScript（登録商標）インタプリタであるRhino等を用いてコードを解釈する。
【００９８】
（制御部）
次に、制御部２７ａを説明する。制御部２７ａは、ＵＲＬリスト作成部２７１ａと、アクセス指示部２７２ａと、プログラム解析部２７３ａと、登録処理部２７８ａと、ＵＲＬ解析部２７９ａとを備える。
【００９９】
ＵＲＬリスト作成部２７１ａは、各ブラウザエミュレータ２５ａが巡回するウェブサイト（解析対象ウェブサイト１２ａ）のＵＲＬリストである巡回対象ＵＲＬリストを作成する。例えば、ＵＲＬリスト作成部２７１ａは、公開されている悪性ウェブサイトのブラックリストに掲載されているウェブサイトのＵＲＬをもとに巡回対象ＵＲＬリストを作成する。
【０１００】
アクセス指示部２７２ａは、各ブラウザエミュレータ２５ａのアクセス部２５２ａへ巡回対象ＵＲＬリスト（ＵＲＬリスト）に示されるＵＲＬへのアクセスを指示する。
【０１０１】
プログラム解析部２７３ａは、アクセス先のウェブサイトから取得したウェブコンテンツに含まれるプログラム（コード）の解析を行う。このプログラム解析部２７３ａの詳細は後記する。
【０１０２】
登録処理部２７８ａは、各ブラウザエミュレータ２５ａのアクセスログを取得し、解析情報データベース２４ａに登録する。また、登録処理部２７８ａは、プログラム解析部２７３ａによるコードの解析（後記するスライスの実行）により得られたＵＲＬやクライアント環境情報（環境情報）を解析情報データベース２４ａに登録する。
【０１０３】
ＵＲＬ解析部２７９ａは、解析情報データベース２４ａに蓄積されたアクセスログやコード解析により得られたＵＲＬ（解析情報）を解析し、その解析結果を出力する。例えば、ＵＲＬ解析部２７９ａは、アクセスログに含まれるＵＲＬや、コード解析により得られたＵＲＬから、攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬを抽出し、出力する。
【０１０４】
（プログラム解析部）
次に、プログラム解析部２７３ａを詳細に説明する。プログラム解析部２７３ａは、構文解析部２７４ａと、プログラム依存グラフ構築部２７５ａと、プログラムスライシング部２７６ａと、スライス実行部２７７ａと、実行経路探索部２７０ａとを備える。
【０１０５】
構文解析部２７４ａは、ブラウザエミュレータ２５ａにより取得されたウェブコンテンツに含まれるコードの構文解析を行う。具体的には、ブラウザエミュレータ２５ａのスクリプトインタプリタ部２５４ａがウェブコンテンツに含まれるコードのスクリプトを解釈する過程で、スクリプトの構文解析を行い、ウェブコンテンツに含まれるコードから、他のサイトへの転送コードを特定する。
【０１０６】
この構文解析の具体例を説明する。ここでの解析対象のコードは、例えば、図１４に示すようなJavaScript（登録商標）により記述されたコードであるものとする。なお、図１４に示すコードはクライアントにインストールされているJava（登録商標）のバージョン情報をもとに条件分岐文を実行後、他のウェブサイトへの転送を実行するスクリプト転送コードである。また、構文解析部２７４ａが特定対象とする転送コードは、例えば、図１５の符号４０１ａに示すスクリプト転送コードであるものとする。なお、図１５の符号４０２ａに示すタグ転送コードは、所定のＨＴＭＬタグにおいて所定の属性名に代入されるＵＲＬをもとに、外部コンテンツを取得するコードである。このタグ転送コードで使用されるＨＴＭＬタグとその外部コンテンツのＵＲＬを指定する属性名のペアは、例えば、図１５の符号４０３ａに示すＨＴＭＬタグおよび属性名のペアであるものとする。これらのコードに関する情報（特定対象コード情報）は、ブラウザエミュレータマネージャ２３ａの記憶部（図示省略）の所定領域に記憶され、システム管理者等が適宜設定可能である。
【０１０７】
例えば、構文解析部２７４ａは、抽象構文木を用いてコードを木構造データへ変換し、木構造データを探索することで転送コードを特定する。なお、この抽象構文木を用いたデータ変換や転送コード特定等の解析手法については、例えば、非特許文献３の技術を用いればよい。構文解析部２７４ａは、抽象構文木の網羅的な探索により、例えば、図１５に示す転送コードに使用されるオブジェクトやオブジェクトのプロパティ、関数を特定する。図１４に示すコードでは、１４行目のlocation.hrefが特定対象となる。
【０１０８】
なお、構文解析部２７４ａは、上記の方法以外の方法で構文解析を行ってももちろんよい。また、図１４および図１５は、プログラム解析部２７３ａを説明するために示した例であり、これらに限るものではない。
【０１０９】
図１３のプログラム依存グラフ構築部２７５ａは、構文解析部２７４ａによる構文解析時に、ウェブコンテンツから取得したコードの各文をノードとし、ノード間におけるデータ依存関係および制御依存関係を示したプログラム依存グラフを構築する。そして、プログラム依存グラフ構築部２７５ａは構築したプログラム依存グラフを用いて、構文解析部２７４ａにより特定した転送コードに関連するノードを特定する。
【０１１０】
例えば、プログラム依存グラフ構築部２７５ａは、JavaScript（登録商標）コードにおける変数定義文、代入文、関数定義文、関数実行文、リターン文、条件分岐文、ループ文、例外処理文等をプログラム依存グラフ（Program  Dependence  Graph）におけるノード（以下、PDGノードと呼ぶ。）とし、ノード間のデータ依存関係や制御依存関係をエッジ（以下、PDGエッジと呼ぶ。）としたプログラム依存グラフを構築する。
【０１１１】
例えば、プログラム依存グラフ構築部２７５ａは、図１４に示すコードから、図１６に示すプログラム依存グラフを構築する。図１６に示すプログラム依存グラフの各PDGノードに記されているラベルについて説明する。VariableInitializerは、変数定義を意味し、定義対象となる変数名も併記している。IfStatementおよびAssignmentはそれぞれ、条件文、変数代入を表し、条件式や変数名を併記している。また、PDGノードに記されている番号は、図１４に示すコードの行数を表している。図１６に示すプログラム依存グラフの実線矢印で示すPDGエッジはデータ依存関係を表しており、破線矢印で示すPDGエッジは制御依存関係を表している。
【０１１２】
例えば、図１６に示すプログラム依存グラフにおいて、IfStatement  jre[1]==“6”は、VariableInitializer  jreとデータ依存関係があり、また、IfStatement  jre[1]==“6”は、Assignment  urlおよびIfStatement  jre[1]==“7”と制御依存関係があることを示す。
【０１１３】
プログラム依存グラフ構築部２７５ａは、このようなプログラム依存グラフから、構文解析部２７４ａで特定したコードに関連するPDGノードを特定する。例えば、構文解析部２７４ａは、図１４に示すコードから、１４行目のlocation.hrefを特定した場合、プログラム依存グラフ構築部２７５ａは、図１６の太線で強調したPDGノード（Assignment  location.href）を特定する。
【０１１４】
図１３のプログラムスライシング部２７６ａは、ウェブコンテンツから取得したコードのうち、プログラム依存グラフ構築部２７５ａにより特定されたプログラム依存グラフのノード（例えば、図１６の太線で強調したPDGノード）の文をスライシング基準とし、プログラム依存グラフから、スライスを抽出する。
【０１１５】
なお、一般的に、スライスを抽出するときには、プログラム依存グラフにおけるデータ依存関係および制御依存関係を再帰的に辿る。しかし、本実施形態のプログラムスライシング部２７６ａは、まず、プログラム依存グラフにおけるデータ依存関係を再帰的に辿ることで、変数の定義参照に関連する文（ノード）を抽出し、次に制御依存関係を所定数以下（例えば、一度）辿ることで、抽出した文の制御フローに関連する文を抽出し、抽出した文をスライスとする。この時、抽出したスライスに関数定義文（function文）が含まれる場合は、プログラムスライシング部２７６ａにより、該当する関数呼び出し文も合わせて抽出する。加えて、関数定義文に引数を含む場合は、プログラムスライシング部２７６ａは、該当する関数呼び出し文の引数に関連のある文も、同様に抽出する。
【０１１６】
なお、ここで制御依存関係については、所定数以下（例えば、一度）辿ることとしたのは、制御依存関係について再帰的に辿ると、スライシング基準（着目している文、例えば、図１６のAssignment  location.href）に関連の薄い文も抽出してしまう可能性があるからである。つまり、本実施形態のプログラムスライシング部２７６ａは、プログラム依存グラフにおけるデータ依存関係を再帰的に辿った後、制御依存関係については所定数以下（例えば、一度）に絞り込んで辿ることで、スライシング基準（着目している文、例えば、図１６のAssignment  location.href）と関連が高い文を抽出することができる。
【０１１７】
プログラムスライシング部２７６ａは、例えば、図１６に示すプログラム依存グラフを用いて、太線で強調したPDGノード（Assignment  location.href）の文をスライシング基準（図１４に示すコードの１４行目のlocation.href：＜14,location.href＞が該当）とし、スライスを抽出する。例えば、プログラムスライシング部２７６ａは、スライシング基準＜14,  location.href＞により、まず図１４に示すコードの１４行目のlocation.hrefの文とデータ依存関係を再帰的に考慮し、PDGノードを抽出し、次に、制御依存関係を一度のみ考慮したPDGノードを抽出する（つまり、図１６に示すプログラム依存グラフから図１７に示すPDGノードが抽出される）。そして、プログラムスライシング部２７６ａは、例えば、図１７に示すPDGノードをもとに、図１８の符号７０１ａ→符号７０２ａに示すようなスライスを抽出する。
【０１１８】
図１３の実行経路探索部２７０ａは、プログラムスライシング部２７６ａで抽出したスライスに複数の実行経路が含まれる場合（つまり、制御依存関係を考慮した際に条件分岐文等が含まれる場合）に、当該スライスを構文解析部２７４ａで構文解析することで、実行経路ごとのスライスを抽出する。つまり、実行経路探索部２７０ａは、構文解析部２７４ａに探索対象コード（スライス）を構文解析させ、構文解析の過程で、条件分岐文等による複数の実行経路を特定した際に、それぞれの実行経路ごとのスライスを抽出することで、制御フローに依存しないスライスを抽出する。例えば、実行経路探索部２７０ａは、図１９の符号８０１ａ（もしくは図１８の符号７０２ａ）に示すコード（スライス）から、図１９の符号８０２ａ〜８０４ａに示す３つのスライスを抽出する。
【０１１９】
なお、実行経路探索部２７０ａは、制御フローに依存せずにスライスを抽出するため、条件分岐文やループ文、例外処理文等を削除したスライスをそれぞれ生成する。
【０１２０】
図１３のスライス実行部２７７ａは、プログラムスライシング部２７６ａまたは実行経路探索部２７０ａで抽出したスライスをスクリプトインタプリタ部２５４ａに実行させる。つまり、スライス実行部２７７ａは、プログラムスライシング部２７６ａまたは実行経路探索部２７０ａで抽出したスライスをスクリプトインタプリタ部２５４ａに解釈させ、その解釈の過程で、転送コードまたはコンテンツ取得コードに使用されるオブジェクト、オブジェクトのプロパティ、関数に代入される値の引数を監視し、ＵＲＬを抽出する。
【０１２１】
例えば、スライス実行部２７７ａは、ブラウザエミュレータ２５ａのスクリプトインタプリタ部２５４ａに、図１９の符号８０２ａ〜８０４ａに示すスライスをそれぞれ実行させ、転送コードに使用されるオブジェクトや関数の引数、プロパティの代入値を監視し、例えば、監視しているlocation.hrefプロパティから、http://A.example/mal1/、http://A.example/mal2/、http://B.example/benign/というＵＲＬを抽出する。
【０１２２】
ただし、スライス実行部２７７ａは、ＤＯＭ（Document  Object  Model）を操作するコードを実行できるよう、ＤＯＭの読み込みが完了したタイミング（例えば、Firefox（登録商標）、Google  Chrome（登録商標）におけるDOMContentLoadedイベントの直前）で、スライスを実行する。また、スライス実行部２７７ａは、スライスを実行した結果が本来のJavaScript（登録商標）等の処理に影響を与えないよう、スライスを実行する時点のＤＯＭ情報（ＤＯＭツリーの構造や値）およびJavaScript（登録商標）のコンテキスト情報（例えば、変数定義や関数定義等）は、スライス実行用に複製し、スライスを実行した後は破棄するものとする。
【０１２３】
また、ブラウザエミュレータ２５ａのアクセス部２５２ａは、スライスの実行により抽出されたＵＲＬ（例えば、図２２に示す解析情報の「スライス」が「１」のＵＲＬ）にアクセスすることで、さらにウェブコンテンツを取得し、取得したウェブコンテンツにコードが含まれていた場合は、上記と同様にスクリプトインタプリタ部２５４ａによるスクリプトの解釈と、構文解析部２７４ａ、プログラム依存グラフ構築部２７５ａ、プログラムスライシング部２７６ａ、実行経路探索部２７０ａおよびスライス実行部２７７ａによる処理とを実行する。つまり、ブラウザエミュレータマネージャ２３ａは、スライスの実行により抽出されたＵＲＬに対し再帰的な解析を行う。これにより、ブラウザエミュレータマネージャ２３ａは攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬをより多く抽出することができる。
【０１２４】
なお、ブラウザエミュレータマネージャ２３ａが上記のようなスライスの実行により抽出されたＵＲＬに対し再帰的な解析を行うか否かは、監視対象のオブジェクトやオブジェクトのプロパティ、関数に応じて、システムの管理者等が適宜設定するようにしてもよい。
【０１２５】
以上説明したプログラム解析部２７３ａによれば、ウェブコンテンツから取得したコードを網羅的に解析し、転送コードを特定する。そして、その特定した転送コードからＵＲＬを抽出する。加えて、このプログラム解析部２７３ａは、抽出したＵＲＬに転送されるために必要なクライアント環境情報を特定する。このプログラム解析部２７３ａによるクライアント環境情報の特定について説明する。
【０１２６】
（クライアント環境情報の特定）
プログラム解析部２７３ａは、スライス実行部２７７ａによりＵＲＬを抽出できた場合において、プログラムスライシング部２７６ａにより抽出したスライスに条件分岐文が含まれるとき、その条件分岐文をスライシング基準とする。そして、プログラムスライシング部２７６ａは、当該スライシング基準を用いてスライスを抽出し、抽出したスライスをスライス実行部２７７ａにより実行する。その結果、ウェブコンテンツに含まれるコードにおいて、ＵＲＬを抽出できた転送コード前段の条件分岐文で、クライアント環境情報を使用する条件判定が行われていれば、当該転送コードがクライアント環境に依存した転送コードであることが分かる。
【０１２７】
このようなクライアント環境情報を使用する条件分岐文では、ブラウザやプラグインのメジャーバージョンとマイナーバージョンを評価するために、文字列操作関数を用いたバージョン情報の分割と結合を行った後、条件判定する場合が多い（図１４に示すコードの２行目の文や、非特許文献５参照）。したがって、スライス実行部２７７ａは、プログラムスライシング部２７６ａで抽出したスライスをスクリプトインタプリタ部２５４ａに解釈させ、その解釈の過程で、スライスに使用される文字列操作等に関連するオブジェクトや関数の引数、プロパティの代入値を監視することで、スライスの実行によるクライアント環境情報の使用を特定する。すなわち、スライス実行部２７７ａは、抽出したＵＲＬと、当該ＵＲＬへの転送に必要なクライアント環境情報を関連付ける。
【０１２８】
例えば、図１８の符号７０２ａ（もしくは図１９の符号８０１ａ）に示すスライスに含まれる条件分岐文をスライシング基準（図１８の符号７０２ａに示すコードの５行目のif文：＜5,if＞が該当）とした場合に、抽出対象となるPDGノードを図２０に示す。なお、ここでは説明を省略するが、プログラムスライシング部２７６ａは、スライシング基準＜8,if＞についても同様にスライスを抽出する。
【０１２９】
そして、プログラムスライシング部２７６ａは、例えば、図２０に示すPDGノードをもとに、図２１の符号１００１ａ→符号１００２ａに示すようなスライスを抽出する。
【０１３０】
例えば、ブラウザエミュレータ２５ａがJava（登録商標）のバージョン「1.6.0.22」がインストールされたクライアント環境を模擬している場合を考える。この場合、スライス実行部２７７ａは、ブラウザエミュレータ２５ａのスクリプトインタプリタ部２５４ａに図２１の符号１００２ａに示すスライスを実行させ、文字列操作等に関連するオブジェクトや関数の引数、プロパティの代入値を監視する。そして、スライス実行部２７７ａにおいて監視している文字列操作に関連する関数であるsplit関数のStringオブジェクトが「1.6.0.22」というJava（登録商標）のバージョン値であることを特定することで、抽出したスライスの実行にJava（登録商標）の環境情報を使用していることが特定できる。
【０１３１】
なお、スライス実行部２７７ａが、ウェブコンテンツに含まれるコードにおけるクライアント環境情報の使用を特定する際には、例えば、ブラウザエミュレータ２５ａで模擬するクライアント環境の名称情報やバージョン情報の完全一致により特定をしてもよいし、正規表現を使用したクライアント情報のシグネチャを生成し、そのシグネチャにより特定をしてもよい。
【０１３２】
ただし、スライス実行部２７７ａは、ＵＲＬの抽出時と同様に、スライスを実行する時点のＤＯＭ情報およびJavaScript（登録商標）のコンテキスト情報をスライス実行用に複製し、スライスを実行した後は破棄するものとする。なお、スライス実行時に監視する関数やプロパティは上記に限らず、監視対象の関数やプロパティを、システム管理者等が適宜追加または削除するようにしてもよい。
【０１３３】
そのほか、抽出したＵＲＬに関連するクライアント環境情報の特定方法として、ＵＲＬに使用されているファイル拡張子情報を用いる方法や、タグ転送コードに使用されているＨＴＭＬタグ情報を用いる方法もある。このファイル拡張子情報を用いる方法は、例えば、ＵＲＬが「.jar」というファイル拡張子を使用するＵＲＬであった場合に、そのＵＲＬはJava（登録商標）に関連するＵＲＬであると特定できる。また、ＨＴＭＬタグ情報を用いる方法は、例えば、タグ転送コードがobjectタグを使用したコードであった場合に、data属性にＵＲＬが指定され、type属性にMIMEタイプが指定される。そのため、type属性が、例えば、「application/pdf」であった場合に、data属性に指定されたＵＲＬはＰＤＦに関連するＵＲＬであると特定できる。
【０１３４】
このようにファイル拡張子情報やＨＴＭＬタグ情報を用いた、ＵＲＬに関連するクライアント環境情報の特定方法は、上記したプログラム解析部２７３ａによる特定方法と併用してももちろんよい。このようにすることで、プログラム解析部２７３ａは、クライアント環境情報を特定できるＵＲＬ数を増やすことができる。
【０１３５】
（解析情報データベース）
次に解析情報データベース２４ａを説明する。前記したとおり、解析情報データベース２４ａは、解析情報を記憶する。解析情報は、例えば、図２２に示すとおり、解析情報の識別情報である「解析ＩＤ」、ブラウザエミュレータ２５ａが解析対象ウェブサイトのＵＲＬにアクセスした際にアクセスしたＵＲＬである「アクセスＵＲＬ」、当該ＵＲＬにアクセスした日時を示す「タイムスタンプ」、当該ＵＲＬがプログラムスライシングによって抽出されたＵＲＬか否かを表す「スライス」、当該ＵＲＬがクライアント環境に依存して転送されるＵＲＬである場合に、転送されるために必要なクライアント環境情報を表す「環境情報」等を対応付けた情報である。
【０１３６】
なお、この解析情報における「スライス」の項目が「１」のＵＲＬは、該当ＵＲＬがプログラムスライシングにより抽出されたＵＲＬであることを示し、「スライス」の項目が「０」のＵＲＬは、当該ＵＲＬがプログラムスライシングにより抽出されたＵＲＬではないこと（すなわち、通常アクセスにより抽出されたＵＲＬであること）を示す。また、「アクセスＵＲＬ」は、解析対象ウェブサイトのＵＲＬのみならず、当該ＵＲＬへのアクセスにより転送されたウェブサイトのＵＲＬも含む。なお、解析情報は、上記以外の情報を含んでいてももちろんよい。
【０１３７】
以上説明したシステムによれば、ウェブコンテンツから取得したコードから網羅的にＵＲＬを抽出することができる。その結果、システムは、クライアント環境に依存して行われるドライブバイダウンロード攻撃において攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬを抽出できる。加えて、システムは、抽出したＵＲＬへ転送されるために必要なクライアント環境情報を特定できる。
【０１３８】
（処理手順）
次に、図２３を用いて、システムの処理手順の例を説明する。まず、ＵＲＬリスト作成部２７１ａは、巡回対象ＵＲＬリストを作成する（Ｓ１０１）。例えば、ＵＲＬリスト作成部２７１ａは、公開されている悪性ウェブサイトのブラックリストをもとに巡回対象ＵＲＬリストを作成する。
【０１３９】
そして、アクセス指示部２７２ａは、ブラウザエミュレータ２５ａに巡回対象ＵＲＬリストのＵＲＬを入力し（Ｓ１０２）、ブラウザエミュレータ２５ａはアクセス部２５２ａで、Ｓ１０２で入力されたＵＲＬにアクセスする（Ｓ１０３）。そして、アクセス部２５２ａは、アクセス先のＵＲＬからウェブコンテンツを取得する。
【０１４０】
なお、Ｓ１０２においてアクセス指示部２７２ａは、１つのブラウザエミュレータ２５ａに複数のＵＲＬへアクセスさせてもよいし、複数のブラウザエミュレータ２５ａにそれぞれ異なるＵＲＬへアクセスさせるようにしてもよい。
【０１４１】
Ｓ１０３の後、ブラウザエミュレータ２５ａのＨＴＭＬ／ＣＳＳパーサ２５３ａは、取得したウェブコンテンツを解釈し、スクリプトインタプリタ部２５４ａにおいて取得したウェブコンテンツにコードが含まれていれば、このコードを解釈し、プログラム解析部２７３ａにおいてコード解析を行う（Ｓ１０４）。このコード解析の詳細は後記する。
【０１４２】
Ｓ１０４の後、アクセス部２５２ａはアクセスログを出力する（Ｓ１０５）。つまり、アクセス部２５２ａは、アクセス指示部２７２ａにより入力されたＵＲＬへのアクセス結果をアクセスログとして出力する。そして、登録処理部２７８ａは、Ｓ１０５で出力されたアクセスログ、Ｓ１０４のコード解析により出力されたＵＲＬおよび環境情報を整形し（Ｓ１０６）、整形されたデータを解析情報データベース２４ａ（図２２参照）に蓄積する（Ｓ１０７）。
【０１４３】
ここで、スライス実行部２７７ａによるスライスの実行により抽出されたＵＲＬを解析する旨が設定されていれば（Ｓ１０８でＹｅｓ）、アクセス指示部２７２ａは、解析情報データベース２４ａの解析情報からスライスの実行により抽出されたＵＲＬを読み出し、当該ＵＲＬを巡回対象ＵＲＬのＵＲＬとしてＳ１０２以降の処理を行う。つまり、ブラウザエミュレータマネージャ２３ａはスライスの実行により抽出されたＵＲＬに対し再帰的な解析を行う。
【０１４４】
なお、Ｓ１０８において、スライスの実行により抽出されたＵＲＬを解析する旨が設定されておらず（Ｓ１０８でＮｏ）、巡回対象ＵＲＬリストに次の巡回ＵＲＬが存在すれば（Ｓ１０９でＹｅｓ）、Ｓ１０２へ戻る。一方、巡回対象ＵＲＬリストに次の巡回ＵＲＬが存在しなければ（Ｓ１０９でＮｏ）、処理を終了する。
【０１４５】
上記のようにして解析情報データベース２４ａに解析情報が蓄積されると、ＵＲＬ解析部２７９ａは、解析情報のＵＲＬの解析処理を行い、例えば、攻撃ＵＲＬや踏台ＵＲＬである可能性の高いＵＲＬを抽出する。
【０１４６】
次に、図２４、図２５、および、図２６を用いて、図２３のＳ１０４のコード解析処理を詳細に説明する。
【０１４７】
まず、構文解析部２７４ａは、ウェブコンテンツから取得したコードの各文を構文解析する（Ｓ１０１０）。ここで、構文解析の対象となる文が存在した場合（Ｓ１０１１でＹｅｓ）、プログラム依存グラフ構築部２７５ａは、プログラム依存グラフ（図１６参照）を構築する（Ｓ１０１２）。一方、構文解析の対象となる文が存在しない場合（Ｓ１０１１でＮｏ）、図２５のＳ１０１６へ進む。
【０１４８】
また、Ｓ１０１２の後、構文解析対象の文が特定対象の転送コードに関連するプログラム依存グラフノード（PDGノード）である場合（Ｓ１０１３でＹｅｓ）、プログラム依存グラフ構築部２７５ａは、そのPDGノードをスライシング基準として保持する（Ｓ１０１４）。一方、Ｓ１０１３において、構文解析対象の文が、特定対象の転送コードに関連しないPDGノードである場合（Ｓ１０１３でＮｏ）、Ｓ１０１５へ進む。
【０１４９】
Ｓ１０１５において、構文解析部２７４ａが、構文解析対象となる次の文が存在すると判断したとき（Ｓ１０１５でＹｅｓ）、Ｓ１０１２へ戻る。一方、構文解析対象となる次の文が存在しないと判断したとき（Ｓ１０１５でＮｏ）、図２５のＳ１０１６へ進む。
【０１５０】
図２５のＳ１０１６において、プログラム解析部２７３ａが、Ｓ１０１４でスライシング基準として保持されたPDGノードが存在すると判断したとき（Ｓ１０１６でＹｅｓ）、プログラムスライシング部２７６ａは、保持されているノード（PDGノード）をスライシング基準とし、プログラムスライシングによりスライスを抽出する（Ｓ１０１７）。このプログラムスライシング部２７６ａによるスライス抽出処理の詳細は後記する。なお、Ｓ１０１６において、プログラム解析部２７３ａが、Ｓ１０１４でスライシング基準として保持されたPDGノードが存在しないと判断したとき（Ｓ１０１６でＮｏ）、処理を終了する。
【０１５１】
Ｓ１０１７の後、実行経路探索部２７０ａが、Ｓ１０１７で抽出されたスライスに複数の実行経路が含まれると判断したとき（Ｓ１０１８でＹｅｓ）、実行経路ごとにスライスを抽出する（Ｓ１０１９）。一方、実行経路探索部２７０ａが、Ｓ１０１７で抽出されたスライスに複数の実行経路が含まれないと判断したとき（Ｓ１０１８でＮｏ）、Ｓ１０２０へ進む。
【０１５２】
Ｓ１０２０において、スライス実行部２７７ａは、Ｓ１０１７で抽出されたスライスに複数の実行経路が含まれない場合は、Ｓ１０１７で抽出されたスライスを実行し、Ｓ１０１７で抽出されたスライスに複数の実行経路が含まれる場合は、Ｓ１０１９で抽出されたスライスを実行する（Ｓ１０２０）。このとき、スライス実行部２７７ａは、転送コードに関連するオブジェクトや関数の引数、プロパティの代入値を監視することにより、転送コードに使用されるＵＲＬを抽出し、出力する（Ｓ１０２１）。Ｓ１０２１の後、図２６のＳ１０２３へ進む。
【０１５３】
図２６のＳ１０２３において、図２５のＳ１０１７で抽出したスライスに条件分岐文が含まれている場合（Ｓ１０２３でＹｅｓ）、プログラムスライシング部２７６ａは、その条件分岐文をスライシング基準とし、プログラムスライシングによりスライスを抽出する（Ｓ１０２４）。このプログラムスライシング部２７６ａによるスライス抽出処理の詳細は、Ｓ１０１７同様、後記する。なお、Ｓ１０２３において、図２５のＳ１０１７で抽出したスライスに条件分岐文が含まれていない場合（Ｓ１０２３でＮｏ）、図２５のＳ１０２２へ進む。
【０１５４】
Ｓ１０２４の後、スライス実行部２７７ａは、Ｓ１０２４で抽出されたスライスを実行する（Ｓ１０２５）。このとき、スライス実行部２７７ａは、文字列操作に関連するオブジェクトや関数の引数、プロパティの代入値を監視することにより、Ｓ１０２４で抽出されたスライスの実行によるクライアント環境情報の使用を特定する（Ｓ１０２６）。
【０１５５】
Ｓ１０２６の後、抽出したスライスに次の条件分岐文が含まれていれば（Ｓ１０２７でＹｅｓ）、Ｓ１０２４へ戻り、抽出したスライスに次の条件分岐文が含まれていなければ（Ｓ１０２７でＮｏ）、図２５のＳ１０２２へ進む。
【０１５６】
図２５のＳ１０２２において、次のスライシング基準となるPDGノードが存在すれば（Ｓ１０２２でＹｅｓ）、Ｓ１０１７へ戻り、次のスライシング基準となるPDGノードが存在しなければ（Ｓ１０２２でＮｏ）、処理を終了する。
【０１５７】
次に、図２７を用いて、図２５のＳ１０１７および図２６のＳ１０２４の処理（スライス抽出処理）を詳細に説明する。
【０１５８】
まず、プログラムスライシング部２７６ａは、スライシング基準のノード（PDGノード）を解析対象ノードとして保持し（Ｓ１０２８）、保持されている解析対象ノードをスライス対象ノードに追加する（Ｓ１０２９）。次に、プログラムスライシング部２７６ａは、保持されている解析対象ノードが持つデータ依存関係のPDGエッジを逆方向に一度辿り、辿った先すべてのPDGノードを、解析対象ノードとして保持する（Ｓ１０３０）。保持されている解析対象ノードのいずれかにデータ依存関係のエッジ（PDGエッジ）が存在する場合（Ｓ１０３１でＹｅｓ）、Ｓ１０２９へ戻り、保持されている解析対象ノードのいずれにもデータ依存関係のPDGエッジが存在しない場合（Ｓ１０３１でＮｏ）、Ｓ１０３２へ進む。
【０１５９】
Ｓ１０３２において、プログラムスライシング部２７６ａは、スライス対象ノード（すなわち、プログラム依存グラフのデータ依存関係のPDGエッジを辿ることで抽出したPDGノード）が持つ制御依存関係のPDGエッジを逆方向に一度辿り、辿った先すべてのPDGノードをスライス対象ノードに追加する（Ｓ１０３２）。Ｓ１０３２の後、プログラムスライシング部２７６ａは、保持されているスライス対象ノードであるPDGノードをスライスとして抽出し（Ｓ１０３３）、処理を終了する。
【０１６０】
上記の処理の一例を挙げる。例えば、プログラムスライシング部２７６ａは、図１６に示すプログラム依存グラフにおいてスライシング基準のPDGノード（（14）Assignment  location.href）を解析対象ノードとすると、このPDGノード（Assignment  location.href）の持つデータ依存関係のPDGエッジを逆方向に一度辿り、辿った先すべてのPDGノード（（6）Assignment  url、（9）Assignment  url、（12）Assignment  urlおよび（4）VariableInitializer  url）を、新たな解析対象ノードとして保持する。また、図１６の（6）Assignment  urlおよび（9）Assignment  urlのPDGノードはさらにデータ依存関係のPDGエッジを持つので、プログラムスライシング部２７６ａは、このPDGエッジを逆方向に辿り、（3）VariableInitializer  dのPDGノードも新たな解析対象ノードとして保持する。ここで保持された解析対象ノードのうち、（6）Assignment  url、（9）Assignment  urlおよび（12）Assignment  urlには、制御依存関係のPDGエッジがあるので、このPDGエッジを逆方向に一度辿り、辿った先すべてのPDGノード、つまり、（5）IfStatement  jre[1]==“6”および（8）IfStatement  jre[1]==“7”のPDGノードをスライス対象ノードに追加する。そして、プログラムスライシング部２７６ａは、保持されているPDGノード、つまり、（14）Assignment  location.href、（6）Assignment  url、（9）Assignment  url、（12）Assignment  url、（4）VariableInitializer  url、（3）VariableInitializer  d、（5）IfStatement  jre[1]==“6”および（8）IfStatement  jre[1]==“7”をスライスとして抽出する。例えば、プログラムスライシング部２７６ａは、図１７に示すPDGノードをもとに、図１８の符号７０１ａ→符号７０２ａに示すスライスを抽出する。
【０１６１】
また、例えば、プログラムスライシング部２７６ａは、図１６に示したプログラム依存グラフにおいてスライシング基準のPDGノード（（5）IfStatement  jre[1]==“6”）を解析対象ノードとすると、このPDGノード（（5）IfStatement  jre[1]==“6”）が持つデータ依存関係のPDGエッジを逆方向に一度辿り、辿った先すべてのPDGノード（（2）VariableInitializer  jre）を、新たな解析対象ノードとして保持する。また、（2）VariableInitializer  jreのPDGノードにはさらにデータ依存関係のPDGエッジがあるので、プログラムスライシング部２７６ａは、このPDGエッジを逆方向に辿り、（1）VariableInitializer  jre_versionのPDGノードも新たな解析対象ノードとして保持する。なお、この場合、（1）VariableInitializer  jre_versionのPDGノードには制御依存関係のPDGエッジは存在しないので、プログラムスライシング部２７６ａは、（5）IfStatement  jre[1]==“6”、（2）VariableInitializer  jreおよび（1）VariableInitializer  jre_versionをスライスとして抽出する。例えば、プログラムスライシング部２７６ａは、図２０に示すPDGノードをもとに、図２１の符号１００１ａ→符号１００２ａに示すスライスを抽出する。
【０１６２】
このようなシステムによれば、クライアント環境に依存してドライブバイダウンロード攻撃を行うコードを詳細に解析できる。その結果、例えば、当該コードからドライブバイダウンロード攻撃において攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬをクライアント環境に依存せず、網羅的に抽出できる。また、システムは、抽出した攻撃ＵＲＬや踏台ＵＲＬである可能性のあるＵＲＬへ転送されるために必要なクライアント環境を特定できる。その結果、従来のハニーポット技術により環境依存攻撃の解析を行う場合に、どのようなクライアント環境を設定すれば、攻撃ＵＲＬや踏台ＵＲＬに到達できるかを効果的に決定できる。また、クライアント環境ごとにＵＲＬを集約することで、各クライアントのクライアント環境に応じて導入すべきＵＲＬブラックリストを最適化できる。
【０１６３】
［その他の実施形態］
なお、構文解析部２７４ａにおいて特定するオブジェクト、オブジェクトのプロパティ、関数は、転送コードやコンテンツ取得コードに関するものに限定されず、目的に応じて適宜変更可能である。
【０１６４】
また、プログラム依存グラフ構築部２７５ａにおいて、JavaScript（登録商標）コードの文のうち、プログラム依存グラフにおけるプログラム依存グラフノードとする文は、変数定義文、代入文、関数定義文、関数実行文、リターン文、条件分岐文、ループ文、例外処理文等としたが、これら以外にも、システムの管理者等が適宜追加、変更してもよい。
【０１６５】
なお、プログラム解析部２７３ａがコード解析の結果、出力する情報はＵＲＬ以外の情報であってもよい。例えば、攻撃コードに使用されるオブジェクトやオブジェクトのプロパティ、関数の情報が事前に分かっていれば、プログラム解析部２７３ａは、これらの情報を用いて攻撃コードを特定し、特定した攻撃コードに使用される各種情報を出力してもよい。
【０１６６】
また、システムは、ブラウザエミュレータ２５ａを用いて解析対象ウェブサイト１２ａにアクセスすることとしたが、ブラウザエミュレータ２５ａ以外（例えば、実際のクライアント環境）を用いて解析対象ウェブサイト１２ａにアクセスしてもよい。
【０１６７】
さらに、プログラムスライシング部２７６ａは、プログラム依存グラフを用いてスライスを抽出することとしたが、各コードの制御依存関係とデータ依存関係とが把握できれば、プログラム依存グラフを用いなくてもよい。
【０１６８】
なお、プログラム解析部２７３ａによるＵＲＬ抽出の後に、プログラム解析部２７３ａを用いて、クライアント環境情報の使用特定を実施したが、システム管理者等が適宜実施しないよう変更してもよい。
【０１６９】
また、ブラウザエミュレータ２５ａは、コンテンツパーサとしてＨＴＭＬ／ＣＳＳパーサ２５３ａを用いることとしたが、Adobe  Acrobat（登録商標）で使用するPDFファイルやAdobe  Flash  Player（登録商標）で使用するSWFファイル等のウェブコンテンツを解釈するコンテンツパーサを用いてもよい。なお、PDFファイルを解釈する場合は、JavaScript（登録商標）を解析コードとし、スクリプトインタプリタ部２５４ａは、JavaScript（登録商標）のインタプリタを使用するものとする。また、SWFファイルを解釈する場合は、ActionScriptを解析対象コードとし、スクリプトインタプリタ部２５４ａは、ActionScriptのインタプリタを使用するものとする。
【０１７０】
また、プログラム解析部２７３ａはJavaScript（登録商標）以外のコード、例えば、VBScriptを解析対象コードとしてもよいが、その場合は、スクリプトインタプリタ部２５４ａは、VBScriptのインタプリタを使用するものとする。
【０１７１】
また、プログラム解析部２７３ａは、スライス実行部２７７ａによりＵＲＬを抽出でき、かつ、プログラムスライシング部２７６ａにより抽出したスライスに条件分岐文が含まれる場合に、その条件分岐文をスライシング基準としたスライスの抽出を行うこととしたが、これに限定されない。例えば、プログラム解析部２７３ａは、プログラムスライシング部２７６ａにより抽出したスライスに条件分岐文が含まれていれば、スライス実行部２７７ａによりＵＲＬを抽出できたか否かにかかわらず、当該条件分岐文をスライシング基準としたスライスの抽出を行ってもよい。
【０１７２】
（プログラム）
また、上記実施形態に係るブラウザエミュレータマネージャ２３，２３ａが実行する処理をコンピュータが実行可能な言語で記述したプログラムを作成し、実行することもできる。この場合、コンピュータがプログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかるプログラムをコンピュータに読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。以下に、ブラウザエミュレータマネージャ２３と同様の機能を実現する制御プログラムを実行するコンピュータの一例を説明する。
【０１７３】
図２８は、解析プログラムを実行するコンピュータを示す図である。図２８に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。
【０１７４】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。
【０１７５】
ここで、図２８に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。上記実施形態で説明した探索対象コード情報や、アクセスログや、解析により抽出されたＵＲＬ等は、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。
【０１７６】
また、解析プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、ハードディスクドライブ１０９０に記憶される。具体的には、上記実施形態で説明したブラウザエミュレータマネージャ２３が実行する各処理が記述されたプログラムモジュールが、ハードディスクドライブ１０９０に記憶される。
【０１７７】
また、解析プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。
【０１７８】
なお、解析プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、制御プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【０１７９】
１，１ａ，２，２ａ      ネットワーク
３，３ａ      パケット転送装置
１２，１２ａ    解析対象ウェブサイト
２３，２３ａ    ブラウザエミュレータマネージャ
２４，２４ａ    解析情報データベース
２５，２５ａ    ブラウザエミュレータ
２６，２６ａ    ホストシステム
２７，２７ａ    制御部
２５１，２５１ａ  クライアント環境模擬部
２５２，２５２ａ  アクセス部
２５３，２５３ａ  ＨＴＭＬ／ＣＳＳパーサ
２５４，２５４ａ  スクリプトインタプリタ部
２７０ａ  実行経路探索部
２７１，２７１ａ  ＵＲＬリスト作成部
２７２，２７２ａ  アクセス指示部
２７３，２７３ａ  プログラム解析部
２７４，２７４ａ  構文解析部
２７５，２７５ａ  プログラム依存グラフ構築部
２７６，２７６ａ  プログラムスライシング部
２７７，２７７ａ  スライス実行部
２７８，２７８ａ  登録処理部
２７９，２７９ａ  ＵＲＬ解析部
【図１】
2016060110.tif 000003
【図２】
2016060110.tif 000004
【図３】
2016060110.tif 000005
【図４】
2016060110.tif 000006
【図５】
2016060110.tif 000007
【図６】
2016060110.tif 000008
【図７】
2016060110.tif 000009
【図８】
2016060110.tif 000010
【図９】
2016060110.tif 000011
【図１０】
2016060110.tif 000012
【図１１】
2016060110.tif 000013
【図１２】
2016060110.tif 000014
【図１３】
2016060110.tif 000015
【図１４】
2016060110.tif 000016
【図１５】
2016060110.tif 000017
【図１６】
2016060110.tif 000018
【図１７】
2016060110.tif 000019
【図１８】
2016060110.tif 000020
【図１９】
2016060110.tif 000021
【図２０】
2016060110.tif 000022
【図２１】
2016060110.tif 000023
【図２２】
2016060110.tif 000024
【図２３】
2016060110.tif 000025
【図２４】
2016060110.tif 000026
【図２５】
2016060110.tif 000027
【図２６】
2016060110.tif 000028
【図２７】
2016060110.tif 000029
【図２８】
2016060110.tif 000030
【国際調査報告】
2016060110.tif 000031
2016060110.tif 000032