(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】特表2019-502197(P2019-502197A)
(43)【公表日】2019年1月24日
(54)【発明の名称】ランタイム生成コードにおける悪意のあるコードの検出のためのシステムおよび方法
(51)【国際特許分類】
G06F 21/56 20130101AFI20181221BHJP
【FI】
G06F21/56
G06F21/56 340
【審査請求】未請求
【予備審査請求】未請求
【全頁数】24
(21)【出願番号】特願2018-526555(P2018-526555)
(86)(22)【出願日】2016年9月7日
(85)【翻訳文提出日】2018年7月19日
(86)【国際出願番号】IL2016050987
(87)【国際公開番号】WO2017098495
(87)【国際公開日】20170615
(31)【優先権主張番号】62/264,404
(32)【優先日】2015年12月8日
(33)【優先権主張国】US
(81)【指定国】
AP(BW,GH,GM,KE,LR,LS,MW,MZ,NA,RW,SD,SL,ST,SZ,TZ,UG,ZM,ZW),EA(AM,AZ,BY,KG,KZ,RU,TJ,TM),EP(AL,AT,BE,BG,CH,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IS,IT,LT,LU,LV,MC,MK,MT,NL,NO,PL,PT,RO,RS,SE,SI,SK,SM,TR),OA(BF,BJ,CF,CG,CI,CM,GA,GN,GQ,GW,KM,ML,MR,NE,SN,TD,TG),AE,AG,AL,AM,AO,AT,AU,AZ,BA,BB,BG,BH,BN,BR,BW,BY,BZ,CA,CH,CL,CN,CO,CR,CU,CZ,DE,DK,DM,DO,DZ,EC,EE,EG,ES,FI,GB,GD,GE,GH,GM,GT,HN,HR,HU,ID,IL,IN,IR,IS,JP,KE,KG,KN,KP,KR,KZ,LA,LC,LK,LR,LS,LU,LY,MA,MD,ME,MG,MK,MN,MW,MX,MY,MZ,NA,NG,NI,NO,NZ,OM,PA,PE,PG,PH,PL,PT,QA,RO,RS,RU,RW,SA,SC,SD,SE,SG,SK,SL,SM,ST,SV,SY,TH,TJ,TM,TN,TR,TT,TZ,UA,UG,US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.SMALLTALK
(71)【出願人】
【識別番号】517181221
【氏名又は名称】エンサイロ リミテッド
【氏名又は名称原語表記】enSilo Ltd.
(74)【代理人】
【識別番号】100105050
【弁理士】
【氏名又は名称】鷲田 公一
(72)【発明者】
【氏名】ヤーヴォ ウディ
(57)【要約】
本発明のいくつかの実施形態の一態様によれば、コンピュータ内で実行されるランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法が提供され、この方法は、コンピュータのプロセッサ上で、コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る行為、ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成した、許可されたソース作成モジュールを表す複数のテンプレートのテンプレートシグネチャとの間のマッチを識別する行為であって、テンプレートが記憶デバイスのリポジトリに格納されている、マッチを識別する行為、および、マッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする行為、を実行するステップを含む。
【選択図】
図1
【特許請求の範囲】
【請求項1】
コンピュータ内で実行されるランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法であって、前記コンピュータのプロセッサ上で、
コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る行為、
前記ランタイム生成コードに関連するシグネチャデータと、前記ランタイム生成コードを作成した、許可されたソース作成モジュールを表す複数のテンプレートのテンプレートシグネチャとの間のマッチを識別する行為であって、前記テンプレートが記憶デバイス上のリポジトリに格納されている、マッチを識別する行為、および、
マッチが見つからないとき、前記ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする行為、
を実行するステップを含む、方法。
【請求項2】
前記テンプレートシグネチャが、許可されたジャストインタイム(JIT)コンパイラを表す、請求項1に記載の方法。
【請求項3】
前記シグネチャデータと前記テンプレートシグネチャとの間の前記マッチを識別するステップが、
オペレーティングシステム機能を呼び出すために前記ランタイム生成コードによって呼び出された第1の実行可能なモジュールと、前記許可されたJITコンパイラを表す前記テンプレートとの間の関連を識別するステップ、および、
前記ランタイム生成コードを作成した第2の実行可能なモジュールと、前記許可されたJITコンパイラを表す前記テンプレートとの間の関連を識別するステップ
のうちの少なくとも一方を含む、請求項2に記載の方法。
【請求項4】
前記シグネチャデータが、前記ランタイム生成コードを格納する前記メモリにおけるエリアのあらかじめ定義されたサイズを含む、請求項2に記載の方法。
【請求項5】
前記シグネチャデータが、前記ランタイム生成コードを格納するメモリ領域の、読取り専用またはアクセス禁止としての指定を含む、請求項2に記載の方法。
【請求項6】
前記シグネチャデータが、少なくとも1つのコードパターンを含む、請求項2に記載の方法。
【請求項7】
前記少なくとも1つのコードパターンが、前記ランタイム生成コードの少なくとも1つの関数の開始領域における少なくとも1つのあらかじめ定義されたプロローグ、少なくとも1つのエピローグ、および少なくとも1つのマジックオペランド値からなるグループから選択される少なくとも1つのメンバを含む、請求項6に記載の方法。
【請求項8】
前記シグネチャデータが、前記ランタイム生成コードの開始領域および終了領域のうちの少なくとも一方に、前記JITコンパイラに関係するあらかじめ定義された制御構造を含む、請求項2に記載の方法。
【請求項9】
前記あらかじめ定義された制御構造が、前記ランタイム生成コードの一部分を各々格納する複数の異なるメモリ領域の各々にあるリンクリスト、ならびに前記それぞれのリンクリストの後に位置する前記それぞれのメモリ領域のサイズおよびアドレスを定義するフィールドのうちの少なくとも一方を含む、請求項8に記載の方法。
【請求項10】
前記リンクリストが、各メモリ領域のポインタをトラバースすることによって検証され、前記フィールドが、前記フィールドの前記値をオペレーティングシステム値と相関させることによって検証される、請求項9に記載の方法。
【請求項11】
前記シグネチャデータが、前記許可されたJITコンパイラが制限される前記ランタイム生成コードに関連するアプリケーションを含む、請求項2に記載の方法。
【請求項12】
前記テンプレートシグネチャが、許可されたフックエンジンを表す、請求項1に記載の方法。
【請求項13】
前記シグネチャデータが、前記ランタイム生成コードがフックエンジンによって作成されるという識別を含み、前記識別が、
フックされたモジュールの外にある外部コードに到達するために、前記フックされたモジュールの前記プロローグにおける既存のコードをエミュレートすること、および
前記フックをインストールした前記許可されたフックエンジン実行ファイルの前にスタックトレースに現れる前記ランタイム生成コードの位置を特定することによって前記ランタイム生成コードを識別するために、前記外部コードに関係する前記スタックトレースを分析すること、
のうちの少なくとも一方によって行われる、請求項12に記載の方法。
【請求項14】
前記シグネチャデータが、前記ランタイム生成コードがある前記メモリエリアのあらかじめ定義されたサイズ、少なくとも1つのコードパターン、前記ランタイム生成コードメモリ領域の開始部分および終了部分のうちの少なくとも一方におけるあらかじめ定義された制御構造、ならびに可変パラメータを除いて前記ランタイム生成コードに逆アセンブルプログラムを適用することによって取得されたアセンブリから計算されたオペコードシグネチャからなるグループから選択される少なくとも1つのメンバを含む、請求項12に記載の方法。
【請求項15】
前記少なくとも1つのコードパターンが、前記ランタイム生成コードの少なくとも1つの関数の開始領域における少なくとも1つのあらかじめ定義されたプロローグ、少なくとも1つのエピローグ、および少なくとも1つのマジックオペランド値からなるグループから選択される少なくとも1つのメンバを含む、請求項14に記載の方法。
【請求項16】
前記テンプレートシグネチャが、許可された実行可能なコンプレッサを表す、請求項1に記載の方法。
【請求項17】
前記シグネチャデータが、前記解凍された実行可能ファイルのフォーマットに従ったメモリ割振りのサイズ、前記実行可能ファイル構造およびコードの不変部分について計算された暗号学的ハッシュ関数、ならびに前記解凍された実行可能ファイルがあるメモリページ上のパーミッションからなるグループから選択される少なくとも1つのメンバを含む、請求項16に記載の方法。
【請求項18】
前記解凍された実行可能ファイルの前記フォーマットに従って前記メモリ割振りのコンテンツをパースすることによって、前記メモリ割振りのベースでの前記メモリのコンテンツが前記解凍された実行可能ファイルの前記フォーマットに従ったものであることを検証するステップと、フィールド値が論理的であり、前記フォーマットに従っていることをチェックするステップとをさらに含む、請求項17に記載の方法。
【請求項19】
悪意のあるコードを含むランタイム生成コードの検出のためのシステムであって、
コードを格納するためのメモリと、
ランタイム生成コードを作成する、許可(authorize)されたソース作成モジュールを表すテンプレートのリポジトリを格納するための記憶デバイスと、
コードを格納するプログラム記憶装置と、
前記格納されたコードを実行するために、前記メモリ、前記記憶デバイス、および前記プログラム記憶装置に結合されたプロセッサと、
を含み、
前記格納されたコードが、
前記メモリにおけるランタイム生成コードの前記作成および前記実行のうちの少なくとも一方のインジケーションを受け取り、前記ランタイム生成コードに関連するシグネチャデータと前記リポジトリのテンプレートシグネチャとの間のマッチを識別し、マッチが見つからないとき、前記ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガするための格納されたコードを含む、
システム。
【請求項20】
悪意のあるコードを含むランタイム生成コードの検出のためのシステムのプロセッサによって実行されるようにプログラムコードを格納した非一時的コンピュータ可読記憶媒体を含むコンピュータプログラム製品であって、前記プログラムコードが、
コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取るための命令、
前記ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成する、許可(authorize)されたソース作成モジュールを表すテンプレートのセットのテンプレートシグネチャとの間のマッチを識別するための命令、および、
マッチが見つからないとき、前記ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガするための命令、
を含む、コンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、そのいくつかの実施形態では、悪意のあるコードの検出に関し、より詳細には、しかし排他的ではなく、ランタイム生成コードにおける悪意のあるコードの検出に関する。
【背景技術】
【0002】
プロセッサによる実行のために、記憶デバイス(例えば、ハードドライブ)に格納された実行可能ファイルからメモリ(例えば、ランダムアクセスメモリ(RAM))にロードされる実行中のプログラムのコードとは対照的に、コードが、ランタイム中に生成されることがある。例えば、ランタイム生成コードは、ジャストインタイム(JIT)コンパイラによって生成されることがあり、JITコンパイラは、ソースコードまたはバイトコードを機械コードにコンパイルし、これをランタイム中に実行する。
【発明の概要】
【発明が解決しようとする課題】
【0003】
ランタイム生成コードは、良性であることがあり、または悪意のあるコード、例えば、マルウェアおよびシェルコードによって使用されることがある。悪意のあるコードは、検出を逃れる助けとなるように、ランタイムに生成されることがあり、例えば、セキュリティプログラムがソースファイルを識別しないようにするために、ランタイム生成コードを(例えば、ハードディスクに格納された)ファイルから切り離すこと、コードを他のプロセスに導入すること、およびシグネチャに基づく検出を回避するために、メモリにおいてそれ自体のコードをモーフィングすることを行う。
【課題を解決するための手段】
【0004】
本発明のいくつかの実施形態の一態様によれば、コンピュータ内で実行されるランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法が提供され、この方法は、コンピュータのプロセッサ上で、コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る行為、ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成した、許可(authorize)されたソース作成モジュールを表す複数のテンプレートのテンプレートシグネチャとの間のマッチを識別する行為であって、テンプレートが記憶デバイスのリポジトリに格納されている、マッチを識別する行為、および、マッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする行為、を実行するステップを含む。
【0005】
任意選択で、テンプレートシグネチャは、許可されたジャストインタイム(JIT)コンパイラを表す。
【0006】
任意選択で、シグネチャデータとテンプレートシグネチャとの間のマッチを識別することは、オペレーティングシステム機能を呼び出すためにランタイム生成コードによって呼び出された第1の実行可能なモジュールと、許可されたJITコンパイラを表すテンプレートとの間の関連を識別すること、およびランタイム生成コードを作成する第2の実行可能なモジュールと許可されたJITコンパイラを表すテンプレートとの間の関連を識別することのうちの少なくとも一方を含む。
【0007】
任意選択で、シグネチャデータは、ランタイム生成コードを格納するメモリにおけるエリアのあらかじめ定義されたサイズを含む。代替または追加として、シグネチャデータは、ランタイム生成コードを格納するメモリ領域の、読取り専用またはアクセス禁止としての指定を含む。代替または追加として、シグネチャデータは、少なくとも1つのコードパターンを含む。
【0008】
任意選択で、ここにおいて、少なくとも1つのコードパターンは、ランタイム生成コードの少なくとも1つの関数の開始領域における少なくとも1つのあらかじめ定義されたプロローグ、少なくとも1つのエピローグ、および少なくとも1つのマジックオペランド値からなるグループから選択される少なくとも1つのメンバを含む。
【0009】
代替または追加として、シグネチャデータは、ランタイム生成コードの開始領域および終了領域のうちの少なくとも一方に、JITコンパイラに関係するあらかじめ定義された制御構造を含む。
【0010】
任意選択で、あらかじめ定義された制御構造は、ランタイム生成コードの一部分を各々格納する複数の異なるメモリ領域の各々にあるリンクリスト、ならびにそれぞれのリンクリストの後に位置するそれぞれのメモリ領域のサイズおよびアドレスを定義するフィールドのうちの少なくとも一方を含む。任意選択で、リンクリストは、各メモリ領域のポインタをトラバースすることによって検証され、フィールドは、フィールドの値をオペレーティングシステム値と相関させることによって検証される。
【0011】
代替または追加として、シグネチャデータは、許可されたJITコンパイラが制限されるランタイム生成コードに関連するアプリケーションを含む。
【0012】
任意選択で、テンプレートシグネチャは、許可されたフックエンジンを表す。
【0013】
任意選択で、シグネチャデータは、ランタイム生成コードがフックエンジンによって作成されるという識別を含み、識別は、フックされたモジュールの外にある外部コードに到達するために、フックされたモジュールのプロローグにおける既存のコードをエミュレートすること、および、フックをインストールした許可されたフックエンジン実行ファイルの前にスタックトレースに現れるランタイム生成コードの位置を特定することによってランタイム生成コードを識別するために、外部コードに関係するスタックトレースを分析することのうちの少なくとも一方によって行われる。
【0014】
代替または追加として、シグネチャデータは、ランタイム生成コードがあるメモリエリアのあらかじめ定義されたサイズ、少なくとも1つのコードパターン、ランタイム生成コードメモリ領域の開始部分および終了部分のうちの少なくとも一方におけるあらかじめ定義された制御構造、ならびに可変パラメータを除いてランタイム生成コードに逆アセンブルプログラムを適用することによって取得されたアセンブリから計算されたオペコードシグネチャからなるグループから選択される少なくとも1つのメンバを含む。
【0015】
任意選択で、少なくとも1つのコードパターンは、ランタイム生成コードの少なくとも1つの関数の開始領域における少なくとも1つのあらかじめ定義されたプロローグ、少なくとも1つのエピローグ、および少なくとも1つのマジックオペランド値からなるグループから選択される少なくとも1つのメンバを含む。
【0016】
任意選択で、テンプレートシグネチャは、許可された実行可能なコンプレッサを表す。
【0017】
任意選択で、シグネチャデータは、解凍された実行可能ファイルのフォーマットに従ったメモリ割振りのサイズ、実行可能ファイル構造およびコードの不変部分について計算された暗号学的ハッシュ関数、ならびに解凍された実行可能ファイルがあるメモリページ上のパーミッションからなるグループから選択される少なくとも1つのメンバを含む。
【0018】
任意選択で、方法は、解凍された実行可能ファイルのフォーマットに従ってメモリ割振りのコンテンツをパースすることによって、メモリ割振りのベースでのメモリのコンテンツが、解凍された実行可能ファイルのフォーマットに従ったものであることを検証するステップと、フィールド値が論理的であり、フォーマットに従っていることをチェックするステップとをさらに含む。
【0019】
本発明のいくつかの実施形態の一態様によれば、悪意のあるコードを含むランタイム生成コードの検出のためのシステムが提供され、システムは、コードを格納するためのメモリと、ランタイム生成コードを作成する、許可(authorize)されたソース作成モジュールを表すテンプレートのリポジトリを格納するための記憶デバイスと、コードを格納するプログラム記憶装置と、格納されたコードを実行するために、メモリ、記憶デバイス、およびプログラム記憶装置に結合されたプロセッサと、を備え、格納されたコードは、メモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取り、ランタイム生成コードに関連するシグネチャデータとリポジトリのテンプレートシグネチャとの間のマッチを識別し、マッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガするための格納されたコードを含む。
【0020】
本発明のいくつかの実施形態の一態様によれば、悪意のあるコードを含むランタイム生成コードの検出のためのシステムのプロセッサによって実行されるようにプログラムコードを格納した非一時的コンピュータ可読記憶媒体を含むコンピュータプログラム製品が提供され、プログラムコードは、コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る命令、ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成する、許可(authorize)されたソース作成モジュールを表すテンプレートのセットのテンプレートシグネチャとの間のマッチを識別する命令、ならびにマッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする命令、を含む。
【0021】
特に定義されない限り、本明細書で使用される技術用語および/または科学用語はすべて本発明が属する技術分野の当業者によって一般に理解されるのと同じ意味を有する。本明細書で説明する方法および材料と同様のまたは同等の方法および材料を本発明の実施形態の実施または試験で使用することができるが、例示的な方法および/または材料を以下で説明する。矛盾する場合、定義を含む特許明細書が統制することになる。加えて、材料、方法および例は、例示にすぎず、必ずしも限定することを意図していない。
【0022】
本発明のいくつかの実施形態が、添付図面を参照しながら、単なる例として、本明細書で説明される。次に図面を詳細に具体的に参照すると、図示の詳細は、例としてのものであり、本発明の実施形態の例示的な議論のためのものであることが強調される。この点に関して、図面とともに行われる説明は、本発明の実施形態をどのように実践できるかを当業者に明らかにする。
【図面の簡単な説明】
【0023】
【
図1】本発明のいくつかの実施形態による、ランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法のフローチャートである。
【
図2】本発明のいくつかの実施形態による、ランタイム生成コード内の悪意のあるコードを検出するシステムの構成要素のブロック図である。
【
図3】本発明のいくつかの実施形態による、ランタイム生成コードのシグネチャデータと、許可されたソース作成モジュールを表すテンプレートシグネチャとの間のマッチを識別する方法のフローチャートである。
【発明を実施するための形態】
【0024】
本発明は、そのいくつかの実施形態では、悪意のあるコードの検出に関し、より詳細には、しかし排他的ではなく、ランタイム生成コードにおける悪意のあるコードの検出に関する。
【0025】
本発明のいくつかの実施形態の一態様は、物理メモリ(例えば、ランダムアクセスメモリ(RAM))に格納され、プロセッサによって実装可能なランタイム生成コード内の悪意のあるコード(例えば、マルウェア、シェルコード、および他の悪意のあるコード)を検出する、プロセッサによって実行可能なコードに関する。
【0026】
任意選択で、悪意のあるコードは、排除によって検出される。ランタイム生成コードに関連するシグネチャデータ間のマッチは、ランタイム生成コードを作成する、許可(authorize)された(すなわち、安全なおよび/または許容される)モジュールを表すテンプレートのセットのテンプレートシグネチャを用いて識別される。マッチが見つかるとき、例えば、テンプレートが、許可されたソース作成モジュールを表すホワイトリスト内に現れるとき、ランタイム生成コードは安全であると推定される。マッチが見つからないとき、ランタイム生成コードは、悪意のあるものであると推定されてもよい。任意選択で、マッチがないことに応じて、悪意のあるコードに対処するために、セキュリティプロセスがトリガされ、例えば、悪意のあるコードを除去するためのプログラムがトリガされる。このようにして、本明細書で説明するシステムおよび/または方法は、コンピュータのメモリ内に悪意のあるコードを含むランタイム生成コードを識別する能力を向上させる。
【0027】
任意選択で、ランタイム生成コード内の悪意のあるコードの存在は、ランタイムコンパイルプロセスの一部としてランタイム生成コードを作成する許可されたジャストインタイム(JIT)コンパイラ、例えば、JAVA(登録商標)、DOTNET(商標)、およびJavaScript(登録商標)エンジンを表すテンプレートシグネチャとのマッチを識別することによって排除される。このようにして、ランタイム生成コードは、許可されたコンパイラによって生成された、コンパイルされた命令であると推定される。
【0028】
代替的に、ランタイム生成コード内の悪意のあるコードの存在は、許可されたフックエンジンを表すテンプレートシグネチャとのマッチを識別することによって排除される。そのようなフックエンジンは、プログラム挙動を変えるためのランタイム生成コード、例えば、アンチウィルスおよび他のセキュリティアプリケーションを作成する場合がある。このようにして、ランタイム生成コードは、安全なおよび/または許容されるフックエンジンが作成したものであると推定される。
【0029】
代替的に、ランタイム生成コード内の悪意のあるコードの存在は、コードを解凍し、解凍したコードを実行する許可された実行可能なコンプレッサ(すなわち、ソフトウェアパッカーと呼ばれることがある)を表すテンプレートシグネチャとのマッチを識別することによって排除される。作成されたおよび/または実行中のランタイム生成コードは、オペレーティングシステムローダを使用する代わりにおよび/または使用せずに、圧縮された実行可能ファイルをメモリ位置にマップするためにソフトウェアパッカーによって使用される場合がある。
【0030】
任意選択で、テンプレートとのマッチングに使用されるランタイム生成コードに関連するシグネチャデータは、例えば、ランタイム生成コードを格納するためのあらかじめ定義されたメモリサイズ、ランタイム生成コード内のあらかじめ定義されたコードパターン(例えば、固有のプロローグ、エピローグ、およびマジックオペランド値)、ならびにランタイム生成コードを格納するメモリ領域(ページ)に関連する割り当てられたパーミッションのうちの1つまたは複数を含んでもよい。
【0031】
シグネチャデータとテンプレートとの間のマッチは、完全(すなわち、100%マッチ)、または部分的(すなわち、100%未満の一致)、例えば相関値であってもよいことに留意されたい。完全に満たない相関および/または部分的マッチは、例えば、確率しきい値に従って使用されてもよい。例えば、確率値70%、しきい値50%超に関連するテンプレートとの部分的マッチが、セキュリティプロセスをトリガすることがある。
【0032】
本発明の少なくとも1つの実施形態を詳細に説明する前に、本発明は、その適用において、以下の説明に記載され、および/または図面および/または実施例に示される構成要素および/または方法の構築および配列の詳細に必ずしも限定されないことを理解されたい。本発明は、他の実施形態が可能であり、または様々な方法で実践もしくは実行することが可能である。
【0033】
本発明は、システム、方法、および/またはコンピュータプログラム製品とすることができる。コンピュータプログラム製品は、プロセッサに本発明の態様を実行させるためのコンピュータ可読プログラム命令を有する1つのコンピュータ可読記憶媒体(または複数の媒体)を含むことができる。
【0034】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を保持し格納することができる有形デバイスとすることができる。コンピュータ可読記憶媒体は、例えば、限定はしないが、電子記憶デバイス、磁気記憶デバイス、光学記憶デバイス、磁気記憶デバイス、半導体記憶デバイス、または前述のものの任意の好適な組合せとすることができる。コンピュータ可読記憶媒体のより具体的な例の包括的でないリストは、以下のものを含む:ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、消去可能プログラマブル読取り専用メモリ(EPROMまたはフラッシュメモリ)、スタティックランダムアクセスメモリ(SRAM)、ポータブルコンパクトディスク読取り専用メモリ(CD−ROM)、デジタル多用途ディスク(DVD)、メモリスティック、フロッピーディスク、および前述のものの任意の好適な組合せ。本明細書で使用するコンピュータ可読記憶媒体は、電波または他の自由に伝播する電磁波、導波路または他の伝送媒体を通って伝搬する電磁波(例えば、光ファイバケーブルを通過する光パルス)、またはワイヤを通して伝送される電気信号などの一時的な信号自体であると解釈されるべきでない。
【0035】
本明細書で説明するコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピューティング/処理デバイスに、またはネットワーク、例えば、インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、および/またはワイヤレスネットワークを介して外部コンピュータもしくは外部記憶デバイスにダウンロードすることができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ、および/またはエッジサーバを含むことができる。各コンピューティング/処理デバイスのネットワークアダプタカードまたはネットワークインターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング/処理デバイス内のコンピュータ可読記憶媒体に格納するためにコンピュータ可読プログラム命令を転送する。
【0036】
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(ISA)命令、機械語命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、またはSmalltalk、C++などのようなオブジェクト指向プログラミング言語および「C」プログラミング言語もしくは類似したプログラミング言語などの従来の手続き型プログラミング言語を含む1つまたは複数のプログラミング言語の任意の組合せで書かれたソースコードもしくはオブジェクトコードのいずれかとすることができる。コンピュータ可読プログラム命令は、ユーザコンピュータで全面的に、ユーザコンピュータで部分的に、スタンドアロンソフトウェアパッケージとして、ユーザコンピュータで部分的におよびリモートコンピュータで部分的に、またはリモートコンピュータもしくはサーバで全面的に実行することができる。後者のシナリオでは、リモートコンピュータは、ローカルエリアネットワーク(LAN)またはワイドエリアネットワーク(WAN)を含む任意のタイプのネットワークによってユーザコンピュータに接続されてもよく、または外部コンピュータへの接続がなされてもよい(例えばインターネットサービスプロバイダーを使用するインターネットを通して)。いくつかの実施形態では、例えば、プログラマブル論理回路、フィールドプログラマブルゲートアレイ(FPGA)、またはプログラマブル論理アレイ(PLA)を含む電子回路は、本発明の態様を実行するために、コンピュータ可読プログラム命令の状態情報を利用することによってコンピュータ可読プログラム命令を実行して、電子回路を個人専用にすることができる。
【0037】
本発明の態様は、本発明の実施形態による方法、装置(システム)、およびコンピュータプログラム製品のフローチャート図および/またはブロック図を参照して本明細書で説明される。フローチャート図および/またはブロック図の各ブロック、およびフローチャート図および/またはブロック図のブロックの組合せは、コンピュータ可読プログラム命令によって実装できることを理解されよう。
【0038】
これらのコンピュータ可読プログラム命令は、汎用コンピュータ、専用コンピュータ、または他のプログラマブルデータ処理装置のプロセッサに提供されて、コンピュータまたは他のプログラマブルデータ処理装置のプロセッサにより実行される命令が、フローチャートおよび/またはブロック図の1つまたは複数のブロックに明記される機能/行為を実施するための手段を作成するように、機械を生成してもよい。これらのコンピュータ可読プログラム命令は、コンピュータ、プログラマブルデータ処理装置、および/または他のデバイスに、特定の方法で機能するように指示することができるコンピュータ可読記憶媒体に格納されてもよく、命令を格納したコンピュータ可読記憶媒体が、フローチャートおよび/またはブロック図の1つもしくは複数のブロックに明記される機能/行為の態様を実装する命令を組み込んだ製品を含むようにする。
【0039】
コンピュータ可読プログラム命令は、コンピュータ、他のプログラマブルデータ処理装置、または他のデバイスにロードされて、一連の動作ステップをコンピュータ、他のプログラマブル装置、または他のデバイス上で実行させ、コンピュータまたは他のプログラマブル装置、または他のデバイス上で実行される命令が、フローチャートおよび/またはブロック図の1つもしくは複数のブロックに明記される機能/行為を実施するように、コンピュータ実装プロセスを生成することもできる。
【0040】
図のフローチャートおよびブロック図は、本発明の様々な実施形態によるシステム、方法、およびコンピュータプログラム製品のあり得る実施態様のアーキテクチャ、機能、および動作を示す。この点に関して、フローチャートまたはブロック図の各ブロックは、特定の論理機能を実装するための1つまたは複数の実行可能命令を含む命令のモジュール、セグメント、または一部分を表すことができる。いくつかの代替実施態様では、ブロックに記された機能は、図に記された順序から外れて行われることがある。例えば、連続して示された2つのブロックは、関係する機能に応じて、実際には実質的に同時に実行されることがあり、またはブロックは時には逆の順序で実行されることがある。ブロック図および/またはフローチャート図の各ブロック、およびブロック図および/またはフローチャート図のブロックの組合せは、特定の機能もしくは動作を実行するかまたは専用ハードウェアとコンピュータ命令との組合せを実行する専用ハードウェアベースシステムによって実装されてもよいことにも留意されたい。
【0041】
次に
図1を参照すると、
図1は、本発明のいくつかの実施形態による、ランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法のフローチャートである。また
図2を参照すると、
図2は、本発明のいくつかの実施形態による、ランタイム生成コードを悪意のあるコードとして識別するために、および/または悪意のあるコードを含むランタイム生成コードを排除するために、ランタイム生成コードに関連するシグネチャデータと、テンプレートシグネチャとのマッチを自動的に識別するシステムの構成要素のブロック図である。
図1の方法は、
図2のシステムによって実装されてもよい。
【0042】
本明細書で説明するシステムおよび/または方法は、コンピュータのメモリ上で実行中のランタイム生成コード内に含まれる悪意のあるコードの識別の技術的問題に関する。本明細書で説明するシステムおよび/または方法は、コンピュータのメモリ上に格納され、コンピュータのプロセッサによって実行されるランタイム生成コード内に含まれる悪意のあるコードの識別のためのソフトウェア技術に関する。悪意のあるコードの識別は、悪意のあるコードを除去および/または隔離するためにプロセッサによって実行可能なプロセスをトリガしてもよい。したがって、本明細書で説明するシステムおよび/または方法は、コンピュータ技術と密接に結び付いている。本明細書で説明するシステムおよび/または方法は、悪意のあるコードを識別し、コードのブロッキング、除去、および/または隔離を可能にすること、(例えば、悪意のあるコードが既存の処理リソースおよび/またはメモリリソースを利用することに起因する)コンピュータへのダメージを軽減および/または回避することによって、コンピュータの性能を向上させることができる(例えば、プロセッサおよび/またはメモリ利用の改善)。
【0043】
システム200は、1つまたは複数のメモリ構造202、例えば、ランダムアクセスメモリ(RAM)、1次記憶装置、メインメモリ、内部メモリ、仮想メモリ(例えば、2次記憶装置にアクセスする)、および/または他の物理メモリ構造(互いに抽象的に連結される場合がある)を含む。
【0044】
メモリ202は、メモリ202と通信している1つまたは複数のプロセッサ204に直接アクセス可能であり、プロセッサ204は、(例えば、マシンコードとして)メモリ202内に格納された命令を実行する。プロセッサ204は、例えば、中央処理ユニット(CPU)、グラフィック処理ユニット(GPU)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、および特定用途向け集積回路(ASIC)を含む場合がある。プロセッサ204(ホモジニアスまたはヘテロジニアス)は、クラスタとしておよび/または1つもしくは複数のマルチコア処理ユニットとして、並列処理用に配置されてもよく、または互いに独立していてもよい。
【0045】
メモリ202およびプロセッサ204は、1つまたは複数のコンピューティングユニット206、例えば、パーソナルコンピュータ、モバイルデバイス(例えば、スマートフォン、タブレット)、ウェアラブルデバイス(例えば、コンピューティング眼鏡、コンピューティング腕時計)、および/またはサーバとして実装されてもよい。
【0046】
コンピューティングユニット206は、プロセッサ204によって実行可能なコードを格納するプログラム記憶装置208を含むおよび/またはこれに関連付けられてもよい。プログラム記憶装置208は、メモリ202によって実装されてもよく、および/またはプロセッサ204には直接利用できない(すなわち、実行するためにはメモリ202にロードする必要がある)命令を格納する2次記憶装置210、例えば、記憶デバイス、例えば、不揮発性メモリ、磁気メディア、半導体メモリデバイス、ハードドライブ、リムーバブルストレージ、および光メディア(例えば、DVD、CD−ROM)によって実装されてもよい。
図1の方法を実施する命令は、プログラム記憶装置208にコードとして格納されてもよい。
【0047】
コンピューティングユニット206は、外部デバイスおよび/または構成要素と、例えば、ネットワークと、サーバと、別のコンピュータと、記憶デバイス、ならびに/または他のデバイスおよび/もしくは構成要素と、通信するための1つまたは複数のデータ通信インターフェース212を含んでもよい。例えば、コンピューティングユニット206は、(本明細書で説明するように)許可されたランタイム生成コードの検出に使用される新しいシグネチャ、および/または更新された許可されたソース作成モジュールのホワイトリストをダウンロードするために、(例えば、ネットワークを介して)リモートサーバ214にアクセスしてもよい。
【0048】
コンピューティングユニット206は、物理ユーザインターフェース216、例えば、ディスプレイ、タッチスクリーン、キーボード、マウス、および音声作動インターフェースのうちの1つまたは複数を含んでもよい。検出された悪意のあるコードのインジケーションは、画面(すなわち、インターフェース21’6)を使用してユーザに表示されてもよい。ユーザは、検出された悪意のあるコードにさらなるアクションを行うこと、例えば、悪意のあるコード除去プロセスを実行することを選択してもよい。
【0049】
図1の方法のブロックは、処理ユニット204によって実行可能な、プログラム記憶装置208に格納されたコードにおける命令として表されてもよい。
【0050】
102において、コンピューティングデバイス206のメモリ202におけるランタイム生成コードの作成および/または実行のインジケーション(例えば、信号、内部メッセージ、ネットワークメッセージ)が、処理ユニット204によって受け取られる。
【0051】
インジケーションは、ランタイム生成コードの作成および/または実行を監視および/または識別するコード(例えば、監視モジュール)から受け取られてもよい。監視は、プロセッサ204によって実行可能な、プログラム記憶装置208(例えば、監視モジュール208A)に格納されたコードによって行われてもよい。
【0052】
以下の例示的な方法は、ランタイム生成コードの作成および/または実行を検出するために使用されてもよい。説明する方法は、必ずしも限定的であることを意図されず、他の方法が使用されてもよい。例えば、ランタイム生成コードは、スタックトレーシングプロセスの一部として検出されてもよい。例えば、プロセスが新しい接続を作成しようとするとき、監視モジュール208Aがスタックをウォークし、接続確立に関連するすべてのコードを識別する。ファイルに関連しないコードが検出されるときはいつでも、悪意のあるランタイム生成コードのチェックが行われる。別の例では、ランタイム生成コードの作成は、データをコードに変えるまたは新しい実行可能なメモリを作成するオペレーティングシステム機能を監視することによって検出される。ランタイム生成コードの実行は、プロセッサ固有の機能、例えば、ブランチトレーシングを使用して検出されてもよい。
【0053】
良性モジュール(すなわち、許可された、安全なおよび/もしくは許容されるプロセス)、または悪意のあるモジュールである場合があるソース作成モジュール218が、ランタイム生成コード220を生成する。作成されたランタイム生成コードは、良性(すなわち、許可された、安全なおよび/もしくは許容されるプロセス)である場合があり、または悪意のあるコード222(例えば、悪意のある行為、例えば、コンピュータにダメージを与えること、コンピュータの性能を低下させること、情報を盗むこと、および/もしくはリモートユーザがコンピュータを制御できるようにすることを行うように設計されたコード)を含む場合がある。
【0054】
本明細書で使用するソース作成モジュールという用語は、実行可能ファイルに関連するコード、例えば、アプリケーションによって呼び出されたオペレーティングシステムファイル、および/またはダイナミックリンクライブラリ(DLL)ファイル、および/または.EXEファイルを意味する。コードは、実行可能ファイルに関連するアプリケーションの一部であってもよい。
【0055】
悪意のあるコードは、良性プロセスの情況において生成される場合があることに留意されたい。本明細書で説明するシステムおよび/または方法は、良性ランタイム生成コードを示すテンプレートシグネチャを排除することによって、良性プロセスの情況において悪意のあるコードの生成および/または実行を検出することがある。例えば、良性ランタイム生成コードを示すテンプレートシグネチャとのマッチが見つからないとき。
【0056】
現在、メモリ202にある(記憶装置210からロードされていてもよい)ソース作成モジュール218は、ソース作成モジュールの実行中に、動的にランタイム生成コードを作成する。ランタイム生成コードは、プロセッサ204による実行に備えて、任意選択では機械語で、メモリ202内に作成され、格納されてもよい。ランタイム生成コードは、仮想マシンによる実行のために仮想メモリ内に作成され、格納されてもよい。
【0057】
104において、ランタイム生成コード210に関連するシグネチャデータと、任意選択で記憶装置210に格納されたテンプレートシグネチャリポジトリ210Bからの、テンプレートシグネチャとの間に、マッチが識別される。テンプレートシグネチャは、ランタイム生成コードを作成した許可されたソース作成モジュールを表す。許可されたソース作成モジュールのリストが、記憶装置210に格納されたリポジトリ210Aに格納されてもよい。識別は、プロセッサ204によって実行可能な、プログラム記憶装置208(例えば、分析モジュール208B)に格納されたコードによって行われてもよい。
【0058】
テンプレートは、ランタイム生成コード用のホワイトリストとして使用されてもよい。ホワイトリストのメンバが識別されたとき、ランタイム生成コードは、実行すること(または実行を続けること)を可能にされてもよい。ホワイトリストのメンバが識別されていないとき、例えば、セキュリティプログラムが悪意のあるコードの存在についてランタイム生成コードを評価するまで、ランタイム生成コードは、実行をブロックまたは回避されてもよい。テンプレートおよび/または許可されたソース作成モジュールは、例えば、リモートサーバ214にアクセスすることによって取得および/または更新されてもよい。
【0059】
次に
図3を参照すると、
図3は、本発明のいくつかの実施形態による、ランタイム生成コードのシグネチャデータと、許可されたソース作成モジュールを表すテンプレートシグネチャとの間のマッチを識別する方法のフローチャートである。方法は、許可されたJITコンパイラ、フックエンジン、および/またはランタイム生成コードを作成した実行可能なコンプレッサを表すテンプレートとのマッチを見つけようと試みる。方法は、ランタイム生成コード自体、ランタイム生成コードに関係するデータ、ランタイム生成コードを格納するメモリに関係するデータ、および/または他のパラメータに基づいて、シグネチャデータを収集し、シグネチャデータをテンプレートにマッチングさせようと試みる。テンプレートは、(ソース作成モジュールの一般的なカテゴリーの1つのメンバであってもよい)あるソース作成モジュールを表してもよく、かつ/またはテンプレートは、ソース作成モジュールの一般的なカテゴリーを表してもよい。悪意のあるコードは、マッチが見つからないことによって識別されてもよい。
【0060】
302において、シグネチャデータと、ランタイム生成コードを作成した許可されたジャストインタイム(JIT)コンパイラとの間でマッチが識別される。JITコンパイラは、プログラムの実行中に(すなわちランタイム中に)動的に(例えば、ソースコード、またはバイトコードの)コンパイルを行って、プロセッサによって実行されるランタイム生成コードを(例えば、機械可読フォーマットで)作成する。
【0061】
シグネチャデータは、メモリ202にロードされたJITコンパイラの1つまたは複数の実行可能なモジュールの存在の識別を含んでもよい。実行可能なモジュールは、ランタイム生成コードを生成することがある。実行可能なモジュールおよび/またはJITコンパイラは、ランタイム生成コードがオペレーティングシステムと直接対話しないときなどに、オペレーティングシステム機能を呼び出すために、ランタイム生成コードによって呼び出されることがある。実行可能なモジュールは、ランタイム生成コードを呼び出すことがある。実行可能なモジュールの識別が、関係するJITコンパイラを表すテンプレートにマッチングさせるためのシグネチャデータとして使用されてもよい。JITコンパイラが実行可能なモジュールを含む(例えば、JITコンパイラおよび実行可能なモジュールが同じである)とき、実行可能なモジュールの識別は、JITコンパイラを表すテンプレートとマッチングしてもよい。実行可能なモジュールは、例えば、関係するファイルがストレージ210に存在することを検証することによって識別されてもよく、例えば、JAVA(登録商標)JITコンパイラとの関連を識別するためのシグネチャとして、ファイルJVM.dllを検証することが使用されてもよい。
【0062】
シグネチャデータは、ランタイム生成コードを格納するために割り振られたメモリ202の領域を管理するために、それぞれのJITコンパイラによって使用されるあらかじめ定義されたメモリ構造を含んでもよい。異なるJITコンパイラは、あらかじめ定義された異なるメモリ構造を有してもよい。あらかじめ定義されたメモリ構造の識別が、関係するJITコンパイラを表すテンプレートシグネチャにマッチングさせるためのシグネチャデータとして使用されてもよい。
【0063】
シグネチャデータは、ランタイム生成コードを格納するメモリ202におけるエリアのあらかじめ定義されたサイズを含んでもよい。異なるJITコンパイラは、あらかじめ定義された異なるサイズを使用してもよく、例えば、それぞれのチャンクサイズを使用することがわかっているJITコンパイラのシグネチャとして、一定のコードチャンクサイズが使用されてもよい。例えば、dotnet(商標)JITコンパイラのいくつかのバージョンは、サイズ0×10000のコードチャンクを使用する。したがって、ランタイム生成コードがサイズ0×10000のチャンクで格納されると識別することが、dotnet(商標)JITコンパイラを表すテンプレートシグネチャとマッチングするためのシグネチャデータとして使用されてもよい。
【0064】
シグネチャデータは、それぞれのJITコンパイラによるランタイム生成コードの生成のメカニズムに関係してもよい。異なるJITコンパイラは、ランタイム生成コードを生成するためのあらかじめ定義された異なるメカニズムを有してもよい。ランタイム生成コードの生成のメカニズムの識別が、関係するJITコンパイラを表すテンプレートシグネチャとマッチングさせるためのシグネチャデータとして使用されてもよい。
【0065】
シグネチャデータは、読取り専用またはアクセス禁止として指定された、ランタイム生成コードを格納する1つまたは複数のメモリ領域に関係してもよい。異なるJITコンパイラが、例えば、新しく作成されたコードの変更を防止するためのセキュリティ対策として、読取り専用またはアクセス禁止としてランタイム生成コードを格納するメモリ領域を指定してもよい。例えば、異なるJITコンパイラが同じ指定を使用するとき、指定は、許可されたJITコンパイラの生成カテゴリーを表すテンプレートシグネチャとマッチングするためのシグネチャデータとして使用されてもよい。例えば、JITコンパイラは、読取り専用としてメモリセグメント(例えば、メモリページ)の保護を設定することがあるが、悪意のあるコードは、それらのそれぞれのランタイム生成コードを書込み可能として指定する可能性があることに留意されたい。例えば、いくつかのJITコンパイラがいくつかの指定を使用するとき、指定は、あるJITコンパイラを表すテンプレートとマッチングするためのシグネチャデータとして使用されてもよい。例えば、V8 JITコンパイラは、ランタイム生成コードのいくつかのページの指定をアクセス禁止に設定してもよい。アクセス禁止の指定は、攻撃者(例えば、人間またはソフトウェア)がコードを悪用するのをより困難にすることができる。
【0066】
シグネチャデータは、1つまたは複数のコードパターン、例えば、ランタイム生成コードの1つもしくは複数の関数の開始領域でのあらかじめ定義されたプロローグ、エピローグ、および/またはマジックオペランド値に関係してもよい。あらかじめ定義されたプロローグは、ランタイム生成コードを作成した許可されたJITコンパイラを表すテンプレートシグネチャとマッチングさせるためのシグネチャデータとして使用されてもよい。例えば、マジック値をスタックにプッシュすることによって始まるプロローグは、ある許可されたJITコンパイラに関連する場合がある。
【0067】
シグネチャデータは、JITコンパイラに関係する1つまたは複数のあらかじめ定義された制御構造に関係してもよい。コード構造は、ランタイム生成コードを格納するメモリ部分の開始領域および/または終了領域に位置してもよい。あらかじめ定義された制御構造は、ランタイム生成コードの一部分を格納する異なるメモリ領域の各々にリンクリストを含んでもよい。あらかじめ定義された制御構造は、それぞれのリンクリストの後に位置するそれぞれのメモリ領域のメモリサイズおよび/またはメモリアドレスを定義するフィールドを含んでもよい。例えば、V8(商標)JITコンパイラは、各それぞれのコード領域のベースに位置するリンクリストを使用してランタイム生成コードのコード領域を連結する。V8(商標)JITコンパイラのリンクリストは、以下のフィールドが後にくる:それぞれのメモリ領域のサイズ、メモリ領域の制御フラグ、メモリ領域が始まるアドレス、およびメモリ領域が終わるアドレス。リンクリスト構造および/または関係するフィールドの1つもしくは複数を識別することによって、シグネチャデータは、V8(商標)JITコンパイラを表すテンプレートシグネチャとマッチングすることができる。
【0068】
制御構造がそれぞれのコード領域に存在するという検証は、検出された値をあらかじめ定義されたオペレーティングシステム値と相関させることによって行われてもよい。例えば、コード領域のサイズを、制御構造に基づいて検出し、オペレーティングシステムによって指定されたあらかじめ定義されたサイズと相関させてもよい。別の例では、各領域の開始アドレスおよび終了アドレスを(例えば、制御構造から)検出し、オペレーティングシステム構成と相関させてもよい。マッチが、制御構造を検証する。リンクリストは、領域間でポインタを使用して、1つのメモリ領域から別のメモリ領域へトラバースすることによって検証されてもよい。各ポインタをたどって、ポインタが実際に有効なコード領域をポイントすること、およびコードの以前のポインタが実際に元のコード領域をポイントすることを検証してもよい。
【0069】
制御構造を検証できないことが、ランタイム生成コードが悪意のあるコードを含む可能性があり、かつ/または悪意のあるソース作成モジュールによって作成されたことを示唆してもよい。
【0070】
シグネチャデータは、ランタイム生成コードに関連することがわかっているアプリケーションまたはプロセスに関係してもよい。許可されたJITコンパイラは、そのアプリケーションまたはプロセスに限定されることがわかっていることがある。例えば、Firefox(商標)ブラウザをランタイム生成コードに関連すると識別することが、JaegerMonkey JITコンパイラがFirefox(商標)ブラウザに限定されることに基づいて、JaegerMonkey JITコンパイラをソース作成モジュールとして表すテンプレートシグネチャにマッチングさせるためのシグネチャデータとして、使用されてもよい。
【0071】
代替的に、304において、シグネチャデータと、ランタイム生成コードを作成した許可されたフックエンジンを表すテンプレートシグネチャとの間でマッチが識別される。許可されたフックエンジンは、例えば、既存のコードをパッチして、現在のコードの実行をフックエンジンのコードへ、またはフックエンジンによって作成されたランタイム生成コードへリダイレクトするために、ランタイム生成コードを作成することがある。
【0072】
シグネチャデータは、ランタイム生成コードがフックエンジンによって作成されるという識別情報を含んでもよい。識別は、フックされたモジュールのプロローグにおける既存のコードをエミュレートして、フックがつながる場所を決定することによって行われてもよく、例えば、コードは、サンドボックス内で実行される仮想マシンによって、および/またはコードエミュレータによって、エミュレートされてもよい。フックされたモジュールの外にあるコードに到達するまで、コードは、エミュレートされ、監視される。外部コードは、フックエンジンによって作成されたランタイム生成コード、またはフックをインストールした実行ファイル(例えば、フックエンジン)であることがある。外部コードがランタイム生成コードであるというケースは、例えば、外部コードがランタイム生成コードのアドレス空間内にあるかどうかを検証することによって決定されてもよい。外部コードが実行ファイルであるとき、実行ファイルとランタイム生成コードとの関連は、スタックトレースを分析することによって検証されてもよい。フックされた関数および/または外部コードに関係するスタックトレースは、スタックトレースにおけるランタイム生成コードのリファレンスを識別するために、フックをインストールした許可されたフッキングエンジン実行ファイルの前の、スタックトレースにおけるランタイム生成コードへのリファレンスの位置を特定することによって、分析されてもよい。
【0073】
ランタイム生成コードがフックエンジンに関連する(すなわち、フックエンジンによって作成された)ことがわかっているとき、シグネチャデータは、許可されたフックエンジンを表すテンプレートシグネチャにマッチングされる。マッチは、ランタイム生成コードを作成したフックエンジンを必ずしも識別せずに、例えば、許可されたエンジンによって共有される1つまたは複数のプロパティに基づいて、ランタイム生成コードが許可されたクラスのフックエンジンによって作成されたかどうかを決定することがある。マッチは、例えば、あるフックエンジンに固有のプロパティに基づいて、コードを作成したある許可されたフックエンジンを決定することがある。
【0074】
任意選択で、シグネチャデータは、許可されたフッキングエンジン、または許可されたエンジンのクラスを示す。例えば、シグネチャデータは、シグネチャリポジトリ210Bに格納された、許可されたフックエンジン(またはエンジンのクラス)のテンプレートシグネチャとマッチングされてもよい。シグネチャリポジトリ210Bのテンプレートシグネチャは、例えば、ネットワークを介してサーバ214からダウンロードすることによって、自動的におよび/または手動で検索されてもよい。サーバ214は、シグネチャのアップデートを提供してもよい。
【0075】
例示的なシグネチャデータは、以下のうちの1つまたは複数を含んでもよい:
【0076】
* ランタイム生成コードがあるメモリエリアのあらかじめ定義されたサイズ。(クラスとしてまたは個別に)許可されたエンジンが、あらかじめ定義されたコードチャンクサイズ、例えば、サイズ0×1000で、コードを書き込んでもよい。
【0077】
* ランタイム生成コードの1つまたは複数の関数の始めの1つまたは複数のあらかじめ定義されたプロローグ。例えば、あるアンチウィルスフックエンジンが、アンチウィルスフックエンジンによって作成されたランタイム生成コードの各チャンクの最初に、オペコードpush MagicValueを使用する場合がある。
【0078】
* ランタイム生成コードを格納するメモリ領域の開始領域および/または終了領域に位置する1つまたは複数のあらかじめ定義された制御構造。例えば、ランタイム生成コードの一部分を各々格納する異なるメモリ領域を連結するリンクリスト。
【0079】
* 逆アセンブラプログラムを使用して生成されたオペコードシグネチャ。逆アセンブラは、可変パラメータ、例えばアドレスを除いて、ランタイム生成コードのアセンブリに適用されてもよい。逆アセンブラは、可変パラメータがランタイム生成コードから除去された後に適用されてもよい。
【0080】
306において、シグネチャデータは、ランタイム生成コードを作成した許可された実行可能なコンプレッサを表すテンプレートシグネチャとマッチングされる。実行可能ファイルは、解凍コードとともに単一の実行可能ファイルに圧縮されてもよい。圧縮された実行可能ファイルが実行されるとき、解凍コードはデータを解凍し、元の(すなわち、圧縮前の)プログラムを復元する。デコンプレッサは、解凍したコードをメモリに直接マップすることによって、解凍したコードをメモリに直接書き込んでもよい。
【0081】
ランタイム生成コードを格納するメモリ領域のコンテンツは、実行可能なコンプレッサに関連するあらかじめ定義されたオペレーティングシステムフォーマットに従って検証される。各実行可能ファイルは、関連するあらかじめ定義されたオペレーティングシステムフォーマットを有し、オペレーティングシステムフォーマットは、圧縮されたファイルがメモリにマップされるとき、メモリに存在する。解凍したプログラムを格納するメモリ割振りのベースでのメモリのコンテンツは、解凍した実行可能ファイルのフォーマットに従って検証される。検証は、解凍した実行可能ファイルのフォーマットに従って、メモリ割振りのコンテンツをパースすることによって行われてもよい。フィールド値は、論理的であり、フォーマットに準拠しているとチェックされてもよい。
【0082】
例示的なシグネチャデータは、以下のうちの1つまたは複数を含んでもよい:
【0083】
* 実行可能なコンプレッサに関連するあらかじめ定義されたフォーマットに従って、ランタイム生成コード(すなわち、解凍されたプログラム)を格納するために割り振られたメモリのあらかじめ定義されたサイズ。(クラスとしてまたは個別に)許可されたコンプレッサが、あらかじめ定義されたコードチャンクサイズでコードを書き込んでもよい。
【0084】
* 実行可能ファイル構造および/またはコードの不変部分について計算されたハッシュ関数(任意選択で、暗号学的ハッシュ関数)。ハッシュ関数によって出力された値は、1つまたは複数の許可された実行可能なコンプレッサにマップされてもよい。
【0085】
* 解凍されたランタイム実行可能コードがメモリに格納されているメモリページのパーミッション指定。パーミッション指定は、許可された実行可能なコンプレッサのクラスを示してもよい。例えば、作成されたランタイム生成コードは、読取り専用として指定されてもよい。
【0086】
106において、シグネチャデータとテンプレートシグネチャとの間でマッチが見つからないとき、ランタイム生成コードに悪意のあるコードが存在するというインジケーションが、生成されてもよい。インジケーションは、例えば、分析モジュールからのセキュリティプログラムへの内部メッセージ通信であって、悪意のあるコードについてランタイム生成コードを調べるためにセキュリティプログラムの起動をトリガしてもよい。インジケーションは、例えば、ユーザに対して画面上に表示されるメッセージであって、悪意のある可能性があるコードが見つかったことをユーザに通知してもよい。
【0087】
代替または追加として、ランタイム生成コードが許可されたソース作成モジュールに関連しているというインジケーションは、(例えば、一般的な、またはあるプロセスにおいて)許可されたソース作成モジュールを表すテンプレートシグネチャとのマッチが見つかるとき生成される。インジケーションは、例えば、ランタイム生成コードが許可されたソース作成モジュールに関連していると分析されたとき、ランタイム生成コードが実行される(または実行を続ける、または実行のブロックを回避する)ことが可能となるように、1つのプロセスから別のプロセスに通信される内部メッセージであってもよい。
【0088】
108において、ランタイム生成コードに悪意のある(例えば、可能性がある)コードが存在するというインジケーションが生成されるとき、コードによって自動的にまたはユーザによって手動で(例えば、悪意のあるコードの可能性を示すメッセージを画面上に提示し、セキュリティプロセスを起動するかどうかをユーザに尋ねて)、1つまたは複数のセキュリティ対策がトリガされてもよい。
【0089】
セキュリティ対策(例えば、セキュリティアプリケーション、例えば、プログラム記憶装置208および/または別の記憶デバイスに格納されたセキュリティモジュール208Cによって実行可能)の例には、ランタイム生成コードのさらなる実行をブロックすること、ランタイム生成コードおよび/もしくは関連するソース作成モジュールの削除、悪意のあるコードを除去するための悪意のあるコード対策セキュリティプログラムの起動、ランタイム生成コードおよび/もしくは関連するソース作成モジュールの隔離、ならびに/またはコードがメモリの他のエリアにアクセスしないようにすることが含まれる。
【0090】
ブロック106の代替として、110において、ランタイム生成コードに関連するシグネチャデータと、許可されたソース作成モジュールを表すテンプレートシグネチャとの間のマッチが見つかるとき、良性コードが存在するというインジケーションが作成されてもよい。本明細書で説明するように、マッチを見つけることは、ランタイム生成コードが許可されたソース作成モジュールに関連していることを示す。例えば、制御モジュールが、ランタイム生成コードは良性コードを表すというインジケーションを受け取るとき、ランタイム生成コードは、続行することを許可されてもよい。ランタイム生成コードの実行を一時停止していることがある、または作成されたインジケーションを監視する制御モジュールは、ランタイム生成コードの実行を再開してもよい。代替的には、インジケーションが作成されず、ランタイム生成コードが実行されるようにする。
【0091】
本発明の様々な実施形態の説明を、例示の目的で提示したが、網羅的であること、または開示する実施形態に限定することを意図していない。説明した実施形態の範囲および趣旨を逸脱することなく、多くの変更形態および変形形態が当業者には明らかであろう。本明細書で使用する用語は、実施形態の原理、実際の応用、または市場で見つけられる技術に優る技術改善を最も良く説明するように、または、当業者が本明細書に開示する実施形態を理解できるように選択した。
【0092】
本出願から満期となる特許の存続期間の間に、多くの関連するソース作成モジュール、ランタイム生成コード、および悪意のあるコードが開発されることが予想され、ソース作成モジュール、ランタイム生成コード、および悪意のあるコードという用語の範囲は、そのような新しい技術を事前にすべて含むものとする。
【0093】
本明細書で使用する「約」という用語は±10%を指す。
【0094】
「備える」、「備えている」、「含む」、「含んでいる」、「有している」、という用語およびそれらの活用形は、「限定はしないが、含む」を意味する。この用語は、「からなる」および「から基本的になる」という用語を包含する。
【0095】
「から基本的になる」という句は、組成または方法が、追加の成分および/またはステップを含む場合があることを意味するが、追加の成分および/またはステップが、特許請求する組成または方法の基本的および新規な特徴を物質的に変えない場合に限る。
【0096】
本明細書で使用する単数形「a」、「an」、および「the」は、文脈上別段明確に示されない限り複数の指示内容を含む。例えば、「化合物」または「少なくとも1つの化合物」という用語は、それらの混合物を含む複数の化合物を含むことができる。
【0097】
「例示的」という語は、本明細書では「例、事例、または例示としての役割を果たすこと」を意味するために使用される。「例示的」として説明するいかなる実施形態も、他の実施形態と比べて好ましいもしくは有利であると必ずしも解釈されてはならず、かつ/または他の実施形態からの特徴の取入れを必ずしも排除してはならない。
【0098】
「任意選択で」という語は、本明細書では、「いくつかの実施形態では提供され、他の実施形態では提供されない」を意味するように使用される。本発明のいかなる特定の実施形態も、複数の「任意選択の」特徴を、そのような特徴が矛盾しない限り、含む場合がある。
【0099】
本出願の全体を通して、本発明の様々な実施形態は、範囲の形式で提示されることがある。範囲の形式での説明は、単に便宜および簡潔のためであり、本発明の範囲に対する柔軟性がない限定と解釈されるべきでないことを理解されたい。したがって、範囲の説明は、すべての可能な部分範囲ならびにその範囲内の個々の数値を具体的に開示したものと考えるべきである。例えば、1から6までなどの範囲の説明は、1から3まで、1から4まで、1から5まで、2から4まで、2から6まで、3から6まで等のような部分範囲、ならびにその範囲内の個々の数、例えば、1、2、3、4、5、および6を具体的に開示したものと考えるべきである。これは、範囲の広さに関係なく適用される。
【0100】
数の範囲が本明細書で示されるときは常に、数の範囲は、示された範囲内の任意の引用される数字(小数または整数)を含むように意図される。第1の表示数と第2の表示数との「間に及んでいる/及ぶ」、ならびに第1の表示数「から」第2の表示数「まで」「及んでいる/及ぶ」という語句は、本明細書では交換可能に使用され、第1および第2の表示された数、ならびにそれらの数の間のすべての小数および整数を含むことを意味する。
【0101】
明確にするために別々の実施形態の文脈で説明されている本発明の特定の特徴は、単一の実施形態において組み合わせて提供されることも可能であることが理解される。逆に、簡潔にするために単一の実施形態の文脈で説明されている本発明の様々な特徴は、本発明の任意の他の説明されている実施形態において、別々に、または任意の適切な部分的組合せで、または好適であるように提供されることも可能である。様々な実施形態の文脈で説明したいくつかの特徴は、それらの要素なしでは実施形態が動作不能である場合を除いて、それらの実施形態の必須の特徴と考えるべきではない。
【0102】
本発明を、その特定の実施形態とともに説明したが、多くの代替形態、変更形態、および変形形態が当業者には明らかとなることは明白である。したがって、添付の特許請求の範囲の趣旨および広い範囲内にあるこのような代替形態、変更形態、および変形形態をすべて包含するものとする。
【0103】
本明細書において言及したすべての公報、特許、および特許出願は、各個々の公報、特許、または特許出願が参照により本明細書に組み込まれるよう具体的かつ個別に示された場合と同じ程度に、それらの全体が参照により本明細書に組み込まれる。加えて、本出願におけるいかなる参照の引用または特定も、そのような参照が本発明に対する先行技術として利用可能であると認めるものとして解釈されてはならない。項目の見出しが使用される限りにおいて、項目の見出しは、必ずしも限定的であると解釈されるべきではない。
【国際調査報告】