典型的な動作環境
図1および以降の考察は、ワーム封じ込めシステムのすべてまたは一部を実装できる適切なコンピューティング環境の簡潔で全般的な説明を提供することを意図している。図1の動作環境は適切な動作環境の一例にすぎず、動作環境の使用または機能の範囲に関して何らかの限定を提示することを意図するものではない。本明細書に記載のワーム封じ込めシステムとして使用するのに適する可能性のある他のよく知られたコンピューティングシステム、環境、および/または構成は、パーソナルコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な家庭用電化製品、ネットワークパーソナルコンピュータ、サーバコンピュータ、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などを含むが、これらには限定されない。
必須ではないが、このワーム封じ込めシステムについては、1つまたは複数のコンピュータまたは他のデバイスによって実行される、プログラムモジュールなどのコンピュータ実行可能命令という一般的なコンテキストにおいて説明する。一般にプログラムモジュールは、特定のタスクを実行したり特定の抽象データ型を実装したりするルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。通常、プログラムモジュールの機能は一体化することもでき、希望に応じて様々な環境に分散することもできる。分散環境では、プログラムモジュールは、メモリストレージデバイスを含むローカルコンピュータ記憶媒体およびリモートコンピュータ記憶媒体の双方に配置することができる。
図1を参照すると、ワーム封じ込めシステムを実装するための典型的なシステムは、コンピューティングデバイス100などのコンピューティングデバイスを含む。その最も基本的な構成において、コンピューティングデバイス100は通常、少なくとも1つの処理装置102およびメモリ104を含む。コンピューティングデバイスの厳密な構成およびタイプに応じて、メモリ104は、(RAMなどの)揮発性、(ROM、フラッシュメモリなどの)不揮発性、またはその両方の何らかの組合せとすることができる。この最も基本的な構成が、破線106によって図1に示されている。さらにデバイス100は、追加の機能および/または機能性を有することもできる。例えばデバイス100は、磁気ディスク、光ディスク、テープなどの(例えば取り外し可能および/または取り外し不能な)追加のストレージを含むこともできる。このような追加のストレージは、取り外し可能記憶装置108および取り外し不能記憶装置110として図1に示されている。コンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、他のデータなどの情報を記憶するための任意の方法または技術で実装される揮発性媒体および不揮発性媒体、ならびに取り外し可能媒体および取り外し不能媒体を含む。メモリ104、取り外し可能記憶装置108、および取り外し不能記憶装置110は、すべてコンピュータ記憶媒体の例である。コンピュータ記憶媒体は、RAM、ROM、EEPROM、フラッシュメモリまたは他のメモリ技術、CD−ROM、デジタル多用途ディスク(DVD)または他の光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは希望の情報を記憶するために使用可能で、デバイス100によってアクセス可能な他の任意の媒体を含むが、これらには限定されない。このような任意のコンピュータ記憶媒体は、デバイス100の一部とすることができる。
またデバイス100は、(1つまたは複数の)通信接続112を含むことができ、これによってデバイス100は、コンピューティングシステムネットワーク211内の他のノードなどの他のコンピューティングデバイスと通信することができる。(1つまたは複数の)通信接続112は、通信媒体の一例である。通信媒体は通常、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを搬送波や他の伝送機構などの変調されたデータ信号内に具現化するものであり、任意の情報伝達媒体を含む。「変調されたデータ信号」という用語は、情報をその信号内で符号化するような方法で設定または変更されたその特性の1つまたは複数を有する信号を意味する。例えば通信媒体は、有線ネットワークや直接有線接続などの有線媒体と、音響、RF(radio frequency)、赤外線や他の無線媒体などの無線媒体とを含むが、これらには限定されない。本明細書で使用するコンピュータ可読媒体という用語は、記憶媒体と通信媒体の両方を含む。
またデバイス100は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイス、レーザ照準機、赤外線カメラ、ビデオ入力デバイス、および/または他の任意の入力デバイスなどの(1つまたは複数の)入力デバイス114を有することもできる。ディスプレイ、スピーカ、プリンタ、および/または他の任意の出力デバイスなどの(1つまたは複数の)出力デバイス116を含むこともできる。
以降の説明では、特段の記載がない限り、1つまたは複数のコンピューティングデバイスによって実行される行為および動作の象徴的な表示を参照して、本発明について説明する。そのようなものとして、コンピュータ実行可能と呼ばれることもあるこうした行為および動作は、構造化された形式でデータを表す電気信号に対するコンピューティングデバイスの処理装置による処理を含むことは理解されよう。この処理によって、データは変換されるか、またはコンピューティングデバイスのメモリシステム内のロケーションに保持され、これによってデバイスの動作は、当業者がよく理解している方法で再構成されるか、またはその他の形で変更される。以降の説明は前述のコンテキストにおいて行うが、これは限定を意図するものではなく、以降で説明する様々な行為および動作はハードウェア内でも実施できることを当業者なら理解されよう。例えば当業者に知られている従来の技術を利用して、DSP、プログラマブルロジックアレイなどの専用回路によってソフトウェア命令のすべてまたは一部を実行することができる。
データが保持されるデータ構造は、データのフォーマットによって定義される特定のプロパティを有するメモリの物理ロケーションである。プログラム命令を格納するために使用するストレージデバイスはネットワーク全体にわたって分散できることを当業者なら完全に理解されよう。例えばリモートコンピュータは、説明されているプロセスの一例をソフトウェアとして格納することができる。ローカルまたは端末コンピュータは、リモートコンピュータにアクセスし、ソフトウェアの一部または全体をダウンロードして、プログラムを実行することができる。あるいはローカルコンピュータは、必要に応じてソフトウェアの断片をダウンロードするか、または一部のソフトウェア命令をローカル端末で実行し、他のソフトウェア命令をリモートコンピュータ(またはコンピュータネットワーク)で実行することによって分散処理を行うことができる。
封じ込めシステムを使用できるネットワーク化された環境の一例について、図2を参照して説明する。このネットワークの例は、雲によって表されているネットワーク211を介して相互に通信する複数のコンピュータすなわちノード210を含む。ネットワーク211は、ルータ、ゲートウェイ、ハブなどのよく知られた多くのコンポーネントを含むことができ、ノード210が有線および/または無線媒体を介して通信できるようにする。ネットワーク211を介して相互に対話する際、1つまたは複数のノードは、他のノードに対してクライアント、ネットワークサーバ、またはピアとして機能することができる。したがって封じ込めシステムの様々な例は、たとえ本明細書に含まれる特定の例が、クライアント、ネットワークサーバ、ピア、またはその組合せのすべてに言及していなくとも、これらのタイプのコンピュータ上で実施することができる。
ワームの封じ込め
ワームは通常、コンピューティングシステム内に保存される可能性のあるメッセージなどの受信データを介してコンピューティングシステムに取り込まれる。受信され保存されたデータは、コンピューティングシステムのストレージ特性を悪用して、脆弱性を作り出す可能性があり、これによってワームは、攻撃および/または増殖することができる。例えば多くのワームは、脆弱なプログラムにコードを注入し、そのプログラムにそのコードを実行させる。他のワームは、新たなコードを注入するのではなく、脆弱なプログラムの実行を遠隔制御することによって、攻撃を行うことができる。
図3を参照すると、ワーム封じ込めシステム300は、検出モジュール340、警報モジュール350、警報検証モジュール360、配信モジュール370、および対応モジュール380の1つまたは複数を含むことができる。検出モジュール340は、ワームによるコンピューティングシステム上の攻撃を検出することができる。検出に先立って、ワームは既知のものでも未知のものでもかまわない。必要に応じて任意のワーム検出システムを使用できることを理解されたい。ワーム封じ込めシステム300は、様々な技術を使用する様々な検出モジュール340を実行することができ、それぞれの検出モジュール340は、1つまたは複数の技術を使用して、ワームを検出することができる。受信した情報を既知のワームを含むものとして識別すること、受信した情報を保存されている情報と比較して、変更されたファイルおよび望ましくないファイルの存在を検出し、構成の変更を検出し、および/または返信用アドレスなどのパラメータ値を検証すること、保存される見込みの情報を実際に保存されている情報と比較して、バッファの上書きを検出すること、ガードストレージセグメントによってバッファオーバーフローを検出すること、アレイバウンズチェッキングを実施して、バッファのオーバーフローおよびアンダーフローを直接検出すること、プログラムおよび/または通信パターンのランタイムをモニタし、予想された動作からの何らかの逸脱を検出すること、文字列および/またはメッセージの長さなどの既知のワームの署名がないか受信データを検査すること、動的データフロー分析などを含む適切な検出技術の任意の組合せを使用することができる。動的データフロー分析については、以降でさらに説明する。
ワームが検出されると、封じ込めシステムは処置を講じることができる。例えば警報モジュール350は警報330を作成し、その警報を1つまたは複数のコンピューティングシステムに送信して、検出されたワームに関する知識を共有することができる。警報モジュールは、自己認証式警報(self−certifying alert)を作成することができ、これは、1つまたは複数のコンピューティングシステムに送信することができ、所与のプログラムが脆弱性を有することを証明する情報を含むことができる。警報の配信は、配信モジュール370によって決定することができ、これによって、互いを信頼していない多数のコンピューティングシステムがワームを封じ込める際に協力できるようになる。受信された自己認証式警報は、その自己認証式警報を受信したコンピューティングシステムによって独自に検証することができる。自己認証式警報の検証は、受信側のコンピューティングシステム320の警報検証モジュール360によって実行することができる。
ワームを検出したおよび/または警報を受信したコンピューティングシステムは、対応モジュール380を介して、システムを浄化および/または保護し、ワームの有害な影響を軽減し、および/またはワームの増殖を防止するための局所的な処置を講じることができる。対応モジュール380によって採用される具体的な保護メカニズムは、ノードごとに異なるものとすることができ、必要に応じて実装することができる。例えばあるノードは、脆弱なソフトウェアパッケージを単に停止することができ、他のノードは、局所的な補修および/またはフィルタリングプロシージャを採用することができる。
動的フロー分析による検出
動的データフロー分析は、多くの異なるワームまたは同じワームの変種が脆弱性を悪用することによってターゲットのプログラムの支配権を握ることができる方法を検出することができる。したがって動的データフロー分析は、ワーム中心ではなく、脆弱性中心である。動的データフロー分析は、脆弱性を含む特定の命令のセットまたはその脆弱性を悪用するためにワームが使用する特定のアクションのセットに関する事前の知識を必要としないため、未知のワームを検出することができる。このようにして、動的データフロー分析は、未知のワームを検出することができる。ワームによって使用される多くの攻撃は、脆弱なプログラムにコードを注入し、そのプログラムにそのコードを実行させることを含む。別の一般的な攻撃メカニズムは、何らかの新たなコードを注入するのではなく、脆弱なプログラムの実行を遠隔制御することである。例えばプログラムが既にCランタイムをロードしている場合、ワームは、system()関数を呼び出すよう脆弱なプログラムに強要することができる。動的フロー分析は、これら2つの感染方法ならびに他の感染方法を検出することができる。
動的フロー分析は、入力オペレーション時に受信されたデータ(例えば、ネットワーク接続から受信されたデータ)の経過を追跡する。動的フロー分析は、図3を参照して前述した検出モジュール340によって実施することができる。より詳細には、検出モジュール340は、情報のいくつかのストレージロケーション、例えば外部ソースから受信した情報を保存するストレージロケーションおよび/または外部ソースからの情報から得た情報を保存するストレージロケーションを「汚染されている」と識別することができる。検出モジュールは、汚染されたロケーションに保存されているデータの実行を選択的に阻止することができ、および/またはそのデータが命令ポインタにロードされるのを選択的に阻止することができる。このようにして、汚染されているデータの実行および/または命令ポインタへのロードを阻止することによって、遠隔ロードされたコードの実行および実行の遠隔制御を防止または低減することができる。命令ポインタまたはプログラムカウンタは、プログラムシーケンス内で次に実行される命令のアドレスすなわちロケーションを含むレジスタである。
動的フロー分析とは、保存されているデータが汚染されているか否かを追跡監視するものであり、任意の適切な方法で実行することができる。例えば外部ソースからの情報を記憶する命令を装備して、どのメモリロケーションおよび/またはCPUレジスタが、入力オペレーションから受信した汚染されているデータおよび/または入力オペレーションから受信したデータから得られた汚染されているデータを含むかを追跡監視することができる。装備されるものとして選択される命令は、ロードオペレーションおよび保存オペレーションなどのデータの読み取りおよび/または書き込みを行う任意の適切な命令(例えばMOV、MOVS、PUSH、POP on x86 CPUs)、算術命令および論理命令(例えばADD、MUL、XOR、AND、on x86 CPUs)を含むことができる。すべての制御移行命令(例えばRET、CALL、JMP on x86 CPUs)、または適切と思われるサブセットを装備して、命令ポインタにロードされるデータ上でチェックを実施することもできる。
汚染されているメモリロケーションは、任意の適切な方法で追跡監視することができる。例えば汚染されているストレージロケーションは、汚染データストア内で追跡監視することができ、この汚染データストアは、汚染標識をコンピューティングデバイスのメモリの一部におけるストレージロケーションに関連付ける。メモリのその部分は、メモリロケーション、レジスタ、オフセットの表示(indication)などとすることができる。
汚染標識は、任意の適切な標識とすることができ、関連付けられているメモリロケーションに記憶されている情報が、信頼できない外部ソースからのものであることを示し、いくつかの例では、情報を送信している他のすべてのノードを信頼できないとみなす場合もある。例えば汚染標識は2進数とすることができ、1は、関連付けられているデータが汚染されていることを示し、0は、関連付けられているデータが汚染されていないことを示す。別の例では、汚染標識は、整数または英数字の文字列などのメッセージ識別子とすることができ、汚染されている情報のメッセージおよび/またはソースを示す。このようにして、汚染標識は、データが汚染されている場合は一意のメッセージ標識に相当することができ、データが「汚染されていない」場合は、空値や「0」などのデフォルト値に相当することができる。別の例では、汚染標識は、メッセージとメッセージ内のオフセットの両方を示す識別子とすることができる。別の例では、汚染標識は、汚染されている情報のメッセージ/ソースにおける値から汚染されているメモリ部分における値を計算するために使用された一連の命令の全シーケンスまたは関連する部分を含むデータフローグラフの識別子とすることができる。
汚染されている、または汚染されていない関連付けられたメモリ部分のロケーションは、関連付けられた汚染標識によって示されるように、任意の適切な方法で示すことができる。一例では、汚染標識は、メモリ内の特定のロケーションを示すメモリロケーション標識に関連付けることができる。別の例では、汚染標識のベクトル内の汚染標識の配置によってメモリロケーションを示すことができる。例えば汚染標識のベクトルまたはアレイ内の第1の汚染標識は、(スタックの最上部などの)第1のメモリロケーションを示すことができ、第2の汚染標識は、(スタックの最上部から2番目のロケーションなどの)第2のメモリロケーションを示すことができる、といった具合である。
一例では、それぞれのメモリロケーションは、汚染データストア内の汚染標識によって追跡監視することができる。汚染データストアの一例390が、図3に示されている。例えばメモリページ、メモリページ内の個々のメモリロケーション、CPUレジスタなど、コンピューティングデバイス内のメモリの任意のタイプまたは部分を追跡監視することができる。
メモリの各ページは、メモリの各ページをページ汚染標識に関連付けることによって追跡監視することができる。メモリのページは、4KBのメモリセグメントなど、メモリの任意のセグメントとすることができる。ページ汚染標識は、メモリページ内の少なくとも1つのメモリロケーションが汚染されているかどうかを示すことができる。ページ汚染標識が、ページ内の少なくとも1つの汚染されているメモリロケーションを示している場合、その汚染されているページ内のそれぞれのメモリロケーションをメモリロケーション汚染標識に関連付けることができる。メモリロケーション汚染標識は、(ベクトル内の位置によって、または他の適切な方法で示されている)関連付けられているメモリロケーションに含まれる情報によって、そのメモリロケーションが汚染されているか否かを示すことができる。このようにして、各メモリページはページ汚染標識に関連付けることができ、汚染されている情報をメモリロケーション単位で追跡することによって、汚染されている情報を含むページのみをメモリロケーションへとさらに区分することができる。
図4は、データ構造の例410、420を示しており、これによって検出モジュールは、どのメモリロケーションが汚染されているか(例えば、入力オペレーションから受信したデータを含んでいるか)を追跡監視することができる。ページ汚染データストア410は、関連付けられているメモリページが汚染されているか否かを示すページ汚染標識のベクトルを含むことができる。例えば図4に示されているように、第1のメモリページは、ページ汚染標識値412によって示されているように、汚染されていない可能性があり、第2のメモリページは、ページ汚染標識値414によって示されているように、汚染されている可能性がある。このように、ページ汚染データストア410は、ページ内のいずれかのロケーションが汚染されている場合に設定される4KBのメモリページごとに1ビットを有するベクトルビットマップである。
ページ汚染データストア410内に示されている汚染されたすべてのページについて、図4に示されているように、汚染されたページを示すページ汚染データストアのページ汚染標識に、さらなるメモリロケーション汚染データストア420を関連付けることができる。メモリロケーション汚染データストア420は、汚染されているページ内の関連付けられているメモリロケーションが汚染されているか否かを示すメモリロケーション汚染標識のベクトルを含むことができる。例えば図4に示されているように、第2のページは、ページ汚染標識414の値によって示されているように、汚染されているデータを含む。メモリロケーション汚染データストア420は、ページ汚染標識414に関連付けることができる。メモリロケーション汚染データストア420は、その特定のページにおいてどのメモリロケーションが汚染されていないか、および/または汚染されているかを示すメモリロケーション汚染標識422、424のベクトルを含むことができる。図4に示されているメモリロケーション汚染データストアの例では、メモリロケーション汚染標識値422によって示されているように、第1のメモリロケーションは汚染されていない可能性があり、メモリロケーション汚染標識値424によって示されているように、第2のメモリロケーションは汚染されている可能性がある。このように、メモリロケーション汚染データストア420は、関連付けられているページ上の関連付けられているメモリロケーションが汚染されている場合に設定されるメモリロケーションごとに1ビットを有するベクトルビットマップである。メモリロケーション汚染データストアは、例えばページ、ワード、および/またはバイトの精度で汚染標識を保持することによって、汚染されているメモリロケーションを任意の適切な精度で追跡監視することができる。同様に、汚染されているメモリロケーションを示すメモリロケーション汚染標識に、さらなるメモリロケーション汚染データストアを関連付けることができる。このさらなるメモリロケーション汚染データストアは、例えば情報のそれぞれのバイトごとなど、より細かいレベルの精度で、汚染されているメモリロケーションを示すことができる。
図4に示されているように、ページ汚染標識はページ汚染データストア410内に保存することができ、メモリロケーション汚染標識はメモリロケーション汚染データストア420内に保存することができる。あるいは、メモリ部分の精度のそれぞれのレベルごとに別々のデータストアを使用するのではなく、次に細かい精度のレベルで汚染標識のベクトルを含む汚染されているメモリ部分を示す汚染標識を有する単一のデータストアを使用することができる。例えばページ汚染標識は、汚染データストア内にアレイとして保存することができる。汚染されていないページを示すページ汚染標識は、0や空値などの任意の適切な標識とすることができる。汚染されている値を示すページ汚染標識は、そのページのどのメモリロケーションが汚染されているか、またどのメモリロケーションが汚染されていないかを示す標識値のベクトルを含むビットマップとすることができる。
図5に示されている汚染データストアの例510では、ページ汚染標識値512によって示されているように、第1のメモリページは汚染されていない可能性があり、ページ汚染標識値514によって示されているように、第2のメモリページは汚染されている可能性がある。ページが汚染されていることを示す汚染ページ標識は、関連付けられているメモリロケーションが汚染されているか否かを示すメモリロケーション汚染標識のベクトルを含むことができる。このように、汚染データストア510は、ページが汚染されていない場合はメモリページごとに1ビットを有するアレイビットマップであり、ページが汚染されている場合はメモリロケーション汚染標識のベクトルである。例えば図5に示されているように、第2のページは、ページ汚染標識の値514によって示されているように、汚染されているデータを含む。ページ汚染標識の値514は、そのページ内のどのメモリロケーションが汚染されているか、またどのメモリロケーションが汚染されていないかを示すことができる。例えば図5に示されているように、メモリロケーション汚染標識値542は、このページに含まれる第1のメモリロケーションが汚染されていないことを示し、メモリロケーション汚染標識544は、関連付けられているメモリロケーションが汚染されていることを示している。
動的データフロー分析は、追加および/または代替として、CPUレジスタ内に保存されているデータを汚染されていないもの/汚染されているものとして追跡監視することができる。例えばメモリの各レジスタは、レジスタ汚染データストア内のレジスタ汚染標識によって追跡監視することができる。レジスタ汚染標識は、保存されている情報のソースによって、関連付けられているメモリのレジスタが汚染されているか否かを示すことができる。前述のように、追加および/または代替として、例えばレジスタ内のそれぞれのバイトごとに汚染標識を保持することによって、レジスタよりも細かい精度で追跡監視を行うこともできる。
図14は、データストアの一例1400を示しており、これによって検出モジュールは、どのレジスタが汚染されているか(例えば、入力オペレーションから受信された(得られた)データを含むか)を追跡監視することができる。レジスタ汚染データストア1400は、レジスタ汚染標識のベクトルを含むことができる。例えば図14に示されているように、第1のCPUレジスタは、レジスタ汚染標識値1422によって示されているように、汚染されていない可能性があり、第2のCPUレジスタは、レジスタ汚染標識値1424によって示されているように、汚染されている可能性がある。このように、レジスタ汚染データストア1400は、関連付けられているページ上の関連付けられているCPUレジスタが汚染されている場合に設定されるCPUレジスタごとの1ビットを有するベクトルビットマップである。
ここまでメモリページ、メモリロケーション、およびレジスタの例について説明したが、前述のような動的データフロー分析を使用して、メモリの任意のタイプ、部分、および/またはフォーマットを追跡監視できることを理解されたい。
前述のように、汚染標識は、関連付けられているメモリ部分が汚染されていない/汚染されていることを示すだけでなく、メモリ部分に保存されている情報のソースおよび/または由来の経路を示すこともできる。汚染されているメモリ部分に保存されている情報のソース、計算、または由来は、オプションのオフセット表示(offset indication)を有する入力メッセージ識別子や、汚染されているメモリロケーションにおける値を計算するために使用される命令のシーケンスを含むデータフローグラフなど、任意の適切な方法で示すことができる。また汚染標識は、命令内で操作される値のソースを示すこともできる。
図18は、汚染データストアの一例1800を示しており、これによって検出モジュールは、どのメモリロケーションおよび/またはレジスタが汚染されているか(例えば、入力オペレーションから受信されたすなわち得られたデータを含むか)と、汚染されているデータのソースとを追跡監視することができる。図18に示されているように、汚染標識値1812などの汚染標識は、そのロケーションにおける関連付けられているデータが汚染されていないことを空値などの任意の適切な方法で示すことができる。汚染標識値1814は、相関付けられたロケーションに保存されている関連付けられたデータが汚染されていることを示すことができ、汚染されている情報のソースを示すことができる。例えば図18に示されているように、汚染標識値1814はデータフロー図を含むことができ、このデータフロー図は、関連付けられたメモリロケーションに記憶されているデータが、信頼できないソースからの汚染されている入力データから得られたものであることを示し、関連付けられたメモリ部分に記憶されているデータが、汚染されている入力データからどのようにして得られたかを示す。このデータフローグラフは、入力値、入力データのソースメッセージ、入力データのメッセージ内のオフセット、現に保存されているデータを得るために入力データに適用された命令などを示すことができる。図18に示されているように、汚染標識値1814はデータフローグラフ1816を示すことができる。図18のデータフローグラフ1816は、入力データ1818が、mess_1というメッセージ識別子を有するメッセージ内に0のオフセットを有することを示している。データフローグラフは、入力データに適用される演算および/または命令を示すことができる。図18に示されているように、入力値1818と、2の値として示されている値1824とを使用して、加算演算1820を実行する。乗算演算子1828によって、加算演算の結果に値1826をかけることができる。このようにデータフローグラフは、関連付けられているメモリロケーションが、汚染されているデータ、例えば入力データ1818からどのようにして得られたかを示している。
図4のページ汚染データストア410およびレジスタ汚染データストア420、図5の汚染データストア510、図14のレジスタ汚染データストア1400、ならびに図18の汚染データストア1800など、(1つまたは複数の)汚染標識を保存する(1つまたは複数の)汚染データストアは、コンピューティングデバイスのメモリ内の1つまたは複数の任意の適切なデータストア内に格納することができる。リレーショナルデータベース、オブジェクト指向データベース、非構造化データベース、インメモリデータベース、シーケンシャルメモリ、あるいは他のデータストアなど、任意の適切なフォーマットの任意の適切なデータストアを使用して、汚染データストアの情報を保存し、および/または検出モジュールに伝達することができることを理解されたい。ASCIIテキストなどのフラットファイルシステム、バイナリファイル、通信ネットワークを介して伝送されるデータ、または他の任意のファイルシステムを使用して、ストレージアレイを構築することができる。前述のデータストアのこうした考えられる実施例にもかかわらず、本明細書で使用されるデータストアおよびストレージアレイという用語は、コンピュータによってアクセス可能な任意の方法で収集および保存される任意のデータを指す。
レジスタ、ページ、メモリロケーションなどのための汚染標識は、任意の適切な時点で作成することができる。例えば入力オペレーションを実行する(例えばネットワーク接続からのデータを受信および/または操作する)たびに、結果として生じるデータを書き込むメモリロケーションおよび/またはレジスタに汚染標識を表示することができる。図3を参照すると、検出モジュール340は、[MoveData destination,source]という形式の命令が実行されるたびに、メモリの関連付けられている部分用に1つまたは複数の汚染標識を作成することができる。より詳細には、汚染されているソースからのデータが書き込み先に書き込まれるたびに、書き込み先のメモリ部分、例えばメモリロケーション、レジスタなどを汚染されているものとして表示することができ、それ以外の場合は、書き込み先のメモリ部分を汚染されていないものとして表示することができる。命令またはシステムコールが、信頼できない外部ソースからのデータを書き込み先に書き込む際、書き込み先のメモリ部分を汚染されているものとして表示することができる。命令MoveDataは、一般化された命令であり、何らかの特定のCPU内に存在するものではなく、コンピューティングデバイスのメモリ内でデータを操作できる任意の数および/または組合せの命令を含むことができる。例えばMoveData命令は、オペランドがレジスタまたはメモリであるx86 MOV命令と、書き込み先が、ESPレジスタによって指し示されているメモリロケーションであり、別のレジスタがオペランドであるPUSHオペレーションとを含むことができる。他の例は、MOV、MOVS、PUSH、POPなどのロードおよび保存オペレーションを含むことができる。他の例は、ADD、MUL、AND、XORなどの算術命令および論理命令を含むことができる。算術命令または論理命令が実行されることによってメモリロケーションが汚染されるたびに、汚染標識は、メモリロケーションを汚染させる命令のシーケンスの全体または一部を含むことができる。上記はx86 CPUに特有の例だが、他のコンピューティングデバイスによって実行される他のオペレーションおよび/または命令が適切な場合もあることを当業者なら理解されよう。
動的データフロー分析を使用してワームの存在を検出するために、データが実行され、および/または命令ポインタにロードされる前にデータを検査することができる。このようにして、動的データフロー分析は、ワームが支配権を握る前に実行を阻止することができる。具体的には、実行の制御が不正なロケーションへリダイレクトされつつあるときに検出を行うことができる。例えば命令が実行される前に、適切な汚染データストアを検査して、実行されるデータを保存するメモリ部分用の(1つまたは複数の)関連付けられている汚染標識を確認し、汚染されていないことを確かめることができる。データを保存するメモリロケーションが汚染されていることを汚染標識が示している場合、命令の実行を停止することができ、ワームの存在を検出することができる。同様に、データがメモリの部分から命令ポインタへロードされる前に、データのそのメモリ部分用に関連付けられている汚染データストアを検査することができる。そのデータが、信頼できないソースから来たすなわち得られたものであることを、その関連付けられているメモリ部分用の汚染標識が示している場合、ポインタ値を命令ポインタへロードせずに、ワームの存在を検出することができる。この最後の検査によって生じる可能性のある偽陽性をいくらかでも減らすために、検出モジュールは、命令ポインタへロードされつつある値で値域の比較(例えば値が所与の定数よりも小さいかどうかのチェック)または論理演算(例えば所与のビットパターンとのAND)が行われなかったことをさらに確認することができる。検出モジュールは、以降で説明する脆弱性検証プロシージャを使用して、偽陽性を示さずにワームの存在が正しく検出されるようにすることもできる。
動的データフロー分析の検出は、現在利用可能なツールの大半が既知のターゲットを保護するように設計されているのに対して、未知の攻撃のターゲットを保護できるため、非常に汎用性が高い。前述のような動的データフロー分析を実施する検出モジュールは、何らかの特定のデータ構造の上書きを検出することに依存するのではなく、実行されつつある、または命令ポインタへロードされつつあるデータのソースを辿ることができる。例えばスタックを保護するように設計されているツールも複数あるが、攻撃者は、関数ポインタまたはsetjmpバッファをターゲットにすることを選択して、このタイプの保護を迂回することができる。いずれにしても、攻撃者は、実行中のプログラムに何らかのデータを入力しなければならないわけであり、これは、動的データフロー分析がその攻撃を検出できることを意味している。実際に、動的データフロー分析は、攻撃のターゲットが非常に識別しづらい問題を検出できる場合がある。
例えば図17に示されているソースコードリスト1700などのプログラムは、ネットワーク接続からデータをロードし、そのデータを第2のバッファへコピーすることができる。このプログラムは、そのバッファを含むページ上のページ保護許可を変更して、実行を可能とし、そのバッファへジャンプすることができる。この問題は、プログラムのスタックには何のダメージもなく、バッファオーバーランもないため、スタックを保護するツールや他のいかなるプログラムデータ構造によっても検出されない。この問題は、ページ上の実行許可を強制するプログラムがCPU内で実行されても、プログラムがページ許可を明確に変更しているため、検出されない。しかしバッファ内のデータは、もともとネットワーク接続上の入力オペレーションを介してプログラムのアドレス空間に入り込んだものであるため、前述のような動的データフロー分析は、この問題を検出することができる。この例は、少し不自然ではあるが、プログラムに含まれる可能性のある不特定のエラーの種類を示している。
検出モジュールによって実施される動的フロー分析は、大半の保護ツールが行うようなソースコードへのアクセスを必要としない場合もあることを理解されたい。この検出メカニズムは、他の複数の方法で実施することができる。これは、ページ許可を使用してメモリアクセスを追跡監視することによってインタープリテーションの下でCPUエミュレータ内においてプログラムを実行することによって、バイナリインスツルメンテーション技術を使用することによって、またはオペレーティングシステムデバッギングインターフェースを使用してプログラムの実行を制御することによって、実施することができる。さらに場合によっては、実行されるすべての命令上で実行環境が制御を維持できる限り、前述のような動的データフロー分析は、自己書き換えコードおよび動的に作成されるコード(例えば、ジャストインタイムのコンパイル環境で作成されるコードなど)の中でさえセキュリティの問題を検出することができる。プログラムがインタープリテーション環境内で実行される場合、すべての命令上で制御を維持することは取るに足りないことだが、自己書き換えコードをサポートするバイナリリライタも存在する。
動的フロー分析は、システムの既知の脆弱性および/またはワームを含むメッセージの特徴を定義することに依存しないため、前述の動的フロー分析は、既知および/または未知のワームを検出することができる。その上、動的フロー分析を実施する検出モジュールは、スピードの遅いワームおよび/または通常のトラフィックを装っているワームを検出することができる。ワームが通常のアプリケーショントラフィック上だけに乗っている場合でさえ、動的フロー分析を使用する検出モジュールは、そのワームを検出することができる。その上、動的フロー分析を実施する検出モジュールは、多形態性および/またはメタモーフィック型のワームを検出することができる。暗号化を含む一般的な錯乱技術を使用するワームミューテイションエンジンが、広く普及している。したがって今後のワームは、これらのツールを広く使用することができ、動的フロー分析を使用せずに検出することは、ますます困難になる。
動的データフロー分析を実施する検出モジュールを拡張して、システムコールのパラメータを上書きすることによってターゲットのプログラムの支配権を握るワームを検出することができる。このようなワームは、例えばプロセスを作成するシステムコールのパラメータを上書きし、他のワームのインスタンスからのコマンドを受け入れるプログラムを起動することができる。検出モジュールは、システムコールが、汚染されている引数、例えば汚染されているメモリロケーションに保存されている引数を使用していること、およびそれらの引数がシステムによってチェックされていないこと、すなわち汚染されている引数上で行われる論理演算(例えば、特定の値または値の範囲との比較)が、それらを安全な値に限定する上で不十分であることをチェックすることによって、このような攻撃を検出することができる。例えば検出モジュールは、ワームが、ターゲットのシステム上に保存されている任意のプログラムを起動するようターゲットのプログラムに強要することができると結論付けることができる。
検出モジュールは、複数の検出メカニズムを実装することができ、ネットワーク内の1つまたは複数の異なるノードのそれぞれの検出モジュールは、様々な検出技術を実装することができる。例えば検出モジュールは、前述のデータフロー分析の検出メカニズムを1つまたは複数の他の検出メカニズムと共に実装することができる。それぞれの検出メカニズムごとに複数の実施例が存在することもできる。このように、検出メカニズムのタイプと実施例の双方において多様性を実現することができる。追加および/または代替の検出メカニズムの例は、動的データフロー分析よりも汎用性は低いが重大な攻撃を検出できる検出メカニズムを含むことができる。
このような簡単な技術の1つは、すべてのRET命令が実行可能ページに制御を渡すのを検出することである。多くのワームが、スタックを上書きし、そのスタックを上書きしたデータ(これは通常、実行許可を有するメモリの領域にはない)へジャンプするという簡単な技術を使用しているため、この検出メカニズムが有効となる場合がある。この技術は、バイナリリライティングを使用して、すべてのRET命令をターゲットの実行可能ページ上に装備することによって、実装することができる。スタックを保護するために、多くの他の技術を使用することができる。
追加および/または代替の検出メカニズムの別の例は、すべてのCALLおよび/またはRET命令を装備することによって、シャドースタックを保持することができる。このシャドースタックは、基本的には通常のスタックのコピーだが、異なるメモリロケーションに保持され、これによって、すべてのRETにおいてスタックのインテグリティをチェックすることができる。
受信した情報を既知のワームを含むものとして識別すること、受信した情報を保存されている情報と比較して、変更されたファイルおよび望ましくないファイルの存在を検出し、構成の変更を検出し、および/または返信用アドレスなどのパラメータ値を検証すること、保存される見込みの情報を実際に保存されている情報と比較して、バッファの上書きを検出すること、ガードストレージセグメントによってバッファオーバーフローを検出すること、アレイバウンズチェッキングを実施して、バッファのオーバーフローおよびアンダーフローを直接検出すること、プログラムおよび/または通信パターンのランタイムをモニタし、予想された動作からの何らかの逸脱を検出すること、文字列および/またはメッセージの長さなどの既知のワームの署名がないか受信データを検査すること、動的データフロー分析などを含む他の追加および/または代替の検出メカニズムを検出モジュールによって実装して、ワームやウイルスなどの存在または危険を検出できることを理解されたい。
作動中、図3の検出モジュール340などの検出モジュールは、ワームを検出する方法を実施することができる。図6は、ワームを検出する方法の一例600を示している。602において、図1を参照して説明したコンピューティングデバイスなどによって、データを操作するための命令を受け取ることができる。前述のように、データを操作するための命令は、データの移動、結合、転送、ロードなどを行う任意の命令とすることができる。604において、コンピューティングデバイスの適切なローカルアプリケーションやオペレーティングシステムなどによって、指示どおりにデータを操作することができる。データの操作は、606においてデータの少なくとも一部、またはデータの操作された部分(例えばデータの派生物)をメモリロケーションおよび/またはレジスタに保存することを含むことができる。メモリは、コンピューティングデバイスのメモリのスタック、バッファ、または他の任意の部分の一部とすることができる。保存されるデータのロケーションは、608において任意の適切な方法で決定することができる。610では、データのソースを検査して、情報を保存しているメモリ部分が「汚染されている」か「汚染されていない」かを判定することができる。保存されている情報が、信頼できないソースから得られたものである場合、メモリ部分は汚染されている。同様に、データが、信頼できるソースから来たものであるか、および/または他の汚染されていないデータから得られたものである場合、そのデータは汚染されていないとみなすことができる。
データが汚染されていない場合、612において、そのデータが汚染されていないことを示す汚染標識値を設定することができる。前述のように、汚染されていないデータを示す汚染標識は、「0」の値や空値などを含む任意の適切な標識とすることができる。
決定された汚染標識値は、614において、その汚染標識値を図3の汚染データストア390などの汚染データストア内に保存することなどによって、保存されているデータのメモリ部分に関連付けることができる。汚染データストアは、初期設定するか、および/またはデフォルトの汚染標識値を投入することができる。より詳細には、最初はすべてのメモリ部分を汚染されているメモリ部分とみなすか、および/または汚染されているメモリ部分を示す汚染標識に関連付けることができ、汚染されていないデータが明確に判定され、関連付けられたメモリ部分に保存された場合に、「汚染されていない」へ意識的に変更することができる。別の例では、最初はすべてのメモリ部分を汚染されていないとみなすか、および/または汚染されていない旨を示す汚染標識に関連付けることができ、汚染されているデータが明確に判定され、関連付けられたメモリ部分に保存された場合に、「汚染されている」へ意識的に変更することができる。汚染データストアは任意の適切な値に初期設定できることを理解されたい。さらに前述のように、汚染データストアは、それぞれのメモリレジスタ、メモリページ、メモリロケーションなどに関連付けられている1つまたは複数の汚染標識を有する1つまたは複数のデータストアを含むことができる。
データが汚染されている場合、612において、判定されたロケーションのデータが汚染されていることを示す汚染標識値を設定することができる。前述のように、汚染されているデータを示す汚染標識は、「1」の値または一意の作成元識別子、例えばデータのソースに関連付けられたメッセージ識別子、現に保存されているデータに入力を提供するデータ用のメモリロケーション、メッセージ内のオフセットと結合したメッセージ識別子、保存されているデータを計算する際に使用される命令のすべてまたは一部を含むデータフローグラフなどを含む任意の適切な標識とすることができる。保存されているデータが、別の汚染されているメモリ部分に保存されている他の「親」データから得られたものである場合は、「親」データと同じ作成元標識、親データのメモリロケーション、受け取った命令とその命令のオペランドのデータフローグラフとを結合することによって作成されるデータフローグラフなどとすることができる。決定された汚染標識値は、614において、その汚染標識値を適切な汚染データストア内に保存することなどによって、保存されているデータのメモリ部分(例えばロケーションまたはレジスタ)に関連付けることができる。例えばメモリロケーションが汚染されていると判定された場合、汚染されているデータを示すメモリロケーション汚染標識を設定することができ、および/またはメモリの汚染されているページを示すページ汚染標識を設定することができる。
場合によっては、システムコールの引数を悪用するワームの存在を検出するために、この方法は、汚染されているメモリ部分がシステムコールに対する引数としていつ使用されるかを判定することができる。より詳細には、616において、システムコールを実行するための命令を受け取ることができる。618では、システムコールの引数として渡されるデータのメモリ部分を割り出すことができる。620において、割り出された(1つまたは複数の)メモリ部分に関連付けられている汚染標識を検査することができる。例えば前述のように、汚染標識を各メモリ部分に関連付けて、保存されている情報が汚染されているか否かを示すことができる。ロードされるデータが「汚染されていない」ことを汚染標識が示すと、場合によっては、受け取った命令を636において実行することができ、例えば情報をロードすることができる。場合によっては、様々な検出メカニズムを含めるために、他の検出技術を用いて命令および/またはデータをさらに検査して、634においてワームやウイルスなどの存在を検出することができる。
場合によっては、ワームの存在を検出するために、この方法は、汚染されたメモリ部分に保存されているデータが、ワームの存在を示す方法でいつ操作されるかを判定することができる。より詳細には、622において、実行フローを変更するための命令を受け取ることができる。624では、命令ポインタへロードされる値を保存するメモリ部分を割り出すことができる。626において、割り出された(1つまたは複数の)メモリ部分に関連付けられている汚染標識を検査することができる。命令ポインタへロードされる値を保存するメモリ部分が汚染されていることを汚染標識が示すと、前述のように626において適切な処置を講じることができる。ロードされる値を保存するメモリ部分が「汚染されていない」ことを汚染標識が示すと、場合によっては、受け取った命令を636において実行することができ、値がロードされる。場合によっては、ロードされる値のメモリ部分が汚染されていないことが示されると、ロードされる値によって示される命令のロケーションを628において割り出すことができ、その命令を保存するメモリ部分が汚染されているか否かを判定するために630において検査することができる。命令を保存するロケーションが汚染されている場合、626において適切な処置を講じることができる。ロケーションが汚染されていないことが示されると、他の検出技術を用いて命令および/またはデータをさらに検査して、634においてワームやウイルスなどの存在を検出することができる。ロードされる値のストレージロケーションおよびその値によって示される命令が汚染されていないことを汚染標識が示した場合、636においてその命令を実行することができる。
操作されるデータが「汚染されている」ことを汚染標識が示した場合、626において適切な処置を講じることができる。前述のように、ワームの検出に対応する適切な処置は、脆弱なプログラムを停止すること、ホストシステムを停止すること、警報メッセージを作成して送信すること、脆弱性用のパッチおよび/またはフィルタを作成することなどを含むことができる。
自己認証式警報(「SCA」)
場合によっては、単一のノードは、それ自体を保護するための検出モジュールを含むことができる。しかしワームの検出は、計算負荷の高いプロセスとなる場合がある。したがって場合によっては、図2に示されているネットワークなどのネットワークの1つまたは複数のノードは、ワーム、脆弱性、および/または攻撃を検出することができ、ネットワーク内の1つまたは複数のノードに警報を与えることができる。中心となるノードが多くの他のノードを代表してワームを検出する場合、この検出システムはサーバ中心となることができる。このようにして、ワームを検出する負荷は、専用のシステムによって負担することができる。あるいはネットワーク内のノードのすべてまたはサブセットが、脆弱性の検出を担当することもでき、この場合、検出システムはホスト中心となることができる。脆弱性を検出するネットワーク内のノードのセットは、固定することもでき、あるいは時間の経過と共に変更することもでき、任意の時点で参加することも離脱することもできる。サーバ中心の検出システムとホスト中心の検出システムを組み合わせることによって、ネットワークの様々なノードの間に様々な検出システムを実装することができ、検出の結果を相互におよび/またはネットワーク内の他のノードに伝達することができる。
検出メカニズムがワームの攻撃を検出するたびに、ソフトウェアプログラムの脆弱性および/または識別されたワームの特徴(例えばメッセージソースなど)を特定する警報を作成することができる。例えばこの警報は、受信データとしてのワームの特徴を介して(ワーム中心)、および/またはワームによって悪用される可能性のあるソフトウェアアプリケーションの脆弱性を介して(脆弱性中心)、ワームを識別することができる。警報の作成は、自動または手動とすることができ、検出された脆弱性および/またはワームに応じて行うこともできる。警報は、図3に示されているように、検出モジュール340からの入力に応答して警報モジュール350を介するなどして、任意の適切な方法で作成することができる。
場合によっては、警報は、受信側のシステムが警報メッセージの作成元および/または内容の信頼性を認証できるように作成することができる。警報の作成元を認証するために、その警報に電子署名して、その警報が信頼できるソースから来たものであることを識別できる場合とできない場合がある。警報内に示されているプログラムの脆弱性を認証するために、警報は、その脆弱性がどのように誘発されるかを記述したイベントのリストおよび/またはプログラムパスなどを含むことができる。一例では、自己認証式警報は、ソフトウェアの脆弱性を識別および/または記述する機械で検証できる証明を含むことができる。このように、自己認証式警報は、受信者が感染プロセスを再現することによって警報における脆弱性の申し立ての信頼性を効率的および/または効果的にチェックできるようにする情報を含むことができる。自己認証式警報は、テキストの記述、脆弱性を示す非決定性のイベントの完全なおよび/または部分的なログ、参照によって本明細書に組み込まれるNecula et al., "Safe Kernel Extensions without Runtime Checking," 2nd Symp. On Operation System Design and Implementation, Oct. 1996, pp. 229-243(非特許文献1)によって説明されている証明を搬送するコードを含めることなどを介して、任意の適切な方法でソフトウェアシステム内の脆弱性について記述することができる。例えば非決定性のイベントのログは、受信したデータを含むことができ、検出された攻撃の瞬間までのイベント、例えば汚染されたメモリ部分に保存されているデータの実行および/または汚染されたメモリ部分からデータをプログラムカウンタへロードすることを示すことができる。
ソフトウェアの脆弱性に関する記述を使用して、警報を自己認証することができる。これは、識別されたソフトウェアアプリケーションが、ワームの攻撃に対するソフトウェアの脆弱性を示す指摘された方法で対応することを受信側コンピューティングデバイスが検証できるためである。このように、この警報は、その警報内に含まれる情報および受信側のノードに知られている情報に基づいて(例えば、ローカルアプリケーションの対応の検証を介して)認証できるため、自己認証することができる。このように自己認証式警報は、脆弱性中心ではなく、ワーム中心とすることができる。
検出されたプログラムの脆弱性については、非決定性のイベントのリストとして自己認証式警報内で記述することができる。より詳細には、脆弱なプログラムの実行は、区分的な決定性のプロセスとしてモデル化することができる。実行とは、インターバルのシーケンスであり、各インターバルは非決定性のイベント(例えばメッセージの受信)から始まり、決定性のイベントのシーケンスが後に続く。インターバル内の実行は決定性であり、例えばプログラムの対応は、現在の状態によって完全に決定される。このように、非決定性のイベントをすべて記録することによって、実行を再現できるようになり、これによってプログラムの脆弱性を示すことができる。識別されたプログラムの脆弱な動作を示す実行を再現することによって、ノードは自己認証式警報の信頼性をチェックできるようになる。
図7は、脆弱性中心である自己認証式警報の一例700を示している。自己認証式警報は、任意の適切なフォーマットおよび/または任意の適切なメッセージプロトコルに基づくことができる。自己認証式警報は、プログラム識別子702およびイベントリスト704を含むことができ、脆弱性タイプ識別子706、1つまたは複数の検証ヒント708、および/または対応標識710を任意選択で含むことができる。
プログラム識別子702は、検出された脆弱性を有するプログラムまたはアプリケーションを識別することができる。プログラム識別子702は、製品名、事前に設定された名前、バージョン番号、製造業者名など、脆弱なプログラムの任意の適切な識別子の任意の1つまたは複数を含むことができる。
イベントリスト704は、実行されるとプログラムを不許可の状態にする1つまたは複数の非決定性のイベントのシーケンスである。イベントリストを再現することによって、検出されたプログラムの脆弱性を説明および/または指摘することができる。イベントリスト702内のイベントのシーケンスは、任意の適切な方法で作成することができる。ともに参照によって本明細書に組み込まれているDunlap et al., "Revirt: enabling intrusion analysis through virtual-machine logging and replay," Operating Syst. Design and Implementation, Boston, Massachusetts, December 2002(非特許文献2)およびElnozahy et al., "A survey of rollback-recovery protocols in message passing systems," ACM Computing Surveys, vol. 32, no. 3, September 2002, pp. 375-408(非特許文献3)によって説明されている技術など、非決定性のイベントを記録する技術は、フォルトトレランスに関する文献においてさらに説明されている。
イベントのシーケンスは、前述の動的フロー検出技術の間に記録されるイベントなど、検出プロセスの間に記録されるイベントを含むか、またはそうしたイベントから得ることができる。イベントリスト内のイベントのシーケンスは、図3の検出モジュール340によって記録されるイベントなど、攻撃の間に実際に記録されるイベントと一致する場合もあり、一致しない場合もある。自己認証式警報を作成するノードは、不許可の状態に達する上で不要なイベントを削除することや、ワームコードの部分を無害な値に置き換えることなどを含む任意の適切な方法で、記録されたイベントを修正することができる。イベントリスト702内の非決定性のイベントのシーケンスは、任意の適切なフォーマットを取り、および/または任意の適切な命令または他のデータを含むことができる。例えばイベントリストは、オペレーティングシステムコールからの結果のリストおよび/または受信したメッセージのリストを含むことができる。ワームは、脆弱なプログラムとの長い対話を必要としない脆弱性を悪用できるため、非決定性のイベントのシーケンスは非常に短くなる場合がある。より詳細には、脆弱な動作は少量のデータで誘発することができる。例えば、これまでの多くのワームにとっては、1つの受信イベントだけで十分な場合もある。
動的フロー分析を使用してワームを検出するために、検出モジュール340は、ワームが支配権を握る前に実行を阻止する。具体的には、実行の制御が不正なロケーションへリダイレクトされつつあるとき、例えば汚染されたメモリ部分からデータが実行されつつあるとき、または命令ポインタへロードされつつあるときにワームの攻撃を検出することができる。警報内のイベントリストのサイズを制限するために、もしも検出が介在しなかったならば実行されていたかまたはプログラムカウンタへロードされていたであろう汚染されたメモリ部分に保存されているデータを含むイベントを探して、非決定性のイベントのログを検索することができる。多くの場合、脆弱性は1つのイベントだけで誘発することができ、自己認証式警報は、この検索結果のイベントのみを含むことができる。一例では、汚染されているデータ、例えば不正なアドレスを探して、完全なログを検索することができる。別の例では、検出モジュールの検出メカニズムを参照して前述したデータフロー分析を使用して、検索を回避し、誤った一致の発生を減らすことができる。動的フロー分析は、すべての入力イベントから追跡監視する完全なデータフローを提供できるため、実行されつつあったかまたはプログラムカウンタへロードされつつあった汚染されたデータの値を決定する1つまたは複数の正確な入力イベントを割り出すことができる。例えばデータフローの追跡監視によって、ワームの攻撃において使用される情報を持ち込む外部ソースからの特定のメッセージ、脆弱性を悪用できる(1つまたは複数の)入力イベント、ならびに/あるいは入力データ内のデータおよび/または命令のオフセットを識別することができる。
入力イベントを割り出すために、入力イベント識別子を汚染されたメモリ部分に保存されているデータに関連付けて、汚染されているデータの現在の値を決定する入力イベントを示すことができる。入力イベント識別子は、汚染標識に追加することもでき、および/または汚染標識内に含むこともできる。入力イベント識別子は、汚染されているメモリ部分および/または汚染されているデータのソースから整数やテキスト文字列などのデータをロードする入力イベントを識別する任意の適切な識別子とすることができる。一例では、汚染標識は、汚染されているデータのソースを識別する入力イベント識別子を含む。より詳細には、汚染されていないことを示す汚染標識は、空値や0などの任意の適切な値とすることができる。しかし場合によっては、汚染されているメモリ部分を示すのに「1」などの整数を用いるのではなく、汚染されているメモリ部分を示す汚染標識は、入力イベント標識または他のソース標識とすることができる。あるいは汚染標識は、汚染されたメモリ部分に保存されている現在の値を決定する入力イベントまたはそれらのイベント内のバイト範囲を割り出すための図18に示されているようなデータフローグラフを含むことができる。データフロー分析によって脆弱性が示されると、実行されつつあるかまたはプログラムカウンタへロードされつつある汚染されたデータのデータフローグラフ内の識別子を有するイベントと、実行ログ内の最後の非決定性のイベントとを使用して、警報内のイベントリストを作成することができる。
脆弱な実行を再現するのに必要な非決定性のイベントのシーケンスのサイズを小さくすることに加えて、またはその代替として、イベントログの添え字が徐々に大きくなる警報のイベントリストの作成中に実行を再現すること(例えば、ログ内をさかのぼること)ができ、エラー状態がないかそれぞれの繰り返しをチェックすることができる。このようにして、イベントのリストを元のイベントから絞り込み、脆弱性の検出へと至ることができる。ネットワーク接続を介して受信される最後の数パケットによって脆弱性が誘発されることがあるため、この戦略は現在の大半のワームに対して効果を上げることができる。
脆弱性タイプ識別子706は、指摘されたプログラム内に存在して悪用される可能性のあるプログラムの脆弱性やエラー状態のタイプを識別および/または記述することができる。脆弱性タイプ識別子は、許容できないエラー状態をもたらす指摘されたプログラムの事前に設定された脆弱性を示す英数字のテキスト文字列などの任意の適切な識別子とすることができる。エラー状態の記述および/または許容可能性については、警報の作成者と受信者の間で合意し、事前に設定することができる。さらに自己認証式警報の受信側のノードは、実行のどの状態または結果が脆弱性を表すかについて合意することができる。脆弱性のタイプに関する合意は、演繹的なものとすること、例えば事前に設定することができ、あるいは動的なものとすること、例えばワームの検出時および/または警報の受信時に決定することもできる。脆弱性タイプ識別子によって識別される脆弱性のタイプは、プログラムまたはアプリケーションの任意の適切な脆弱性とすることができる。脆弱性を表すものとして演繹的に合意できる多くの異なるタイプの状態がある。脆弱性のタイプの一例として、任意実行制御(「AEC」)を挙げることができる。AECの警報は、ワームが実行をプログラムのアドレス空間内におけるコードの任意の断片へリダイレクトできるようにする脆弱性を識別する。この警報は、脆弱なプログラムへの入力内でアドレスが提供されるコードの断片をどのように呼び出すかについて記述する。脆弱性のタイプの別の例としては、任意コード実行(ACE)を挙げることができる。ACEの警報は、コード注入の脆弱性について記述する。この警報は、脆弱なプログラムへの入力内で提供されるコードの任意の断片をどのように実行するかについて記述する。脆弱性のタイプの別の例としては、任意関数引数(AFA)を挙げることができる。AFAの警報は、ワームが重要な関数に対する引数の値を変更できるようにする、例えばプロセスを作成するシステムコールを呼び出す際に実行する実行ファイルの名前を変更できるようにするデータ投入の脆弱性を識別する。この警報は、脆弱なプログラムへの入力内で提供される引数の値を有する指定された重要な関数をどのように呼び出すかについて記述する。
(1つまたは複数の)検証ヒント708は、示されたイベントのリストを再現した後に指摘された状態または脆弱性が真実であることのチェックを容易にすることができる任意の適切な情報を含むことができる。
対応標識710は、プログラムの脆弱性に対する適切な対応を容易にすることができる任意の適切な情報を含むことができる。例えば対応標識は、パッチによって脆弱性を解消できること、フィルタを作成して、脆弱性が悪用される可能性を検出できること、識別されたワームを含むメッセージを受信したことを検出するためのフィルタ、パッチ/フィルタを実装する実際のコードなどを示すことができる。
一例では、脆弱性中心の自己認証式警報は、プログラムが任意実行制御(AEC)の脆弱性を有していることを示すことができる。ワームの攻撃は、脆弱なプログラムの実行のフローを任意に変更する能力に基づくことができるため、AECの脆弱性のタイプの標識によって脆弱性を示すことができる。プログラムにメッセージを送信することによってプログラムカウンタを任意のロケーションへリダイレクトする能力を提供することはまれであり、危険であるため、ホストは、この状態が脆弱性を表していることに合意することができる。このタイプの脆弱性について、検証ヒントは、プログラムカウンタ(例えば、EIP on x86 CPUs)へ任意の値をロードするよう指定することができ、プログラムカウンタへロードされる値が非決定性イベントのリスト内のどこにあるかを指定することができる。例えば非決定性のイベントのリストが、受信されたメッセージのリストである場合、検証ヒントは、プログラムカウンタへロードされる値がどのメッセージ内にあるか、またどのオフセットにあるかを指定することができる。このメッセージおよびオフセットは、前述の技術を使用して決定することができる。
別の例では、脆弱性中心の自己認証式警報は、プログラムが任意コード実行(ACE)の脆弱性を有していることを示すことができる。ワームの攻撃は、脆弱なプログラムへコードを注入する能力に基づくことができるため、ACEの脆弱性のタイプの標識によって脆弱性を示すことができる。プログラムにメッセージを送信することによってプログラムへ新たなコードを注入する能力を提供することはまれであり、危険であるため、ホストは、この状態が脆弱性を表していることに合意することができる。このタイプの脆弱性について、検証ヒントは、新たなコードが注入され実行されるよう指定することができ、実行されるコードが非決定性イベントのリスト内のどこにあるかを指定することができる。例えば非決定性のイベントのリストが、受信されたメッセージのリストである場合、検証ヒントは、注入され実行されるコードがどのメッセージ内にあるか、またどのオフセットにあるかを指定することができる。このメッセージおよびオフセットは、前述の技術を使用して決定することができる。
別の例では、脆弱性中心の自己認証式警報は、プログラムが任意関数引数(AFA)の脆弱性を有していることを示すことができる。ワームの攻撃は、関数の引数として使用される値を投入する能力に基づくことができるため、AFAの脆弱性のタイプの標識によって脆弱性を示すことができる。プログラムにメッセージを送信することによって、プログラムによって使用されるシステムコールへ任意の新たな引数を投入する能力を提供することはまれであり、危険であるため、ホストは、この状態が脆弱性を表していることに合意することができる。このタイプの脆弱性について、検証ヒントは、任意の関数の引数が投入され実行されるよう指定することができ、投入される引数が非決定性イベントのリスト内のどこにあるかを指定することができる。例えば非決定性のイベントのリストが、受信されたメッセージのリストである場合、検証ヒントは、投入される引数がどのメッセージ内にあるか、またどのオフセットにあるかを指定することができる。このメッセージおよびオフセットは、前述の技術を使用して決定することができる。
自己認証式警報の代替形態は、Necula et al., "Safe Kernel Extensions without Runtime Checking," 2nd Symp. On Operation System Design and Implementation, Oct. 1996, pp. 229-243(非特許文献1)の証明を搬送するコードに類似した、プログラムが脆弱である旨の証明を含むことができる。最も簡単な形態では、この証明は、命令のシーケンスの形態などで、不許可の状態へ至る実行パスの記述を含むことができる。この形態の警報は、これまでの警報とは異なり、非決定性のイベントのリストのみを有するのではなく、プログラム命令のシーケンスを搬送し、また論理公式を搬送して、後述の検証メカニズムを容易にすることもできる。
警報を作成するノードは、その警報を少なくとも1つの他のノードに送信して、検出されたワームまたは脆弱性を知らせることができる。警報の配信は、図3に示されているように、警報モジュール350に応答して配信モジュール370を介して決定することができる。ノードは、通信媒体を介して任意の適切なメッセージフォーマットまたはプロトコルで警報を送信することができる。警報は、警報を作成するノードと通信状態にある任意の適切なノードへ配信することができる。ノードは、警報を受信すると、自分と通信状態にある任意の適切なノードへその警報を配信することもできる。例えば警報は、所定の警報アドレスリストに従ってすべてのノードへ、作成側のノードと最近連絡を取ったすべてのノードへ、または他の任意の適切な配信スキームに従って送信することができる。1つの配信スキームについて、以降でさらに詳しく論じる。
自己認証式警報の認証
図7の自己認証式警報700などの自己認証式警報は、その警報を受信するノードによって自己認証することができる。例えば図3に示されているように、受信側ノード320の警報検証モジュール360は、受信した警報330を認証することができる。一例では、受信側ノードは、警報を解析して、プログラム識別子およびイベントリスト、ならびに脆弱性標識および1つまたは複数の検証ヒントなどの他の任意のパラメータを検索することができる。受信側ノードは、示されたプログラム内のイベントリストによって定義されている実行を再現することができる。プログラム内のイベントを何らかのタイプのサンドボックス環境において再現することなど、任意の適切な技術を使用して、イベントリストを再現することができる。イベントリストを再現した結果は、受信側ノードによって検査し、プログラムの脆弱性を検証することができ、提供される脆弱性タイプ識別子および/あるいは(1つまたは複数の)検証ヒントによって補強し、指摘されたエラーまたは脆弱性の状態が存在するかどうかを判定することができる。存在しない場合、警報は認証されず、そのメッセージを破棄することや、誤った警報であることを特定する警報を他のノードに送信することなど、適切な処置を講じることができる。
イベントリストは、そのまま実行するのではなく、一次論理を使用して認証することができる。例えば自己認証式警報内に含まれる証明は、証明を搬送するコードの仕組みに類似した方法で検証することができる。しかし自己認証式警報を認証することは、プログラムのすべての実行が安全性条件を順守していることを示すのではなく、プログラムの1回の特定の実行が脆弱性を呈することを示すことができる。自己認証式警報を認証することは、プログラム全体について検討するのではなく、1つまたは複数の識別された実行パス、例えばイベントリスト内の非決定性イベントのシーケンスによって定義されたパスに焦点を絞ることができる。簡単な形態では、自己認証式警報内の証明は、イベントのリストによって定義されたパスにおいて実行される命令のリストを含むことができる。このように、論理的な検証によって、脆弱なプログラム内の識別されたパス用の安全性条件を作成し、プログラムが自己認証式警報によって提供されるイベントリスト内のイベントを受信した場合はその安全性条件が当てはまらないことを示すことができる。
例えば前述したAECの自己認証式警報では、示されたプログラムの脆弱な実行パスは、1つのメッセージを受信しただけでトリガすることができ、この自己認証式警報は、そのパス内の命令のリストを含むことができる。この警報を認証するために、プログラムテキストを使用して、安全性条件を決定し、イベントリスト内のイベントがこの条件に違反していないか検証することなどによって、命令のリストをチェックすることができる。その実行パス用のプログラムの命令から論理安全性条件を作成することができる。実行パス用の安全性条件を得るために、安全なプログラムの実行をシミュレートする抽象計算機を定義することができる。この抽象計算機用の命令は、脆弱なプログラムによって作成される実際のCPU用の命令に類似したものとすることができる。
図9は、x86 CPUの命令のサブセット用の抽象計算機の一例900を示している。図9では、ΠはCPUの命令のベクトル(例えば、自己認証式警報内の命令のリスト)を表し、pcはプログラムカウンタを表し、Πpcは現在の命令を表し、ρはマシンのレジスタおよびメモリの状態を表し、ρ[ri]は状態ρにおけるレジスタrの値であり(またriと短縮することができ)、rmは、メモリの状態を示す特殊レジスタを表し、ρ[rd←rs]は、rdの値をrsの値に置き換えることによってρから得られる新たな状態を表し、sel(rm,n)はメモリアドレスnの内容を表し、upd(rm,rd,rs)は、レジスタrsをレジスタrdへ書き込んだ結果として生じる新たなメモリの状態を表し、ZFはゼロフラグ(例えば1ビットのメモリ)を表している。
この抽象計算機の例900は、戻り命令(RET)を実行しているときに、スタックポインタレジスタ(ESP)によって指されたメモリ位置がワームを含んでいないことをチェックする。図9に示されているような抽象計算機の定義から、プログラム用の安全性条件を機械的に作成するためのルールのセットを得ることができる。図10は、図9の抽象計算機に対応するルールのセットの一例1000を示している。このルール1000は、安全性条件パラメータSCpc+11004の点から安全性条件パラメータSCpc1002を指定する。このように、最後の命令から開始して、先頭に至るまで前の命令を1つずつ処理し、その間に、命令のリストが、プログラムテキストを与えられた有効な実行を表していることをチェックすることによって、プログラムの安全性条件を得ることができる。より詳細には、まず最後の命令を検査し、次いで最後の2つの命令を検査し、といった具合に行うことができる。
前提条件を定義することができる。より詳細には、この前提条件は、レジスタおよび/またはメモリの状態など、脆弱な実行パスの開始時におけるプログラムの初期状態を反映することができる。脆弱性の述部を定義することができる。例えば脆弱性の述部は、Precondition⇒¬Safety Conditionとして定義することができる。そして脆弱性の述部は、一次述語論理のルールに従って証明することができる。
例えば自己認証式警報のイベントリストによって提供される命令の脆弱なシーケンスは、図11に示されている命令1100として定義することができる。図10のルール1000を使用して、安全性条件SafetyConditionを次のように定義することができる。
(ECX=10⇒¬Worm(sel(rm,ESP)))∧(ECX≠10⇒¬Worm(sel(rm,1234)) (1)
このように、警報のイベントリスト1100によって識別された実行パスの開始時には、ECXレジスタの値は10とは異なり、メモリ位置1234は、ネットワークの入力オペレーションによって書き込まれたばかりである(したがって「汚染されている」とみなされ、ワームを含む可能性がある)。上記の方程式(1)によって与えられる安全性条件から、次のように前提条件を定義することができる。
(ECX≠10∧Worm(sel(rm,1234)) (2)
方程式(1)の安全性条件および方程式(2)の前提条件から、脆弱性の述部を作成し、証明することができる。脆弱性を証明することによって、イベントリスト内で示された脆弱性の存在を検証することができ、これによって警報を認証することができる。メモリロケーション1234は必ずしもワームを含むとは限らないことを理解されたい。例えば外部からの入力オペレーションによってプログラムの実行を任意に変更できるという事実は、脆弱性がまだ悪用されていないとしても、そのプログラムが攻撃に対して脆弱であることを意味することができる。
図16は、自己認証式警報を作成する方法の一例1600を示しており、図8は、自己認証式警報を認証する方法の一例800を示している。図16を参照すると、802において、検出モジュール340などによってプログラムの脆弱性を検出することができる。804では、脆弱なプログラム用のプログラム識別子を決定することができる。806では、脆弱性のタイプを決定することができ、適切な脆弱性標識が選択される。808では、機械で検証できる脆弱性の証明を提供するイベントリスト808を決定することができる。前述のように、イベントリストは、動的データフロー分析を実施する検出プロセスの間に記録されたイベントから得ることができる。またイベントリストは、検出中に記録されたイベントから削減するかまたは絞り込み、指摘された脆弱性を示す最小のまたは絞り込まれたイベントのセットを確定することや、データフローグラフから導き出すこと、修正して一部を無害な値に置き換えることなどもできる。810では、決定されたイベントリストおよび/または脆弱性標識に基づいて、1つまたは複数の検証ヒントを決定することができる。場合によっては、812において、例えばパッチおよび/またはフィルタ、パッチおよび/またはフィルタを実装するための実際のコード、ワームの署名など、ワームに対する潜在的な解決策に関するヒントを含むことができる対応標識を決定することができる。814では、任意の適切なプロトコルに従って任意の適切なフォーマットで自己認証式メッセージを形成することができる。816では、通信媒体などを介してネットワーク内の別のノードへ警報を送信することができる。前述のように、配信モジュール370を使用して、自己認証式警報用の受信側ノードを決定することができる。
図8を参照すると、850において、通信媒体などを介して受信側ノードが自己認証式警報を受信することができる。852では、図3の警報検証モジュール360などによって警報を解析して、プログラム識別子およびイベントリストを割り出すことができる。854では、プログラム識別子を受信側ノード上に存在するプログラムと比較することができる。プログラム識別子が受信側ノード内に存在しない場合は、856において適切な処置を講じることができる。例えば適切な処置は、その警報を破棄すること、および/またはその警報を別のノードへ転送して、その警報を通信ネットワーク内でさらに配信することを含むことができる。
プログラム識別子が受信側ノードのプログラムまたはアプリケーションを示している場合、受信側ノードは、858において図3の警報検証モジュール360などを介して、示されたプログラムをロードすることができる。場合によっては、このプログラムは、停止中のプロセスにロードすることができる。場合によっては、このプログラムは、アクション、他者との接触、および/または指摘された脆弱性の他の副次的な悪影響を制限する「サンドボックス」環境へロードすることができる。バーチャルマシンは、警報の検証を行うことができるサンドボックス環境を提供することができる。他のサンドボックス環境は、実行中のプログラムからのすべての出力を黙って破棄し、副次的な影響を抑えることができる。場合によっては、受信側ノードは、隔離されたおよび/またはテスト中のデバイスなどの別のコンピューティングデバイスに対して、示されたプログラムをロードするよう、および/または自己認証式警報を認証するよう指示することができる。
860では、停止中のプロセスのアドレス空間に検証関数をロードすることができる。検証関数は、示されたプログラムによって呼び出された場合、成功標識を返すことができ、あるいは対応モジュールを呼び出すことができる。成功標識は、視覚または聴覚信号を含めること、指定された値を有するプログラムを終了すること、値をネットワークインターフェースに書き込むこと、同期オブジェクトに信号を送信することなどを行う検証関数の実行を示す任意の適切な標識とすることができる。検証関数の構造は、イベントリストによって示される脆弱性のタイプに依存することができる。このように、脆弱性標識および/または検証ヒントを自己認証式警報から解析し、適切な検証関数を選択および/または作成するために使用することができる。
862では、ロードされたプログラムを使用してイベントリストを再現することができる。イベントリストが実行される際、検証関数を呼び出すことができ、これは、示されたプログラム内の脆弱性の存在を指摘することができる。例えばAECを示す脆弱性標識については、自己認証式警報内のヒントは、プログラムカウンタへロードされるアドレスのイベントおよび/またはそのイベント内のオフセットを示すことができる。検証関数がロードされたアドレスは、そのイベントおよび/またはオフセットに配置することができる。このように、イベントリストの再現中に864において検証関数が実行された場合、脆弱性が実証され、警報は認証されたとみなすことができる。このように、受信側ノードは866において、脆弱なプログラムを停止すること、および/または脆弱性を解消するために適切なパッチおよび/またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。警報が認証されなかった場合、例えば検証関数が実行されなかった場合は、856において、メッセージを破棄すること、および/または無効な警報である旨を(1つまたは複数の)他のノードに知らせることなど、適切な処置を講じることができる。
別の例では、ACEの警報を示す脆弱性標識について、自己認証式警報内のヒントは、ターゲットのプログラムによって注入され実行されるコードのイベントおよび/またはそのイベント内のオフセットを示すことができる。「検証呼び出し」命令のシーケンス、すなわち検証関数を呼び出すようターゲットのCPUに指示するそのCPUの命令のシーケンスは、そのイベントおよび/またはオフセットに配置することができる。このように、イベントリストの再現中に864において検証関数が実行された場合、脆弱性が実証され、警報は認証されたとみなすことができる。このように、受信側ノードは866において、脆弱なプログラムを停止すること、および/または脆弱性を解消するために適切なパッチおよび/またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。警報が認証されなかった場合、例えば検証関数が実行されなかった場合は、856において、メッセージを破棄すること、および/または無効な警報である旨を(1つまたは複数の)他のノードに知らせることなど、適切な処置を講じることができる。
別の例では、AFAの警報を示す脆弱性標識について、自己認証式警報内のヒントは、ターゲットのプログラムの関数へ渡される任意の引数のイベントおよび/またはそのイベント内のオフセットを示すことができる。任意の引数は、そのイベントおよび/またはオフセットに配置することができ、検証者は、提供される任意の引数の値を、非決定性のイベントの再現中に関数の呼び出しにおいて使用される実際の引数の値と比較してチェックするラッパ(wrapper)と共に、AFAの警報内で識別された重要な関数を装備することができる。このラッパは、それらの値が一致した場合に検証関数を呼び出す。このように、イベントリストの再現中に864において検証関数が実行された場合、脆弱性が実証され、警報は認証されたとみなすことができる。このように、受信側ノードは866において、脆弱なプログラムを停止すること、および/または脆弱性を解消するために適切なパッチおよび/またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。警報が認証されなかった場合、例えば検証関数が実行されなかった場合は、856において、メッセージを破棄すること、および/または無効な警報である旨を(1つまたは複数の)他のノードに知らせることなど、適切な処置を講じることができる。
前述したように、イベントリストは、そのまま実行するのではなく、一次論理を使用して認証することができる。図8の方法を参照すると、872において、イベントリストによって示された実行パス用のプログラムの命令から論理安全性条件を作成することができる。安全性条件は、安全なプログラムの実行をシミュレートした抽象計算機を定義することなどによって、任意の適切な方法で作成することができる。874では、前提条件を定義することができ、この前提条件は、脆弱な実行パスの開始時におけるプログラムの初期状態を反映することができる。876では、脆弱性の述部を定義することができ、次いでこの脆弱性の述部は、878において一次述語論理のルールに従って証明することができる。述部が証明された場合は、866において、脆弱なプログラムを停止すること、および/または脆弱性を解消するために適切なパッチおよび/またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。述部が証明されなかった場合は、856において、メッセージを破棄すること、および/または無効な警報である旨を(1つまたは複数の)他のノードに知らせることなど、適切な処置を講じることができる。
対応
示された脆弱性が実行結果によって実際に確認された場合、認証されたプログラム内の脆弱性に対応して、適切な処置を講じることができる。コンピューティングデバイスの対応は、システム管理者や図3の対応モジュール380によって手動で指示される対応などを含む任意の適切な方法によって、手動および/または自動で実行することができる。例えばプログラムをオフラインにすることができ、および/または他の対応策を講じることもできる。対応策は、イベントリストおよび/または脆弱性タイプ標識ならびに/あるいは検証ヒントに基づいてパッチおよび/またはフィルタを作成することを含むことができる。このように、自己認証式警報内の情報を使用して、アプリケーションを停止せずに、感染を防ぐためのパッチおよび/またはフィルタを手動および/または自動で作成することができる。さらに、作成されたパッチ/フィルタは、図7の対応標識710内など、受信側ノードが使用するための自己認証式警報内に含むことができる。
自己認証式警報のイベントリストおよび/または検証ヒントを使用して、脆弱性を修復する脆弱なプログラム用のバイナリ修正(例えばパッチ)を自動的に作成することができる。
例えば感染がデータ構造の上書きを含んでいるならば、これを防止する特別なチェックを実行するコードを作成することができる。例えば上書きがバッファのオーバーフローまたはアンダーフローに起因しているのであれば、上書きを防止するためのアレイバウンズチェッキングコードを作成することができる。そして作成されたコードを脆弱なプログラムに適用することができる。別の例では、上書きされたデータ構造のコピーを別途保存し、オリジナルのデータ構造を使用し、実行に先立ってオリジナルのデータ構造へアクセスする前に必ずそのコピーのデータ構造とオリジナルのデータ構造を比較することによって、動的なパッチを作成することができる。別の例では、ループ内の境界条件を別の条件に(例えばループ本体が実行される回数が必ず少なくなるようにする条件に)置き換えることができる。
ワームを搬送するソースメッセージ内の十分に一意の英数字の文字列、および/または特定の長さを有するメッセージに基づいてワーム固有のフィルタを作成することができる。
多形性のワームを検出できる脆弱性固有のフィルタを作成することができる。一例では、ネットワークスタックの上にフィルタをインストールすることができる。脆弱性固有のフィルタは、アプリケーションの状態を使用して、受信トラフィックをいつ中断するかを決定することができる。より詳細には、フィルタの一般条件は、自己認証式警報のイベントリスト内に記載されている実行パスを分析することによって、また感染へと至る実行パスを受信メッセージ内のどのバイトが決定するのか、それらのバイト上のどの条件が実行パス内でテストされるのかをチェックすることによって、作成することができる。これらの脆弱性固有のフィルタは、プログラムカウンタへロードされるかまたはワームによって実行される汚染されたデータが書き込まれるまでに、動的フロー分析に類似したメカニズムを使用して作成することができる。
一例では、動的データフロー分析を使用して脆弱性中心のフィルタを作成する対応モジュールは、メモリロケーションおよび/またはレジスタなどの汚染されているそれぞれのメモリ部分ごとにデータフローグラフを保持することができる。また対応モジュールは、それぞれのCPUフラグごとにデータフローグラフを保持することもできる。それぞれのデータフローグラフは、メッセージまたは他の外部情報源における値から汚染されているメモリロケーションにおける値を計算するために使用された命令のシーケンスの全体または関連する部分を含むことができる。対応モジュールは、制御フロー分析を使用して、制御移行命令の実行後に命令ポインタの値を決定するすべての条件と、また条件付きの移動およびセット命令の実行時に使用される条件とを追跡監視することができる。これらの条件を結び付けたものをフィルタ条件と呼ぶことがある。フィルタ条件は、最初は真であり、汚染されているプロセッサフラグを使用するか、または汚染されているロケーションから読み取ったアドレスへ制御を移行するすべての命令の後で更新することができる。フィルタ条件は、汚染されているフラグおよびアドレスロケーションのデータフローグラフによって計算された式上でその古い値と適切な条件を結び付けたものへと更新される。例えばJZ EAX(ゼロフラグが設定された場合は、EAXレジスタ内に保存されているアドレスへジャンプする)が実行され、ジャンプが行われたときに、ゼロフラグとEAXレジスタが両方とも汚染されていないならば、フィルタ条件はそのまま変更されない。ゼロフラグが汚染されている場合は、ゼロフラグのデータフローグラフによって計算された式は偽であるという条件を追加する。EAXも汚染されている場合は、EAXのデータフローグラフによって計算された式は、EAXによってその時点で保存されている値に等しいという条件も追加する。ジャンプが行われない場合は、ゼロフラグのデータフローグラフによって計算された式は真であるという条件を追加し、EAXのデータフローグラフに関する条件は追加しない。このプロシージャが完了すれば、フィルタ条件を受信メッセージに適用して、ワームまたは同一の脆弱性を悪用するそのワームの変種を遮断することができる。このように、フィルタ条件によって偽陽性の発生を減らすことができる。
図15に示されている脆弱なコードの例を使用して、フィルタの作成について説明することができる。図15のコード1500は、ネットワークバッファ内のメッセージの最初のバイトを定数(0×31)と比較することによって開始する。これが一致する場合、ネットワークバッファ内のバイトは、ゼロバイトが見つかるまで、スタックベースのバッファにコピーされる。これは、スタック上の返信用アドレスを上書きする可能性のある潜在的なバッファオーバーフローであり、文字列ライブラリ内の脆弱性を表している。この脆弱性用のフィルタは、前述の動的データフロー分析を実行することによって作成することができる。例えば図15の命令の例のうち最初の4つの命令1502を実行すると、動的データフロー分析を実施する検出モジュールは、メッセージ内の最初のバイトは0×31に等しくなるべきであるという条件を決定することができる。同様に、ループを実行すると、ネットワークバッファ内のバイトのシーケンスはゼロとは異なるという条件が得られる。これらの条件を有するフィルタを受信メッセージに適用すれば、偽陽性が生じることはなく、この脆弱性を悪用するワームの変種を実質的にすべて遮断することができる。複数のさらなるメカニズムを使用して、フィルタ条件を精密にすることもできる。一例では、対応モジュールは、SCA内の検証ヒントによって識別されたオフセットの後に現れるメッセージバイト上の条件を削除する。メッセージ内のバイトは通常は順を追って処理されるため、このヒューリステックによって偽陽性が生じる可能性はほとんどない。別の例では、対応モジュールは、関数が戻ったときに、その関数の実行によって追加された条件を削除する。その関数が戻った後は、通常これらの条件は重要ではなく、その関数の重要な効果は、汚染されているデータのデータフローグラフに取り込まれていることが、その理論的根拠である。
作成されるパッチまたはフィルタは、図3の対応モジュール380などを介して、警報メッセージを受信および認証する任意のマシンによって独自に作成することができる。別の例では、作成されたパッチまたはフィルタを警報メッセージ内に含めることができ、そのパッチまたはフィルタは、受信側ノードによって任意の適切な方法で認証または実証することができる。図7に示されているように、自己認証式警報は対応標識710を含むこともでき、この対応標識710は、検証された脆弱性および/またはワームの攻撃に対する適切な対応を含むことができる。例えば対応標識は、適切なパッチおよび/またはフィルタの記述またはヒントや、適切なパッチおよび/またはフィルタを実装するコードなどを提供することができる。
警報の配信
脆弱性を検出したノードは、その検出したノードと通信状態にあるネットワーク内の1つまたは複数のノードに警報を送信することができる。例えば通信ネットワークのノードの一部は、脆弱性および/またはワームの検出モジュールを実行することができ、この検出モジュールは、検出の負荷を分散すること、ならびにワームにとって中心となるターゲットを除去することを促進することができる。前述のように、検出モジュールは様々な検出メカニズムを含むことができ、そうした検出メカニズムには、簡単なものもあり、複雑なものもある。ネットワークの検出側ノードは、アイドル状態にある場合、その通常のオペレーションの一環として、および/またはネットワーク内におけるその基本的な機能または専用の機能として検出モジュールを実行することができる。検出モジュールを実行することによって、通信ネットワークのノードのうち任意の数(例えば1つ)、一定割合、またはすべてを検出側ノードとみなすことができることを理解されたい。
前述のように、脆弱性および/またはワームの攻撃が検出されると、1つの対応として、自己認証式警報などの警報を作成し、その警報をネットワーク内の1つまたは複数のノードへ送信することができる。このようにして、その脆弱性をまだ検出していないノード、および/またはその検出されたワームにまだ感染していないノードは、ワームおよび/またはプログラムの脆弱性に関して警報を受けることができ、適切な防護措置を講じることができる。前述のように、自己認証式警報は、機械で検証できる情報を含むことができ、この情報によって受信側ノードは、その警報の信頼性を独自に検証することができる。このようにして、警報を受信するネットワーク内のいかなるノードも、認証局などと通信せずにその警報を認証することができる。したがって自己認証式警報は、互いを信頼していないノード間の協力を促進するアーキテクチャの一部とすることができる。
オーバーレイネットワーク
ワームおよび/または脆弱性が検出されると、その脆弱なプログラムを実行している可能性のある、またはそのワームの攻撃の影響を受けやすい他のノードへ迅速におよび/または弾力的に警報を送信することができる。この警報は、ネットワーク内の任意の数の確定可能なおよび/または事前に確定されたノードへ任意の適切な方法で送信することができる。一例では、この警報は、悪意あるインサイダおよび/またはワームによるサービス拒否の攻撃から保護されているネットワークオーバーレイを使用して送信することができる。例えばこの警報は、構造化されたピアツーピアオーバーレイを介して広く送信することができる。
ピアツーピアネットワークは、非常に多数のノードへ拡張することができ、また弾力性を有することができ、例えば多数のノードが故障するかまたは接続を断たれた場合でさえ接続性を維持することができるため、ピアツーピアオーバーレイは、自己編成的なアプリケーションを構築するための適切な下地を提供することができる。以降の説明は、構造化されたピアツーピアオーバーレイの概要を提供し、ピアツーピアオーバーレイを保護して、システム内の実質的にすべての感染していないノードへ警報を配信できる可能性を高める際の一例を示す。以降の考察では、一例としてPastryのピアツーピアオーバーレイを使用するが、他の任意の適切なネットワークおよび/またはピアツーピアネットワークオーバーレイも使用できることを理解されたい。ピアツーピアネットワーク用のオーバーレイネットワークのタイプに関する現時点での例には、カリフォルニア大学バークリー校で開発されたTapestry、マサチューセッツ工科大学で開発されたChord、ならびにマイクロソフトおよびライス大学で開発されたPastryが含まれる。Tapestry、Chord、およびPastryは、分散システムを構築するためのツールキットである。類似した他のシステムとしては、CAN、Kademlia、Skipnet、およびViceroyがある。新しいオーバーレイの設計も頻繁に登場している。
Pastryなどの構造化されたオーバーレイは、キーをオーバーレイノードへマップする。それぞれのノードには、識別子空間から選択されるノード識別子が割り当てられる。キーは、同一の識別子空間から選択される。キーは、識別子空間内のキーに最も近いおよび/または最も類似したノード識別子を有するノードへマップされる。このノードは、そのキーのルートノードと呼ばれることがある。ノードへのキーのマッピングは、例えば参照によって本明細書に組み込まれるDabek, et al., "Towards a common API for structured peer-to-peer overlays," 2nd Int'l Workshop on P2P Systems, Feb. 2003, pp. 33-44(非特許文献4)でさらに論じられているKBRインターフェースを使用して、ユーザがルックアップメッセージを送信先キーへ送信できるようにするプリミティブを介して公開することができる。ルックアップメッセージは、オーバーレイを介して送信先キーのルートノードへ転送することができる。例えばPastryは、ノード識別子およびキーを128ビットの符号なし整数のセットから一様に無作為に選択し、次いで示された送信先キーを、そのキーに数字上最も近いノード識別子を有するアクティブノードへマップする。例えばその数字上最も近いノード識別子は、2128を法とする送信先キーに最も近いノード識別子とすることができる。
ノード用のルーティング状態情報は、ルーティングテーブル内に保存することができる。ルーティングテーブルは、そのルーティングテーブル内に示されているノード空間が、そのルーティングテーブルを保存しているノードのノード識別子に近づくにつれて、ますます詳細なレベルで、アドレス空間内の様々なノード用にノード識別子とネットワークアドレスを関連付けることができる。ノードのリーフセット(leaf set)は、ルーティングテーブルをホストしているノードのノード識別子に最も近いかまたは最も類似したノード用に、ノード識別子およびネットワークアドレスなどの情報を含む。リーフセットは、オーバーレイプロトコルに応じて、ルーティングテーブルとは別にデータ構造内に保存することもでき、および/またはルーティングテーブルの最低レベルとすることもできる。
Pastryを参照して、ルーティングテーブル構造の一例について論じる。Pastryのルーティングアルゴリズムは、ノード識別子およびキーを2b進数の符号なし整数と解釈し、この場合のbは、4という典型的な値を有するパラメータである。この解釈に基づくと、ルーティングテーブルは、128/b行および2b列を有する行列である。ルーティングテーブルの行rおよび列cにおける入力は、ルーティングテーブル内の最初の行がr=0を表すと仮定した場合に、最初のr桁をローカルノードのノード識別子と共有し、cに等しい(r+1)番目の桁を有するノード識別子を含む。このようなノード識別子がない場合、例えばネットワーク内にそのノード識別子を使用しているアクティブノードがない場合、その入力は空値とすることができる。ノード識別子は識別子空間全体にわたって一様に無作為に割り当てることができるため、ルーティングテーブル内の空値でない入力の平均数は、ピアツーピアネットワーク内のノードの数の(2bの底を有する)(2b−1)*logとして概算することができる。Pastryノードのリーフセットは、ローカルノードのノード識別子の左へl/2番目に近いノード識別子と、ローカルノードのノード識別子の右へl/2番目に近いノード識別子とを含むことができ、この場合のlは、8という典型的な値を有するパラメータである。そしてピアツーピアネットワーク内における各ノードのリーフセットのセットは、オーバーレイノードをリング型に接続する。このように、送信先キーと一致する徐々に長くなるプレフィックスを有するノードへメッセージを転送することによって、ピアツーピアネットワーク内でメッセージを回送することができる。
図12は、b=2およびl=4を有する構造化されたオーバーレイネットワークの一例1200を示している。この構造化されたオーバーレイネットワークの図は、ノード1202を起点とするルックアップメッセージのルート1210を示している。このルックアップメッセージは、示されているキーに最も近いノード識別子と一致するキーを含む。例えばそのキーに関連付けられた希望の情報を保存しているノードが、そのキーに最も近いノード識別子を有するノードである。例えばノード1202は、203231というノード識別子を有することができ、ルックアップメッセージのキーは、323310とすることができる。このルックアップメッセージを送信するために、起点ノード1202は、このルックアップメッセージの送信先キーに最も近い既知のノード識別子を探して、そのルーティングテーブルの1つのレベルを検索することができる。より詳細には、ノード1202は、そのキーの最初の桁である3の桁で始まるノード識別子を探して、そのルーティングテーブルの最初の行を検索することができる。この起点ノードは、3で始まるノード識別子のルーティングテーブルロケーションでノード識別子313221を見つけることができる。図12を参照すると、起点ノード1202は、通信媒体を使用してルート1212を介して、そのルーティングテーブル内のノード識別子(313221)に関連付けられているアドレスのノード1204へルックアップメッセージを転送することができる。そしてノード1204は、そのルックアップメッセージを受信し、例えばルックアップメッセージキー323310の最初の2桁と一致する32で始まるノード識別子を探して、そのルーティングテーブル(例えば、そのテーブルの第2のレベル)を検索することができる。ノード1204は、32で始まるノード識別子のロケーションでノード識別子322021を見つけることができる。次いでノード1204は、通信媒体を使用してルート1214を介して、そのルーティングテーブル内のノード識別子(322021)に関連付けられているアドレスのノード1206へルックアップメッセージを転送することができる。そしてノード1206は、そのルックアップメッセージを受信し、そのルックアップメッセージがキーのルートノード1208に達するまで、そのルーティングテーブルなどを検索することができる。多くの場合、ルーティングは、ノード識別子の配信が十分に無作為で一様である場合、平均して約
ホップ(hop)を取ることができる(パラメータNはネットワーク内のノードの数であり、bはノード識別子空間の底である)。
ネットワークの保護
構造化されたネットワークオーバーレイを介して警報配信の弾力性を高めるために、1つまたは複数のセキュリティメカニズムを使用して、構造化されたピアツーピアオーバーレイネットワークを保護することができる。必要に応じて、任意のセキュリティ手段を使用することができる。このセキュリティ手段は、例えば参照によって本明細書に組み込まれるCastro et al., "Secure routing for structured peer-to-peer overlay networks," 5th Usenix Symp. On Operating System Design and Implementation, Boston, MA, December, 2002, pp. 299-314(非特許文献5)に記載されている技術を含むことができる。さらなるセキュリティメカニズムによって、情報開示を減らすこと、サービス拒否(オーバーレイレベルで混雑状態を作り出すこと)を減らすこと、オーバーレイノードの大部分が感染していない場合でさえ、感染していないノードへ警報を広く送信することなどが可能である。
1つのセキュリティ手段は、ピアツーピアネットワークへ参加するノードにノード識別子を割り当てることができる。このノード識別子は、1つまたは複数の信頼できる認証局(CA)などの任意の適切なソースによって割り当てることができる。認証局は、ノード識別子がノード識別子空間から必ず十分に無作為に選択されるようにすることができ、および/またはノードがノード識別子を偽造するのを防止することができる。認証局は、例えば支払い、特定の製品を所有していることの証明、慈善事業への金銭的な贈り物の証明などを要求することによって、ノード識別子を認証する署名入り証明書の可用性を制御する技術を使用することができる。認証局を使用してノード識別子を割り当てることによって、Sybil攻撃を減らすことができる。攻撃から認証局を保護するために、1つまたは複数の認証局をオフラインにすること、および/またはオーバーレイネットワークの通常のオペレーションに関与させないことができる。
1つの代替および/または追加のセキュリティ手段は、任意の適切な方法で達成できる安全なルーティングテーブルの保守を可能にすることを含むことができる。例えば、ルーティングテーブル内の各フィールドを満たすことができるノード識別子のセットに制約を課すことができる。識別子iを有するノードのPastyルーティングテーブルでは、行rおよび列cのフィールドに対して、最初のr桁をノード識別子iと共有し、r+1番目の桁に値cを有する任意のノード識別子を含むよう制約を課すことができる。ノード識別子の入力の残りの桁は、ルーティングとは無関係とすることができる。しかしルーティングテーブル内の入力には、ドメイン内のポイントpに最も近いノード識別子を示すかまたは含むようにさらに制約を課すことができる。ポイントpは、最初のr桁をノード識別子iと共有し、r+1番目の桁に値cを有し、そのドメイン内の有効なポイントpのノード識別子を限定する何らかの確定可能な一連の桁を有するノード空間内のノード識別子ロケーションとして定義することができる。例えばポイントpは、最初のr桁をノード識別子iと共有し、r+1番目の桁に値cを有し、iと同じ残りの桁を有していたノード識別子として定義することができる。ルーティングテーブルの入力を識別子空間内の仮想ポイントに結び付けることによって、悪意のあるノードによって送信され、悪意のないノードによって受信されたルーティングの更新が仮想ポイントの制約を満たさない場合は、その更新を受け入れる事態を少なくすることができる。このようにして、悪意あるノードによって占拠される可能性のあるルーティングテーブルの入力の数を抑えることができる。この技術については、参照によって本明細書に組み込まれるCastro et al., "Secure routing for structured peer-to-peer overlay networks," 5th Usenix Symp. On Operating System Design and Implementation, Boston, MA, December, 2002, pp. 299-314(非特許文献5)にさらに記載されている。
追加または代替のセキュリティ手段は、情報開示を回避することを含むことができる。より詳細には、ネットワークオーバーレイのクローリング(crawling)を不許可および/または妨害することができる。したがって、オーバーレイのメンバー情報へのアクセスを減らすことができる。ルーティングテーブル内の入力を抑制することなど、任意の適切な技術を使用して、メンバー情報の漏洩を回避することができる。例えばiというノード識別子を有するノードは、ノードの障害、別のノードがオーバーレイから離脱したこと、および/またはそのノードが参加して、そのルーティングテーブルを初期設定中であることによって、そのルーティングテーブル内の行rおよび列cにおけるスロットが空になったために、そのスロットを満たす必要が生じる場合がある。そのスロットを満たすために、そのノードは、そのスロット用の制約を定義する識別子s、例えばr+1番目の桁に値cを有すること以外はノード識別子と等しい識別子へ要求メッセージを転送することができる。このような要求が、あるノードに送達されると、その受信側ノードは、識別子sにさらに近いノードがそのルーティングテーブルおよび/またはリーフセット内に存在するかどうかをチェックすることができる。また受信側ノードは、識別子sが要求側のノード識別子用の有効なポイントpを表していないかどうかをチェックすることもできる。有効なポイントpを表していない場合、受信側ノードは、その要求を放棄し、より近いノードへその要求を転送し、および/または他の任意の適切な処置を講じることができる。このようにして、悪意あるノードが、ルーティングテーブルの入力の制約を満たすノードしか見つけられないようにすることができる。場合によっては、他のアプリケーションがオーバーレイのメンバーに関する情報を漏洩する可能性があるため、場合によっては、そうしたアプリケーションに対して、警報の配信をサポートするオーバーレイの最上部で実行することを制限することができる。
別の代替および/または追加のセキュリティ手段は、あるノードが危険にさらされた際にオーバーレイの近隣のノードの身元を露呈してしまう事態を少なくすることができる。例えばオペレーティングシステムのカーネル内、バーチャルマシンモニタ内、ハードウェアチップ内などでオーバーレイを実行することができる。
別の代替または追加のセキュリティ手段は、ピアツーピアネットワーク内のノード間におけるメッセージトラフィックの混雑状態を減らすことができ、これによって、ネットワークに対するサービス拒否の攻撃の発生および/または影響を少なくすることができる。ネットワーク内の混雑状態を減らすために、様々な適切なメカニズムのうち任意の1つまたは複数を使用することができる。例えば、ノードが際限ない数のメッセージをオーバーレイに注入するのを防止することができる。追加および/または代替として、オーバーレイメッセージに署名することができ、それぞれのノードは、メッセージの署名によって識別されたオーバーレイ内の他のノード用に処理するメッセージの割合に制限を課すことができる。例えば認証局は、各ノードのノード識別子および公開鍵の双方を含む証明書に署名することができる。送信側ノードは、オーバーレイメッセージを送信する際、秘密鍵を使用してそのメッセージに署名してから、そのメッセージを回送することができる。認証局によって署名されたノードの証明書をメッセージに添付することができる。メッセージを回送する各ノードは、送信側ノードがそのメッセージのソースであることを検証することができ(例えば証明書を使用して、そのメッセージの署名を検証することができ)、その特定のノード用に回送したメッセージの数を(例えばメッセージカウントパラメータ内に)記録することができる。メッセージカウントパラメータは、送信側ノードから回送されるメッセージの数を制限できる所定のしきい値と比較することができる。別の例では、所与の任意のノードがネットワークにメッセージを挿入できる割合は、それぞれの近隣のリンク(例えば、ローカルノードのノード識別子に類似したノード識別子を有するノード)に割合の制限を適用することによって、限度を設けることができる。ノード識別子が認証局によって割り当てられている場合は、近隣のノードを変更することを制限することができる。
弾力的な配信
警報の配信、例えばその警報用の受信側ノードを識別することは、任意の適切な方法で決定することができる。例えば図3に示されているように、配信モジュール370は、警報が作成された場合は警報モジュール350からの入力に応答して、および/または受信された警報が検証された場合は警報検証モジュール360からの入力に応答して、トリガすることができる。ワームの攻撃および/またはプログラムの脆弱性を示す警報の配信は、1つまたは複数のルーティングノードが警報の伝達を阻止しようとする試みに対して弾力性を有することができる。阻止する側のノードは、警報の伝達を意図的に阻止する悪意あるノードである可能性もあり、あるいはそのノードは、メッセージの回送に参加できなくなる危険にさらされている可能性もあり、例えばワームに感染している可能性もある。したがってピアツーピアネットワーク内のノードへ警報を送信するための配信スキームは、複数のオーバーレイパスを介して同一のノードへ警報を送信することができる。より詳細には、ノードは、それぞれ異なるノードを起点とする、および/または異なるルーティングパスを介して送信される複数の警報を受信することができる。
パスを1つだけ使用する場合、そのパスが阻止される確率は、次のように概算することができる。
P(block)=1−(1−f)pathlength (3)
ここでのパラメータfは、回送を阻止しているネットワーク内のノードの比率である。したがって、例えば複数の独立したマルチキャストツリーを構築することによって、すべてのノードに対して複数の独立したパスを使用して警報を送信する場合、少なくとも1つのパスが、悪意のないおよび/または対応可能なノードのみを含む確率は、次のように概算することができる。
ここでのNはネットワーク内のノードの数であり、
はツリーの深さであり、pは各ノードへの独立したパスの数であり、binomは、0本の成功したルートおよびp回の試行を有する2項分布であり、各試行において首尾よく回送できる確率が
である。したがってb=4で、100,000のノードからなるネットワーク上でノードの50パーセントが危険にさらされているとすると、所与のノードへ到達する90%の確率を達成するには、約40本のパスを選択する必要があるだろう。ネットワーク内の各ノードへ1つの警報を転送するために40本のパスを使用する場合、メッセージのコストは、p*Nという値によって概算することができる。
メッセージを回送するために選択される独立したパスは、任意の適切な方法で選択することができる。例えば、無作為のパスを選択することができる。別の例では、すべてのノードは、そのルーティングテーブル内の入力のすべてまたは一部に警報を送信することができる。b=1のピアツーピアネットワークでは、ルーティングテーブルをすべてのルーティングテーブルの入力へ完全に送信すると、約
本のメッセージ分のメッセージコストを要することがある。完全にルーティングテーブルを送信すれば、警報のソースへの良好なパスが存在するすべてのノードへ到達できる見込みが高まることがある。別の例では、受信側ノードは、所定のレベルに満たないルーティングテーブル内の入力によって識別することができる。代替として、または追加として、警報を送信するノードは、リーフセット内の各入力へ警報を送信ことができる。
警報を受信および認証するノードは、配信技術、例えば複数の無作為のパスに従って他のノードへ、ルーティングテーブルの入力内の入力へ、リーフセット内の入力などへ警報を転送することができる。例えば1つのノードが、認証された警報をそのルーティングテーブル内のすべてのノードへ転送する場合、それぞれの受信側ノードは、自分のルーティングテーブル内にその受信側ノードを記載しているすべてのノードから警報を受信することができ、これによってネットワーク内のすべてのノードへの複数のパスが形成される。したがって警報は、ネットワーク内の実質的にすべてのノードへ配信することができ、警報が阻止される事態を少なくするために、別々のパスを介して各ノードへ複数の警報を回送することができる。
さらにノードは、警報を転送する前に、警報の作成元および/または警報の内容、例えばプログラム内の脆弱性の兆候を検証することができる。警報の作成元を検証することができず、検証されている脆弱性に関する記述が見つかった場合、ノードはその警報を転送する場合もあり、転送しない場合もある。警報の作成元を検証することができ、脆弱性に関する記述が見つからない場合、ノードはその警報を放棄することができる。
ノードは、1つの警報を既に転送された複数の警報と比較することができる。その警報が、以前に転送された警報と同じ脆弱性について記述している場合、ノードはその警報を転送しない場合がある。同じ警報メッセージを果てしなく送信し続ける事態を少なくするために、警報は、その警報が複製されたものかどうかを判断するために検査できる警報識別子、警報を転送するための特定の時間量を示すタイムアウト標識、警報が転送される回数を制限する転送回数のカウンタ、または他の任意の適切な標識を含むことができる。
ノードがオーバーレイに参加する場合、参加する側のノードは、そのリーフセットおよび/またはルーティングテーブル内に存在するノードなど、オーバーレイの1つまたは複数のノードに対して、関連する警報を転送するよう要求することができる。この関連する警報は、例えば参加側のノードが最後にオーバーレイへの接続を離脱して以降に認証された警報や、所定の期間内の警報などを含むオーバーレイ内のノードによって保存される任意の適切な警報とすることができる。警報の要求を受信したノードは、要求された警報のすべてまたは一部を返すことができる。追加および/または代替として、警報の要求を受信したノードは、自分が受信および/または保存している警報の要約を送信することができる。参加側のノードは、要約内の識別された警報の一部を選択し、それらの特定の警報をネットワークオーバーレイ内の受信側ノードおよび/または他のノードに要求することができる。この警報の要約は、必要に応じて任意の適切な形態を取ることができる。
図12のピアツーピアネットワークの例を参照すると、ノード1202は、ノード1220、1222、1224、1226用の入力を含むリーフセット1232を有することができる。ノード1202は、ノード1220、1222、1224、1226へ警報を送信することができ、これらのノードのそれぞれは、認証された警報をそれらのリーフセット内に含まれるノードへ転送することができる。例えばノード1222は、ノード1202、1220、1244、1246を含むリーフセット1242を有することができる。このようにノード1220は、ノード1202とノード1222の双方から警報を受信することができる。さらに、警報が後続の各リーフセットへ送信されるに従って、その警報はネットワーク中に配信される。
さらにこの配信システムは、オーバーレイネットワークのサイズが拡大または縮小するのに応じて、自動的に拡大縮小することができる。このルーティングテーブルおよび/またはリーフセット配信技術によって、ピアツーピアネットワークのいかなるノードも、独自にワーム封じ込めシステムに参加または離脱できるようになる。さらに自己認証式警報を配信することによって、パートナー間で広範な合意が不要となる場合がある。より詳細には、それぞれのノードは、感染について通知する上で、および/または感染から自分たちを保護する上で、単一のポイント、例えばISPや他の中央サーバには依存しない。
このワーム封じ込めシステムの検出、警報の認証、警報の配信、および/または対応モジュールは、単一の中央処理装置には依存しないため、専用の攻撃のターゲットとなる、および/または単一障害点となる可能性のある中央インフラストラクチャは存在しない。場合によっては、ワーム封じ込めシステムのインフラストラクチャをさらに分散化するために、封じ込めシステムの一部(例えば、ピアツーピアネットワークのノードのリーフセットの一部)であるすべてのノードを交換可能とすることができる。このようにして、封じ込めシステム内のノードのすべてまたは少なくとも一部は、(それぞれ異なる形で実装することができ、実際にそうされている可能性があるにもかかわらず、)同じタイプの機能を果たすことができる。
インターネットプロトコルマルチキャストおよびプルベースのメカニズムなどの他の配信または伝播技術が適する場合もある。
展開のシナリオ
前述のように、オーバーレイネットワークの1つまたは複数のノードは、検出モジュールを実行して、ワームの攻撃および/またはソフトウェアプログラム内の脆弱性を検出することができる。検出モジュールは、1つまたは複数の専用のコンピューティングデバイス(例えばハニーポットタイプの展開)、アイドル状態の1つまたは複数のコンピューティングデバイス(例えばスクリーンセーバタイプのアプリケーションの一部として)、および通常の製品展開の一環としての1つまたは複数のノードの任意の組合せによって実行することができる。
ワームが蔓延しているときに警報を広く送信するために使用されるオーバーレイネットワークは、インターネットまたは他の通信ネットワークの全体にわたって展開すること、企業の1つのローカルネットワークの複数のノードにわたって展開すること、特定の種類のユーザ(例えばソフトウェアパッケージの登録ユーザ)として定義された複数のノードにわたって展開することなどができる。
前述のように、脆弱性またはワームの攻撃が検出されると、警報メッセージを自動的に作成することができる。さらに、警報メッセージを受信した際および/または警報メッセージを認証した際に、所定の配信プロトコルに従って自動的に警報を転送することができる。場合によっては、手動または人間の対話によって、警報を作成および/または転送するための監視および/または承認を提供することができる。
ネットワークのノードのすべてまたは少なくとも一部が、封じ込めシステムにおける検出、警報の認証、および/または警報の配信に関与している場合、大規模な攻撃が発生する前でさえ、攻撃者がシステムに侵入する可能性がある。システム内のいずれのノードも悪意を有する可能性があり、それぞれのノードが別々のエンティティによって所有されている可能性がある場合、たとえそれらのノードが、認証局によって署名されたIDを有していても、それらのノード間には信頼関係がまったくない可能性がある。それにもかかわらず、これらのノードは、ワームが未知の脆弱性を悪用するのを阻止するという課題について協力することができる。悪意あるノードを識別することによって、悪意あるノードによって悪用される可能性のあるメカニズムが取り込まれるおそれがある。したがって封じ込めシステムのアーキテクチャは、前述のように、ネットワーク内に存在する悪意ある未知のノードに耐えうるように、および/またはそうしたノードを囲い込むような設計で作成することができる。
作動中、ワーム封じ込めアーキテクチャは、検出、警報の作成、警報の認証、警報の配信、および/あるいはワームまたはプログラムの脆弱性への対応を提供することができる。より詳細には、場合によると、この封じ込めシステムによって保護されているネットワークの各ノードは、検出、警報の作成、警報の認証、警報の配信、および/あるいは攻撃または脆弱性への対応のうち少なくとも1つに参加することができる。例えば図3を参照すると、ピアツーピアネットワーク310の検出側ノードは、検出モジュール340、警報モジュール350、配信モジュール370、および対応モジュール380を含むことができる。前述のように、検出モジュールは、動的データフロー分析などを使用することによって、ワームの攻撃および/またはソフトウェアの脆弱性を検出することができる。任意の適切なランタイム分析システムを使用して、イベントを追跡監視することができる。
ワームの攻撃および/またはプログラムの脆弱性を検出すると、検出モジュール340は、対応モジュール380と通信して、1つまたは複数の防護手段をトリガすることができる。識別されたワームおよび/またはプログラムの脆弱性を感染していないノードへ伝達するために、検出側ノード310は、警報モジュール350を使用して、警報メッセージ330を作成することができる。前述のように、この警報メッセージは自己認証式とすることができ、および/または脆弱なプログラムの識別子、脆弱性タイプ標識、イベントリスト、1つまたは複数の検証ヒント、および対応標識のうちの1つまたは複数を含むことができる。警報モジュール350は、配信モジュール370と通信して、配信プロトコルに従ってネットワークの1つまたは複数のノードへ警報メッセージ330を送信することができる。例えば前述のように、警報メッセージは、ネットワークオーバーレイプロトコルに従って維持されているルーティングテーブル内で識別されたノードへ配信することができる。追加または代替として、警報メッセージは、ピアツーピアオーバーレイプロトコルに従って維持されているリーフセット内で識別されたすべてのノードへ配信することもできる。
図3に示されているように、警報メッセージ330は、ノード310のリーフセット内で識別された受信側ノード320へ送信することができる。この受信側ノードは、警報メッセージ330を受信し、警報検証モジュール360を使用して、警報メッセージを認証することができる。警報が認証された場合、受信側ノード320は、対応モジュール380を使用して、1つまたは複数の防護手段をトリガすることができる。通信ネットワーク全体にわたって警報330を配信するために、受信側モジュール320は、配信モジュール370を使用して、配信プロトコルに従ってネットワークの1つまたは複数のノードへ警報メッセージ330を転送することができる。例えば前述のように、警報メッセージは、ピアツーピアオーバーレイプロトコルに従って維持されているルーティングテーブルおよび/またはリーフセット内で識別されたノードへ配信することができる。
ある実験では、SQL Slammerに類似したワームによる攻撃を切り抜けたノードの比率は、システム内におけるワームを検出したノードの比率の関数として割り出すことができる。ある実験では、1つの母集団、すなわち100,000台のノード(例えばホストコンピューティングデバイス)がネットワークの一部であり、10台が感染しているとしてシミュレートした。さらにワームによる攻撃の前でさえ、ネットワーク内のノードの10%が悪意を有すると仮定した。感染率βは約0.117と推定され、これは、インターネット上で観測されるSQL Slammerの動作に近い数値と考えられる。実験結果の例が図13のグラフ1300に示されており、ワームを検出したノードの比率が軸1302に沿って示され、感染を免れたノードの比率が軸1304に沿って示されている。図13のグラフは、ネットワーク内におけるワームを検出したノードの比率がわずかであっても、例えば0.001であっても、ワームの感染を脆弱な母集団の10%未満に封じ込めるのには十分である場合があることを示している。
例示された実施形態を参照して本発明の原理について説明および例示したが、そうした原理から逸脱することなく、例示された実施形態の構成および細部を修正できることが理解されよう。
例えば1つの方法は、プログラム識別子およびイベントリストを含む自己認証式警報を受信側コンピューティングデバイスにおいて受信するステップであって、そのプログラム識別子は、検出された脆弱性を有するプログラムを識別し、そのイベントリストは、検出された脆弱性を示す1つまたは複数の非決定性のイベントを含むステップと、受信側コンピューティングデバイスが、検出された脆弱性を有するプログラムを含むかどうかを判定するステップと、イベントリストが、検出された脆弱性を示していることを検証するステップとを含むことができる。この検証するステップは、プログラム内のイベントリストを実行するステップを含むことができる。検証するステップは、プログラムの命令から論理安全性条件を作成するステップと、イベントリストの冒頭にプログラムの状態を定義する前提条件を定義するステップと、イベントリストに基づいて脆弱な述部を定義するステップと、述語論理に基づいて論理安全性条件、前提条件、および脆弱な述部を評価するステップとを含むことができる。この方法では、自己認証式警報は、プログラム内で検出された脆弱性のタイプを示すための脆弱性タイプ識別子を含むことができ、検証するステップは、脆弱性タイプ識別子を参照するステップを含む。この方法では、自己認証式警報は、検出された脆弱性をイベントリストがどのように示すかの表示(indication)を提供する1つまたは複数の検証ヒントを含むことができる。イベントリストを検証するステップは、1つまたは複数の検証ヒントに基づいてイベントリストを修正して、検証が成功したことを信号で伝えるプログラムへロードされた検証関数の実行をトリガするステップを含むことができる。この方法では、感染の企てを検出するためのソフトウェアまたはハードウェアの装備を使用してプログラムの実行中に記録されたイベントからイベントリストを得ることができる。この方法は、イベントリストを検証するステップに応答して少なくとも1つの他のノードへ自己認証式警報を転送するステップをさらに含むことができる。自己認証式警報が転送される場合、オーバーレイネットワーク内の近隣のノードのセットから少なくとも1つの他のノードうちの少なくとも1つのノードを検索することができる。自己認証式警報が転送される場合、少なくとも1つの他のノードうちの少なくとも1つのノードは、オーバーレイネットワーク内の近隣のノードをすべて含むことができる。この方法は、イベントリストに基づいて脆弱性を解消するためのパッチまたはフィルタを作成するステップをさらに含むことができる。
別の例では、自己認証式警報のデータ構造をその上に格納しているコンピュータ可読媒体は、ワームの攻撃に対する検出された脆弱性を有するプログラムを識別するプログラム識別子を表すデータを含む第1のデータフィールドと、検出された脆弱性を示す1つまたは複数の非決定性のイベントを含むイベントリストを表すデータを含む第2のデータフィールドと、プログラム内で検出された脆弱性のタイプを示すための脆弱性タイプ識別子を表すデータを含む第3のデータフィールドとを含むことができる。このコンピュータ可読媒体では、脆弱性タイプ識別子は、プログラムの実行を任意のコードへリダイレクトする能力、任意のコードを実行する能力、または任意の引数を関数に提供する能力を示すことができる。このコンピュータ可読媒体は、検出された脆弱性をイベントリストがどのように示すかの表示を提供する1つまたは複数の検証ヒントを表すデータを含む第4のデータフィールドをさらに含むことができる。1つまたは複数の検証ヒントは、脆弱性のタイプに応じて、実行されるコードの任意のアドレスの、実行される任意のコードの、または関数に対する任意の引数の、イベントリスト内のイベントおよびそのイベント内のオフセットを示すことができる。このコンピュータ可読媒体は、検出された脆弱性を解消するのに適したパッチおよびフィルタの少なくとも1つを表すデータを含む第5のデータフィールドをさらに含むことができる。
別の例では、コンピュータ実行可能コンポーネントを有する1つまたは複数のコンピュータ可読媒体は、ワームの攻撃を検出するための手段と、検出されたワームに対応して自己認証式警報を作成するための手段と、ネットワークオーバーレイの少なくとも1つの他のノードへ自己認証式警報を配信するための手段とを含むことができる。このコンピュータ可読媒体は、構造化されたネットワークオーバーレイのルーティングテーブルおよびリーフセットの少なくとも1つをさらに含むことができ、自己認証式警報を配信するための手段は、ルーティングテーブルおよびリーフセットの少なくとも1つにアクセスして、少なくとも1つの他のノードを決定する。このコンピュータ可読媒体は、ルーティングテーブル内の入力の漏洩を少なくするための手段をさらに含むことができる。自己認証式警報を作成するための手段は、イベントログにアクセスして、ワームの攻撃によって悪用できるプログラム内の脆弱性を示す少なくとも1つの非決定性のイベントを割り出すことができる。このコンピュータ可読媒体は、受信した自己認証式警報を認証するための手段をさらに含むことができ、配信するための手段は、プログラム内の脆弱性およびワームの攻撃の少なくとも1つを示す受信した自己認証式警報を検証することによってトリガされる。
さらに別の例では、1つまたは複数のコンピュータ可読媒体は、実施されると、受信した情報をコンピューティングシステムのメモリの第1の部分に書き込むかまたは保存するための命令を受信するステップと、受信した情報が、信頼できないソースから、または「汚染されている」ことを示す汚染標識を有するメモリの部分から受信されたものである場合に「汚染されている」ことを表示する第1の汚染標識をメモリの第1の部分に関連付けるステップと、受信した情報をプログラムカウンタへロードするかまたは実行するための命令を受信するステップと、第1の汚染標識が「汚染されている」ことを示しているかどうかというプログラムの脆弱性の表示(indication)を提供するステップとを含む方法を実行できるコンピュータ可読命令を含む。受信した情報をロードするかまたは実行するための受信された命令は、データを移動するための命令、算術命令および論理命令、ならびにプログラムの制御フローを変更する命令を含むことができる。プログラムの脆弱性の表示を提供するステップは、受信した情報に基づいてパッチまたはフィルタを作成するステップを含むことができる。プログラムの脆弱性の表示を提供するステップは、自己認証式警報を少なくとも1つの他のノードへ送信するステップを含むことができる。このコンピュータ可読媒体は、その少なくとも1つの他のノードをオーバーレイネットワーク内の近隣のノードのセットから識別するノード識別子を検索するステップをさらに含むことができる。このコンピュータ可読媒体は、受信した情報のソースを識別する入力イベント識別子をメモリの第1の部分に関連付けるステップをさらに含むことができる。第1の汚染標識は、入力イベント識別子を含むことができる。このコンピュータ可読媒体は、受信した情報から新たなデータを計算するステップと、その新たなデータをメモリの第2の部分に保存するステップと、受信した情報が、信頼できないソースから、または「汚染されている」ことを示す汚染標識を有するメモリ部分から受信されたものである場合に「汚染されている」ことを表示する第2の汚染標識をメモリの第2の部分に関連付けるステップとをさらに含むことができる。第2の汚染標識は、受信した情報から新たなデータを計算するステップの少なくとも1つのステップを示すデータフローグラフ、またはその情報の受信元であるメモリ部分の汚染標識内のデータフローグラフを含むことができる。メモリの第1の部分は、CPUレジスタ、メモリページ、およびページ内のメモリロケーションから構成されるグループの少なくとも1つを含むことができる。メモリの第1の部分は、第1のメモリページの一部であるメモリロケーションを含むことができ、この方法は、第1の汚染標識に基づいてページ汚染標識をメモリページに関連付けるステップをさらに含む。受信した情報をプログラムカウンタへロードするかまたは実行するための命令を受信するステップは、第1の汚染標識が「汚染されていない」ことを示している場合に、受信した情報を実行し、受信した情報によって参照される命令を保存しているメモリの第3の部分に関連付けられた第3の汚染標識を検査するための命令を受信するステップを含むことができる。このコンピュータ可読媒体は、第3の汚染標識が「汚染されている」ことを示している場合にプログラムの脆弱性の表示を提供するステップをさらに含むことができる。
さらに別の例では、1つの方法は、保存された値のソースが信頼できないソースか信頼できるソースかを追跡記録する少なくとも1つの汚染データストアを保持するステップと、その保存された値をプログラムポインタへロードする前に少なくとも1つの汚染ストアを検査するステップと、その保存された値が信頼できるソースからのものであることを少なくとも1つの汚染データストアが示している場合に、その保存された値をロードするステップと、その保存された値が信頼できないソースからのものであることを少なくとも1つの汚染データストアが示している場合に、その保存された値を自動的にロードすることを拒否するステップと、その保存された値を自動的にロードすることを拒否するステップに応答して、その保存された値のストレージロケーションを割り出し、少なくとも1つの汚染データストアから、その保存された値の入力ソースを割り出すステップとを含むことができる。この少なくとも1つの汚染データストアは、保存された値を計算するために使用されるステップのセットを示すデータフローグラフを含むことができる。入力ソースを割り出すステップは、保存された値の入力ソースおよびその入力ソース内のオフセットを割り出すステップを含むことができる。この方法は、保存された値が信頼できるソースからのものであることを少なくとも1つの汚染データストアが示している場合に、その保存された値が指し示している命令が信頼できるソースからのものであるかどうかを判定するステップと、その保存された値およびその命令が双方とも少なくとも1つの信頼できるソースからのものである場合に限ってその命令を実行するステップとをさらに含むことができる。
さらに別の例では、コンピュータ実行可能コンポーネントを含む1つまたは複数のコンピュータ可読媒体は、動的データフロー分析を使用してワームの攻撃を検出するための手段と、ワームの攻撃を検出したことに応答して警報を作成するための手段と、警報を作成したことに応答してその警報を配信するための手段とを含むことができる。このコンピュータ可読媒体は、検出するための手段の動的データフロー分析に基づいてパッチまたはフィルタを作成するための手段をさらに含むことができる。警報を作成するための手段は、検出するための手段の動的データフロー分析に少なくとも部分的に基づいて自己認証式警報を作成するための手段を含むことができる。
さらに別の例では、1つの方法は、ワームの攻撃によって悪用できるプログラムの脆弱性を示す第1の実行パスを検索するステップと、その第1の実行パスの少なくとも一部を決定する受信メッセージ内の少なくとも1つのバイトを決定するステップと、その少なくとも1つのバイトの存在を検証するためにテストできる決定されたバイト上の少なくとも1つの条件を決定するステップと、その少なくとも1つの条件によって新たなメッセージの少なくとも一部をテストしてワームによる攻撃の存在を検出するステップと、そのテストに基づいてその新たなメッセージを処理することを拒否するステップとを含むことができる。この第1の実行パスは、脆弱性を検出するために使用されるイベントログから得ることができる。この方法は、別のコンピューティングデバイスから自己認証式警報を受信するステップをさらに含むことができ、第1の実行パスを検索するステップは、自己認証式警報を解析してイベントリストを検索するステップを含むことができる。少なくとも1つの条件を決定するステップは、汚染されているメモリ部分が制御フローの決定において使用されている場合に、その汚染されているメモリ部分からのデータ上で計算された論理演算を記録するステップを含むことができる。この方法は、フィルタ条件を「真」に初期設定するステップをさらに含むことができ、記録するステップは、フィルタ条件をそのフィルタ条件の前の値と少なくとも1つの条件との論理AND関数として更新するステップを含む。この方法は、汚染されているメモリ部分のデータフローグラフを含む命令のシーケンスを記録するステップをさらに含むことができる。この方法は、脆弱性を示す自己認証式警報内にフィルタ条件を含めるステップと、その自己認証式警報を別のコンピューティングデバイスへ送信するステップとをさらに含むことができる。第1の実行パスは、非決定性のイベントのイベントリストを含むことができる。
別の例では、1つまたは複数のコンピュータ可読媒体は、実施されると、フィルタ条件の値を「真」に初期設定するステップと、プログラムカウンタへロードされるかまたは実行されるデータを含むメモリの部分に関連付けられた汚染標識の値を判定するステップと、条件付きの制御移行を実行するための命令を受信するステップと、フィルタ条件の前の値および判定された汚染標識の値に基づいてフィルタ条件を更新するステップと、そのフィルタ条件を受信メッセージに適用して、プログラム内の脆弱性を悪用するワームの攻撃を阻止するステップとを含む方法を実行できるコンピュータ可読命令を含む。この1つまたは複数のコンピュータ可読媒体は、検出モジュールから脆弱性の表示を受信するステップをさらに含むことができる。この1つまたは複数のコンピュータ可読媒体は、自己認証式警報から脆弱性の表示を受信するステップをさらに含むことができる。この1つまたは複数のコンピュータ可読媒体は、脆弱性を示す自己認証式警報内にフィルタ条件を含めるステップと、その自己認証式警報を別のコンピューティングデバイスへ送信するステップとをさらに含むことができる。汚染標識は、メモリの部分に含まれる値を計算するために使用された命令のシーケンスを含むデータフローグラフを含むことができる。
さらに別の例では、コンピュータ実行可能コンポーネントを有する1つまたは複数のコンピュータ可読媒体は、ワームによって悪用できるプログラム内の脆弱性を示す命令のシーケンスを自動的に作成するための手段と、その命令のシーケンスに基づいて脆弱性に対する解決策を自動的に作成するための手段とを含むことができる。命令のシーケンスを自動的に作成するための手段は、ワームの攻撃を検出するための手段を含むことができる。命令のシーケンスを自動的に作成するための手段は、受信した自己認証式警報を認証するための手段を含むことができる。解決策を自動的に作成するための手段は、脆弱性を悪用する受信された命令用のフィルタを作成するための手段を含むことができる。解決策を自動的に作成するための手段は、プログラム内の脆弱性に対するパッチを作成するための手段を含むことができる。この1つまたは複数のコンピュータ可読媒体は、命令のシーケンスおよび解決策の少なくとも一部を含む自己認証式警報を作成するための手段をさらに含むことができる。この1つまたは複数のコンピュータ可読媒体は、自己認証式警報をネットワークオーバーレイの少なくとも1つの他のノードへ配信するための手段をさらに含むことができる。
本発明の原理を適用できる多くの可能な実施形態を考慮すれば、詳細な実施形態は例示的なものにすぎず、本発明の範囲を限定するものとみなすべきではないことを理解されたい。むしろ、添付の特許請求の範囲およびその均等物の範囲および趣旨内に収まりうるそうしたすべての実施形態を本発明として特許請求する。