(57)【要約】人間に解読可能なコード（例えばマクロやスクリプト）であるか否かにかかわらず、あるいはコンパイルされたコード（例えばWindowsの実行可能ファイル）であるか否かにかかわらず、実行可能コードをエミュレートする方法。設計時には、コードの変数について一つまたは複数の「内容属性」（悪意性に関係があるプロパティー、例えばランダム値）を定義する。設計時には、また悪意的な状態（例えば、ある特定のシステム関数に対する呼び出しと、ある特定の内容との組み合わせ）のリストを定義する。代入命令をエミュレートする際には、代入された内容に従って代入された変数の属性を設定する。数学演算子をエミュレートする際には、内容計算をも適用する。関数呼び出しをエミュレートする際には、現在の状態（関数のアイデンティティーと呼び出し内容）をあらかじめ定義された悪意的な状態と比較し、少なくとも一つの悪意的な状態が一致する場合には、コードの悪意性が決定される。
2006512667.tif 000002
【特許請求の範囲】
【請求項１】
実行可能コードをエミュレートする方法であって、前記方法は、
−  前記実行可能コードの少なくとも一つの変数について、悪意性に関係する少なくとも一つの内容属性を事前に定義するステップと、
−  ある特定の内容および値またはそのいずれか一方を有するある特定のシステム関数を呼び出す少なくとも一つの悪意的な状態を事前に定義するステップと、
−  代入命令をエミュレートする際に、前記代入される内容と前記代入される変数の前記値とに従って、前記代入される変数の前記内容属性を設定するステップと、
−  数学演算子をエミュレートする際に、内容計算を使用するステップと、
−  関数呼び出しをエミュレートする際に、前記関数のアイデンティティーと、前記呼び出しパラメーターの前記内容および値またはそのいずれか一方との組み合わせである現在の状態が、前記事前に定義された悪意的な状態の少なくとも一つに一致することをチェックするステップとを含み、これにより前記コードの悪意性を指摘する、実行可能コードをエミュレートする方法。
【請求項２】
前記チェックするステップは、前記関数のアイデンティティーと、前記呼び出しパラメーターの前記内容および値またはそのいずれか一方との間の等価性を検査するステップと、前記関数のアイデンティティーと、前記呼び出しパラメーターの前記内容および値のまたはそのいずれか一方との類似性を検査するステップと、ある特定の関数がすでに呼び出し済みか否かを検査するステップと、ある特定の関数がある特定のパラメーターとともにすでに呼び出し済みか否かを検査するステップと、を含むグループから選ばれる、請求項１に記載の方法。
【請求項３】
前記実行可能ファイルは、コンパイル済みコードと人間に解読可能なコードと、を含むグループから選ばれる、請求項１に記載の方法。
【請求項４】
前記少なくとも一つの内容属性は、プログラミングフラグと、ブーリアン値と、数値と、文字列値と、を含むグループから選ばれる、請求項１に記載の方法。
【請求項５】
前記少なくとも一つの内容属性は、ランダム値と、時間値と、ある特定のフォルダー名と、ある特定のファイル拡張子と、フォルダー内のファイル数と、を含むグループから選ばれる、請求項１に記載の方法。
【請求項６】
前記システム関数は、実行可能ファイルのプログラミング言語と、前記コードが実行するオペレーティングシステムと、を含むグループから選ばれる、請求項１に記載の方法。
【請求項７】
前記パラメーター（一つまたは複数）は、永久的パラメーターと、一時的パラメーターと、を含むグループから選ばれる、請求項１に記載の方法。
【請求項８】
前記パラメーター（一つまたは複数）は、その内容によってパスされるか、またはそのアドレスによってパスされる、請求項１に記載の方法。
【請求項９】
前記コンパイル済みコードは、Windows EXEと、Windows DLLと、Windows OCXと、Linux実行可能ファイルと、Solaris実行可能ファイルと、を含むグループから選ばれる、請求項２に記載の方法。
【請求項１０】
前記人間に解読可能なコードは、マクロと、スクリプトと、VBScriptと、JavaScriptと、ＢＡＴと、ＰＨＰと、ＡＳＰと、を含むグループから選択される、請求項２に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ウイルスやその他の種類の悪質コードの存在を、エミュレーションによって検知する分野に関する。
【背景技術】
【０００２】
エミュレーションは、ウイルス性活動を検知する方法の一つである。エミュレーターは、試験すべきサンプルのコードを命令ごとに調べる仮想環境を作成する。変化をウイルス性挙動に相関させることによって、ウイルス性活動を検知する。
エミュレーションは、他の方法では検知できない多形性ウイルス、暗号化されたウイルス、未知のウイルス等の検知に役立つ方法であり、ウイルス性被害を検知および防止またはそのいずれか一方を行う他の方法に比べて、いくつかの利点がある。
プログラマーであれば、コードを調べるだけで、ソースコードの悪意性を指摘することができる。例えば、ディレクトリーのファイルの名前を取得し、ファイルを削除するループを突きとめたプログラマーは、そのコードに悪意があると仮定できる。人間のプログラマーとは対照的に、機械であるエミュレーターは、コードを調べるだけでは、ウイルス性コードを指摘できず、引き起こされた変化を既知のパターンと比較しながら、コードを実行しなければならない。換言すると、機械であるエミュレーターは、人知を欠いているのである。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
本発明の目的は、従来技術で公知のものよりもさらに「知的」である悪意性を検知するために実行可能コードをエミュレートする方法を提供することである。
本発明の他の目的および利点は、説明が進むにつれて明らかとなろう。
【課題を解決するための手段】
【０００４】
本発明は、人間に解読可能なコード（例えばマクロやスクリプト）であるか否かにかかわらず、あるいは、コンパイルされたコード（例えばWindowsの実行可能ファイル）であるか否かにかかわらず、実行可能コードをエミュレートする方法に関する。設計時には、コードの変数について一つまたは複数の内容属性を定義する。内容属性は、悪意性に関係のあるプロパティー、例えばWindowsディレクトリー、ランダム値、文字列の右側にある「．ＥＸＥ」等を意味する。内容属性は、例えばフラグによって実行してもよい。設計時には、悪意的な状態のリストをも定義するが、この悪意的な状態は、少なくとも、ある特定のシステム関数に対する呼び出しに、呼び出しパラメーター（一つまたは複数）として、ある特定の内容を組み合わせたものである。代入命令をエミュレートする際には、代入された内容に従って、代入された変数の属性を設定する。数学演算子をエミュレートする際には、内容計算をも適用する。関数呼び出しをエミュレートする際には、現在の状態（すなわち、関数のアイデンティティーと呼び出し内容および値）をあらかじめ定義された悪意的な状態と比較し、さらに少なくとも一つの悪意的な状態が一致する場合は、コードの悪意性が決定される。
システム関数は、例えば、実行可能ファイルのプログラミング言語の一部であったり、コードを実行するオペレーティングシステムにより提供される関数であったり、リンクされたルーチンパッケージにより提供される関数であったりする。
【発明を実施するための最良の形態】
【０００５】
本発明は、添付の図面を参照することで、より良く理解されよう。
本明細書において、コンピューターに関連するマクロという用語は、文書や実行可能コードのような、別の存在中に埋め込まれた実行可能コードを指す。
当該技術において、コンピューターに関連するスクリプトという用語は、ほとんどすべてのインターネットアプリケーションで機能するウェブページのＨＴＭＬコードに組み込まれたプログラムを指す。スクリプトは、またそのスクリプト構文をサポートする様々なアプリケーションとともに使用することができる。スクリプト記述言語には、例えばVBScriptやJavaScriptがある。
実行前に機械コードに変換される「コンパイル済み実行可能ファイル」とは対称的に、マクロとスクリプトは、「非コンパイル済み実行可能ファイル」であり、すなわち、実行可能コードがソースコードに相当するプログラムである。非コンパイル済み実行可能ファイルの他の例には、ＡＳＰやＸＭＬがある。
非コンパイル済み実行可能ファイルは、人間による解読が可能なため、バンダル（スクリプトやマクロ内に書き込まれる悪質な実行可能ファイル）によって悪用される。システムをトロイに感染させたり、ファイルを変更したり、DoS攻撃を引き起こしたり、あるいは、Microsoft NetworksやMicrosoft Outlookを使って悪質コードを蔓延させたりと、バンダルは、ほとんど、どんなことでも実行できる。Microsoft Wordを攻撃するマクロウイルスは、（通常はNORMAL.DOTを変更することにより）グローバル環境に向けて自身を複製することによって有効に作用する。残念ながら、ソフトウェアアプリケーションの能力向上は、ウイルスの作成者に、より多くの害をなす可能性を与えるものである。
なお、ここでは人間に解読可能なプログラミングコード中での例を提示するが、それらの例がコンパイル済みコードと非コンパイル済みコードの両方に当てはまることに留意されたい。さらに、それらの例は、既存のプログラミング言語よりはむしろ、概略的プログラミング言語中に提示されている。
【０００６】
悪質コードによって一般的に利用されるプログラミングツールとコンピューターリソースがいくつかある。例えば、ランダムジェネレーターは、ほとんど全てのオペレーティングシステムとほとんど全てのプログラミング言語に用意されているプログラミングツールだが、ウイルスもこの形態をよく利用し、そのウイルス自身を複製する際には、同じコードの繰り返しを防ぐことで、ビットパターン（「ウイルスシグネチャー」とも呼ばれる）スキャンによる悪質コードの検知を困難にする。プログラミング言語で記述されたプログラムとしての人間に解読可能なコードでは、変数を使用する。人間に解読可能なコードは平文であるため、悪質コードを複製するメカニズムは、その変数のためにランダムな名前を生成することができ、有効コード行間に非有効コードのコメントを追加したりする。このようにランダムジェネレーターを利用すれば、非有効コードもまたランダムに生成することができる。
リアルタイムクロックは、どのオペレーティングシステムにも用意され、ほとんど全てのプログラミング言語に用意されているプログラミングツールであるが、この形態もまた、ウイルスによく利用されるプログラミングツールの他の一例である。なぜなら、リアルタイムクロックは、ウイルスコードの遅延トリガーが可能であり、しかもランダムジェネレーターの代替として使うことができるからである。しかも、遅延トリガーを備える一部のウイルスは、害を及ぼす前、または発見される以前に、広く伝播可能となる。遅延トリガーは、将来の日付に設定され、ホストマシンのリアルタイムクロックを利用する。
Windowsのシステムファイルを格納するWindowsフォルダーもまた、Windowsのオペレーティングシステムにおいて悪質コードによって利用される内容の他の例である。ウイルスは、Windowsフォルダー内で既存ファイルの一つの変更を試みることがあり、ランダムな名前などを有するファイルを作成したりする。
上述したいくつかの内容の組み合わせが、実行可能ファイル内での悪質コードの存在を指摘することもある。例えば、Windowsディレクトリーにおけるランダムな名前を有する新規ファイルの作成は、ウイルスによるものであったりする。しかし、このことは、実行可能ファイルであれば、悪質コードをより正確に指摘することができる。したがって、作成されたファイルがWindows実行可能ファイルの拡張子であるＥＸＥ拡張子を有する場合、あるいはVisual Basic Scriptの拡張子であるＶＢＳを有する場合、その実行可能ファイルは、悪質なものとして分類できる。
【０００７】
本発明の好適な実施形態によると、「悪意的な状態」は、少なくとも、ある特定のシステム関数を、そのパラメーター（一つまたは複数）としてのある特定の内容とともに実行するステップを含む。したがって、少なくとも二つの要素、すなわちある特定のシステム関数と、そのパラメーター（一つまたは複数）としてのある特定の内容とが含まれる。
なお、本明細書において、変数の「内容」という用語は、その値をも指すことに留意されたい。しかし、値に言及した箇所もいくつかある。
あらかじめ定義された少なくとも一つの悪意的な状態に一致する状態は、悪質なものとして指摘される。二つの状態のそれぞれの要素（すなわち、関数のアイデンティティーと呼び出し内容）が等しいか、あるいは少なくとも「類似」する場合（例えば、少なくともそれぞれの内容／値が一定の割合で等しい）、二つの状態は「一致」する。例えば、ある特定の関数がある特定の内容とともに呼び出された場合や、その内容を考慮せずに呼び出された場合など、呼び出された関数の履歴を追跡することによって悪意性を定義することもできる。
ある特定の関数に対する呼び出しの識別は、一目瞭然であり、ほとんど全てのコンパイラー・パーサーがこのことを実行する。しかし、パラメーターの値よりはむしろパラメーターの内容を扱うコンセプトは、新規なものである。
例えば、以下の関数を呼び出す際のパラメーターはランダム数である。
2006512667.tif 000003
ここで、Random()は、ランダム数ジェネレーターである。
MyFunctionが最初に実行される際、そのパラメーターは、例えば0.443213になり得るし、次回のそれは、例えば、0.332455になり得る。したがって、そのテキストを分析することによって、パラメーターにランダムな性質が備わっていることは指摘することはできない。
【０００８】
本発明の好適な実施形態によると、変数の内容は、次のとおりに指摘できる。
実行可能ファイルの各変数を、その内容を指し示す数個の属性（例えばフラグ）によって特徴づける（ここでは内容属性と称す）。例えば：
−  変数にWindowsのフォルダー名が代入されたか否かを指摘するフラグ；
−  変数にランダムな値が代入されたか否かを指摘するフラグ；
−  変数にリアルタイムが代入されたか否かを指摘するフラグ；
−  変数にWindowsオペレーティングシステムにおいて実行可能ファイルの一種の拡張子である値「．ＥＸＥ」が代入されたか否かを指摘するフラグ；
およびその他。
実行可能ファイルの実行をエミュレートする間は、以下の命令（例）が実行される。
2006512667.tif 000004
ここで、Windows_directory()は、Windowsディレクトリーの文字列をもとに返すシステム関数であり、Random()は、ランダムの整数を返す。
この例では、変数File_nameのWindowsフォルダーフラグと、ランダムフラグと、ＥＸＥフラグとがオンになる。
2006512667.tif 000005
は、実際には数個の命令：
−  Random関数を実行する命令と；
−  Windows_directory関数を実行する命令と；
−  数学的加算を実行する命令と；
−  文字列加算を実行する命令と、
を含むことに留意されたい。
一部のプログラミング言語は、必要に応じて数値を文字列値に、また文字列値を数値に変換するが、一部のコンパイラには、そのような能力が備わっていないことにも留意されたい。したがって、関数Ｓｔｒが数値を文字列に変換すると仮定すると、この場合の例は、次のようになる。
2006512667.tif 000006
変数に値を代入することを悪質操作と見なしても意味が無いが、変数への代入の履歴を追跡しない限り、その内容を決定することはできない。したがって、検査の段階は、例えばファイルを作成する関数、ファイルの内容を変更する関数等、コンピューターに被害を与え得る特定のシステム関数が呼び出される時点とすべきである。
以下の命令もまた、Windowsディレクトリー内でランダムな名前を有する実行可能ファイルを作成する。
2006512667.tif 000007
しかし、関数Create_fileのパラメーターとして変数を使用する代わりに、ファイルの名前がパラメーターとなる。実際に、このことは、一時的な変数を作成することと、前記の関数が実行する直前にその一時的な変数に値を代入することと同じである。
2006512667.tif 000008
【０００９】
前述のとおり、本発明によると、前記変数は、その値のほかに内容属性を備える。したがって、その内容が数学演算の影響をどのように受けるかについては疑問の余地がある。
例：
2006512667.tif 000009
ここで、例えば、前記変数First_varのリアルタイムフラグがオンになり、変数Second_varのＥＸＥフラグがオンになる。この場合、代入の内容の結果が変数MyValueのリアルタイムフラグと変数MyValueのＥＸＥフラグとをオンにすることは明白である。したがって、エミュレーターには「内容計算」のルールを設けるべきである。例えば、加法の交換法則や加法の結合法則等を含むそのようなルールでは、比較文やエミュレートされるプログラミング言語がサポートする、その他の特徴をも考慮に入れるべきである。無論、前記内容をエミュレートすることに加え、前記値もエミュレートするのが望ましい。
別の例：
2006512667.tif 000010
「アドレス帳オブジェクト」で実行された演算子「->Count()」は、数値だけでなく、数値を内容属性「アドレス帳内エントリー」とともに返し、上述のように変数Var_Bに「アドレス帳内エントリー」を加える。
別の例：
2006512667.tif 000011
Var_Cへの代入の後、その値は、Var_Aに代入されたアドレス帳の第二のエントリーとなる。Var_Aの内容属性は、「アドレス帳データベース」のようなものでもよく、Var_Cの内容属性は、「アドレス帳エントリー」のようなものでもよい。
【００１０】
図１は、悪質コードを検知するために、実行可能ファイルをエミュレートする方法を概略的に示す図である。
−  設計ステップにあたるステップ１０１では、一群の悪意的な状態を定義する。悪意的な状態は、ある特定のシステム関数に対する呼び出しに、ある特定の内容を組み合わせたものである。このことは、ウイルス対策会社がウイルス対策エミュレーター設計の一部として実行する予備段階である。無論、内容属性および関数またはそのいずれか一方のリストは、ファイルに保存し、後で修正できる（ウイルス対策会社の所在地で、または設置場所で）。
−  エミュレーションの際に（すなわち実行時に）実行される次のステップ１０２では、実行すべき次の命令を決定する。
−  次のステップ１０３では、命令のタイプを検査する。それが代入命令ならば、フローはステップ１０４へ、さもなければフローはステップ１０５へと続く。
−  ステップ１０４では、設定すべき代入変数の内容属性（一つまたは複数）を決定するために命令を分析し、さらに対応する値を設定し、そこからフローは、ステップ１０２に戻る。
−  ステップ１０５で、命令のタイプが関数呼び出しならば、フローは、ステップ１０６へと続き、さもなければ、フローは、ステップ１１０へと続く。
−  ステップ１０６から、関数が信用できるものとして予備決定される場合は、フローは、ステップ１０２へと続き、さもなければ、フローは、ステップ１０７へと続く。
−  ステップ１０７では、現在の状態（すなわち、そのパラメーターの内容属性を有する呼び出し関数）をステップ１０１であらかじめ定義しておいた悪意的な状態と比較することによって悪意性を検査する。現在の状態があらかじめ定義された悪意的な状態の少なくとも一つと一致するならば、コードの悪意性の決定を指摘できる。
−  ステップ１０８から、ステップ１０７で行った検査に基づき、命令が不審なようであれば、フローは、ステップ１０９へと続き、そこで警報手順が実行され、さらにそこからステップ１０２へと続く。
−  段階１１０から、検査すべき最後の命令が最後の命令（例えば停止命令）であれば、エミュレーションは停止し、さもなければ、フローは、ステップ１０２へと続く。
通常、エミュレーションは、最後の命令が実行されるまで続き、その後にエミュレーションの結果を調べる。このようにすれば、より多くのディテールが収集され、コードの悪意性をより正確に決定できる。しかし、警報手順によってさらなる実行が保留になることがあり、保留になるとエミュレーション時間が短縮する。
【００１１】
当業者にとって周知のとおり、パラメーターをそのアドレスによって、またはその値によって転送すべく、関数を宣言することができる。値を転送する場合は、一時的パラメーターを作成し、また別の場合のように、そのアドレスをパラメーターとして転送する。いずれの場合も、コードをエミュレートする際の変数は、永久的であれ一時的なものであれ、内容属性をも備える。
なお、本明細書において「関数」という用語は、手順、ソフトウェア割り込み、およびその他をも指すことに留意されたい。
前記エミュレーションは、ユーザーのマシン、ネットワークに通じるゲートウェイ等で実行可能である。例えば、ユーザーがインターネット／イントラネットを閲覧している最中に着信する全てのＨＴＭＬファイルをチェックするために、エミュレーターをインストールすることもあれば、組織がそのネットワークに通じるゲートウェイ、メールサーバー、およびその他で、このようなエミュレーターをインストールすることもあると思われる。
当業者であれば、本発明の範囲を損なうことなく、他の形式や方法によって本発明を実施できることを理解できよう。本明細書に記載された実施形態は、本発明を限定するものではなく、例示として見なすべきものである。
【図面の簡単な説明】
【００１２】
【図１】悪質コードを検知するために、実行可能ファイルをエミュレートする方法を概略的に示す図。
【図１】
2006512667.tif 000012
【国際調査報告】
2006512667.tif 000013