(57)【特許請求の範囲】
【請求項１】
端末装置からサーバへのリクエストを受信し、受信した前記リクエストを前記サーバの環境を再現したサンドボックスで検査させ、前記サンドボックスによる前記リクエストの検査結果が攻撃の検知を示すものではない場合、前記リクエストを前記サーバへ転送し、前記リクエストの検査結果が攻撃の検知を示すものである場合、前記リクエストを前記サーバへ転送しないリクエスト制御部と、
前記リクエストに含まれる変数ごとに、前記サンドボックス内のアプリケーションにおいて処理可能な前記変数の値を示した変換情報を記憶する記憶部と、
前記リクエスト制御部で受信した前記端末装置からのリクエストを受信し、前記変換情報を参照して、前記リクエストにおける変数を、前記サンドボックス内のアプリケーションにおいて処理可能な変数の値に変換した上で、前記サンドボックスへ転送するリクエスト再現部と、
過去における前記サーバへのアクセスログまたは通信パケットから、前記リクエストに含まれる変数を抽出し、抽出した変数のうち、前記サーバへのアクセスまたは通信のたびに前記変数の値が変化する度合いが所定の閾値以上である変数を、前記リクエストにおける変換の対象となる変数として特定し、特定した前記変数を前記変換情報に設定する変換情報設定部と、
を備えることを特徴とするリクエスト制御装置。
【請求項２】
前記リクエストに含まれる変数のうち、前記変換の対象となる変数は、
前記リクエストに含まれる、セッションＩＤ、ｎｏｎｃｅ、ユーザＩＤ、パスワード、および、動的に変化するコンテンツのコンテンツＩＤの少なくともいずれかであることを特徴とする請求項１に記載のリクエスト制御装置。
【請求項３】
前記リクエスト制御部は、さらに、
過去に前記サンドボックスで検査したリクエストに対し、前記リクエストのＩＰアドレス、ポート番号、受信時刻、および、前記リクエストのハッシュ値の少なくともいずれかを用いて前記リクエストの識別情報を求め、前記リクエストの識別情報と、前記リクエストの前記サンドボックスにおける検査結果とを対応付けて示した検査済みリクエスト情報を記憶部に蓄積する情報蓄積部を備え、
前記端末装置からリクエストを受信した場合、受信したリクエストの前記識別情報を求め、前記検査済みリクエスト情報において、前記識別情報に対応するリクエストが検査済みでなければ、受信した前記リクエストを前記サンドボックスで検査させ、前記検査済みリクエスト情報において、前記識別情報に対応するリクエストが検査済みであり、かつ、前記リクエストの検査結果が攻撃の検知を示すものではない場合、受信した前記リクエストを前記サーバへ転送することを特徴とする請求項１に記載のリクエスト制御装置。
【請求項４】
端末装置からサーバへのリクエストを制御するリクエスト制御装置が、
前記端末装置からサーバへのリクエストを受信するステップと、
受信した前記リクエストを前記サーバの環境を再現したサンドボックスで検査させるステップと、
前記サンドボックスによる前記リクエストの検査結果が攻撃の検知を示すものではない場合、前記リクエストを前記サーバへ転送し、前記リクエストの検査結果が攻撃の検知を示すものである場合、前記リクエストを前記サーバへ転送しないステップと、
前記リクエストに含まれる変数ごとに、前記サンドボックス内のアプリケーションにおいて処理可能な前記変数の値を示した変換情報を参照して、前記受信した端末装置からのリクエストにおける変数を、前記サンドボックス内のアプリケーションにおいて処理可能な変数の値に変換した上で、前記サンドボックスへ転送するステップと、
過去における前記サーバへのアクセスログまたは通信パケットから、前記リクエストに含まれる変数を抽出し、抽出した変数のうち、前記サーバへのアクセスまたは通信のたびに前記変数の値が変化する度合いが所定の閾値以上である変数を、前記リクエストにおける変換の対象となる変数として特定し、特定した前記変数を前記変換情報に設定するステップと、
を含んだことを特徴とするリクエスト制御方法。
【請求項５】
端末装置からサーバへのリクエストを受信するステップと、
受信した前記リクエストを前記サーバの環境を再現したサンドボックスで検査させるステップと、
前記サンドボックスよる前記リクエストの検査結果が攻撃の検知を示すものではない場合、前記リクエストを前記サーバへ転送し、前記リクエストの検査結果が攻撃の検知を示すものである場合、前記リクエストを前記サーバへ転送しないステップと、
前記リクエストに含まれる変数ごとに、前記サンドボックス内のアプリケーションにおいて処理可能な前記変数の値を示した変換情報を参照して、前記受信した端末装置からのリクエストにおける変数を、前記サンドボックス内のアプリケーションにおいて処理可能な変数の値に変換した上で、前記サンドボックスへ転送するステップと、
過去における前記サーバへのアクセスログまたは通信パケットから、前記リクエストに含まれる変数を抽出し、抽出した変数のうち、前記サーバへのアクセスまたは通信のたびに前記変数の値が変化する度合いが所定の閾値以上である変数を、前記リクエストにおける変換の対象となる変数として特定し、特定した前記変数を前記変換情報に設定するステップと、
をコンピュータに実行させることを特徴とするリクエスト制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、リクエスト制御装置、リクエスト制御方法、および、リクエスト制御プログラムに関する。
【背景技術】
【０００２】
従来のＷｅｂアプリケーションに対する攻撃検知・防御技術として、ＮＩＤＳ（ネットワーク上に流れるパケット、通信等の特徴量から攻撃コードを検知する技術）、ＨＩＤＳ（ホスト内のシステムコールの順序や引数を特徴量として攻撃を検知する技術）がある。また、サンドボックス（プログラムやファイルを保護された領域で動作させ、その挙動から、当該プログラムやファイルが悪性か否かを判断する技術）等もある。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】Roesch,  Martin.  "Snort‐Lightweight  Intrusion  Detection  for  Networks."  LISA.  Vol.  99.  No.  1.  1999.
【非特許文献２】Barnett,  Ryan.  "WAF  Virtual  Patching  Challenge:  Securing  WebGoat  with  ModSecurity."  Breach  Security  (2009).
【非特許文献３】Hofmeyr,  Steven  A.,  Stephanie  Forrest,  and  Anil  Somayaji.  "Intrusion  Detection  using  Sequences  of  System  Calls."  Journal  of  computer  security  6.3  (1998):  151-180.
【非特許文献４】Mutz,  Darren.,  et  al.  "Anomalous  System  Call  Detection."  ACM  Transactions  on  Information  and  System  Security  (TISSEC)  9.1  (2006):  61-93.
【非特許文献５】Guarnieri,  C.,  et  al.  "Cuckoo  Sandbox-open  source  automated  malware  analysis."  Black  Hat  USA  (2013).
【非特許文献６】Tcpreplay、［平成29年1月16日検索］、インターネット＜URL：http://tcpreplay.synfin.net/)
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、ＮＩＤＳは攻撃コードを検知できても、その攻撃コードが実行されるか否かや、攻撃コードによる攻撃が有効であるか否かについて判断できないという問題がある。また、ＨＩＤＳは、システムコールを取得できるよう、Ｗｅｂサーバ等に対する変更が必要であるという問題がある。【０００５】
そこで、本発明は、前記した問題を解決し、実環境であるＷｅｂサーバ等に対し変更を加えることなく、精度良く、かつ、効率的に攻撃を検知することを課題とする。
【課題を解決するための手段】
【０００６】
前記した課題を解決するため、本発明は、端末装置からサーバへのリクエストを受信し、受信した前記リクエストを前記サーバの環境を再現したサンドボックスで検査させ、前記サンドボックスによる前記リクエストの検査結果が攻撃の検知を示すものではない場合、前記リクエストを前記サーバへ転送し、前記リクエストの検査結果が攻撃の検知を示すものである場合、前記リクエストを前記サーバへ転送しないリクエスト制御部を備えることを特徴とする。ここで言うサンドボックスとは背景技術で述べたプログラムやファイルの挙動を観測するものではなく、ネットワーク上に流れるリクエストを処理する際の挙動を観測するものである。
【発明の効果】
【０００７】
本発明によれば、実環境であるＷｅｂサーバ等に対し変更を加えることなく、精度良く、かつ、効率的に攻撃を検知することができる。
【図面の簡単な説明】
【０００８】
【図１】図１は、第１の実施形態のシステムの構成例を示した図である。
【図２】図２は、図１のリクエスト制御装置の動作例を説明するための図である。
【図３】図３は、図２に示す、（５）リクエスト（オリジナル）に対する（６）レスポンス（オリジナル）と、（３）リクエスト（再現）＋リクエストＩＤに対する（４−Ａ）レスポンス（再現）＋リクエストＩＤとを例示した図である。
【図４】図４は、図１のリクエスト制御装置の処理手順の例を示したフローチャートである。
【図５】図５は、図１のリクエスト制御部の処理手順の例を示したフローチャートである。
【図６】図６は、第２の実施形態のシステムの構成例を示した図である。
【図７】図７は、図６のリクエスト制御装置の動作例を説明するための図である。
【図８】図８は、図７に示す、（５）リクエスト（オリジナル）に対する（６）レスポンス（オリジナル）と、（３）リクエスト（再現）＋リクエストＩＤに対する（４−Ａ）レスポンス（再現）＋リクエストＩＤとを例示した図である。
【図９】図９は、第３の実施形態のシステムの構成例を示した図である。
【図１０】図１０は、図９のリクエスト制御装置の動作例を説明するための図である。
【図１１】図１１は、第４の実施形態のシステムの構成例を示した図である。
【図１２】図１２は、図１１の変換ルール作成部の動作例を説明するための図である。
【図１３】図１３は、リクエスト制御プログラムを実行するコンピュータを示す図である。
【０００９】
以下、図面を参照しながら、本発明を実施するための形態（実施形態）を第１の実施形態から第４の実施形態に分けて説明する。本発明は、各実施形態に限定されない。また、各実施形態に登場する構成は、矛盾が生じない範囲で適宜組合せ可能である。【００１０】
[第１の実施形態]
（全体構成と概要）
まず、第１の実施形態のシステムの全体構成と概要を説明する。システムは、図１に示すように、クライアント（端末装置）１０と、Ｗｅｂシステム２０と、リクエスト制御装置３０とを備える。【００１１】
クライアント１０は、ネットワーク経由でＷｅｂシステム２０と通信可能なコンピュータであり、例えば、ＨＴＴＰリクエスト（リクエスト）をＷｅｂシステム２０へ送信し、当該Ｗｅｂシステム２０からのＨＴＴＰレスポンス（レスポンス）を受信する。【００１２】
Ｗｅｂシステム２０は、攻撃の検知対象となるシステムである。このＷｅｂシステム２０は、クライアント１０からのリクエストに応じて、様々な処理を実行し、当該クライアント１０へレスポンスを返す。このＷｅｂシステム２０は、例えば、Ｗｅｂサーバ、アプリケーションサーバ、ＤＢ（データベース）サーバ等により実現される。【００１３】
リクエスト制御装置３０は、クライアント１０とＷｅｂシステム２０との間に設置され、クライアント１０からＷｅｂシステム２０へのリクエストを受信する。そして、リクエスト制御装置３０は、受信したリクエストを、Ｗｅｂシステム２０の環境を再現したサンドボックス３２で検査し、サンドボックス３２による当該リクエストの検査結果が攻撃の検知を示すものではない場合、当該リクエストをＷｅｂシステム２０へ転送する。一方、サンドボックス３２よる当該リクエストの検査結果が攻撃の検知を示すものである場合、リクエスト制御装置３０は、当該リクエストをＷｅｂシステム２０へ転送しない。【００１４】
このようにリクエスト制御装置３０が、クライアント１０からＷｅｂシステム２０へのリクエストに割り込み、Ｗｅｂシステム２０の環境を再現したサンドボックス３２により、当該リクエストが攻撃を示すものか否かを検査する。これにより、システムは、実環境であるＷｅｂシステム２０に変更を加えることなく、精度良く、かつ、効率的に攻撃を検知することができる。【００１５】
（リクエスト制御装置の構成）
次に、引き続き図１を用いて、リクエスト制御装置３０の構成を説明する。リクエスト制御装置３０は、クローン作成部３１と、リクエスト制御部３３と、リクエスト再現部３４と、変換テーブル３４１と、状態ＤＢ３４２とを備える。なお、サンドボックス３２は、クローン作成部３１によるサンドボックス３２の生成後に装備される。【００１６】
クローン作成部３１は、攻撃の検知対象となるＷｅｂシステム２０から、当該Ｗｅｂシステム２０のクローンを作成するための情報（クローン情報）を取得し、Ｗｅｂシステム２０のクローン（サンドボックス３２）を生成する。【００１７】
例えば、クローン作成部３１は、Ｗｅｂシステム２０が仮想マシンとして実装されている場合、仮想マシンの機能を活用してＷｅｂシステム２０のクローンを生成することができる。また、Ｗｅｂシステム２０が物理マシンとして実装されている場合、クローン作成部３１は、Ｐ２Ｖ（Physical  to  Virtual）等の技術を活用して、Ｗｅｂシステム２０が実装される物理マシンを一旦仮想マシンに変換し、仮想マシンの機能を活用してＷｅｂシステム２０のクローンを生成することができる。なお、図１において、サンドボックス３２は、リクエスト制御装置３０の内部に生成されているが、リクエスト制御装置３０の外部に生成されてもよい。【００１８】
サンドボックス３２は、攻撃の検知対象となるＷｅｂシステム２０の環境（アプリケーションやデータ等）を再現した装置である。このサンドボックス３２は、入力されたリクエストが攻撃であるか否かの検査を行う攻撃検知部３５を備える。例えば、攻撃検知部３５は、リクエスト再現部３４からのリクエストの入力を受け付けると（（３）リクエスト（再現）＋リクエストＩＤ）、サンドボックス３２内の情報を用いて、当該リクエストの検査を行う。そして、攻撃検知部３５は、当該リクエストの検査結果およびリクエストＩＤを対応付けてリクエスト制御部３３へ出力する（（４−Ｂ）検査結果、リクエストＩＤ）。【００１９】
リクエスト制御部３３は、クライアント１０からＷｅｂシステム２０へのリクエストを受信すると、受信したリクエストをサンドボックス３２で検査させる。そして、リクエスト制御部３３は、サンドボックス３２によるリクエストの検査結果が攻撃の検知を示すものではない場合、当該リクエストをＷｅｂシステム２０へ転送する。一方、リクエストの検査結果が攻撃の検知を示すものである場合、リクエスト制御装置３０はリクエストをＷｅｂシステム２０へ転送しない。【００２０】
例えば、リクエスト制御部３３は、クライアント１０からのリクエスト（（１）リクエスト（オリジナル））を受信した場合、当該リクエスト（オリジナル）のリクエストＩＤを生成し、付与する。そして、リクエスト制御部３３は、当該リクエストＩＤが付与されたリクエストをリクエスト再現部３４へ転送する（（２）リクエスト（制御）＋リクエストＩＤ）。【００２１】
なお、リクエスト制御部３３は、サンドボックス３２から当該リクエストＩＤのリクエストの検査結果を受信するまで、当該リクエストＩＤのリクエストを保持しておく。そして、リクエスト制御部３３は、サンドボックス３２から、当該リクエストＩＤのリクエストの検査結果を受信し（（４−Ｂ）検査結果、リクエストＩＤ）、当該リクエストの検査結果が攻撃の検知を示すものでなければ、当該リクエストをＷｅｂシステム２０へ転送する（（５）リクエスト（オリジナル））。一方、当該リクエストＩＤのリクエストの検査結果が攻撃の検知を示すものであれば、リクエスト制御部３３は、当該リクエストをＷｅｂシステム２０へ転送しない。【００２２】
例えば、検査結果が攻撃の検知を示すものである場合、リクエスト制御部３３は、当該リクエストを破棄あるいは通信をリセットする。なお、サンドボックス３２から検査結果が所定の時間返答されない場合（つまり、タイムアウトした場合）、リクエスト制御部３３は、当該リクエストをＷｅｂシステム２０に転送してもよいし、破棄してもよい。タイムアウトしたリクエストを転送するか、破棄するかは、例えば、システムの管理者等が予め設定しておく。なお、所定の時間まではリクエストに対するレスポンスのセッションが切断されないよう、クライアントに対しセッション維持のための信号を生成して送信してもよい。【００２３】
また、リクエスト制御部３３は、Ｗｅｂシステム２０から、リクエストのレスポンスを受信した場合、当該レスポンスを当該リクエストの送信元のクライアント１０へ返す（（６）レスポンス（オリジナル）および（７）レスポンス（オリジナル））。【００２４】
このようにリクエスト制御部３３は、Ｗｅｂシステム２０との間でやりとりされるリクエストおよびレスポンスに割り込み、Ｗｅｂシステム２０の環境を再現したサンドボックス３２にリクエストの検査を行わせる。そして、リクエスト制御部３３は、リクエストの検査結果が攻撃であれば当該リクエストをＷｅｂシステム２０へ転送せず、攻撃でなければ当該リクエストをＷｅｂシステム２０へ転送する。【００２５】
なお、リクエスト制御部３３がリクエストに付与するリクエストＩＤには、例えば、リクエストの送信元ＩＰアドレス、送信先ＩＰアドレス、送信元ポート番号、送信先ポート番号、時刻、リクエストのバイト列のハッシュ値等、リクエストのユニーク性を表現できる値を用いる。【００２６】
例えば、リクエストの、送信元ＩＰアドレス、送信先ＩＰアドレス、送信元ポート番号、送信先ポート番号、時刻、リクエストのバイト列のハッシュ値＝（1.1.1.1,  2.2.2.2,  50001,  80,  2016/00/00  00:00:00.000  581fc5e8bc2861213adeacb07b851092）ならば、リクエスト制御部３３は、当該リクエストにリクエストＩＤ＝１を付与する。【００２７】
また、リクエストの、送信元ＩＰアドレス、送信先ＩＰアドレス、送信元ポート番号、送信先ポート番号、時刻、リクエストのバイト列のハッシュ値＝(3.3.3.3,  2.2.2.2,  50002,  80,  2016/00/00  00:00:01.000  bcd899f4235fd90793545bba7fce19d1)ならば、リクエスト制御部３３は、当該リクエストにリクエストＩＤ＝２を付与する。【００２８】
なお、リクエスト制御部３３は、リクエストにリクエストＩＤを付与する際、Ｗｅｂシステム２０やサンドボックス３２で用いるアプリケーションの動作に影響を与えないように行う。例えば、リクエスト制御部３３は、リクエストＩＤを、当該リクエストのリクエストヘッダに追加したり、専用パラメタを追加したりしてもよい。【００２９】
リクエスト再現部３４は、入力されたリクエストを、サンドボックス３２のアプリケーション等で適切に処理されるよう、当該リクエストの内容を一部変更してサンドボックス３２へ出力する。つまり、リクエスト再現部３４は、Ｗｅｂシステム２０へ入力されるリクエストを、サンドボックス３２で処理可能なリクエストに変更する。【００３０】
これは、例えば、リクエスト等においてユーザの識別に利用されるセッションＩＤは、Ｗｅｂシステム２０等で処理を行うアプリケーションに発行してもらう必要があり、クライアント１０からＷｅｂシステム２０へ送信したリクエストをそのままサンドボックス３２に再送してしまうと、サンドボックス３２のアプリケーションで正しく処理されないおそれがあるからである。【００３１】
そこで、リクエスト再現部３４は、例えば、変換テーブル３４１に設定された変換ルール（変換情報）に従い、リクエストを、サンドボックス３２のアプリケーション等で適切に処理されるよう変換する。この変換ルールは、例えば、リクエストに含まれる変数ごとに、当該変数の値をどの値に変換すべきかを示したものである。なお、変換先の値は、サンドボックス３２内のアプリケーションにおいて処理可能な変数の値が設定される。【００３２】
例えば、この変換ルールには、リクエストに含まれるセッションＩＤの変換や、ＣＳＲＦ（Cross-Site  Request  Forgeries）対策のため、正しいクライアント１０から操作が行われているかをチェックする機能として一般的用いられているnonceの変換に関するルールが設定される。【００３３】
例えば、Ｗｅｂシステム２０で用いられるアプリケーションが、セッションＩＤを利用している場合を考える。この場合、リクエスト再現部３４は、リクエスト制御部３３から出力されたリクエストに含まれるセッションＩＤを、過去にサンドボックス３２で発行されたセッションＩＤに書き換える。例えば、リクエスト再現部３４は、リクエスト制御部３３から出力されたリクエストに含まれるセッションＩＤを、以下のように、過去にサンドボックス３２で発行されたセッションＩＤ（PHPSESSID=ffffeeee）に書き換える。【００３４】
PHPSESSID=1234abcd  →  PHPSESSID=ffffeeee【００３５】
また、nonceが用いられる場合、Ｗｅｂシステム２０から発行されたnonceをそのままサンドボックス３２に用いることは出来ない。そのため、リクエスト再現部３４は、過去にサンドボックス３２側から取得したnonceがある場合、そのnonceを利用する。例えば、リクエスト再現部３４は、リクエストに含まれるnonceの値を、以下のように、過去にサンドボックス３２から取得したnonceの値（nonce=5678）に書き換える。【００３６】
POST  /post.php?nonce=1234  →  POST  /post.php?nonce=5678【００３７】
なお、上記の変換ルールは、変換テーブル３４１に設定され、変換時に使用する変数の値は、状態ＤＢ３４２（後記）の値を用いる。【００３８】
例えば、リクエスト再現部３４は、リクエスト制御部３３からリクエストの入力を受け付けると（（２）リクエスト（制御）＋リクエストＩＤ）、変換テーブル３４１および状態ＤＢ３４２を参照して、当該リクエストの内容を一部変更してサンドボックス３２へ出力する（（３）リクエスト（再現）＋リクエストＩＤ）。そして、リクエスト再現部３４は、サンドボックス３２から当該リクエストに対するレスポンスを受け取る（（４−Ａ）レスポンス（再現）＋リクエストＩＤ）。その後、リクエスト再現部３４は、サンドボックス３２から受け取ったレスポンスに含まれる変数の値を、状態ＤＢ３４２に蓄積する。【００３９】
変換テーブル３４１は、リクエスト再現部３４が、リクエストに含まれるどの変数の値をどの値に変換するかを示す変換ルールを記憶する。この変換ルールは、例えば、図２に示すように、変数（変数名）ごとに、当該変数の変換元の値と、変換先の値とを示した情報である。【００４０】
また、状態ＤＢ３４２は、変換ルールにおいて変換の対象となる変数名ごとに、当該変数の変換先の値を示した情報である。この状態ＤＢ３４２は、例えば、過去においてサンドボックス３２から出力されたレスポンスに含まれる変数の値に基づき生成される。一例を挙げると、リクエスト再現部３４がサンドボックス３２からレスポンスを受け取ると、当該レスポンスに含まれる変数の値を状態ＤＢ３４２に追加する。【００４１】
この変換テーブル３４１および状態ＤＢ３４２は、リクエスト制御装置３０の記憶部（図示省略）に記憶される。なお、変換テーブル３４１および状態ＤＢ３４２は、リクエスト制御装置３０の外部に記憶されてもよい。【００４２】
（リクエスト制御装置の動作例）
次に、図２および図３を用いてリクエスト制御装置３０の動作例を説明する。なお、図３は、図２に示す、（５）リクエスト（オリジナル）に対する（６）レスポンス（オリジナル）と、（３）リクエスト（再現）＋リクエストＩＤに対する（４−Ａ）レスポンス（再現）＋リクエストＩＤとを例示した図である。【００４３】
例えば、図３に示すように、Ｗｅｂシステム２０は、リクエスト（オリジナル）−１に対し、レスポンス（オリジナル）−１に示す、PHPSESSID=1234abcd、nonce=1234を設定したレスポンスを返す。その後、Ｗｅｂシステム２０は、リクエスト（オリジナル）−２に示す、PHPSESSID=1234abcd、nonce=1234が設定されたリクエストの入力を受け付けた場合、レスポンス（オリジナル）−２に示すレスポンスを返す。つまり、Ｗｅｂシステム２０は正常な処理を行う。また、一方で、サンドボックス３２は、リクエスト（再現）−１に対し、レスポンス（再現）−１に示す、PHPSESSID=ffffeeee、nonce=5678を設定したレスポンスを返す場合を考える。【００４４】
この場合、リクエスト再現部３４は、リクエスト制御部３３から、図３のリクエスト（オリジナル）−２に示すリクエストの入力を受け付けると、過去に受け取ったレスンポンス（再現）−１に基づき、当該リクエストを、PHPSESSID=ffffeeee、nonce=5678を設定したリクエストに変換し、サンドボックス３２へ出力する。これにより、サンドボックス３２は、当該リクエストに基づく処理を実行し、レスポンス（再現）−２に示すレスポンスをリクエスト再現部３４へ返す。【００４５】
また、リクエスト再現部３４がリクエストＩＤ＝ｘｘｘｘ（X-REQUEST-ID:xxxx）のリクエストをサンドボックス３２へ出力し、サンドボックス３２から通知された当該リクエストの検査結果が「攻撃」である場合（図２の（４−Ｂ）参照）、リクエスト制御部３３で保持する当該リクエストＩＤ=ｘｘｘｘ(X-REQUEST-ID:xxxx)のリクエスト(リクエスト(オリジナル)−３)はＷｅｂシステム２０へ転送しない。【００４６】
このようにすることで、リクエスト制御装置３０は、実環境であるＷｅｂシステム２０等に対し変更を加えることなく、攻撃を検知することができる。【００４７】
（処理手順）
次に、図４を用いてリクエスト制御装置３０の処理手順の例を説明する。なお、リクエスト制御装置３０は、事前にサンドボックス３２を生成済みであるものとする。【００４８】
まず、リクエスト制御装置３０は、ユーザより終了命令がなく（Ｓ１でＮｏ）、クライアント１０から未処理のリクエストが到着した場合（Ｓ２でＹｅｓ）、リクエストの攻撃検知処理を実施する（Ｓ３）。つまり、リクエスト制御装置３０は、サンドボックス３２で当該リクエストが攻撃か否かの検査を行う。そして、検査結果が攻撃であれば（Ｓ４でＹｅｓ）、リクエスト制御装置３０は、当該リクエストを破棄する（Ｓ５）。一方、検査結果が攻撃でなければ（Ｓ４でＮｏ）、リクエスト制御装置３０は、当該リクエストをＷｅｂシステム２０へ転送する（Ｓ６）。なお、ユーザより終了命令があった場合（Ｓ１でＹｅｓ）、リクエスト制御装置３０はＳ３〜Ｓ６の処理を実行せず、処理を終了する。また、Ｓ２で未処理のリクエストが到着しなかった場合（Ｓ２でＮｏ）、リクエスト制御装置３０は、Ｓ１へ戻る。【００４９】
次に、図５を用いてリクエスト制御部３３の処理手順の例を詳細に説明する。リクエスト制御部３３は、未処理のリクエストが到着すると（Ｓ１１）、当該リクエストにリクエストＩＤを付与し、リクエスト再現部３４に転送する（Ｓ１２）。その後、当該リクエストは、リクエスト再現部３４により、サンドボックス３２に転送され、サンドボックス３２で検査される。【００５０】
Ｓ１２の後、Ｓ１２で転送したリクエストＩＤのリクエストに対する検査結果が攻撃検知部３５により返答され（Ｓ１３でＹｅｓ）、当該検査結果が攻撃を示すものであれば（Ｓ１４でＹｅｓ）、リクエスト制御部３３は、検査結果の対象となるリクエストＩＤの示すリクエストを破棄する（Ｓ１５）。一方、検査結果が攻撃を示すものでなければ（Ｓ１４でＮｏ）、リクエスト制御部３３は、検査結果の対象となるリクエストＩＤの示すリクエストをＷｅｂシステム２０へ転送する（Ｓ１６）。【００５１】
また、Ｓ１２で転送したリクエストＩＤのリクエストに対する検査結果が攻撃検知部３５により返答されず（Ｓ１３でＮｏ）、所定の時間が経過した場合（Ｓ１７でＹｅｓ）、リクエスト制御部３３はタイムアウト処理を行い（Ｓ１８）、まだ所定の時間が経過していなければ（Ｓ１７でＮｏ）、Ｓ１３へ戻る。【００５２】
このようにすることで、リクエスト制御装置３０は、実環境であるＷｅｂシステム２０等に対し変更を加えることなく、攻撃を検知することができる。【００５３】
[第２の実施形態]
なお、Ｗｅｂシステム２０のコンプライアンスやセキュリティポリシーにより、リクエスト制御装置３０がＷｅｂシステム２０の仮想マシンをクローニングすることができない場合もある。このような場合、Ｗｅｂシステム２０に用いられるアプリケーションが、オープンソースなアプリケーションであれば、当該アプリケーションを用いてサンドボックス３２を作成し、リクエスト制御装置は、当該サンドボックス３２を用いてリクエストに対する攻撃検知を行えばよい。【００５４】
上記のようなサンドボックス３２を用いるリクエスト制御装置を、リクエスト制御装置３０ａとして説明する。前記した実施形態と同じ構成については同じ符号を付して説明を省略する。【００５５】
図６に示すようにリクエスト制御装置３０ａは、変換テーブル３４１ａ、リクエスト再現部３４ａを備える。【００５６】
変換テーブル３４１ａは、リクエストに含まれるセッションＩＤの変換や、nonceの変換に関する変換ルールに加え、ログインユーザの変換に関する変換ルール（図７の符号７０１に示すルール参照）や、動的コンテンツＩＤの変換に関する変換ルール（図７の符号７０２に示すルール参照）を含む。そして、リクエスト再現部３４ａは、この変換テーブル３４１ａに設定された変換ルールに従い、リクエストにおけるログインユーザの変換や、動的コンテンツＩＤの変換を行った上で、当該リクエストをサンドボックス３２へ出力する。【００５７】
例えば、リクエスト再現部３４ａは、ログインユーザの変換に関する変換ルールに基づき、リクエスト制御部３３から受け取ったリクエストにログイン処理に関する部分があった場合、当該リクエストを、サンドボックス３２のユーザのログイン処理に用いても正常に動作するよう、当該リクエストの変換を行う。【００５８】
一例を挙げると、リクエスト再現部３４ａは、クライアント１０から受信したリクエストに含まれる「POST  /login.php?user=admin&password=mypasswd」という記述を、サンドボックス３２のユーザのログイン処理に用いても正常に動作するよう「POST  /login.php?user=sandbox&password=sandbox_passwd」に変換する。【００５９】
リクエスト再現部３４ａが、このようなリクエストの変換を行うことで、サンドボックス３２が、Ｗｅｂシステム２０のクローンではない場合であっても、サンドボックス３２でのログイン処理を正常に実行させることができる。【００６０】
また、例えば、リクエスト再現部３４ａは、動的コンテンツＩＤの変換に関する変換ルールに基づき、リクエスト制御部３３から受け取ったリクエストに動的コンテンツ（例えば、ブログ等の記事）に関する記述があった場合、当該リクエストを、サンドボックス３２の動的コンテンツへのリクエストに用いても正常に動作するよう、当該リクエストの変換を行う。【００６１】
一例を挙げると、リクエスト再現部３４ａは、リクエストに含まれる「GET  /index.php?page_id=100」という記述を、サンドボックス３２の動的コンテンツへのリクエストとなるよう「GET  /index.php?page_id=1」に変換する。【００６２】
リクエスト再現部３４ａが、このようなリクエストの変換を行うことで、サンドボックス３２が、Ｗｅｂシステム２０のクローンではない場合であっても、サンドボックス３２での動的コンテンツに対する処理を正常に実行させることができる。【００６３】
なお、リクエスト再現部３４ａは、リクエストに静的コンテンツ等に関する記述があった場合は、リクエストの変換を行う必要がないので、リクエストの変換を行わない。例えば、リクエスト再現部３４ａは、リクエストに「GET  /css/style.css」や「GET  /favicon.ico」等の静的コンテンツのリクエストが含まれていた場合、リクエストの変換を行わない。【００６４】
（リクエスト制御装置の動作例）
次に、図７および図８を用いてリクエスト制御装置３０ａの動作例を説明する。なお、図８は、図７に示す、（５）リクエスト（オリジナル）に対する（６）レスポンス（オリジナル）と、（３）リクエスト（再現）＋リクエストＩＤに対する（４−Ａ）レスポンス（再現）＋リクエストＩＤとを例示した図である。【００６５】
例えば、図８に示すように、Ｗｅｂシステム２０は、リクエスト（オリジナル）−５に対し、レスポンス（オリジナル）−５に示すレスポンスを返す。また、Ｗｅｂシステム２０は、リクエスト（オリジナル）−６に示すリクエストの入力を受け付けた場合、レスポンス（オリジナル）−６に示すレスポンスを返す場合を考える。【００６６】
この場合、リクエスト再現部３４ａは、リクエスト制御部３３から、図８に示す「GET  /login.php?nonce=1234&user=admin&password=mypasswd」を含むリクエスト（オリジナル）−５の入力を受け付けると、このリクエストのnonceとユーザＩＤ＆パスワードの値の変換を行う。例えば、リクエスト再現部３４は、上記のリクエストのnonceとユーザＩＤ＆パスワードの値を、リクエスト（再現）−５に示すように「GET  /login.php?nonce=5678&user=sandbox&password=sandbox」に変換する。【００６７】
これにより、サンドボックス３２においても、当該リクエストに基づき、Ｗｅｂシステム２０と同じアプリケーションを動作させることができる。その結果、例えば、リクエスト再現部３４ａは、サンドボックス３２から、レスポンス（再現）−５に示すレスポンスを受け取ることができる。【００６８】
また、リクエスト再現部３４ａは、リクエスト制御部３３から、図８に示す「GET  /index.php?page_id=100」を含むリクエスト（オリジナル）−６の入力を受け付けると、このリクエストのpage_idの値の変換を行う。例えば、リクエスト再現部３４ａは、上記のリクエストのpage_idの値を、リクエスト（再現）−６に示すように「GET  /index.php?page_id=1」に変換する。【００６９】
これにより、サンドボックス３２においても、当該リクエストに基づく処理を正常に実行させることができる。その結果、例えば、リクエスト再現部３４ａは、サンドボックス３２から、レスポンス（再現）−６に示すレスポンスを受け取ることができる。【００７０】
[第３の実施形態]
また、リクエスト制御装置は、リクエストの処理スループットを向上させるため、サンドボックス３２で検査済みのリクエストと同種のリクエストについてはサンドボックス３２で再度検査を行わないようにしてもよい。上記のようなリクエスト制御装置を、リクエスト制御装置３０ｂとして説明する。前記した各実施形態と同じ構成については同じ符号を付して説明を省略する。【００７１】
図９に示すようにリクエスト制御装置３０ｂは、リクエスト制御部３３ａと、検査済みリクエスト情報ＤＢ３３１とを備える。【００７２】
リクエスト制御部３３ａは、サンドボックス３２で検査済みのリクエストと同種のリクエストについてはリクエスト再現部３４へ出力しない。ここでは、リクエスト制御部３３ａは、検査済みのリクエストと同種のリクエストを識別するために、それぞれのリクエストのバイト列のハッシュ値（リクエストハッシュＩＤ）を用いる場合を例に説明する。リクエスト制御部３３ａは、このリクエストハッシュＩＤが同じリクエストを同種のリクエストと判断するものとする。【００７３】
例えば、リクエスト制御部３３ａは、過去にサンドボックス３２で検査したリクエストのリクエストハッシュＩＤと、当該リクエストの検査結果とを対応付けて検査済みリクエスト情報ＤＢ３３１に蓄積しておく。そして、リクエスト制御部３３ａは、クライアント１０からリクエストを受信すると、当該リクエストのリクエストハッシュＩＤを求める。そして、リクエスト制御部３３ａは、検査済みリクエスト情報ＤＢ３３１を参照し、当該リクエストハッシュＩＤのリクエストが検査済みでなければ、受信したリクエストをリクエスト再現部３４へ転送する。つまり、リクエスト制御部３３ａは、当該リクエストをサンドボックス３２で検査させる。【００７４】
一方、リクエスト制御部３３ａは、検査済みリクエスト情報ＤＢ３３１を参照し、当該リクエストハッシュＩＤのリクエストが検査済みであり、かつ、当該リクエストの検査結果が攻撃の検知を示すものではない場合、当該リクエストをＷｅｂシステム２０へ転送する。また、リクエスト制御部３３ａは、検査済みリクエスト情報ＤＢ３３１を参照し、当該リクエストハッシュＩＤのリクエストが検査済みであり、かつ、当該リクエストの検査結果が攻撃の検知を示すものである場合、当該リクエストをＷｅｂシステム２０へ転送しない。【００７５】
このリクエスト制御部３３ａは、情報蓄積部３３２を備える。この情報蓄積部３３２は、過去にサンドボックス３２で検査したリクエストの検査結果を、検査済みリクエスト情報ＤＢ３３１に蓄積する。具体的には、情報蓄積部３３２は、サンドボックス３２で検査済みのリクエストに対し、当該リクエストのリクエストハッシュＩＤを求める。このリクエストハッシュＩＤは、例えば、リクエストのバイト列のハッシュ値、リクエストに含まれるＩＰアドレス、ポート番号、および、受信時刻の少なくともいずれかを用いて求められる。【００７６】
その後、情報蓄積部３３２は、サンドボックス３２で検査済みのリクエストに対し、当該リクエストのリクエストハッシュＩＤと、当該リクエストの検査結果とを対応付けた情報（検査済みリクエスト情報）を検査済みリクエスト情報ＤＢ３３１に蓄積する。【００７７】
検査済みリクエスト情報ＤＢ３３１は、前記した検査済みリクエスト情報を記憶する。この検査済みリクエスト情報ＤＢ３３１は、リクエスト制御装置３０ｂの記憶部（図示省略）に記憶される。なお、リクエスト情報ＤＢ３３１は、リクエスト制御装置３０ｂの外部に記憶されてもよい。【００７８】
（リクエスト制御装置の動作例）
次に、図１０を用いてリクエスト制御装置３０ｂの動作例を説明する。なお、図１０において、検査済みリクエスト情報ＤＢ３３１には、符号１０１に示す検査済みリクエスト情報が蓄積されているものとする。【００７９】
例えば、リクエスト制御部３３ａが、クライアント１０から、（１）リクエスト（オリジナル）として、符号１０２に示すリクエストを受信した場合を考える。この場合、リクエスト制御部３３ａは、検査済みリクエスト情報ＤＢ３３１に、当該リクエストのリクエストハッシュＩＤが含まれており、かつ、検査結果が「正常」なので、当該リクエストをそのままＷｅｂシステム２０へ転送する。【００８０】
なお、ここでは説明を省略しているが、リクエスト制御部３３ａは、検査済みリクエスト情報ＤＢ３３１に、当該リクエストのリクエストハッシュＩＤが含まれているが、検査結果が「攻撃」であれば、当該リクエストを破棄、または、通信のリセットを行い、当該リクエストをＷｅｂシステム２０へ転送しない。また、リクエスト制御部３３ａは、検査済みリクエスト情報ＤＢ３３１に、当該リクエストのリクエストハッシュＩＤが含まれていなければ、当該リクエストをリクエスト再現部３４へ出力し、サンドボックス３２で検査を行う。そして、リクエスト制御部３３ａは、当該リクエストの検査結果に応じて、当該リクエストをＷｅｂシステム２０へ転送するか否かを判断する。【００８１】
このようなリクエスト制御装置３０ｂによれば、サンドボックス３２で検査済みのリクエストとバイト列のハッシュ値が同じ等、同種のリクエストについてはサンドボックス３２で再度検査を行わない。よって、リクエスト制御装置３０ｂは、リクエストの処理スループットを向上させることができる。【００８２】
[第４の実施形態]
また、リクエスト制御装置は、過去におけるＷｅｂシステム２０へのアクセスログや、通信パケット（例えば、ＰＣＡＰ（Packet  CAPture））から、サンドボックス３２へのリクエストを転送する際、変換を必要とするリクエストの変数を特定し、この変数を変換テーブル３４１に設定してもよい。【００８３】
上記のリクエスト制御装置を、リクエスト制御装置３０ｃとして説明する。前記した実施形態と同じ構成については同じ符号を付して説明を省略する。【００８４】
リクエスト制御装置３０ｃは、図１１に示すように、変換ルール作成部（変換情報設定部）３６をさらに備える。この変換ルール作成部３６は、過去におけるＷｅｂシステム２０へのアクセスログや、ＰＣＡＰから、リクエストに含まれる変数を抽出する。そして、変換ルール作成部３６は、抽出した変数のうち、Ｗｅｂシステム２０へのアクセスまたは通信のたびに、変数の値が頻繁に変化する変数を特定する。【００８５】
例えば、変換ルール作成部３６は、過去におけるＷｅｂシステム２０へのアクセスまたは通信のたびに値が変化する度合いが所定の閾値以上である変数を、リクエストにおける変換の対象となる変数として特定する。そして、変換ルール作成部３６は、特定した変数を変換テーブル３４１における変換ルールに設定する。【００８６】
変換ルール作成部３６による、変換ルールの作成手順の一例を挙げる。例えば、変換ルール作成部３６は、過去におけるＷｅｂシステム２０へのアクセスログにおけるリクエストＵＲＬ、リクエストヘッダ、リクエストデータ部等から、リクエストの変数となる部分を抽出する。【００８７】
次に、変換ルール作成部３６は、抽出した各変数に対して、変数の値の集合Ｘから、以下の式（１）により定義される分散度Ｖを求める。式（１）において、ｕｎｉｑ（Ｘ）は集合Ｘの中からユニークな要素を取り出す関数である。【００８８】
【数１】
0006676790.tif 000002
【００８９】
ここで、式（１）により求めた、Ｖが所定の閾値Ｔ以上である場合、変換ルール作成部３６は、その変数を、セッションＩＤやnonceのように、Ｗｅｂシステム２０へのアクセスまたは通信のたび値が変化する度合いの高い変数と判断する。そして、変換ルール作成部３６は、当該変換を必要とする変数として特定する。一方、Ｖが閾値Ｔより小さい場合、変換ルール作成部３６は、当該変数を、変換を必要としない変数と判断する。【００９０】
図１２を用いて変換ルール作成部３６の動作例を説明する。変換ルール作成部３６が、符号１２１に示す過去のアクセスログ、ＰＣＡＰ等を用い、上記の式（１）においてＶの閾値Ｔ＝０．８を設定した場合を例に説明する。【００９１】
例えば、変換ルール作成部３６は、符号１２１に示す過去のアクセスログ、ＰＣＡＰ等からmodeおよびsessidの２つの変数を抽出し、上記の式（１）によりそれぞれの変数のＶを算出したところ、modeのＶの値は０．４であり、sessidのＶの値は１．０であった場合を考える。この場合、変換ルール作成部３６は、modeのＶの値は閾値Ｔ（０．８）未満なので、変換は必要ない（Ｎｏ）と判定し、sessidのＶの値は閾値Ｔ（０．８）以上であるので変換の必要がある（Ｙｅｓ）と判定する。そして、変換ルール作成部３６は、sessidに関する変換ルールを変換テーブル３４１に追加する。例えば、変換ルール作成部３６は、sessidの値について、状態ＤＢ３４２に登録されたsessidの値「a001」を読み出し、リクエストにおけるsessidの値（例えば「0001」）を「a001」に変換するという変換ルールを変換テーブル３４１に追加する。【００９２】
このような変換テーブル３４１に基づき、リクエスト再現部３４は、sessidの値が「a001」であるリクエストについて、このsessidの値を「a001」に変換し、サンドボックス３２へ出力する。【００９３】
このようにリクエスト制御装置３０ｃは、過去のアクセスログ、ＰＣＡＰ等を用い自動で変換テーブル３４１に変換ルールを追加することができるので、ユーザが変換テーブル３４１に変換ルールを追加する手間を軽減することができる。【００９４】
（プログラム）
また、上記の実施形態で述べたリクエスト制御装置３０，３０ａ，３０ｂ，３０ｃの機能を実現するプログラムを所望の情報処理装置（コンピュータ）にインストールすることによって実装できる。例えば、パッケージソフトウェアやオンラインソフトウェアとして提供される上記のプログラムを情報処理装置に実行させることにより、情報処理装置をリクエスト制御装置３０，３０ａ，３０ｂ，３０ｃとして機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やＰＨＳ（Personal  Handyphone  System）等の移動体通信端末、さらには、ＰＤＡ（Personal  Digital  Assistants）等がその範疇に含まれる。また、リクエスト制御装置３０，３０ａ，３０ｂ，３０ｃを、クラウドサーバに実装してもよい。【００９５】
以下に、上記のプログラム（リクエスト制御プログラム）を実行するコンピュータの一例を説明する。図１３は、リクエスト制御プログラムを実行するコンピュータを示す図である。図１３に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。【００９６】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。【００９７】
ここで、図１３に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。前記した実施形態で説明した各種データや情報は、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。【００９８】
そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。【００９９】
なお、リクエスト制御プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、リクエスト制御プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【０１００】
１０    クライアント
２０    Ｗｅｂシステム
３０，３０ａ，３０ｂ，３０ｃ  リクエスト制御装置
３１    クローン作成部
３２    サンドボックス
３３，３３ａ  リクエスト制御部
３４，３４ａ  リクエスト再現部
３５    攻撃検知部
３６    変換ルール作成部
３３１  検査済みリクエスト情報ＤＢ
３３２  情報蓄積部
３４１，３４１ａ  変換テーブル
３４２  状態ＤＢ
【図１】
0006676790.tif 000003
【図２】
0006676790.tif 000004
【図３】
0006676790.tif 000005
【図４】
0006676790.tif 000006
【図５】
0006676790.tif 000007
【図６】
0006676790.tif 000008
【図７】
0006676790.tif 000009
【図８】
0006676790.tif 000010
【図９】
0006676790.tif 000011
【図１０】
0006676790.tif 000012
【図１１】
0006676790.tif 000013
【図１２】
0006676790.tif 000014
【図１３】
0006676790.tif 000015