(57)【要約】【課題】  ワームの封じ込めを提供すること。【解決手段】  封じ込めシステムは、検出されたワームに関する知識を安全に共有するための基盤として警報を作成するステップおよび／または送信するステップを備えることができる。警報は、所与のプログラムが脆弱性を有していることを証明する情報を含むことができる。この警報は自己認証式とすることができ、これによって、その信頼性はコンピューティングシステムによって独自に検証することができる。【選択図】  図３
2006031718.tif 000002
【特許請求の範囲】
【請求項１】
ａ）プログラム識別子およびイベントリストを含む自己認証式警報を受信側コンピューティングデバイスにおいて受信するステップであって、前記プログラム識別子は、検出された脆弱性を有するプログラムを識別し、前記イベントリストは、前記検出された脆弱性を示す１つまたは複数の非決定性のイベントを含むステップと、
ｂ）前記受信側コンピューティングデバイスが、前記検出された脆弱性を有する前記プログラムを含むかどうかを判定するステップと、
ｃ）前記イベントリストが、前記検出された脆弱性を示していることを検証するステップとを備えることを特徴とする方法。
【請求項２】
検証するステップは、前記プログラム内の前記イベントリストを実行するステップを含むことを特徴とする請求項１に記載の方法。
【請求項３】
検証するステップは、前記プログラムの命令から論理安全性条件を作成するステップと、前記イベントリストの冒頭に前記プログラムの状態を定義する前提条件を定義するステップと、前記イベントリストに基づいて脆弱な述部を定義するステップと、述語論理に基づいて前記論理安全性条件、前記前提条件、および前記脆弱な述部を評価するステップとを含むことを特徴とする請求項１に記載の方法。
【請求項４】
前記自己認証式警報は、前記プログラム内で検出された脆弱性のタイプを示すための脆弱性タイプ識別子を含み、検証するステップは、前記脆弱性タイプ識別子を参照するステップを含むことを特徴とする請求項１に記載の方法。
【請求項５】
前記自己認証式警報は、前記検出された脆弱性を前記イベントリストがどのように示すかの表示を提供する１つまたは複数の検証ヒントを含むことを特徴とする請求項１に記載の方法。
【請求項６】
受信した情報をコンピューティングシステムのメモリの第１の部分に書き込むかまたは保存するための命令を受信するステップと、前記受信した情報が、信頼できないソースから、または「汚染されている」ことを示す汚染標識を有するメモリの部分から受信されたものである場合に「汚染されている」ことを示す第１の汚染標識を前記メモリの前記第１の部分に関連付けるステップと、前記受信した情報をプログラムカウンタへロードするかまたは実行するための命令を受信するステップと、前記第１の汚染標識が「汚染されている」ことを示している場合に、前記プログラム識別子および前記イベントリストを含む、プログラムの脆弱性を示す前記自己認証式警報を作成するステップであって、前記イベントリストは、書き込むかまたは保存するための命令を受信する動作、第１の汚染標識を関連付ける動作、前記受信した情報をロードするための命令を受信する動作の間に記録された１つまたは複数のイベントを示すステップとをさらに備えることを特徴とする請求項１に記載の方法。
【請求項７】
前記受信した情報のソースを識別する入力イベント識別子をメモリの前記第１の部分に関連付けるステップをさらに備えることを特徴とする請求項６に記載の方法。
【請求項８】
前記受信した情報から新たなデータを計算するステップと、前記新たなデータを前記メモリの第２の部分に保存するステップと、前記受信した情報が、信頼できないソースから、または汚染されていることを示す汚染標識を有するメモリ部分から受信されたものである場合に「汚染されている」ことを示す第２の汚染標識を前記メモリの前記第２の部分に関連付けるステップとをさらに備えることを特徴とする請求項６に記載の方法。
【請求項９】
前記第２の汚染標識は、前記受信した情報から前記新たなデータを計算するステップの少なくとも１つのステップを示すデータフローグラフ、または前記情報の受信元である前記メモリ部分の前記汚染標識内のデータフローグラフを含むことを特徴とする請求項８に記載の方法。
【請求項１０】
前記受信した情報をプログラムカウンタへロードするかまたは実行するための命令を受信するステップは、前記第１の汚染標識が「汚染されていない」ことを示している場合に、前記受信した情報を実行するための命令を受信するステップを含む方法であって、この場合、前記受信した情報によって参照される命令を保存している前記メモリの第３の部分に関連付けられた第３の汚染標識を検査するステップをさらに備えることを特徴とする請求項６に記載の方法。
【請求項１１】
前記イベントリストを検証するステップに応答して、ネットワークオーバーレイ内のノード識別子によって識別された少なくとも１つの近隣のノードへ前記自己認証式警報を転送するステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項１２】
前記イベントリストに基づいて前記脆弱性を解消するためのパッチおよびフィルタの少なくとも１つを作成するステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項１３】
コンピュータ実行可能コンポーネントを有する１つまたは複数のコンピュータ可読媒体において、
ａ）動的データフロー分析を使用してワームの攻撃に対する脆弱性を検出するための手段と、
ｂ）検出されたワームに対応して自己認証式警報を作成するための手段であって、前記自己認証式警報は、
ｉ）ワームの攻撃に対する前記脆弱性を有するプログラムを識別するプログラム識別子を表すデータを含む第１のデータフィールド、
ｉｉ）前記脆弱性を示す１つまたは複数の非決定性のイベントを含むイベントリストを表すデータを含む第２のデータフィールド、および
ｉｉｉ）前記プログラム内で検出された脆弱性のタイプを示すための脆弱性タイプ識別子を表すデータを含む第３のデータフィールドを含む手段とを備えることを特徴とするコンピュータ可読媒体。
【請求項１４】
前記自己認証式警報は、前記脆弱性を前記イベントリストがどのように示すかの表示を提供する１つまたは複数の検証ヒントを表すデータを含む第４のデータフィールドをさらに含み、前記検証ヒントは、前記脆弱性のタイプに応じて、実行されるコードの任意のアドレスの、実行される任意のコードの、または関数に対する任意の引数の、前記イベントリスト内のイベントおよび前記イベント内のオフセットを示すことを特徴とする請求項１３に記載のコンピュータ可読媒体。
【請求項１５】
前記脆弱性のタイプは、前記プログラムによる実行を任意のコードへリダイレクトする能力、任意のコードを実行する能力、または任意の引数を関数に提供する能力を示すことを特徴とする請求項１３に記載のコンピュータ可読媒体。
【請求項１６】
ネットワークオーバーレイの少なくとも１つの他のノードへ前記自己認証式警報を配信するための手段をさらに備えることを特徴とする請求項１３に記載のコンピュータ可読媒体。
【請求項１７】
前記検出するための手段は、前記脆弱性を示す少なくとも１つの非決定性のイベントを含むイベントログを作成することを特徴とする請求項１３に記載のコンピュータ可読媒体。
【請求項１８】
前記提供されたヒントを使用して前記イベントリストを修正して、検証が成功したことを信号で伝える前記プログラムへロードされた検証関数の実行をトリガするステップを含む受信した自己認証式警報を認証するための手段をさらに含むことを特徴とする請求項１３に記載のコンピュータ可読媒体。
【請求項１９】
ａ）ワームの攻撃によって悪用できるプログラムの脆弱性を示す第１の実行パスを自己認証式警報から取り出すステップと、
ｂ）前記第１の実行パスの少なくとも一部を決定する受信メッセージ内の少なくとも１つのバイトを決定するステップと、
ｃ）前記少なくとも１バイトの存在を検証するためにテストできる前記決定されたバイト上の少なくとも１つの条件を決定するステップと、
ｄ）前記少なくとも１つの条件によって新たなメッセージの少なくとも一部をテストして、ワームによる攻撃の存在を検出するステップと、
ｅ）前記テストに基づいて前記新たなメッセージを処理することを拒否するステップとを備えることを特徴とする方法。
【請求項２０】
少なくとも１つの条件を決定するステップは、汚染されているメモリ部分が制御フローの決定において使用されている場合に、前記汚染されているメモリ部分からのデータ上で計算された論理演算を記録するステップを含むことを特徴とする請求項１９に記載の方法。
【請求項２１】
実施されると、
ａ）ワームの攻撃に対するプログラム内の脆弱性の表示を自己認証式警報から受信するステップと、
ｂ）フィルタ条件の値を「真」に初期設定するステップと、
ｃ）プログラムカウンタへロードされるかまたは実行されるデータを含むメモリの部分に関連付けられた汚染標識の値を判定するステップと、
ｄ）条件付きの制御移行を実行するための命令を受信するステップと、
ｅ）前記フィルタ条件の前の値および前記判定された汚染標識の値に基づいて前記フィルタ条件を更新するステップと、
ｆ）前記フィルタ条件を受信メッセージに適用して、前記脆弱性を悪用するワームの攻撃を阻止するステップとを備える方法を実行するコンピュータ可読命令を備えることを特徴とする１つまたは複数のコンピュータ可読媒体。
【請求項２２】
前記汚染標識は、メモリの前記部分に含まれる値を計算するために使用された命令のシーケンスを含むデータフローグラフを含むことを特徴とする請求項９に記載の１つまたは複数のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この説明は、一般にコンピュータのセキュリティに関し、より具体的には、ネットワーク化されたコンピュータのシステム内でワームが蔓延するのを検出し、警報し、および／または軽減することに関する。
【背景技術】
【０００２】
【非特許文献１】Necula et al., "Safe Kernel Extensions without Runtime Checking," 2nd Symp. On Operation System Design and Implementation, Oct. 1996, pp. 229-243
【非特許文献２】Dunlap et al., "Revirt: enabling intrusion analysis through virtual-machine logging and replay," Operating Syst. Design and Implementation, Boston, Massachusetts, December 2002
【非特許文献３】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
【非特許文献４】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
【非特許文献５】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
【発明の開示】
【発明が解決しようとする課題】
【０００３】
ネットワーク化されたコンピュータのシステム内でワームが蔓延するのを検出し、警報し、および／または軽減することを目的とする。
【課題を解決するための手段】
【０００４】
以降では、読者に対して基本的な理解を提供するために、本開示の簡略化した概要を提示する。この概要は、本開示を網羅的に概観したものではなく、また本発明の鍵となる重要な要素を明らかにするものでもなく、本発明の範囲を画定するものでもない。その唯一の目的は、以降で提示されるさらに詳細な説明への前置きとして、本明細書に開示されるいくつかの発想を簡略化した形態で提示することである。
【０００５】
ワームとしても知られる自己増殖するプログラムが、インターネットに接続されたコンピュータに脅威をもたらしている。ワームは、一般的なソフトウェアパッケージなどのプログラムにおける脆弱性を悪用して、感染したマシンの支配権を握る。したがって、この問題に対する長期的な１つの解決策は、脆弱性のないソフトウェアを構築することである。しかし、そのときまでは、引き続きソフトウェアは脆弱性を有することとなり、ワームの影響を軽減するには、ワーム封じ込めシステムを展開することができる。ワームは急速に蔓延できるため、封じ込めシステムは、迅速におよび／または効率よく検出および対応するように自動化することができ、ネットワーク内の別のコンピューティングシステムノードに警報を配信することができる。
【０００６】
封じ込めシステムの一態様は、動的フロー分析を含む様々な技術を介して攻撃の大きなまとまりを検出できる検出システムを含むことができる。封じ込めシステムの別の態様は、検出されたワームに関する知識を安全に共有するための基盤として警報を作成するステップおよび／または送信するステップを含むことができる。警報は、所与のプログラムが脆弱性を有していることを証明する情報を含むことができる。この警報は自己認証式とすることができ、これによって、その信頼性はコンピューティングシステムによって独自に検証することができる。この封じ込めシステムは、ワームの発生中に活発な攻撃を受けているときでさえ、感染していないノードへタイムリーに警報を伝達するための弾力的なおよび／または自己編成的なプロトコルを含むことができる。この封じ込めシステムは、ワームが急速に蔓延して、ソフトウェアパッケージにおける未知の脆弱性を悪用しているときでさえ、互いを信頼していない多数のコンピュータが、ワームを封じ込めるタスクにおいて協力できるようにするシステムアーキテクチャを含むことができる。この封じ込めシステムは、未来の攻撃からコンピューティングデバイスを保護できる保護システムを含むことができる。
【０００７】
付随する特徴の多くは、以降の詳細な説明を添付の図面と併せて参照することによってよりよく理解するほど、より容易にその真価が理解されよう。
【０００８】
この説明は、以降の詳細な説明を添付の図面に照らして読めば、よりよく理解されよう。
【０００９】
添付の図面では、同様の部分を指すために同様の参照番号が使用されている。
【発明を実施するための最良の形態】
【００１０】
典型的な動作環境
図１および以降の考察は、ワーム封じ込めシステムのすべてまたは一部を実装できる適切なコンピューティング環境の簡潔で全般的な説明を提供することを意図している。図１の動作環境は適切な動作環境の一例にすぎず、動作環境の使用または機能の範囲に関して何らかの限定を提示することを意図するものではない。本明細書に記載のワーム封じ込めシステムとして使用するのに適する可能性のある他のよく知られたコンピューティングシステム、環境、および／または構成は、パーソナルコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な家庭用電化製品、ネットワークパーソナルコンピュータ、サーバコンピュータ、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などを含むが、これらには限定されない。
【００１１】
必須ではないが、このワーム封じ込めシステムについては、１つまたは複数のコンピュータまたは他のデバイスによって実行される、プログラムモジュールなどのコンピュータ実行可能命令という一般的なコンテキストにおいて説明する。一般にプログラムモジュールは、特定のタスクを実行したり特定の抽象データ型を実装したりするルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。通常、プログラムモジュールの機能は一体化することもでき、希望に応じて様々な環境に分散することもできる。分散環境では、プログラムモジュールは、メモリストレージデバイスを含むローカルコンピュータ記憶媒体およびリモートコンピュータ記憶媒体の双方に配置することができる。
【００１２】
図１を参照すると、ワーム封じ込めシステムを実装するための典型的なシステムは、コンピューティングデバイス１００などのコンピューティングデバイスを含む。その最も基本的な構成において、コンピューティングデバイス１００は通常、少なくとも１つの処理装置１０２およびメモリ１０４を含む。コンピューティングデバイスの厳密な構成およびタイプに応じて、メモリ１０４は、（ＲＡＭなどの）揮発性、（ＲＯＭ、フラッシュメモリなどの）不揮発性、またはその両方の何らかの組合せとすることができる。この最も基本的な構成が、破線１０６によって図１に示されている。さらにデバイス１００は、追加の機能および／または機能性を有することもできる。例えばデバイス１００は、磁気ディスク、光ディスク、テープなどの（例えば取り外し可能および／または取り外し不能な）追加のストレージを含むこともできる。このような追加のストレージは、取り外し可能記憶装置１０８および取り外し不能記憶装置１１０として図１に示されている。コンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、他のデータなどの情報を記憶するための任意の方法または技術で実装される揮発性媒体および不揮発性媒体、ならびに取り外し可能媒体および取り外し不能媒体を含む。メモリ１０４、取り外し可能記憶装置１０８、および取り外し不能記憶装置１１０は、すべてコンピュータ記憶媒体の例である。コンピュータ記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）または他の光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは希望の情報を記憶するために使用可能で、デバイス１００によってアクセス可能な他の任意の媒体を含むが、これらには限定されない。このような任意のコンピュータ記憶媒体は、デバイス１００の一部とすることができる。
【００１３】
またデバイス１００は、（１つまたは複数の）通信接続１１２を含むことができ、これによってデバイス１００は、コンピューティングシステムネットワーク２１１内の他のノードなどの他のコンピューティングデバイスと通信することができる。（１つまたは複数の）通信接続１１２は、通信媒体の一例である。通信媒体は通常、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを搬送波や他の伝送機構などの変調されたデータ信号内に具現化するものであり、任意の情報伝達媒体を含む。「変調されたデータ信号」という用語は、情報をその信号内で符号化するような方法で設定または変更されたその特性の１つまたは複数を有する信号を意味する。例えば通信媒体は、有線ネットワークや直接有線接続などの有線媒体と、音響、ＲＦ（ｒａｄｉｏ  ｆｒｅｑｕｅｎｃｙ）、赤外線や他の無線媒体などの無線媒体とを含むが、これらには限定されない。本明細書で使用するコンピュータ可読媒体という用語は、記憶媒体と通信媒体の両方を含む。
【００１４】
またデバイス１００は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイス、レーザ照準機、赤外線カメラ、ビデオ入力デバイス、および／または他の任意の入力デバイスなどの（１つまたは複数の）入力デバイス１１４を有することもできる。ディスプレイ、スピーカ、プリンタ、および／または他の任意の出力デバイスなどの（１つまたは複数の）出力デバイス１１６を含むこともできる。
【００１５】
以降の説明では、特段の記載がない限り、１つまたは複数のコンピューティングデバイスによって実行される行為および動作の象徴的な表示を参照して、本発明について説明する。そのようなものとして、コンピュータ実行可能と呼ばれることもあるこうした行為および動作は、構造化された形式でデータを表す電気信号に対するコンピューティングデバイスの処理装置による処理を含むことは理解されよう。この処理によって、データは変換されるか、またはコンピューティングデバイスのメモリシステム内のロケーションに保持され、これによってデバイスの動作は、当業者がよく理解している方法で再構成されるか、またはその他の形で変更される。以降の説明は前述のコンテキストにおいて行うが、これは限定を意図するものではなく、以降で説明する様々な行為および動作はハードウェア内でも実施できることを当業者なら理解されよう。例えば当業者に知られている従来の技術を利用して、ＤＳＰ、プログラマブルロジックアレイなどの専用回路によってソフトウェア命令のすべてまたは一部を実行することができる。
【００１６】
データが保持されるデータ構造は、データのフォーマットによって定義される特定のプロパティを有するメモリの物理ロケーションである。プログラム命令を格納するために使用するストレージデバイスはネットワーク全体にわたって分散できることを当業者なら完全に理解されよう。例えばリモートコンピュータは、説明されているプロセスの一例をソフトウェアとして格納することができる。ローカルまたは端末コンピュータは、リモートコンピュータにアクセスし、ソフトウェアの一部または全体をダウンロードして、プログラムを実行することができる。あるいはローカルコンピュータは、必要に応じてソフトウェアの断片をダウンロードするか、または一部のソフトウェア命令をローカル端末で実行し、他のソフトウェア命令をリモートコンピュータ（またはコンピュータネットワーク）で実行することによって分散処理を行うことができる。
【００１７】
封じ込めシステムを使用できるネットワーク化された環境の一例について、図２を参照して説明する。このネットワークの例は、雲によって表されているネットワーク２１１を介して相互に通信する複数のコンピュータすなわちノード２１０を含む。ネットワーク２１１は、ルータ、ゲートウェイ、ハブなどのよく知られた多くのコンポーネントを含むことができ、ノード２１０が有線および／または無線媒体を介して通信できるようにする。ネットワーク２１１を介して相互に対話する際、１つまたは複数のノードは、他のノードに対してクライアント、ネットワークサーバ、またはピアとして機能することができる。したがって封じ込めシステムの様々な例は、たとえ本明細書に含まれる特定の例が、クライアント、ネットワークサーバ、ピア、またはその組合せのすべてに言及していなくとも、これらのタイプのコンピュータ上で実施することができる。
【００１８】
ワームの封じ込め
ワームは通常、コンピューティングシステム内に保存される可能性のあるメッセージなどの受信データを介してコンピューティングシステムに取り込まれる。受信され保存されたデータは、コンピューティングシステムのストレージ特性を悪用して、脆弱性を作り出す可能性があり、これによってワームは、攻撃および／または増殖することができる。例えば多くのワームは、脆弱なプログラムにコードを注入し、そのプログラムにそのコードを実行させる。他のワームは、新たなコードを注入するのではなく、脆弱なプログラムの実行を遠隔制御することによって、攻撃を行うことができる。
【００１９】
図３を参照すると、ワーム封じ込めシステム３００は、検出モジュール３４０、警報モジュール３５０、警報検証モジュール３６０、配信モジュール３７０、および対応モジュール３８０の１つまたは複数を含むことができる。検出モジュール３４０は、ワームによるコンピューティングシステム上の攻撃を検出することができる。検出に先立って、ワームは既知のものでも未知のものでもかまわない。必要に応じて任意のワーム検出システムを使用できることを理解されたい。ワーム封じ込めシステム３００は、様々な技術を使用する様々な検出モジュール３４０を実行することができ、それぞれの検出モジュール３４０は、１つまたは複数の技術を使用して、ワームを検出することができる。受信した情報を既知のワームを含むものとして識別すること、受信した情報を保存されている情報と比較して、変更されたファイルおよび望ましくないファイルの存在を検出し、構成の変更を検出し、および／または返信用アドレスなどのパラメータ値を検証すること、保存される見込みの情報を実際に保存されている情報と比較して、バッファの上書きを検出すること、ガードストレージセグメントによってバッファオーバーフローを検出すること、アレイバウンズチェッキングを実施して、バッファのオーバーフローおよびアンダーフローを直接検出すること、プログラムおよび／または通信パターンのランタイムをモニタし、予想された動作からの何らかの逸脱を検出すること、文字列および／またはメッセージの長さなどの既知のワームの署名がないか受信データを検査すること、動的データフロー分析などを含む適切な検出技術の任意の組合せを使用することができる。動的データフロー分析については、以降でさらに説明する。
【００２０】
ワームが検出されると、封じ込めシステムは処置を講じることができる。例えば警報モジュール３５０は警報３３０を作成し、その警報を１つまたは複数のコンピューティングシステムに送信して、検出されたワームに関する知識を共有することができる。警報モジュールは、自己認証式警報（ｓｅｌｆ−ｃｅｒｔｉｆｙｉｎｇ  ａｌｅｒｔ）を作成することができ、これは、１つまたは複数のコンピューティングシステムに送信することができ、所与のプログラムが脆弱性を有することを証明する情報を含むことができる。警報の配信は、配信モジュール３７０によって決定することができ、これによって、互いを信頼していない多数のコンピューティングシステムがワームを封じ込める際に協力できるようになる。受信された自己認証式警報は、その自己認証式警報を受信したコンピューティングシステムによって独自に検証することができる。自己認証式警報の検証は、受信側のコンピューティングシステム３２０の警報検証モジュール３６０によって実行することができる。
【００２１】
ワームを検出したおよび／または警報を受信したコンピューティングシステムは、対応モジュール３８０を介して、システムを浄化および／または保護し、ワームの有害な影響を軽減し、および／またはワームの増殖を防止するための局所的な処置を講じることができる。対応モジュール３８０によって採用される具体的な保護メカニズムは、ノードごとに異なるものとすることができ、必要に応じて実装することができる。例えばあるノードは、脆弱なソフトウェアパッケージを単に停止することができ、他のノードは、局所的な補修および／またはフィルタリングプロシージャを採用することができる。
【００２２】
動的フロー分析による検出
動的データフロー分析は、多くの異なるワームまたは同じワームの変種が脆弱性を悪用することによってターゲットのプログラムの支配権を握ることができる方法を検出することができる。したがって動的データフロー分析は、ワーム中心ではなく、脆弱性中心である。動的データフロー分析は、脆弱性を含む特定の命令のセットまたはその脆弱性を悪用するためにワームが使用する特定のアクションのセットに関する事前の知識を必要としないため、未知のワームを検出することができる。このようにして、動的データフロー分析は、未知のワームを検出することができる。ワームによって使用される多くの攻撃は、脆弱なプログラムにコードを注入し、そのプログラムにそのコードを実行させることを含む。別の一般的な攻撃メカニズムは、何らかの新たなコードを注入するのではなく、脆弱なプログラムの実行を遠隔制御することである。例えばプログラムが既にＣランタイムをロードしている場合、ワームは、ｓｙｓｔｅｍ（）関数を呼び出すよう脆弱なプログラムに強要することができる。動的フロー分析は、これら２つの感染方法ならびに他の感染方法を検出することができる。
【００２３】
動的フロー分析は、入力オペレーション時に受信されたデータ（例えば、ネットワーク接続から受信されたデータ）の経過を追跡する。動的フロー分析は、図３を参照して前述した検出モジュール３４０によって実施することができる。より詳細には、検出モジュール３４０は、情報のいくつかのストレージロケーション、例えば外部ソースから受信した情報を保存するストレージロケーションおよび／または外部ソースからの情報から得た情報を保存するストレージロケーションを「汚染されている」と識別することができる。検出モジュールは、汚染されたロケーションに保存されているデータの実行を選択的に阻止することができ、および／またはそのデータが命令ポインタにロードされるのを選択的に阻止することができる。このようにして、汚染されているデータの実行および／または命令ポインタへのロードを阻止することによって、遠隔ロードされたコードの実行および実行の遠隔制御を防止または低減することができる。命令ポインタまたはプログラムカウンタは、プログラムシーケンス内で次に実行される命令のアドレスすなわちロケーションを含むレジスタである。
【００２４】
動的フロー分析とは、保存されているデータが汚染されているか否かを追跡監視するものであり、任意の適切な方法で実行することができる。例えば外部ソースからの情報を記憶する命令を装備して、どのメモリロケーションおよび／またはＣＰＵレジスタが、入力オペレーションから受信した汚染されているデータおよび／または入力オペレーションから受信したデータから得られた汚染されているデータを含むかを追跡監視することができる。装備されるものとして選択される命令は、ロードオペレーションおよび保存オペレーションなどのデータの読み取りおよび／または書き込みを行う任意の適切な命令（例えばＭＯＶ、ＭＯＶＳ、ＰＵＳＨ、ＰＯＰ  ｏｎ  ｘ８６  ＣＰＵｓ）、算術命令および論理命令（例えばＡＤＤ、ＭＵＬ、ＸＯＲ、ＡＮＤ、ｏｎ  ｘ８６  ＣＰＵｓ）を含むことができる。すべての制御移行命令（例えばＲＥＴ、ＣＡＬＬ、ＪＭＰ  ｏｎ  ｘ８６  ＣＰＵｓ）、または適切と思われるサブセットを装備して、命令ポインタにロードされるデータ上でチェックを実施することもできる。
【００２５】
汚染されているメモリロケーションは、任意の適切な方法で追跡監視することができる。例えば汚染されているストレージロケーションは、汚染データストア内で追跡監視することができ、この汚染データストアは、汚染標識をコンピューティングデバイスのメモリの一部におけるストレージロケーションに関連付ける。メモリのその部分は、メモリロケーション、レジスタ、オフセットの表示（ｉｎｄｉｃａｔｉｏｎ）などとすることができる。
【００２６】
汚染標識は、任意の適切な標識とすることができ、関連付けられているメモリロケーションに記憶されている情報が、信頼できない外部ソースからのものであることを示し、いくつかの例では、情報を送信している他のすべてのノードを信頼できないとみなす場合もある。例えば汚染標識は２進数とすることができ、１は、関連付けられているデータが汚染されていることを示し、０は、関連付けられているデータが汚染されていないことを示す。別の例では、汚染標識は、整数または英数字の文字列などのメッセージ識別子とすることができ、汚染されている情報のメッセージおよび／またはソースを示す。このようにして、汚染標識は、データが汚染されている場合は一意のメッセージ標識に相当することができ、データが「汚染されていない」場合は、空値や「０」などのデフォルト値に相当することができる。別の例では、汚染標識は、メッセージとメッセージ内のオフセットの両方を示す識別子とすることができる。別の例では、汚染標識は、汚染されている情報のメッセージ／ソースにおける値から汚染されているメモリ部分における値を計算するために使用された一連の命令の全シーケンスまたは関連する部分を含むデータフローグラフの識別子とすることができる。
【００２７】
汚染されている、または汚染されていない関連付けられたメモリ部分のロケーションは、関連付けられた汚染標識によって示されるように、任意の適切な方法で示すことができる。一例では、汚染標識は、メモリ内の特定のロケーションを示すメモリロケーション標識に関連付けることができる。別の例では、汚染標識のベクトル内の汚染標識の配置によってメモリロケーションを示すことができる。例えば汚染標識のベクトルまたはアレイ内の第１の汚染標識は、（スタックの最上部などの）第１のメモリロケーションを示すことができ、第２の汚染標識は、（スタックの最上部から２番目のロケーションなどの）第２のメモリロケーションを示すことができる、といった具合である。
【００２８】
一例では、それぞれのメモリロケーションは、汚染データストア内の汚染標識によって追跡監視することができる。汚染データストアの一例３９０が、図３に示されている。例えばメモリページ、メモリページ内の個々のメモリロケーション、ＣＰＵレジスタなど、コンピューティングデバイス内のメモリの任意のタイプまたは部分を追跡監視することができる。
【００２９】
メモリの各ページは、メモリの各ページをページ汚染標識に関連付けることによって追跡監視することができる。メモリのページは、４ＫＢのメモリセグメントなど、メモリの任意のセグメントとすることができる。ページ汚染標識は、メモリページ内の少なくとも１つのメモリロケーションが汚染されているかどうかを示すことができる。ページ汚染標識が、ページ内の少なくとも１つの汚染されているメモリロケーションを示している場合、その汚染されているページ内のそれぞれのメモリロケーションをメモリロケーション汚染標識に関連付けることができる。メモリロケーション汚染標識は、（ベクトル内の位置によって、または他の適切な方法で示されている）関連付けられているメモリロケーションに含まれる情報によって、そのメモリロケーションが汚染されているか否かを示すことができる。このようにして、各メモリページはページ汚染標識に関連付けることができ、汚染されている情報をメモリロケーション単位で追跡することによって、汚染されている情報を含むページのみをメモリロケーションへとさらに区分することができる。
【００３０】
図４は、データ構造の例４１０、４２０を示しており、これによって検出モジュールは、どのメモリロケーションが汚染されているか（例えば、入力オペレーションから受信したデータを含んでいるか）を追跡監視することができる。ページ汚染データストア４１０は、関連付けられているメモリページが汚染されているか否かを示すページ汚染標識のベクトルを含むことができる。例えば図４に示されているように、第１のメモリページは、ページ汚染標識値４１２によって示されているように、汚染されていない可能性があり、第２のメモリページは、ページ汚染標識値４１４によって示されているように、汚染されている可能性がある。このように、ページ汚染データストア４１０は、ページ内のいずれかのロケーションが汚染されている場合に設定される４ＫＢのメモリページごとに１ビットを有するベクトルビットマップである。
【００３１】
ページ汚染データストア４１０内に示されている汚染されたすべてのページについて、図４に示されているように、汚染されたページを示すページ汚染データストアのページ汚染標識に、さらなるメモリロケーション汚染データストア４２０を関連付けることができる。メモリロケーション汚染データストア４２０は、汚染されているページ内の関連付けられているメモリロケーションが汚染されているか否かを示すメモリロケーション汚染標識のベクトルを含むことができる。例えば図４に示されているように、第２のページは、ページ汚染標識４１４の値によって示されているように、汚染されているデータを含む。メモリロケーション汚染データストア４２０は、ページ汚染標識４１４に関連付けることができる。メモリロケーション汚染データストア４２０は、その特定のページにおいてどのメモリロケーションが汚染されていないか、および／または汚染されているかを示すメモリロケーション汚染標識４２２、４２４のベクトルを含むことができる。図４に示されているメモリロケーション汚染データストアの例では、メモリロケーション汚染標識値４２２によって示されているように、第１のメモリロケーションは汚染されていない可能性があり、メモリロケーション汚染標識値４２４によって示されているように、第２のメモリロケーションは汚染されている可能性がある。このように、メモリロケーション汚染データストア４２０は、関連付けられているページ上の関連付けられているメモリロケーションが汚染されている場合に設定されるメモリロケーションごとに１ビットを有するベクトルビットマップである。メモリロケーション汚染データストアは、例えばページ、ワード、および／またはバイトの精度で汚染標識を保持することによって、汚染されているメモリロケーションを任意の適切な精度で追跡監視することができる。同様に、汚染されているメモリロケーションを示すメモリロケーション汚染標識に、さらなるメモリロケーション汚染データストアを関連付けることができる。このさらなるメモリロケーション汚染データストアは、例えば情報のそれぞれのバイトごとなど、より細かいレベルの精度で、汚染されているメモリロケーションを示すことができる。
【００３２】
図４に示されているように、ページ汚染標識はページ汚染データストア４１０内に保存することができ、メモリロケーション汚染標識はメモリロケーション汚染データストア４２０内に保存することができる。あるいは、メモリ部分の精度のそれぞれのレベルごとに別々のデータストアを使用するのではなく、次に細かい精度のレベルで汚染標識のベクトルを含む汚染されているメモリ部分を示す汚染標識を有する単一のデータストアを使用することができる。例えばページ汚染標識は、汚染データストア内にアレイとして保存することができる。汚染されていないページを示すページ汚染標識は、０や空値などの任意の適切な標識とすることができる。汚染されている値を示すページ汚染標識は、そのページのどのメモリロケーションが汚染されているか、またどのメモリロケーションが汚染されていないかを示す標識値のベクトルを含むビットマップとすることができる。
【００３３】
図５に示されている汚染データストアの例５１０では、ページ汚染標識値５１２によって示されているように、第１のメモリページは汚染されていない可能性があり、ページ汚染標識値５１４によって示されているように、第２のメモリページは汚染されている可能性がある。ページが汚染されていることを示す汚染ページ標識は、関連付けられているメモリロケーションが汚染されているか否かを示すメモリロケーション汚染標識のベクトルを含むことができる。このように、汚染データストア５１０は、ページが汚染されていない場合はメモリページごとに１ビットを有するアレイビットマップであり、ページが汚染されている場合はメモリロケーション汚染標識のベクトルである。例えば図５に示されているように、第２のページは、ページ汚染標識の値５１４によって示されているように、汚染されているデータを含む。ページ汚染標識の値５１４は、そのページ内のどのメモリロケーションが汚染されているか、またどのメモリロケーションが汚染されていないかを示すことができる。例えば図５に示されているように、メモリロケーション汚染標識値５４２は、このページに含まれる第１のメモリロケーションが汚染されていないことを示し、メモリロケーション汚染標識５４４は、関連付けられているメモリロケーションが汚染されていることを示している。
【００３４】
動的データフロー分析は、追加および／または代替として、ＣＰＵレジスタ内に保存されているデータを汚染されていないもの／汚染されているものとして追跡監視することができる。例えばメモリの各レジスタは、レジスタ汚染データストア内のレジスタ汚染標識によって追跡監視することができる。レジスタ汚染標識は、保存されている情報のソースによって、関連付けられているメモリのレジスタが汚染されているか否かを示すことができる。前述のように、追加および／または代替として、例えばレジスタ内のそれぞれのバイトごとに汚染標識を保持することによって、レジスタよりも細かい精度で追跡監視を行うこともできる。
【００３５】
図１４は、データストアの一例１４００を示しており、これによって検出モジュールは、どのレジスタが汚染されているか（例えば、入力オペレーションから受信された（得られた）データを含むか）を追跡監視することができる。レジスタ汚染データストア１４００は、レジスタ汚染標識のベクトルを含むことができる。例えば図１４に示されているように、第１のＣＰＵレジスタは、レジスタ汚染標識値１４２２によって示されているように、汚染されていない可能性があり、第２のＣＰＵレジスタは、レジスタ汚染標識値１４２４によって示されているように、汚染されている可能性がある。このように、レジスタ汚染データストア１４００は、関連付けられているページ上の関連付けられているＣＰＵレジスタが汚染されている場合に設定されるＣＰＵレジスタごとの１ビットを有するベクトルビットマップである。
【００３６】
ここまでメモリページ、メモリロケーション、およびレジスタの例について説明したが、前述のような動的データフロー分析を使用して、メモリの任意のタイプ、部分、および／またはフォーマットを追跡監視できることを理解されたい。
【００３７】
前述のように、汚染標識は、関連付けられているメモリ部分が汚染されていない／汚染されていることを示すだけでなく、メモリ部分に保存されている情報のソースおよび／または由来の経路を示すこともできる。汚染されているメモリ部分に保存されている情報のソース、計算、または由来は、オプションのオフセット表示（ｏｆｆｓｅｔ  ｉｎｄｉｃａｔｉｏｎ）を有する入力メッセージ識別子や、汚染されているメモリロケーションにおける値を計算するために使用される命令のシーケンスを含むデータフローグラフなど、任意の適切な方法で示すことができる。また汚染標識は、命令内で操作される値のソースを示すこともできる。
【００３８】
図１８は、汚染データストアの一例１８００を示しており、これによって検出モジュールは、どのメモリロケーションおよび／またはレジスタが汚染されているか（例えば、入力オペレーションから受信されたすなわち得られたデータを含むか）と、汚染されているデータのソースとを追跡監視することができる。図１８に示されているように、汚染標識値１８１２などの汚染標識は、そのロケーションにおける関連付けられているデータが汚染されていないことを空値などの任意の適切な方法で示すことができる。汚染標識値１８１４は、相関付けられたロケーションに保存されている関連付けられたデータが汚染されていることを示すことができ、汚染されている情報のソースを示すことができる。例えば図１８に示されているように、汚染標識値１８１４はデータフロー図を含むことができ、このデータフロー図は、関連付けられたメモリロケーションに記憶されているデータが、信頼できないソースからの汚染されている入力データから得られたものであることを示し、関連付けられたメモリ部分に記憶されているデータが、汚染されている入力データからどのようにして得られたかを示す。このデータフローグラフは、入力値、入力データのソースメッセージ、入力データのメッセージ内のオフセット、現に保存されているデータを得るために入力データに適用された命令などを示すことができる。図１８に示されているように、汚染標識値１８１４はデータフローグラフ１８１６を示すことができる。図１８のデータフローグラフ１８１６は、入力データ１８１８が、ｍｅｓｓ＿１というメッセージ識別子を有するメッセージ内に０のオフセットを有することを示している。データフローグラフは、入力データに適用される演算および／または命令を示すことができる。図１８に示されているように、入力値１８１８と、２の値として示されている値１８２４とを使用して、加算演算１８２０を実行する。乗算演算子１８２８によって、加算演算の結果に値１８２６をかけることができる。このようにデータフローグラフは、関連付けられているメモリロケーションが、汚染されているデータ、例えば入力データ１８１８からどのようにして得られたかを示している。
【００３９】
図４のページ汚染データストア４１０およびレジスタ汚染データストア４２０、図５の汚染データストア５１０、図１４のレジスタ汚染データストア１４００、ならびに図１８の汚染データストア１８００など、（１つまたは複数の）汚染標識を保存する（１つまたは複数の）汚染データストアは、コンピューティングデバイスのメモリ内の１つまたは複数の任意の適切なデータストア内に格納することができる。リレーショナルデータベース、オブジェクト指向データベース、非構造化データベース、インメモリデータベース、シーケンシャルメモリ、あるいは他のデータストアなど、任意の適切なフォーマットの任意の適切なデータストアを使用して、汚染データストアの情報を保存し、および／または検出モジュールに伝達することができることを理解されたい。ＡＳＣＩＩテキストなどのフラットファイルシステム、バイナリファイル、通信ネットワークを介して伝送されるデータ、または他の任意のファイルシステムを使用して、ストレージアレイを構築することができる。前述のデータストアのこうした考えられる実施例にもかかわらず、本明細書で使用されるデータストアおよびストレージアレイという用語は、コンピュータによってアクセス可能な任意の方法で収集および保存される任意のデータを指す。
【００４０】
レジスタ、ページ、メモリロケーションなどのための汚染標識は、任意の適切な時点で作成することができる。例えば入力オペレーションを実行する（例えばネットワーク接続からのデータを受信および／または操作する）たびに、結果として生じるデータを書き込むメモリロケーションおよび／またはレジスタに汚染標識を表示することができる。図３を参照すると、検出モジュール３４０は、［ＭｏｖｅＤａｔａ  ｄｅｓｔｉｎａｔｉｏｎ，ｓｏｕｒｃｅ］という形式の命令が実行されるたびに、メモリの関連付けられている部分用に１つまたは複数の汚染標識を作成することができる。より詳細には、汚染されているソースからのデータが書き込み先に書き込まれるたびに、書き込み先のメモリ部分、例えばメモリロケーション、レジスタなどを汚染されているものとして表示することができ、それ以外の場合は、書き込み先のメモリ部分を汚染されていないものとして表示することができる。命令またはシステムコールが、信頼できない外部ソースからのデータを書き込み先に書き込む際、書き込み先のメモリ部分を汚染されているものとして表示することができる。命令ＭｏｖｅＤａｔａは、一般化された命令であり、何らかの特定のＣＰＵ内に存在するものではなく、コンピューティングデバイスのメモリ内でデータを操作できる任意の数および／または組合せの命令を含むことができる。例えばＭｏｖｅＤａｔａ命令は、オペランドがレジスタまたはメモリであるｘ８６  ＭＯＶ命令と、書き込み先が、ＥＳＰレジスタによって指し示されているメモリロケーションであり、別のレジスタがオペランドであるＰＵＳＨオペレーションとを含むことができる。他の例は、ＭＯＶ、ＭＯＶＳ、ＰＵＳＨ、ＰＯＰなどのロードおよび保存オペレーションを含むことができる。他の例は、ＡＤＤ、ＭＵＬ、ＡＮＤ、ＸＯＲなどの算術命令および論理命令を含むことができる。算術命令または論理命令が実行されることによってメモリロケーションが汚染されるたびに、汚染標識は、メモリロケーションを汚染させる命令のシーケンスの全体または一部を含むことができる。上記はｘ８６  ＣＰＵに特有の例だが、他のコンピューティングデバイスによって実行される他のオペレーションおよび／または命令が適切な場合もあることを当業者なら理解されよう。
【００４１】
動的データフロー分析を使用してワームの存在を検出するために、データが実行され、および／または命令ポインタにロードされる前にデータを検査することができる。このようにして、動的データフロー分析は、ワームが支配権を握る前に実行を阻止することができる。具体的には、実行の制御が不正なロケーションへリダイレクトされつつあるときに検出を行うことができる。例えば命令が実行される前に、適切な汚染データストアを検査して、実行されるデータを保存するメモリ部分用の（１つまたは複数の）関連付けられている汚染標識を確認し、汚染されていないことを確かめることができる。データを保存するメモリロケーションが汚染されていることを汚染標識が示している場合、命令の実行を停止することができ、ワームの存在を検出することができる。同様に、データがメモリの部分から命令ポインタへロードされる前に、データのそのメモリ部分用に関連付けられている汚染データストアを検査することができる。そのデータが、信頼できないソースから来たすなわち得られたものであることを、その関連付けられているメモリ部分用の汚染標識が示している場合、ポインタ値を命令ポインタへロードせずに、ワームの存在を検出することができる。この最後の検査によって生じる可能性のある偽陽性をいくらかでも減らすために、検出モジュールは、命令ポインタへロードされつつある値で値域の比較（例えば値が所与の定数よりも小さいかどうかのチェック）または論理演算（例えば所与のビットパターンとのＡＮＤ）が行われなかったことをさらに確認することができる。検出モジュールは、以降で説明する脆弱性検証プロシージャを使用して、偽陽性を示さずにワームの存在が正しく検出されるようにすることもできる。
【００４２】
動的データフロー分析の検出は、現在利用可能なツールの大半が既知のターゲットを保護するように設計されているのに対して、未知の攻撃のターゲットを保護できるため、非常に汎用性が高い。前述のような動的データフロー分析を実施する検出モジュールは、何らかの特定のデータ構造の上書きを検出することに依存するのではなく、実行されつつある、または命令ポインタへロードされつつあるデータのソースを辿ることができる。例えばスタックを保護するように設計されているツールも複数あるが、攻撃者は、関数ポインタまたはｓｅｔｊｍｐバッファをターゲットにすることを選択して、このタイプの保護を迂回することができる。いずれにしても、攻撃者は、実行中のプログラムに何らかのデータを入力しなければならないわけであり、これは、動的データフロー分析がその攻撃を検出できることを意味している。実際に、動的データフロー分析は、攻撃のターゲットが非常に識別しづらい問題を検出できる場合がある。
【００４３】
例えば図１７に示されているソースコードリスト１７００などのプログラムは、ネットワーク接続からデータをロードし、そのデータを第２のバッファへコピーすることができる。このプログラムは、そのバッファを含むページ上のページ保護許可を変更して、実行を可能とし、そのバッファへジャンプすることができる。この問題は、プログラムのスタックには何のダメージもなく、バッファオーバーランもないため、スタックを保護するツールや他のいかなるプログラムデータ構造によっても検出されない。この問題は、ページ上の実行許可を強制するプログラムがＣＰＵ内で実行されても、プログラムがページ許可を明確に変更しているため、検出されない。しかしバッファ内のデータは、もともとネットワーク接続上の入力オペレーションを介してプログラムのアドレス空間に入り込んだものであるため、前述のような動的データフロー分析は、この問題を検出することができる。この例は、少し不自然ではあるが、プログラムに含まれる可能性のある不特定のエラーの種類を示している。
【００４４】
検出モジュールによって実施される動的フロー分析は、大半の保護ツールが行うようなソースコードへのアクセスを必要としない場合もあることを理解されたい。この検出メカニズムは、他の複数の方法で実施することができる。これは、ページ許可を使用してメモリアクセスを追跡監視することによってインタープリテーションの下でＣＰＵエミュレータ内においてプログラムを実行することによって、バイナリインスツルメンテーション技術を使用することによって、またはオペレーティングシステムデバッギングインターフェースを使用してプログラムの実行を制御することによって、実施することができる。さらに場合によっては、実行されるすべての命令上で実行環境が制御を維持できる限り、前述のような動的データフロー分析は、自己書き換えコードおよび動的に作成されるコード（例えば、ジャストインタイムのコンパイル環境で作成されるコードなど）の中でさえセキュリティの問題を検出することができる。プログラムがインタープリテーション環境内で実行される場合、すべての命令上で制御を維持することは取るに足りないことだが、自己書き換えコードをサポートするバイナリリライタも存在する。
【００４５】
動的フロー分析は、システムの既知の脆弱性および／またはワームを含むメッセージの特徴を定義することに依存しないため、前述の動的フロー分析は、既知および／または未知のワームを検出することができる。その上、動的フロー分析を実施する検出モジュールは、スピードの遅いワームおよび／または通常のトラフィックを装っているワームを検出することができる。ワームが通常のアプリケーショントラフィック上だけに乗っている場合でさえ、動的フロー分析を使用する検出モジュールは、そのワームを検出することができる。その上、動的フロー分析を実施する検出モジュールは、多形態性および／またはメタモーフィック型のワームを検出することができる。暗号化を含む一般的な錯乱技術を使用するワームミューテイションエンジンが、広く普及している。したがって今後のワームは、これらのツールを広く使用することができ、動的フロー分析を使用せずに検出することは、ますます困難になる。
【００４６】
動的データフロー分析を実施する検出モジュールを拡張して、システムコールのパラメータを上書きすることによってターゲットのプログラムの支配権を握るワームを検出することができる。このようなワームは、例えばプロセスを作成するシステムコールのパラメータを上書きし、他のワームのインスタンスからのコマンドを受け入れるプログラムを起動することができる。検出モジュールは、システムコールが、汚染されている引数、例えば汚染されているメモリロケーションに保存されている引数を使用していること、およびそれらの引数がシステムによってチェックされていないこと、すなわち汚染されている引数上で行われる論理演算（例えば、特定の値または値の範囲との比較）が、それらを安全な値に限定する上で不十分であることをチェックすることによって、このような攻撃を検出することができる。例えば検出モジュールは、ワームが、ターゲットのシステム上に保存されている任意のプログラムを起動するようターゲットのプログラムに強要することができると結論付けることができる。
【００４７】
検出モジュールは、複数の検出メカニズムを実装することができ、ネットワーク内の１つまたは複数の異なるノードのそれぞれの検出モジュールは、様々な検出技術を実装することができる。例えば検出モジュールは、前述のデータフロー分析の検出メカニズムを１つまたは複数の他の検出メカニズムと共に実装することができる。それぞれの検出メカニズムごとに複数の実施例が存在することもできる。このように、検出メカニズムのタイプと実施例の双方において多様性を実現することができる。追加および／または代替の検出メカニズムの例は、動的データフロー分析よりも汎用性は低いが重大な攻撃を検出できる検出メカニズムを含むことができる。
【００４８】
このような簡単な技術の１つは、すべてのＲＥＴ命令が実行可能ページに制御を渡すのを検出することである。多くのワームが、スタックを上書きし、そのスタックを上書きしたデータ（これは通常、実行許可を有するメモリの領域にはない）へジャンプするという簡単な技術を使用しているため、この検出メカニズムが有効となる場合がある。この技術は、バイナリリライティングを使用して、すべてのＲＥＴ命令をターゲットの実行可能ページ上に装備することによって、実装することができる。スタックを保護するために、多くの他の技術を使用することができる。
【００４９】
追加および／または代替の検出メカニズムの別の例は、すべてのＣＡＬＬおよび／またはＲＥＴ命令を装備することによって、シャドースタックを保持することができる。このシャドースタックは、基本的には通常のスタックのコピーだが、異なるメモリロケーションに保持され、これによって、すべてのＲＥＴにおいてスタックのインテグリティをチェックすることができる。
【００５０】
受信した情報を既知のワームを含むものとして識別すること、受信した情報を保存されている情報と比較して、変更されたファイルおよび望ましくないファイルの存在を検出し、構成の変更を検出し、および／または返信用アドレスなどのパラメータ値を検証すること、保存される見込みの情報を実際に保存されている情報と比較して、バッファの上書きを検出すること、ガードストレージセグメントによってバッファオーバーフローを検出すること、アレイバウンズチェッキングを実施して、バッファのオーバーフローおよびアンダーフローを直接検出すること、プログラムおよび／または通信パターンのランタイムをモニタし、予想された動作からの何らかの逸脱を検出すること、文字列および／またはメッセージの長さなどの既知のワームの署名がないか受信データを検査すること、動的データフロー分析などを含む他の追加および／または代替の検出メカニズムを検出モジュールによって実装して、ワームやウイルスなどの存在または危険を検出できることを理解されたい。
【００５１】
作動中、図３の検出モジュール３４０などの検出モジュールは、ワームを検出する方法を実施することができる。図６は、ワームを検出する方法の一例６００を示している。６０２において、図１を参照して説明したコンピューティングデバイスなどによって、データを操作するための命令を受け取ることができる。前述のように、データを操作するための命令は、データの移動、結合、転送、ロードなどを行う任意の命令とすることができる。６０４において、コンピューティングデバイスの適切なローカルアプリケーションやオペレーティングシステムなどによって、指示どおりにデータを操作することができる。データの操作は、６０６においてデータの少なくとも一部、またはデータの操作された部分（例えばデータの派生物）をメモリロケーションおよび／またはレジスタに保存することを含むことができる。メモリは、コンピューティングデバイスのメモリのスタック、バッファ、または他の任意の部分の一部とすることができる。保存されるデータのロケーションは、６０８において任意の適切な方法で決定することができる。６１０では、データのソースを検査して、情報を保存しているメモリ部分が「汚染されている」か「汚染されていない」かを判定することができる。保存されている情報が、信頼できないソースから得られたものである場合、メモリ部分は汚染されている。同様に、データが、信頼できるソースから来たものであるか、および／または他の汚染されていないデータから得られたものである場合、そのデータは汚染されていないとみなすことができる。
【００５２】
データが汚染されていない場合、６１２において、そのデータが汚染されていないことを示す汚染標識値を設定することができる。前述のように、汚染されていないデータを示す汚染標識は、「０」の値や空値などを含む任意の適切な標識とすることができる。
【００５３】
決定された汚染標識値は、６１４において、その汚染標識値を図３の汚染データストア３９０などの汚染データストア内に保存することなどによって、保存されているデータのメモリ部分に関連付けることができる。汚染データストアは、初期設定するか、および／またはデフォルトの汚染標識値を投入することができる。より詳細には、最初はすべてのメモリ部分を汚染されているメモリ部分とみなすか、および／または汚染されているメモリ部分を示す汚染標識に関連付けることができ、汚染されていないデータが明確に判定され、関連付けられたメモリ部分に保存された場合に、「汚染されていない」へ意識的に変更することができる。別の例では、最初はすべてのメモリ部分を汚染されていないとみなすか、および／または汚染されていない旨を示す汚染標識に関連付けることができ、汚染されているデータが明確に判定され、関連付けられたメモリ部分に保存された場合に、「汚染されている」へ意識的に変更することができる。汚染データストアは任意の適切な値に初期設定できることを理解されたい。さらに前述のように、汚染データストアは、それぞれのメモリレジスタ、メモリページ、メモリロケーションなどに関連付けられている１つまたは複数の汚染標識を有する１つまたは複数のデータストアを含むことができる。
【００５４】
データが汚染されている場合、６１２において、判定されたロケーションのデータが汚染されていることを示す汚染標識値を設定することができる。前述のように、汚染されているデータを示す汚染標識は、「１」の値または一意の作成元識別子、例えばデータのソースに関連付けられたメッセージ識別子、現に保存されているデータに入力を提供するデータ用のメモリロケーション、メッセージ内のオフセットと結合したメッセージ識別子、保存されているデータを計算する際に使用される命令のすべてまたは一部を含むデータフローグラフなどを含む任意の適切な標識とすることができる。保存されているデータが、別の汚染されているメモリ部分に保存されている他の「親」データから得られたものである場合は、「親」データと同じ作成元標識、親データのメモリロケーション、受け取った命令とその命令のオペランドのデータフローグラフとを結合することによって作成されるデータフローグラフなどとすることができる。決定された汚染標識値は、６１４において、その汚染標識値を適切な汚染データストア内に保存することなどによって、保存されているデータのメモリ部分（例えばロケーションまたはレジスタ）に関連付けることができる。例えばメモリロケーションが汚染されていると判定された場合、汚染されているデータを示すメモリロケーション汚染標識を設定することができ、および／またはメモリの汚染されているページを示すページ汚染標識を設定することができる。
【００５５】
場合によっては、システムコールの引数を悪用するワームの存在を検出するために、この方法は、汚染されているメモリ部分がシステムコールに対する引数としていつ使用されるかを判定することができる。より詳細には、６１６において、システムコールを実行するための命令を受け取ることができる。６１８では、システムコールの引数として渡されるデータのメモリ部分を割り出すことができる。６２０において、割り出された（１つまたは複数の）メモリ部分に関連付けられている汚染標識を検査することができる。例えば前述のように、汚染標識を各メモリ部分に関連付けて、保存されている情報が汚染されているか否かを示すことができる。ロードされるデータが「汚染されていない」ことを汚染標識が示すと、場合によっては、受け取った命令を６３６において実行することができ、例えば情報をロードすることができる。場合によっては、様々な検出メカニズムを含めるために、他の検出技術を用いて命令および／またはデータをさらに検査して、６３４においてワームやウイルスなどの存在を検出することができる。
【００５６】
場合によっては、ワームの存在を検出するために、この方法は、汚染されたメモリ部分に保存されているデータが、ワームの存在を示す方法でいつ操作されるかを判定することができる。より詳細には、６２２において、実行フローを変更するための命令を受け取ることができる。６２４では、命令ポインタへロードされる値を保存するメモリ部分を割り出すことができる。６２６において、割り出された（１つまたは複数の）メモリ部分に関連付けられている汚染標識を検査することができる。命令ポインタへロードされる値を保存するメモリ部分が汚染されていることを汚染標識が示すと、前述のように６２６において適切な処置を講じることができる。ロードされる値を保存するメモリ部分が「汚染されていない」ことを汚染標識が示すと、場合によっては、受け取った命令を６３６において実行することができ、値がロードされる。場合によっては、ロードされる値のメモリ部分が汚染されていないことが示されると、ロードされる値によって示される命令のロケーションを６２８において割り出すことができ、その命令を保存するメモリ部分が汚染されているか否かを判定するために６３０において検査することができる。命令を保存するロケーションが汚染されている場合、６２６において適切な処置を講じることができる。ロケーションが汚染されていないことが示されると、他の検出技術を用いて命令および／またはデータをさらに検査して、６３４においてワームやウイルスなどの存在を検出することができる。ロードされる値のストレージロケーションおよびその値によって示される命令が汚染されていないことを汚染標識が示した場合、６３６においてその命令を実行することができる。
【００５７】
操作されるデータが「汚染されている」ことを汚染標識が示した場合、６２６において適切な処置を講じることができる。前述のように、ワームの検出に対応する適切な処置は、脆弱なプログラムを停止すること、ホストシステムを停止すること、警報メッセージを作成して送信すること、脆弱性用のパッチおよび／またはフィルタを作成することなどを含むことができる。
【００５８】
自己認証式警報（「ＳＣＡ」）
場合によっては、単一のノードは、それ自体を保護するための検出モジュールを含むことができる。しかしワームの検出は、計算負荷の高いプロセスとなる場合がある。したがって場合によっては、図２に示されているネットワークなどのネットワークの１つまたは複数のノードは、ワーム、脆弱性、および／または攻撃を検出することができ、ネットワーク内の１つまたは複数のノードに警報を与えることができる。中心となるノードが多くの他のノードを代表してワームを検出する場合、この検出システムはサーバ中心となることができる。このようにして、ワームを検出する負荷は、専用のシステムによって負担することができる。あるいはネットワーク内のノードのすべてまたはサブセットが、脆弱性の検出を担当することもでき、この場合、検出システムはホスト中心となることができる。脆弱性を検出するネットワーク内のノードのセットは、固定することもでき、あるいは時間の経過と共に変更することもでき、任意の時点で参加することも離脱することもできる。サーバ中心の検出システムとホスト中心の検出システムを組み合わせることによって、ネットワークの様々なノードの間に様々な検出システムを実装することができ、検出の結果を相互におよび／またはネットワーク内の他のノードに伝達することができる。
【００５９】
検出メカニズムがワームの攻撃を検出するたびに、ソフトウェアプログラムの脆弱性および／または識別されたワームの特徴（例えばメッセージソースなど）を特定する警報を作成することができる。例えばこの警報は、受信データとしてのワームの特徴を介して（ワーム中心）、および／またはワームによって悪用される可能性のあるソフトウェアアプリケーションの脆弱性を介して（脆弱性中心）、ワームを識別することができる。警報の作成は、自動または手動とすることができ、検出された脆弱性および／またはワームに応じて行うこともできる。警報は、図３に示されているように、検出モジュール３４０からの入力に応答して警報モジュール３５０を介するなどして、任意の適切な方法で作成することができる。
【００６０】
場合によっては、警報は、受信側のシステムが警報メッセージの作成元および／または内容の信頼性を認証できるように作成することができる。警報の作成元を認証するために、その警報に電子署名して、その警報が信頼できるソースから来たものであることを識別できる場合とできない場合がある。警報内に示されているプログラムの脆弱性を認証するために、警報は、その脆弱性がどのように誘発されるかを記述したイベントのリストおよび／またはプログラムパスなどを含むことができる。一例では、自己認証式警報は、ソフトウェアの脆弱性を識別および／または記述する機械で検証できる証明を含むことができる。このように、自己認証式警報は、受信者が感染プロセスを再現することによって警報における脆弱性の申し立ての信頼性を効率的および／または効果的にチェックできるようにする情報を含むことができる。自己認証式警報は、テキストの記述、脆弱性を示す非決定性のイベントの完全なおよび／または部分的なログ、参照によって本明細書に組み込まれるNecula et al., "Safe Kernel Extensions without Runtime Checking," 2nd Symp. On Operation System Design and Implementation, Oct. 1996, pp. 229-243（非特許文献１）によって説明されている証明を搬送するコードを含めることなどを介して、任意の適切な方法でソフトウェアシステム内の脆弱性について記述することができる。例えば非決定性のイベントのログは、受信したデータを含むことができ、検出された攻撃の瞬間までのイベント、例えば汚染されたメモリ部分に保存されているデータの実行および／または汚染されたメモリ部分からデータをプログラムカウンタへロードすることを示すことができる。
【００６１】
ソフトウェアの脆弱性に関する記述を使用して、警報を自己認証することができる。これは、識別されたソフトウェアアプリケーションが、ワームの攻撃に対するソフトウェアの脆弱性を示す指摘された方法で対応することを受信側コンピューティングデバイスが検証できるためである。このように、この警報は、その警報内に含まれる情報および受信側のノードに知られている情報に基づいて（例えば、ローカルアプリケーションの対応の検証を介して）認証できるため、自己認証することができる。このように自己認証式警報は、脆弱性中心ではなく、ワーム中心とすることができる。
【００６２】
検出されたプログラムの脆弱性については、非決定性のイベントのリストとして自己認証式警報内で記述することができる。より詳細には、脆弱なプログラムの実行は、区分的な決定性のプロセスとしてモデル化することができる。実行とは、インターバルのシーケンスであり、各インターバルは非決定性のイベント（例えばメッセージの受信）から始まり、決定性のイベントのシーケンスが後に続く。インターバル内の実行は決定性であり、例えばプログラムの対応は、現在の状態によって完全に決定される。このように、非決定性のイベントをすべて記録することによって、実行を再現できるようになり、これによってプログラムの脆弱性を示すことができる。識別されたプログラムの脆弱な動作を示す実行を再現することによって、ノードは自己認証式警報の信頼性をチェックできるようになる。
【００６３】
図７は、脆弱性中心である自己認証式警報の一例７００を示している。自己認証式警報は、任意の適切なフォーマットおよび／または任意の適切なメッセージプロトコルに基づくことができる。自己認証式警報は、プログラム識別子７０２およびイベントリスト７０４を含むことができ、脆弱性タイプ識別子７０６、１つまたは複数の検証ヒント７０８、および／または対応標識７１０を任意選択で含むことができる。
【００６４】
プログラム識別子７０２は、検出された脆弱性を有するプログラムまたはアプリケーションを識別することができる。プログラム識別子７０２は、製品名、事前に設定された名前、バージョン番号、製造業者名など、脆弱なプログラムの任意の適切な識別子の任意の１つまたは複数を含むことができる。
【００６５】
イベントリスト７０４は、実行されるとプログラムを不許可の状態にする１つまたは複数の非決定性のイベントのシーケンスである。イベントリストを再現することによって、検出されたプログラムの脆弱性を説明および／または指摘することができる。イベントリスト７０２内のイベントのシーケンスは、任意の適切な方法で作成することができる。ともに参照によって本明細書に組み込まれているDunlap et al., "Revirt: enabling intrusion analysis through virtual-machine logging and replay," Operating Syst. Design and Implementation, Boston, Massachusetts, December 2002（非特許文献２）および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（非特許文献３）によって説明されている技術など、非決定性のイベントを記録する技術は、フォルトトレランスに関する文献においてさらに説明されている。
【００６６】
イベントのシーケンスは、前述の動的フロー検出技術の間に記録されるイベントなど、検出プロセスの間に記録されるイベントを含むか、またはそうしたイベントから得ることができる。イベントリスト内のイベントのシーケンスは、図３の検出モジュール３４０によって記録されるイベントなど、攻撃の間に実際に記録されるイベントと一致する場合もあり、一致しない場合もある。自己認証式警報を作成するノードは、不許可の状態に達する上で不要なイベントを削除することや、ワームコードの部分を無害な値に置き換えることなどを含む任意の適切な方法で、記録されたイベントを修正することができる。イベントリスト７０２内の非決定性のイベントのシーケンスは、任意の適切なフォーマットを取り、および／または任意の適切な命令または他のデータを含むことができる。例えばイベントリストは、オペレーティングシステムコールからの結果のリストおよび／または受信したメッセージのリストを含むことができる。ワームは、脆弱なプログラムとの長い対話を必要としない脆弱性を悪用できるため、非決定性のイベントのシーケンスは非常に短くなる場合がある。より詳細には、脆弱な動作は少量のデータで誘発することができる。例えば、これまでの多くのワームにとっては、１つの受信イベントだけで十分な場合もある。
【００６７】
動的フロー分析を使用してワームを検出するために、検出モジュール３４０は、ワームが支配権を握る前に実行を阻止する。具体的には、実行の制御が不正なロケーションへリダイレクトされつつあるとき、例えば汚染されたメモリ部分からデータが実行されつつあるとき、または命令ポインタへロードされつつあるときにワームの攻撃を検出することができる。警報内のイベントリストのサイズを制限するために、もしも検出が介在しなかったならば実行されていたかまたはプログラムカウンタへロードされていたであろう汚染されたメモリ部分に保存されているデータを含むイベントを探して、非決定性のイベントのログを検索することができる。多くの場合、脆弱性は１つのイベントだけで誘発することができ、自己認証式警報は、この検索結果のイベントのみを含むことができる。一例では、汚染されているデータ、例えば不正なアドレスを探して、完全なログを検索することができる。別の例では、検出モジュールの検出メカニズムを参照して前述したデータフロー分析を使用して、検索を回避し、誤った一致の発生を減らすことができる。動的フロー分析は、すべての入力イベントから追跡監視する完全なデータフローを提供できるため、実行されつつあったかまたはプログラムカウンタへロードされつつあった汚染されたデータの値を決定する１つまたは複数の正確な入力イベントを割り出すことができる。例えばデータフローの追跡監視によって、ワームの攻撃において使用される情報を持ち込む外部ソースからの特定のメッセージ、脆弱性を悪用できる（１つまたは複数の）入力イベント、ならびに／あるいは入力データ内のデータおよび／または命令のオフセットを識別することができる。
【００６８】
入力イベントを割り出すために、入力イベント識別子を汚染されたメモリ部分に保存されているデータに関連付けて、汚染されているデータの現在の値を決定する入力イベントを示すことができる。入力イベント識別子は、汚染標識に追加することもでき、および／または汚染標識内に含むこともできる。入力イベント識別子は、汚染されているメモリ部分および／または汚染されているデータのソースから整数やテキスト文字列などのデータをロードする入力イベントを識別する任意の適切な識別子とすることができる。一例では、汚染標識は、汚染されているデータのソースを識別する入力イベント識別子を含む。より詳細には、汚染されていないことを示す汚染標識は、空値や０などの任意の適切な値とすることができる。しかし場合によっては、汚染されているメモリ部分を示すのに「１」などの整数を用いるのではなく、汚染されているメモリ部分を示す汚染標識は、入力イベント標識または他のソース標識とすることができる。あるいは汚染標識は、汚染されたメモリ部分に保存されている現在の値を決定する入力イベントまたはそれらのイベント内のバイト範囲を割り出すための図１８に示されているようなデータフローグラフを含むことができる。データフロー分析によって脆弱性が示されると、実行されつつあるかまたはプログラムカウンタへロードされつつある汚染されたデータのデータフローグラフ内の識別子を有するイベントと、実行ログ内の最後の非決定性のイベントとを使用して、警報内のイベントリストを作成することができる。
【００６９】
脆弱な実行を再現するのに必要な非決定性のイベントのシーケンスのサイズを小さくすることに加えて、またはその代替として、イベントログの添え字が徐々に大きくなる警報のイベントリストの作成中に実行を再現すること（例えば、ログ内をさかのぼること）ができ、エラー状態がないかそれぞれの繰り返しをチェックすることができる。このようにして、イベントのリストを元のイベントから絞り込み、脆弱性の検出へと至ることができる。ネットワーク接続を介して受信される最後の数パケットによって脆弱性が誘発されることがあるため、この戦略は現在の大半のワームに対して効果を上げることができる。
【００７０】
脆弱性タイプ識別子７０６は、指摘されたプログラム内に存在して悪用される可能性のあるプログラムの脆弱性やエラー状態のタイプを識別および／または記述することができる。脆弱性タイプ識別子は、許容できないエラー状態をもたらす指摘されたプログラムの事前に設定された脆弱性を示す英数字のテキスト文字列などの任意の適切な識別子とすることができる。エラー状態の記述および／または許容可能性については、警報の作成者と受信者の間で合意し、事前に設定することができる。さらに自己認証式警報の受信側のノードは、実行のどの状態または結果が脆弱性を表すかについて合意することができる。脆弱性のタイプに関する合意は、演繹的なものとすること、例えば事前に設定することができ、あるいは動的なものとすること、例えばワームの検出時および／または警報の受信時に決定することもできる。脆弱性タイプ識別子によって識別される脆弱性のタイプは、プログラムまたはアプリケーションの任意の適切な脆弱性とすることができる。脆弱性を表すものとして演繹的に合意できる多くの異なるタイプの状態がある。脆弱性のタイプの一例として、任意実行制御（「ＡＥＣ」）を挙げることができる。ＡＥＣの警報は、ワームが実行をプログラムのアドレス空間内におけるコードの任意の断片へリダイレクトできるようにする脆弱性を識別する。この警報は、脆弱なプログラムへの入力内でアドレスが提供されるコードの断片をどのように呼び出すかについて記述する。脆弱性のタイプの別の例としては、任意コード実行（ＡＣＥ）を挙げることができる。ＡＣＥの警報は、コード注入の脆弱性について記述する。この警報は、脆弱なプログラムへの入力内で提供されるコードの任意の断片をどのように実行するかについて記述する。脆弱性のタイプの別の例としては、任意関数引数（ＡＦＡ）を挙げることができる。ＡＦＡの警報は、ワームが重要な関数に対する引数の値を変更できるようにする、例えばプロセスを作成するシステムコールを呼び出す際に実行する実行ファイルの名前を変更できるようにするデータ投入の脆弱性を識別する。この警報は、脆弱なプログラムへの入力内で提供される引数の値を有する指定された重要な関数をどのように呼び出すかについて記述する。
【００７１】
（１つまたは複数の）検証ヒント７０８は、示されたイベントのリストを再現した後に指摘された状態または脆弱性が真実であることのチェックを容易にすることができる任意の適切な情報を含むことができる。
【００７２】
対応標識７１０は、プログラムの脆弱性に対する適切な対応を容易にすることができる任意の適切な情報を含むことができる。例えば対応標識は、パッチによって脆弱性を解消できること、フィルタを作成して、脆弱性が悪用される可能性を検出できること、識別されたワームを含むメッセージを受信したことを検出するためのフィルタ、パッチ／フィルタを実装する実際のコードなどを示すことができる。
【００７３】
一例では、脆弱性中心の自己認証式警報は、プログラムが任意実行制御（ＡＥＣ）の脆弱性を有していることを示すことができる。ワームの攻撃は、脆弱なプログラムの実行のフローを任意に変更する能力に基づくことができるため、ＡＥＣの脆弱性のタイプの標識によって脆弱性を示すことができる。プログラムにメッセージを送信することによってプログラムカウンタを任意のロケーションへリダイレクトする能力を提供することはまれであり、危険であるため、ホストは、この状態が脆弱性を表していることに合意することができる。このタイプの脆弱性について、検証ヒントは、プログラムカウンタ（例えば、ＥＩＰ  ｏｎ  ｘ８６  ＣＰＵｓ）へ任意の値をロードするよう指定することができ、プログラムカウンタへロードされる値が非決定性イベントのリスト内のどこにあるかを指定することができる。例えば非決定性のイベントのリストが、受信されたメッセージのリストである場合、検証ヒントは、プログラムカウンタへロードされる値がどのメッセージ内にあるか、またどのオフセットにあるかを指定することができる。このメッセージおよびオフセットは、前述の技術を使用して決定することができる。
【００７４】
別の例では、脆弱性中心の自己認証式警報は、プログラムが任意コード実行（ＡＣＥ）の脆弱性を有していることを示すことができる。ワームの攻撃は、脆弱なプログラムへコードを注入する能力に基づくことができるため、ＡＣＥの脆弱性のタイプの標識によって脆弱性を示すことができる。プログラムにメッセージを送信することによってプログラムへ新たなコードを注入する能力を提供することはまれであり、危険であるため、ホストは、この状態が脆弱性を表していることに合意することができる。このタイプの脆弱性について、検証ヒントは、新たなコードが注入され実行されるよう指定することができ、実行されるコードが非決定性イベントのリスト内のどこにあるかを指定することができる。例えば非決定性のイベントのリストが、受信されたメッセージのリストである場合、検証ヒントは、注入され実行されるコードがどのメッセージ内にあるか、またどのオフセットにあるかを指定することができる。このメッセージおよびオフセットは、前述の技術を使用して決定することができる。
【００７５】
別の例では、脆弱性中心の自己認証式警報は、プログラムが任意関数引数（ＡＦＡ）の脆弱性を有していることを示すことができる。ワームの攻撃は、関数の引数として使用される値を投入する能力に基づくことができるため、ＡＦＡの脆弱性のタイプの標識によって脆弱性を示すことができる。プログラムにメッセージを送信することによって、プログラムによって使用されるシステムコールへ任意の新たな引数を投入する能力を提供することはまれであり、危険であるため、ホストは、この状態が脆弱性を表していることに合意することができる。このタイプの脆弱性について、検証ヒントは、任意の関数の引数が投入され実行されるよう指定することができ、投入される引数が非決定性イベントのリスト内のどこにあるかを指定することができる。例えば非決定性のイベントのリストが、受信されたメッセージのリストである場合、検証ヒントは、投入される引数がどのメッセージ内にあるか、またどのオフセットにあるかを指定することができる。このメッセージおよびオフセットは、前述の技術を使用して決定することができる。
【００７６】
自己認証式警報の代替形態は、Necula et al., "Safe Kernel Extensions without Runtime Checking," 2nd Symp. On Operation System Design and Implementation, Oct. 1996, pp. 229-243（非特許文献１）の証明を搬送するコードに類似した、プログラムが脆弱である旨の証明を含むことができる。最も簡単な形態では、この証明は、命令のシーケンスの形態などで、不許可の状態へ至る実行パスの記述を含むことができる。この形態の警報は、これまでの警報とは異なり、非決定性のイベントのリストのみを有するのではなく、プログラム命令のシーケンスを搬送し、また論理公式を搬送して、後述の検証メカニズムを容易にすることもできる。
【００７７】
警報を作成するノードは、その警報を少なくとも１つの他のノードに送信して、検出されたワームまたは脆弱性を知らせることができる。警報の配信は、図３に示されているように、警報モジュール３５０に応答して配信モジュール３７０を介して決定することができる。ノードは、通信媒体を介して任意の適切なメッセージフォーマットまたはプロトコルで警報を送信することができる。警報は、警報を作成するノードと通信状態にある任意の適切なノードへ配信することができる。ノードは、警報を受信すると、自分と通信状態にある任意の適切なノードへその警報を配信することもできる。例えば警報は、所定の警報アドレスリストに従ってすべてのノードへ、作成側のノードと最近連絡を取ったすべてのノードへ、または他の任意の適切な配信スキームに従って送信することができる。１つの配信スキームについて、以降でさらに詳しく論じる。
【００７８】
自己認証式警報の認証
図７の自己認証式警報７００などの自己認証式警報は、その警報を受信するノードによって自己認証することができる。例えば図３に示されているように、受信側ノード３２０の警報検証モジュール３６０は、受信した警報３３０を認証することができる。一例では、受信側ノードは、警報を解析して、プログラム識別子およびイベントリスト、ならびに脆弱性標識および１つまたは複数の検証ヒントなどの他の任意のパラメータを検索することができる。受信側ノードは、示されたプログラム内のイベントリストによって定義されている実行を再現することができる。プログラム内のイベントを何らかのタイプのサンドボックス環境において再現することなど、任意の適切な技術を使用して、イベントリストを再現することができる。イベントリストを再現した結果は、受信側ノードによって検査し、プログラムの脆弱性を検証することができ、提供される脆弱性タイプ識別子および／あるいは（１つまたは複数の）検証ヒントによって補強し、指摘されたエラーまたは脆弱性の状態が存在するかどうかを判定することができる。存在しない場合、警報は認証されず、そのメッセージを破棄することや、誤った警報であることを特定する警報を他のノードに送信することなど、適切な処置を講じることができる。
【００７９】
イベントリストは、そのまま実行するのではなく、一次論理を使用して認証することができる。例えば自己認証式警報内に含まれる証明は、証明を搬送するコードの仕組みに類似した方法で検証することができる。しかし自己認証式警報を認証することは、プログラムのすべての実行が安全性条件を順守していることを示すのではなく、プログラムの１回の特定の実行が脆弱性を呈することを示すことができる。自己認証式警報を認証することは、プログラム全体について検討するのではなく、１つまたは複数の識別された実行パス、例えばイベントリスト内の非決定性イベントのシーケンスによって定義されたパスに焦点を絞ることができる。簡単な形態では、自己認証式警報内の証明は、イベントのリストによって定義されたパスにおいて実行される命令のリストを含むことができる。このように、論理的な検証によって、脆弱なプログラム内の識別されたパス用の安全性条件を作成し、プログラムが自己認証式警報によって提供されるイベントリスト内のイベントを受信した場合はその安全性条件が当てはまらないことを示すことができる。
【００８０】
例えば前述したＡＥＣの自己認証式警報では、示されたプログラムの脆弱な実行パスは、１つのメッセージを受信しただけでトリガすることができ、この自己認証式警報は、そのパス内の命令のリストを含むことができる。この警報を認証するために、プログラムテキストを使用して、安全性条件を決定し、イベントリスト内のイベントがこの条件に違反していないか検証することなどによって、命令のリストをチェックすることができる。その実行パス用のプログラムの命令から論理安全性条件を作成することができる。実行パス用の安全性条件を得るために、安全なプログラムの実行をシミュレートする抽象計算機を定義することができる。この抽象計算機用の命令は、脆弱なプログラムによって作成される実際のＣＰＵ用の命令に類似したものとすることができる。
【００８１】
図９は、ｘ８６  ＣＰＵの命令のサブセット用の抽象計算機の一例９００を示している。図９では、ΠはＣＰＵの命令のベクトル（例えば、自己認証式警報内の命令のリスト）を表し、ｐｃはプログラムカウンタを表し、Πpcは現在の命令を表し、ρはマシンのレジスタおよびメモリの状態を表し、ρ［ｒi］は状態ρにおけるレジスタｒの値であり（またｒiと短縮することができ）、ｒmは、メモリの状態を示す特殊レジスタを表し、ρ［ｒd←ｒs］は、ｒdの値をｒsの値に置き換えることによってρから得られる新たな状態を表し、ｓｅｌ（ｒm，ｎ）はメモリアドレスｎの内容を表し、ｕｐｄ（ｒm，ｒd，ｒs）は、レジスタｒsをレジスタｒdへ書き込んだ結果として生じる新たなメモリの状態を表し、ＺＦはゼロフラグ（例えば１ビットのメモリ）を表している。
【００８２】
この抽象計算機の例９００は、戻り命令（ＲＥＴ）を実行しているときに、スタックポインタレジスタ（ＥＳＰ）によって指されたメモリ位置がワームを含んでいないことをチェックする。図９に示されているような抽象計算機の定義から、プログラム用の安全性条件を機械的に作成するためのルールのセットを得ることができる。図１０は、図９の抽象計算機に対応するルールのセットの一例１０００を示している。このルール１０００は、安全性条件パラメータＳＣpc+1１００４の点から安全性条件パラメータＳＣpc１００２を指定する。このように、最後の命令から開始して、先頭に至るまで前の命令を１つずつ処理し、その間に、命令のリストが、プログラムテキストを与えられた有効な実行を表していることをチェックすることによって、プログラムの安全性条件を得ることができる。より詳細には、まず最後の命令を検査し、次いで最後の２つの命令を検査し、といった具合に行うことができる。
【００８３】
前提条件を定義することができる。より詳細には、この前提条件は、レジスタおよび／またはメモリの状態など、脆弱な実行パスの開始時におけるプログラムの初期状態を反映することができる。脆弱性の述部を定義することができる。例えば脆弱性の述部は、Ｐｒｅｃｏｎｄｉｔｉｏｎ⇒¬Ｓａｆｅｔｙ  Ｃｏｎｄｉｔｉｏｎとして定義することができる。そして脆弱性の述部は、一次述語論理のルールに従って証明することができる。
【００８４】
例えば自己認証式警報のイベントリストによって提供される命令の脆弱なシーケンスは、図１１に示されている命令１１００として定義することができる。図１０のルール１０００を使用して、安全性条件ＳａｆｅｔｙＣｏｎｄｉｔｉｏｎを次のように定義することができる。
【００８５】
（ＥＣＸ＝１０⇒¬Ｗｏｒｍ（ｓｅｌ（ｒm，ＥＳＰ）））∧（ＥＣＸ≠１０⇒¬Ｗｏｒｍ（ｓｅｌ（ｒm，１２３４））                                          （１）
このように、警報のイベントリスト１１００によって識別された実行パスの開始時には、ＥＣＸレジスタの値は１０とは異なり、メモリ位置１２３４は、ネットワークの入力オペレーションによって書き込まれたばかりである（したがって「汚染されている」とみなされ、ワームを含む可能性がある）。上記の方程式（１）によって与えられる安全性条件から、次のように前提条件を定義することができる。
【００８６】
（ＥＣＸ≠１０∧Ｗｏｒｍ（ｓｅｌ（ｒm，１２３４））                    （２）
方程式（１）の安全性条件および方程式（２）の前提条件から、脆弱性の述部を作成し、証明することができる。脆弱性を証明することによって、イベントリスト内で示された脆弱性の存在を検証することができ、これによって警報を認証することができる。メモリロケーション１２３４は必ずしもワームを含むとは限らないことを理解されたい。例えば外部からの入力オペレーションによってプログラムの実行を任意に変更できるという事実は、脆弱性がまだ悪用されていないとしても、そのプログラムが攻撃に対して脆弱であることを意味することができる。
【００８７】
図１６は、自己認証式警報を作成する方法の一例１６００を示しており、図８は、自己認証式警報を認証する方法の一例８００を示している。図１６を参照すると、８０２において、検出モジュール３４０などによってプログラムの脆弱性を検出することができる。８０４では、脆弱なプログラム用のプログラム識別子を決定することができる。８０６では、脆弱性のタイプを決定することができ、適切な脆弱性標識が選択される。８０８では、機械で検証できる脆弱性の証明を提供するイベントリスト８０８を決定することができる。前述のように、イベントリストは、動的データフロー分析を実施する検出プロセスの間に記録されたイベントから得ることができる。またイベントリストは、検出中に記録されたイベントから削減するかまたは絞り込み、指摘された脆弱性を示す最小のまたは絞り込まれたイベントのセットを確定することや、データフローグラフから導き出すこと、修正して一部を無害な値に置き換えることなどもできる。８１０では、決定されたイベントリストおよび／または脆弱性標識に基づいて、１つまたは複数の検証ヒントを決定することができる。場合によっては、８１２において、例えばパッチおよび／またはフィルタ、パッチおよび／またはフィルタを実装するための実際のコード、ワームの署名など、ワームに対する潜在的な解決策に関するヒントを含むことができる対応標識を決定することができる。８１４では、任意の適切なプロトコルに従って任意の適切なフォーマットで自己認証式メッセージを形成することができる。８１６では、通信媒体などを介してネットワーク内の別のノードへ警報を送信することができる。前述のように、配信モジュール３７０を使用して、自己認証式警報用の受信側ノードを決定することができる。
【００８８】
図８を参照すると、８５０において、通信媒体などを介して受信側ノードが自己認証式警報を受信することができる。８５２では、図３の警報検証モジュール３６０などによって警報を解析して、プログラム識別子およびイベントリストを割り出すことができる。８５４では、プログラム識別子を受信側ノード上に存在するプログラムと比較することができる。プログラム識別子が受信側ノード内に存在しない場合は、８５６において適切な処置を講じることができる。例えば適切な処置は、その警報を破棄すること、および／またはその警報を別のノードへ転送して、その警報を通信ネットワーク内でさらに配信することを含むことができる。
【００８９】
プログラム識別子が受信側ノードのプログラムまたはアプリケーションを示している場合、受信側ノードは、８５８において図３の警報検証モジュール３６０などを介して、示されたプログラムをロードすることができる。場合によっては、このプログラムは、停止中のプロセスにロードすることができる。場合によっては、このプログラムは、アクション、他者との接触、および／または指摘された脆弱性の他の副次的な悪影響を制限する「サンドボックス」環境へロードすることができる。バーチャルマシンは、警報の検証を行うことができるサンドボックス環境を提供することができる。他のサンドボックス環境は、実行中のプログラムからのすべての出力を黙って破棄し、副次的な影響を抑えることができる。場合によっては、受信側ノードは、隔離されたおよび／またはテスト中のデバイスなどの別のコンピューティングデバイスに対して、示されたプログラムをロードするよう、および／または自己認証式警報を認証するよう指示することができる。
【００９０】
８６０では、停止中のプロセスのアドレス空間に検証関数をロードすることができる。検証関数は、示されたプログラムによって呼び出された場合、成功標識を返すことができ、あるいは対応モジュールを呼び出すことができる。成功標識は、視覚または聴覚信号を含めること、指定された値を有するプログラムを終了すること、値をネットワークインターフェースに書き込むこと、同期オブジェクトに信号を送信することなどを行う検証関数の実行を示す任意の適切な標識とすることができる。検証関数の構造は、イベントリストによって示される脆弱性のタイプに依存することができる。このように、脆弱性標識および／または検証ヒントを自己認証式警報から解析し、適切な検証関数を選択および／または作成するために使用することができる。
【００９１】
８６２では、ロードされたプログラムを使用してイベントリストを再現することができる。イベントリストが実行される際、検証関数を呼び出すことができ、これは、示されたプログラム内の脆弱性の存在を指摘することができる。例えばＡＥＣを示す脆弱性標識については、自己認証式警報内のヒントは、プログラムカウンタへロードされるアドレスのイベントおよび／またはそのイベント内のオフセットを示すことができる。検証関数がロードされたアドレスは、そのイベントおよび／またはオフセットに配置することができる。このように、イベントリストの再現中に８６４において検証関数が実行された場合、脆弱性が実証され、警報は認証されたとみなすことができる。このように、受信側ノードは８６６において、脆弱なプログラムを停止すること、および／または脆弱性を解消するために適切なパッチおよび／またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。警報が認証されなかった場合、例えば検証関数が実行されなかった場合は、８５６において、メッセージを破棄すること、および／または無効な警報である旨を（１つまたは複数の）他のノードに知らせることなど、適切な処置を講じることができる。
【００９２】
別の例では、ＡＣＥの警報を示す脆弱性標識について、自己認証式警報内のヒントは、ターゲットのプログラムによって注入され実行されるコードのイベントおよび／またはそのイベント内のオフセットを示すことができる。「検証呼び出し」命令のシーケンス、すなわち検証関数を呼び出すようターゲットのＣＰＵに指示するそのＣＰＵの命令のシーケンスは、そのイベントおよび／またはオフセットに配置することができる。このように、イベントリストの再現中に８６４において検証関数が実行された場合、脆弱性が実証され、警報は認証されたとみなすことができる。このように、受信側ノードは８６６において、脆弱なプログラムを停止すること、および／または脆弱性を解消するために適切なパッチおよび／またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。警報が認証されなかった場合、例えば検証関数が実行されなかった場合は、８５６において、メッセージを破棄すること、および／または無効な警報である旨を（１つまたは複数の）他のノードに知らせることなど、適切な処置を講じることができる。
【００９３】
別の例では、ＡＦＡの警報を示す脆弱性標識について、自己認証式警報内のヒントは、ターゲットのプログラムの関数へ渡される任意の引数のイベントおよび／またはそのイベント内のオフセットを示すことができる。任意の引数は、そのイベントおよび／またはオフセットに配置することができ、検証者は、提供される任意の引数の値を、非決定性のイベントの再現中に関数の呼び出しにおいて使用される実際の引数の値と比較してチェックするラッパ（ｗｒａｐｐｅｒ）と共に、ＡＦＡの警報内で識別された重要な関数を装備することができる。このラッパは、それらの値が一致した場合に検証関数を呼び出す。このように、イベントリストの再現中に８６４において検証関数が実行された場合、脆弱性が実証され、警報は認証されたとみなすことができる。このように、受信側ノードは８６６において、脆弱なプログラムを停止すること、および／または脆弱性を解消するために適切なパッチおよび／またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。警報が認証されなかった場合、例えば検証関数が実行されなかった場合は、８５６において、メッセージを破棄すること、および／または無効な警報である旨を（１つまたは複数の）他のノードに知らせることなど、適切な処置を講じることができる。
【００９４】
前述したように、イベントリストは、そのまま実行するのではなく、一次論理を使用して認証することができる。図８の方法を参照すると、８７２において、イベントリストによって示された実行パス用のプログラムの命令から論理安全性条件を作成することができる。安全性条件は、安全なプログラムの実行をシミュレートした抽象計算機を定義することなどによって、任意の適切な方法で作成することができる。８７４では、前提条件を定義することができ、この前提条件は、脆弱な実行パスの開始時におけるプログラムの初期状態を反映することができる。８７６では、脆弱性の述部を定義することができ、次いでこの脆弱性の述部は、８７８において一次述語論理のルールに従って証明することができる。述部が証明された場合は、８６６において、脆弱なプログラムを停止すること、および／または脆弱性を解消するために適切なパッチおよび／またはフィルタを実装することなど、認証された警報に対応して適切な処置を講じることができる。述部が証明されなかった場合は、８５６において、メッセージを破棄すること、および／または無効な警報である旨を（１つまたは複数の）他のノードに知らせることなど、適切な処置を講じることができる。
【００９５】
対応
示された脆弱性が実行結果によって実際に確認された場合、認証されたプログラム内の脆弱性に対応して、適切な処置を講じることができる。コンピューティングデバイスの対応は、システム管理者や図３の対応モジュール３８０によって手動で指示される対応などを含む任意の適切な方法によって、手動および／または自動で実行することができる。例えばプログラムをオフラインにすることができ、および／または他の対応策を講じることもできる。対応策は、イベントリストおよび／または脆弱性タイプ標識ならびに／あるいは検証ヒントに基づいてパッチおよび／またはフィルタを作成することを含むことができる。このように、自己認証式警報内の情報を使用して、アプリケーションを停止せずに、感染を防ぐためのパッチおよび／またはフィルタを手動および／または自動で作成することができる。さらに、作成されたパッチ／フィルタは、図７の対応標識７１０内など、受信側ノードが使用するための自己認証式警報内に含むことができる。
【００９６】
自己認証式警報のイベントリストおよび／または検証ヒントを使用して、脆弱性を修復する脆弱なプログラム用のバイナリ修正（例えばパッチ）を自動的に作成することができる。
【００９７】
例えば感染がデータ構造の上書きを含んでいるならば、これを防止する特別なチェックを実行するコードを作成することができる。例えば上書きがバッファのオーバーフローまたはアンダーフローに起因しているのであれば、上書きを防止するためのアレイバウンズチェッキングコードを作成することができる。そして作成されたコードを脆弱なプログラムに適用することができる。別の例では、上書きされたデータ構造のコピーを別途保存し、オリジナルのデータ構造を使用し、実行に先立ってオリジナルのデータ構造へアクセスする前に必ずそのコピーのデータ構造とオリジナルのデータ構造を比較することによって、動的なパッチを作成することができる。別の例では、ループ内の境界条件を別の条件に（例えばループ本体が実行される回数が必ず少なくなるようにする条件に）置き換えることができる。
【００９８】
ワームを搬送するソースメッセージ内の十分に一意の英数字の文字列、および／または特定の長さを有するメッセージに基づいてワーム固有のフィルタを作成することができる。
【００９９】
多形性のワームを検出できる脆弱性固有のフィルタを作成することができる。一例では、ネットワークスタックの上にフィルタをインストールすることができる。脆弱性固有のフィルタは、アプリケーションの状態を使用して、受信トラフィックをいつ中断するかを決定することができる。より詳細には、フィルタの一般条件は、自己認証式警報のイベントリスト内に記載されている実行パスを分析することによって、また感染へと至る実行パスを受信メッセージ内のどのバイトが決定するのか、それらのバイト上のどの条件が実行パス内でテストされるのかをチェックすることによって、作成することができる。これらの脆弱性固有のフィルタは、プログラムカウンタへロードされるかまたはワームによって実行される汚染されたデータが書き込まれるまでに、動的フロー分析に類似したメカニズムを使用して作成することができる。
【０１００】
一例では、動的データフロー分析を使用して脆弱性中心のフィルタを作成する対応モジュールは、メモリロケーションおよび／またはレジスタなどの汚染されているそれぞれのメモリ部分ごとにデータフローグラフを保持することができる。また対応モジュールは、それぞれのＣＰＵフラグごとにデータフローグラフを保持することもできる。それぞれのデータフローグラフは、メッセージまたは他の外部情報源における値から汚染されているメモリロケーションにおける値を計算するために使用された命令のシーケンスの全体または関連する部分を含むことができる。対応モジュールは、制御フロー分析を使用して、制御移行命令の実行後に命令ポインタの値を決定するすべての条件と、また条件付きの移動およびセット命令の実行時に使用される条件とを追跡監視することができる。これらの条件を結び付けたものをフィルタ条件と呼ぶことがある。フィルタ条件は、最初は真であり、汚染されているプロセッサフラグを使用するか、または汚染されているロケーションから読み取ったアドレスへ制御を移行するすべての命令の後で更新することができる。フィルタ条件は、汚染されているフラグおよびアドレスロケーションのデータフローグラフによって計算された式上でその古い値と適切な条件を結び付けたものへと更新される。例えばＪＺ  ＥＡＸ（ゼロフラグが設定された場合は、ＥＡＸレジスタ内に保存されているアドレスへジャンプする）が実行され、ジャンプが行われたときに、ゼロフラグとＥＡＸレジスタが両方とも汚染されていないならば、フィルタ条件はそのまま変更されない。ゼロフラグが汚染されている場合は、ゼロフラグのデータフローグラフによって計算された式は偽であるという条件を追加する。ＥＡＸも汚染されている場合は、ＥＡＸのデータフローグラフによって計算された式は、ＥＡＸによってその時点で保存されている値に等しいという条件も追加する。ジャンプが行われない場合は、ゼロフラグのデータフローグラフによって計算された式は真であるという条件を追加し、ＥＡＸのデータフローグラフに関する条件は追加しない。このプロシージャが完了すれば、フィルタ条件を受信メッセージに適用して、ワームまたは同一の脆弱性を悪用するそのワームの変種を遮断することができる。このように、フィルタ条件によって偽陽性の発生を減らすことができる。
【０１０１】
図１５に示されている脆弱なコードの例を使用して、フィルタの作成について説明することができる。図１５のコード１５００は、ネットワークバッファ内のメッセージの最初のバイトを定数（０×３１）と比較することによって開始する。これが一致する場合、ネットワークバッファ内のバイトは、ゼロバイトが見つかるまで、スタックベースのバッファにコピーされる。これは、スタック上の返信用アドレスを上書きする可能性のある潜在的なバッファオーバーフローであり、文字列ライブラリ内の脆弱性を表している。この脆弱性用のフィルタは、前述の動的データフロー分析を実行することによって作成することができる。例えば図１５の命令の例のうち最初の４つの命令１５０２を実行すると、動的データフロー分析を実施する検出モジュールは、メッセージ内の最初のバイトは０×３１に等しくなるべきであるという条件を決定することができる。同様に、ループを実行すると、ネットワークバッファ内のバイトのシーケンスはゼロとは異なるという条件が得られる。これらの条件を有するフィルタを受信メッセージに適用すれば、偽陽性が生じることはなく、この脆弱性を悪用するワームの変種を実質的にすべて遮断することができる。複数のさらなるメカニズムを使用して、フィルタ条件を精密にすることもできる。一例では、対応モジュールは、ＳＣＡ内の検証ヒントによって識別されたオフセットの後に現れるメッセージバイト上の条件を削除する。メッセージ内のバイトは通常は順を追って処理されるため、このヒューリステックによって偽陽性が生じる可能性はほとんどない。別の例では、対応モジュールは、関数が戻ったときに、その関数の実行によって追加された条件を削除する。その関数が戻った後は、通常これらの条件は重要ではなく、その関数の重要な効果は、汚染されているデータのデータフローグラフに取り込まれていることが、その理論的根拠である。
【０１０２】
作成されるパッチまたはフィルタは、図３の対応モジュール３８０などを介して、警報メッセージを受信および認証する任意のマシンによって独自に作成することができる。別の例では、作成されたパッチまたはフィルタを警報メッセージ内に含めることができ、そのパッチまたはフィルタは、受信側ノードによって任意の適切な方法で認証または実証することができる。図７に示されているように、自己認証式警報は対応標識７１０を含むこともでき、この対応標識７１０は、検証された脆弱性および／またはワームの攻撃に対する適切な対応を含むことができる。例えば対応標識は、適切なパッチおよび／またはフィルタの記述またはヒントや、適切なパッチおよび／またはフィルタを実装するコードなどを提供することができる。
【０１０３】
警報の配信
脆弱性を検出したノードは、その検出したノードと通信状態にあるネットワーク内の１つまたは複数のノードに警報を送信することができる。例えば通信ネットワークのノードの一部は、脆弱性および／またはワームの検出モジュールを実行することができ、この検出モジュールは、検出の負荷を分散すること、ならびにワームにとって中心となるターゲットを除去することを促進することができる。前述のように、検出モジュールは様々な検出メカニズムを含むことができ、そうした検出メカニズムには、簡単なものもあり、複雑なものもある。ネットワークの検出側ノードは、アイドル状態にある場合、その通常のオペレーションの一環として、および／またはネットワーク内におけるその基本的な機能または専用の機能として検出モジュールを実行することができる。検出モジュールを実行することによって、通信ネットワークのノードのうち任意の数（例えば１つ）、一定割合、またはすべてを検出側ノードとみなすことができることを理解されたい。
【０１０４】
前述のように、脆弱性および／またはワームの攻撃が検出されると、１つの対応として、自己認証式警報などの警報を作成し、その警報をネットワーク内の１つまたは複数のノードへ送信することができる。このようにして、その脆弱性をまだ検出していないノード、および／またはその検出されたワームにまだ感染していないノードは、ワームおよび／またはプログラムの脆弱性に関して警報を受けることができ、適切な防護措置を講じることができる。前述のように、自己認証式警報は、機械で検証できる情報を含むことができ、この情報によって受信側ノードは、その警報の信頼性を独自に検証することができる。このようにして、警報を受信するネットワーク内のいかなるノードも、認証局などと通信せずにその警報を認証することができる。したがって自己認証式警報は、互いを信頼していないノード間の協力を促進するアーキテクチャの一部とすることができる。
【０１０５】
オーバーレイネットワーク
ワームおよび／または脆弱性が検出されると、その脆弱なプログラムを実行している可能性のある、またはそのワームの攻撃の影響を受けやすい他のノードへ迅速におよび／または弾力的に警報を送信することができる。この警報は、ネットワーク内の任意の数の確定可能なおよび／または事前に確定されたノードへ任意の適切な方法で送信することができる。一例では、この警報は、悪意あるインサイダおよび／またはワームによるサービス拒否の攻撃から保護されているネットワークオーバーレイを使用して送信することができる。例えばこの警報は、構造化されたピアツーピアオーバーレイを介して広く送信することができる。
【０１０６】
ピアツーピアネットワークは、非常に多数のノードへ拡張することができ、また弾力性を有することができ、例えば多数のノードが故障するかまたは接続を断たれた場合でさえ接続性を維持することができるため、ピアツーピアオーバーレイは、自己編成的なアプリケーションを構築するための適切な下地を提供することができる。以降の説明は、構造化されたピアツーピアオーバーレイの概要を提供し、ピアツーピアオーバーレイを保護して、システム内の実質的にすべての感染していないノードへ警報を配信できる可能性を高める際の一例を示す。以降の考察では、一例としてＰａｓｔｒｙのピアツーピアオーバーレイを使用するが、他の任意の適切なネットワークおよび／またはピアツーピアネットワークオーバーレイも使用できることを理解されたい。ピアツーピアネットワーク用のオーバーレイネットワークのタイプに関する現時点での例には、カリフォルニア大学バークリー校で開発されたＴａｐｅｓｔｒｙ、マサチューセッツ工科大学で開発されたＣｈｏｒｄ、ならびにマイクロソフトおよびライス大学で開発されたＰａｓｔｒｙが含まれる。Ｔａｐｅｓｔｒｙ、Ｃｈｏｒｄ、およびＰａｓｔｒｙは、分散システムを構築するためのツールキットである。類似した他のシステムとしては、ＣＡＮ、Ｋａｄｅｍｌｉａ、Ｓｋｉｐｎｅｔ、およびＶｉｃｅｒｏｙがある。新しいオーバーレイの設計も頻繁に登場している。
【０１０７】
Ｐａｓｔｒｙなどの構造化されたオーバーレイは、キーをオーバーレイノードへマップする。それぞれのノードには、識別子空間から選択されるノード識別子が割り当てられる。キーは、同一の識別子空間から選択される。キーは、識別子空間内のキーに最も近いおよび／または最も類似したノード識別子を有するノードへマップされる。このノードは、そのキーのルートノードと呼ばれることがある。ノードへのキーのマッピングは、例えば参照によって本明細書に組み込まれる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（非特許文献４）でさらに論じられているＫＢＲインターフェースを使用して、ユーザがルックアップメッセージを送信先キーへ送信できるようにするプリミティブを介して公開することができる。ルックアップメッセージは、オーバーレイを介して送信先キーのルートノードへ転送することができる。例えばＰａｓｔｒｙは、ノード識別子およびキーを１２８ビットの符号なし整数のセットから一様に無作為に選択し、次いで示された送信先キーを、そのキーに数字上最も近いノード識別子を有するアクティブノードへマップする。例えばその数字上最も近いノード識別子は、２128を法とする送信先キーに最も近いノード識別子とすることができる。
【０１０８】
ノード用のルーティング状態情報は、ルーティングテーブル内に保存することができる。ルーティングテーブルは、そのルーティングテーブル内に示されているノード空間が、そのルーティングテーブルを保存しているノードのノード識別子に近づくにつれて、ますます詳細なレベルで、アドレス空間内の様々なノード用にノード識別子とネットワークアドレスを関連付けることができる。ノードのリーフセット（ｌｅａｆ  ｓｅｔ）は、ルーティングテーブルをホストしているノードのノード識別子に最も近いかまたは最も類似したノード用に、ノード識別子およびネットワークアドレスなどの情報を含む。リーフセットは、オーバーレイプロトコルに応じて、ルーティングテーブルとは別にデータ構造内に保存することもでき、および／またはルーティングテーブルの最低レベルとすることもできる。
【０１０９】
Ｐａｓｔｒｙを参照して、ルーティングテーブル構造の一例について論じる。Ｐａｓｔｒｙのルーティングアルゴリズムは、ノード識別子およびキーを２b進数の符号なし整数と解釈し、この場合のｂは、４という典型的な値を有するパラメータである。この解釈に基づくと、ルーティングテーブルは、１２８／ｂ行および２b列を有する行列である。ルーティングテーブルの行ｒおよび列ｃにおける入力は、ルーティングテーブル内の最初の行がｒ＝０を表すと仮定した場合に、最初のｒ桁をローカルノードのノード識別子と共有し、ｃに等しい（ｒ＋１）番目の桁を有するノード識別子を含む。このようなノード識別子がない場合、例えばネットワーク内にそのノード識別子を使用しているアクティブノードがない場合、その入力は空値とすることができる。ノード識別子は識別子空間全体にわたって一様に無作為に割り当てることができるため、ルーティングテーブル内の空値でない入力の平均数は、ピアツーピアネットワーク内のノードの数の（２bの底を有する）（２b−１）*ｌｏｇとして概算することができる。Ｐａｓｔｒｙノードのリーフセットは、ローカルノードのノード識別子の左へｌ／２番目に近いノード識別子と、ローカルノードのノード識別子の右へｌ／２番目に近いノード識別子とを含むことができ、この場合のｌは、８という典型的な値を有するパラメータである。そしてピアツーピアネットワーク内における各ノードのリーフセットのセットは、オーバーレイノードをリング型に接続する。このように、送信先キーと一致する徐々に長くなるプレフィックスを有するノードへメッセージを転送することによって、ピアツーピアネットワーク内でメッセージを回送することができる。
【０１１０】
図１２は、ｂ＝２およびｌ＝４を有する構造化されたオーバーレイネットワークの一例１２００を示している。この構造化されたオーバーレイネットワークの図は、ノード１２０２を起点とするルックアップメッセージのルート１２１０を示している。このルックアップメッセージは、示されているキーに最も近いノード識別子と一致するキーを含む。例えばそのキーに関連付けられた希望の情報を保存しているノードが、そのキーに最も近いノード識別子を有するノードである。例えばノード１２０２は、２０３２３１というノード識別子を有することができ、ルックアップメッセージのキーは、３２３３１０とすることができる。このルックアップメッセージを送信するために、起点ノード１２０２は、このルックアップメッセージの送信先キーに最も近い既知のノード識別子を探して、そのルーティングテーブルの１つのレベルを検索することができる。より詳細には、ノード１２０２は、そのキーの最初の桁である３の桁で始まるノード識別子を探して、そのルーティングテーブルの最初の行を検索することができる。この起点ノードは、３で始まるノード識別子のルーティングテーブルロケーションでノード識別子３１３２２１を見つけることができる。図１２を参照すると、起点ノード１２０２は、通信媒体を使用してルート１２１２を介して、そのルーティングテーブル内のノード識別子（３１３２２１）に関連付けられているアドレスのノード１２０４へルックアップメッセージを転送することができる。そしてノード１２０４は、そのルックアップメッセージを受信し、例えばルックアップメッセージキー３２３３１０の最初の２桁と一致する３２で始まるノード識別子を探して、そのルーティングテーブル（例えば、そのテーブルの第２のレベル）を検索することができる。ノード１２０４は、３２で始まるノード識別子のロケーションでノード識別子３２２０２１を見つけることができる。次いでノード１２０４は、通信媒体を使用してルート１２１４を介して、そのルーティングテーブル内のノード識別子（３２２０２１）に関連付けられているアドレスのノード１２０６へルックアップメッセージを転送することができる。そしてノード１２０６は、そのルックアップメッセージを受信し、そのルックアップメッセージがキーのルートノード１２０８に達するまで、そのルーティングテーブルなどを検索することができる。多くの場合、ルーティングは、ノード識別子の配信が十分に無作為で一様である場合、平均して約
【０１１１】
【数１】
2006031718.tif 000003
【０１１２】
ホップ（ｈｏｐ）を取ることができる（パラメータＮはネットワーク内のノードの数であり、ｂはノード識別子空間の底である）。
【０１１３】
ネットワークの保護
構造化されたネットワークオーバーレイを介して警報配信の弾力性を高めるために、１つまたは複数のセキュリティメカニズムを使用して、構造化されたピアツーピアオーバーレイネットワークを保護することができる。必要に応じて、任意のセキュリティ手段を使用することができる。このセキュリティ手段は、例えば参照によって本明細書に組み込まれる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（非特許文献５）に記載されている技術を含むことができる。さらなるセキュリティメカニズムによって、情報開示を減らすこと、サービス拒否（オーバーレイレベルで混雑状態を作り出すこと）を減らすこと、オーバーレイノードの大部分が感染していない場合でさえ、感染していないノードへ警報を広く送信することなどが可能である。
【０１１４】
１つのセキュリティ手段は、ピアツーピアネットワークへ参加するノードにノード識別子を割り当てることができる。このノード識別子は、１つまたは複数の信頼できる認証局（ＣＡ）などの任意の適切なソースによって割り当てることができる。認証局は、ノード識別子がノード識別子空間から必ず十分に無作為に選択されるようにすることができ、および／またはノードがノード識別子を偽造するのを防止することができる。認証局は、例えば支払い、特定の製品を所有していることの証明、慈善事業への金銭的な贈り物の証明などを要求することによって、ノード識別子を認証する署名入り証明書の可用性を制御する技術を使用することができる。認証局を使用してノード識別子を割り当てることによって、Ｓｙｂｉｌ攻撃を減らすことができる。攻撃から認証局を保護するために、１つまたは複数の認証局をオフラインにすること、および／またはオーバーレイネットワークの通常のオペレーションに関与させないことができる。
【０１１５】
１つの代替および／または追加のセキュリティ手段は、任意の適切な方法で達成できる安全なルーティングテーブルの保守を可能にすることを含むことができる。例えば、ルーティングテーブル内の各フィールドを満たすことができるノード識別子のセットに制約を課すことができる。識別子ｉを有するノードのＰａｓｔｙルーティングテーブルでは、行ｒおよび列ｃのフィールドに対して、最初のｒ桁をノード識別子ｉと共有し、ｒ＋１番目の桁に値ｃを有する任意のノード識別子を含むよう制約を課すことができる。ノード識別子の入力の残りの桁は、ルーティングとは無関係とすることができる。しかしルーティングテーブル内の入力には、ドメイン内のポイントｐに最も近いノード識別子を示すかまたは含むようにさらに制約を課すことができる。ポイントｐは、最初のｒ桁をノード識別子ｉと共有し、ｒ＋１番目の桁に値ｃを有し、そのドメイン内の有効なポイントｐのノード識別子を限定する何らかの確定可能な一連の桁を有するノード空間内のノード識別子ロケーションとして定義することができる。例えばポイントｐは、最初のｒ桁をノード識別子ｉと共有し、ｒ＋１番目の桁に値ｃを有し、ｉと同じ残りの桁を有していたノード識別子として定義することができる。ルーティングテーブルの入力を識別子空間内の仮想ポイントに結び付けることによって、悪意のあるノードによって送信され、悪意のないノードによって受信されたルーティングの更新が仮想ポイントの制約を満たさない場合は、その更新を受け入れる事態を少なくすることができる。このようにして、悪意あるノードによって占拠される可能性のあるルーティングテーブルの入力の数を抑えることができる。この技術については、参照によって本明細書に組み込まれる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（非特許文献５）にさらに記載されている。
【０１１６】
追加または代替のセキュリティ手段は、情報開示を回避することを含むことができる。より詳細には、ネットワークオーバーレイのクローリング（ｃｒａｗｌｉｎｇ）を不許可および／または妨害することができる。したがって、オーバーレイのメンバー情報へのアクセスを減らすことができる。ルーティングテーブル内の入力を抑制することなど、任意の適切な技術を使用して、メンバー情報の漏洩を回避することができる。例えばｉというノード識別子を有するノードは、ノードの障害、別のノードがオーバーレイから離脱したこと、および／またはそのノードが参加して、そのルーティングテーブルを初期設定中であることによって、そのルーティングテーブル内の行ｒおよび列ｃにおけるスロットが空になったために、そのスロットを満たす必要が生じる場合がある。そのスロットを満たすために、そのノードは、そのスロット用の制約を定義する識別子ｓ、例えばｒ＋１番目の桁に値ｃを有すること以外はノード識別子と等しい識別子へ要求メッセージを転送することができる。このような要求が、あるノードに送達されると、その受信側ノードは、識別子ｓにさらに近いノードがそのルーティングテーブルおよび／またはリーフセット内に存在するかどうかをチェックすることができる。また受信側ノードは、識別子ｓが要求側のノード識別子用の有効なポイントｐを表していないかどうかをチェックすることもできる。有効なポイントｐを表していない場合、受信側ノードは、その要求を放棄し、より近いノードへその要求を転送し、および／または他の任意の適切な処置を講じることができる。このようにして、悪意あるノードが、ルーティングテーブルの入力の制約を満たすノードしか見つけられないようにすることができる。場合によっては、他のアプリケーションがオーバーレイのメンバーに関する情報を漏洩する可能性があるため、場合によっては、そうしたアプリケーションに対して、警報の配信をサポートするオーバーレイの最上部で実行することを制限することができる。
【０１１７】
別の代替および／または追加のセキュリティ手段は、あるノードが危険にさらされた際にオーバーレイの近隣のノードの身元を露呈してしまう事態を少なくすることができる。例えばオペレーティングシステムのカーネル内、バーチャルマシンモニタ内、ハードウェアチップ内などでオーバーレイを実行することができる。
【０１１８】
別の代替または追加のセキュリティ手段は、ピアツーピアネットワーク内のノード間におけるメッセージトラフィックの混雑状態を減らすことができ、これによって、ネットワークに対するサービス拒否の攻撃の発生および／または影響を少なくすることができる。ネットワーク内の混雑状態を減らすために、様々な適切なメカニズムのうち任意の１つまたは複数を使用することができる。例えば、ノードが際限ない数のメッセージをオーバーレイに注入するのを防止することができる。追加および／または代替として、オーバーレイメッセージに署名することができ、それぞれのノードは、メッセージの署名によって識別されたオーバーレイ内の他のノード用に処理するメッセージの割合に制限を課すことができる。例えば認証局は、各ノードのノード識別子および公開鍵の双方を含む証明書に署名することができる。送信側ノードは、オーバーレイメッセージを送信する際、秘密鍵を使用してそのメッセージに署名してから、そのメッセージを回送することができる。認証局によって署名されたノードの証明書をメッセージに添付することができる。メッセージを回送する各ノードは、送信側ノードがそのメッセージのソースであることを検証することができ（例えば証明書を使用して、そのメッセージの署名を検証することができ）、その特定のノード用に回送したメッセージの数を（例えばメッセージカウントパラメータ内に）記録することができる。メッセージカウントパラメータは、送信側ノードから回送されるメッセージの数を制限できる所定のしきい値と比較することができる。別の例では、所与の任意のノードがネットワークにメッセージを挿入できる割合は、それぞれの近隣のリンク（例えば、ローカルノードのノード識別子に類似したノード識別子を有するノード）に割合の制限を適用することによって、限度を設けることができる。ノード識別子が認証局によって割り当てられている場合は、近隣のノードを変更することを制限することができる。
【０１１９】
弾力的な配信
警報の配信、例えばその警報用の受信側ノードを識別することは、任意の適切な方法で決定することができる。例えば図３に示されているように、配信モジュール３７０は、警報が作成された場合は警報モジュール３５０からの入力に応答して、および／または受信された警報が検証された場合は警報検証モジュール３６０からの入力に応答して、トリガすることができる。ワームの攻撃および／またはプログラムの脆弱性を示す警報の配信は、１つまたは複数のルーティングノードが警報の伝達を阻止しようとする試みに対して弾力性を有することができる。阻止する側のノードは、警報の伝達を意図的に阻止する悪意あるノードである可能性もあり、あるいはそのノードは、メッセージの回送に参加できなくなる危険にさらされている可能性もあり、例えばワームに感染している可能性もある。したがってピアツーピアネットワーク内のノードへ警報を送信するための配信スキームは、複数のオーバーレイパスを介して同一のノードへ警報を送信することができる。より詳細には、ノードは、それぞれ異なるノードを起点とする、および／または異なるルーティングパスを介して送信される複数の警報を受信することができる。
【０１２０】
パスを１つだけ使用する場合、そのパスが阻止される確率は、次のように概算することができる。
【０１２１】
Ｐ（ｂｌｏｃｋ）＝１−（１−ｆ）pathlength                          （３）
ここでのパラメータｆは、回送を阻止しているネットワーク内のノードの比率である。したがって、例えば複数の独立したマルチキャストツリーを構築することによって、すべてのノードに対して複数の独立したパスを使用して警報を送信する場合、少なくとも１つのパスが、悪意のないおよび／または対応可能なノードのみを含む確率は、次のように概算することができる。
【０１２２】
【数２】
2006031718.tif 000004
【０１２３】
ここでのＮはネットワーク内のノードの数であり、
【０１２４】
【数３】
2006031718.tif 000005
【０１２５】
はツリーの深さであり、ｐは各ノードへの独立したパスの数であり、ｂｉｎｏｍは、０本の成功したルートおよびｐ回の試行を有する２項分布であり、各試行において首尾よく回送できる確率が
【０１２６】
【数４】
2006031718.tif 000006
【０１２７】
である。したがってｂ＝４で、１００，０００のノードからなるネットワーク上でノードの５０パーセントが危険にさらされているとすると、所与のノードへ到達する９０％の確率を達成するには、約４０本のパスを選択する必要があるだろう。ネットワーク内の各ノードへ１つの警報を転送するために４０本のパスを使用する場合、メッセージのコストは、ｐ*Ｎという値によって概算することができる。
【０１２８】
メッセージを回送するために選択される独立したパスは、任意の適切な方法で選択することができる。例えば、無作為のパスを選択することができる。別の例では、すべてのノードは、そのルーティングテーブル内の入力のすべてまたは一部に警報を送信することができる。ｂ＝１のピアツーピアネットワークでは、ルーティングテーブルをすべてのルーティングテーブルの入力へ完全に送信すると、約
【０１２９】
【数５】
2006031718.tif 000007
【０１３０】
本のメッセージ分のメッセージコストを要することがある。完全にルーティングテーブルを送信すれば、警報のソースへの良好なパスが存在するすべてのノードへ到達できる見込みが高まることがある。別の例では、受信側ノードは、所定のレベルに満たないルーティングテーブル内の入力によって識別することができる。代替として、または追加として、警報を送信するノードは、リーフセット内の各入力へ警報を送信ことができる。
【０１３１】
警報を受信および認証するノードは、配信技術、例えば複数の無作為のパスに従って他のノードへ、ルーティングテーブルの入力内の入力へ、リーフセット内の入力などへ警報を転送することができる。例えば１つのノードが、認証された警報をそのルーティングテーブル内のすべてのノードへ転送する場合、それぞれの受信側ノードは、自分のルーティングテーブル内にその受信側ノードを記載しているすべてのノードから警報を受信することができ、これによってネットワーク内のすべてのノードへの複数のパスが形成される。したがって警報は、ネットワーク内の実質的にすべてのノードへ配信することができ、警報が阻止される事態を少なくするために、別々のパスを介して各ノードへ複数の警報を回送することができる。
【０１３２】
さらにノードは、警報を転送する前に、警報の作成元および／または警報の内容、例えばプログラム内の脆弱性の兆候を検証することができる。警報の作成元を検証することができず、検証されている脆弱性に関する記述が見つかった場合、ノードはその警報を転送する場合もあり、転送しない場合もある。警報の作成元を検証することができ、脆弱性に関する記述が見つからない場合、ノードはその警報を放棄することができる。
【０１３３】
ノードは、１つの警報を既に転送された複数の警報と比較することができる。その警報が、以前に転送された警報と同じ脆弱性について記述している場合、ノードはその警報を転送しない場合がある。同じ警報メッセージを果てしなく送信し続ける事態を少なくするために、警報は、その警報が複製されたものかどうかを判断するために検査できる警報識別子、警報を転送するための特定の時間量を示すタイムアウト標識、警報が転送される回数を制限する転送回数のカウンタ、または他の任意の適切な標識を含むことができる。
【０１３４】
ノードがオーバーレイに参加する場合、参加する側のノードは、そのリーフセットおよび／またはルーティングテーブル内に存在するノードなど、オーバーレイの１つまたは複数のノードに対して、関連する警報を転送するよう要求することができる。この関連する警報は、例えば参加側のノードが最後にオーバーレイへの接続を離脱して以降に認証された警報や、所定の期間内の警報などを含むオーバーレイ内のノードによって保存される任意の適切な警報とすることができる。警報の要求を受信したノードは、要求された警報のすべてまたは一部を返すことができる。追加および／または代替として、警報の要求を受信したノードは、自分が受信および／または保存している警報の要約を送信することができる。参加側のノードは、要約内の識別された警報の一部を選択し、それらの特定の警報をネットワークオーバーレイ内の受信側ノードおよび／または他のノードに要求することができる。この警報の要約は、必要に応じて任意の適切な形態を取ることができる。
【０１３５】
図１２のピアツーピアネットワークの例を参照すると、ノード１２０２は、ノード１２２０、１２２２、１２２４、１２２６用の入力を含むリーフセット１２３２を有することができる。ノード１２０２は、ノード１２２０、１２２２、１２２４、１２２６へ警報を送信することができ、これらのノードのそれぞれは、認証された警報をそれらのリーフセット内に含まれるノードへ転送することができる。例えばノード１２２２は、ノード１２０２、１２２０、１２４４、１２４６を含むリーフセット１２４２を有することができる。このようにノード１２２０は、ノード１２０２とノード１２２２の双方から警報を受信することができる。さらに、警報が後続の各リーフセットへ送信されるに従って、その警報はネットワーク中に配信される。
【０１３６】
さらにこの配信システムは、オーバーレイネットワークのサイズが拡大または縮小するのに応じて、自動的に拡大縮小することができる。このルーティングテーブルおよび／またはリーフセット配信技術によって、ピアツーピアネットワークのいかなるノードも、独自にワーム封じ込めシステムに参加または離脱できるようになる。さらに自己認証式警報を配信することによって、パートナー間で広範な合意が不要となる場合がある。より詳細には、それぞれのノードは、感染について通知する上で、および／または感染から自分たちを保護する上で、単一のポイント、例えばＩＳＰや他の中央サーバには依存しない。
【０１３７】
このワーム封じ込めシステムの検出、警報の認証、警報の配信、および／または対応モジュールは、単一の中央処理装置には依存しないため、専用の攻撃のターゲットとなる、および／または単一障害点となる可能性のある中央インフラストラクチャは存在しない。場合によっては、ワーム封じ込めシステムのインフラストラクチャをさらに分散化するために、封じ込めシステムの一部（例えば、ピアツーピアネットワークのノードのリーフセットの一部）であるすべてのノードを交換可能とすることができる。このようにして、封じ込めシステム内のノードのすべてまたは少なくとも一部は、（それぞれ異なる形で実装することができ、実際にそうされている可能性があるにもかかわらず、）同じタイプの機能を果たすことができる。
【０１３８】
インターネットプロトコルマルチキャストおよびプルベースのメカニズムなどの他の配信または伝播技術が適する場合もある。
【０１３９】
展開のシナリオ
前述のように、オーバーレイネットワークの１つまたは複数のノードは、検出モジュールを実行して、ワームの攻撃および／またはソフトウェアプログラム内の脆弱性を検出することができる。検出モジュールは、１つまたは複数の専用のコンピューティングデバイス（例えばハニーポットタイプの展開）、アイドル状態の１つまたは複数のコンピューティングデバイス（例えばスクリーンセーバタイプのアプリケーションの一部として）、および通常の製品展開の一環としての１つまたは複数のノードの任意の組合せによって実行することができる。
【０１４０】
ワームが蔓延しているときに警報を広く送信するために使用されるオーバーレイネットワークは、インターネットまたは他の通信ネットワークの全体にわたって展開すること、企業の１つのローカルネットワークの複数のノードにわたって展開すること、特定の種類のユーザ（例えばソフトウェアパッケージの登録ユーザ）として定義された複数のノードにわたって展開することなどができる。
【０１４１】
前述のように、脆弱性またはワームの攻撃が検出されると、警報メッセージを自動的に作成することができる。さらに、警報メッセージを受信した際および／または警報メッセージを認証した際に、所定の配信プロトコルに従って自動的に警報を転送することができる。場合によっては、手動または人間の対話によって、警報を作成および／または転送するための監視および／または承認を提供することができる。
【０１４２】
ネットワークのノードのすべてまたは少なくとも一部が、封じ込めシステムにおける検出、警報の認証、および／または警報の配信に関与している場合、大規模な攻撃が発生する前でさえ、攻撃者がシステムに侵入する可能性がある。システム内のいずれのノードも悪意を有する可能性があり、それぞれのノードが別々のエンティティによって所有されている可能性がある場合、たとえそれらのノードが、認証局によって署名されたＩＤを有していても、それらのノード間には信頼関係がまったくない可能性がある。それにもかかわらず、これらのノードは、ワームが未知の脆弱性を悪用するのを阻止するという課題について協力することができる。悪意あるノードを識別することによって、悪意あるノードによって悪用される可能性のあるメカニズムが取り込まれるおそれがある。したがって封じ込めシステムのアーキテクチャは、前述のように、ネットワーク内に存在する悪意ある未知のノードに耐えうるように、および／またはそうしたノードを囲い込むような設計で作成することができる。
【０１４３】
作動中、ワーム封じ込めアーキテクチャは、検出、警報の作成、警報の認証、警報の配信、および／あるいはワームまたはプログラムの脆弱性への対応を提供することができる。より詳細には、場合によると、この封じ込めシステムによって保護されているネットワークの各ノードは、検出、警報の作成、警報の認証、警報の配信、および／あるいは攻撃または脆弱性への対応のうち少なくとも１つに参加することができる。例えば図３を参照すると、ピアツーピアネットワーク３１０の検出側ノードは、検出モジュール３４０、警報モジュール３５０、配信モジュール３７０、および対応モジュール３８０を含むことができる。前述のように、検出モジュールは、動的データフロー分析などを使用することによって、ワームの攻撃および／またはソフトウェアの脆弱性を検出することができる。任意の適切なランタイム分析システムを使用して、イベントを追跡監視することができる。
【０１４４】
ワームの攻撃および／またはプログラムの脆弱性を検出すると、検出モジュール３４０は、対応モジュール３８０と通信して、１つまたは複数の防護手段をトリガすることができる。識別されたワームおよび／またはプログラムの脆弱性を感染していないノードへ伝達するために、検出側ノード３１０は、警報モジュール３５０を使用して、警報メッセージ３３０を作成することができる。前述のように、この警報メッセージは自己認証式とすることができ、および／または脆弱なプログラムの識別子、脆弱性タイプ標識、イベントリスト、１つまたは複数の検証ヒント、および対応標識のうちの１つまたは複数を含むことができる。警報モジュール３５０は、配信モジュール３７０と通信して、配信プロトコルに従ってネットワークの１つまたは複数のノードへ警報メッセージ３３０を送信することができる。例えば前述のように、警報メッセージは、ネットワークオーバーレイプロトコルに従って維持されているルーティングテーブル内で識別されたノードへ配信することができる。追加または代替として、警報メッセージは、ピアツーピアオーバーレイプロトコルに従って維持されているリーフセット内で識別されたすべてのノードへ配信することもできる。
【０１４５】
図３に示されているように、警報メッセージ３３０は、ノード３１０のリーフセット内で識別された受信側ノード３２０へ送信することができる。この受信側ノードは、警報メッセージ３３０を受信し、警報検証モジュール３６０を使用して、警報メッセージを認証することができる。警報が認証された場合、受信側ノード３２０は、対応モジュール３８０を使用して、１つまたは複数の防護手段をトリガすることができる。通信ネットワーク全体にわたって警報３３０を配信するために、受信側モジュール３２０は、配信モジュール３７０を使用して、配信プロトコルに従ってネットワークの１つまたは複数のノードへ警報メッセージ３３０を転送することができる。例えば前述のように、警報メッセージは、ピアツーピアオーバーレイプロトコルに従って維持されているルーティングテーブルおよび／またはリーフセット内で識別されたノードへ配信することができる。
【０１４６】
ある実験では、ＳＱＬ  Ｓｌａｍｍｅｒに類似したワームによる攻撃を切り抜けたノードの比率は、システム内におけるワームを検出したノードの比率の関数として割り出すことができる。ある実験では、１つの母集団、すなわち１００，０００台のノード（例えばホストコンピューティングデバイス）がネットワークの一部であり、１０台が感染しているとしてシミュレートした。さらにワームによる攻撃の前でさえ、ネットワーク内のノードの１０％が悪意を有すると仮定した。感染率βは約０．１１７と推定され、これは、インターネット上で観測されるＳＱＬ  Ｓｌａｍｍｅｒの動作に近い数値と考えられる。実験結果の例が図１３のグラフ１３００に示されており、ワームを検出したノードの比率が軸１３０２に沿って示され、感染を免れたノードの比率が軸１３０４に沿って示されている。図１３のグラフは、ネットワーク内におけるワームを検出したノードの比率がわずかであっても、例えば０．００１であっても、ワームの感染を脆弱な母集団の１０％未満に封じ込めるのには十分である場合があることを示している。
【０１４７】
例示された実施形態を参照して本発明の原理について説明および例示したが、そうした原理から逸脱することなく、例示された実施形態の構成および細部を修正できることが理解されよう。
【０１４８】
例えば１つの方法は、プログラム識別子およびイベントリストを含む自己認証式警報を受信側コンピューティングデバイスにおいて受信するステップであって、そのプログラム識別子は、検出された脆弱性を有するプログラムを識別し、そのイベントリストは、検出された脆弱性を示す１つまたは複数の非決定性のイベントを含むステップと、受信側コンピューティングデバイスが、検出された脆弱性を有するプログラムを含むかどうかを判定するステップと、イベントリストが、検出された脆弱性を示していることを検証するステップとを含むことができる。この検証するステップは、プログラム内のイベントリストを実行するステップを含むことができる。検証するステップは、プログラムの命令から論理安全性条件を作成するステップと、イベントリストの冒頭にプログラムの状態を定義する前提条件を定義するステップと、イベントリストに基づいて脆弱な述部を定義するステップと、述語論理に基づいて論理安全性条件、前提条件、および脆弱な述部を評価するステップとを含むことができる。この方法では、自己認証式警報は、プログラム内で検出された脆弱性のタイプを示すための脆弱性タイプ識別子を含むことができ、検証するステップは、脆弱性タイプ識別子を参照するステップを含む。この方法では、自己認証式警報は、検出された脆弱性をイベントリストがどのように示すかの表示（ｉｎｄｉｃａｔｉｏｎ）を提供する１つまたは複数の検証ヒントを含むことができる。イベントリストを検証するステップは、１つまたは複数の検証ヒントに基づいてイベントリストを修正して、検証が成功したことを信号で伝えるプログラムへロードされた検証関数の実行をトリガするステップを含むことができる。この方法では、感染の企てを検出するためのソフトウェアまたはハードウェアの装備を使用してプログラムの実行中に記録されたイベントからイベントリストを得ることができる。この方法は、イベントリストを検証するステップに応答して少なくとも１つの他のノードへ自己認証式警報を転送するステップをさらに含むことができる。自己認証式警報が転送される場合、オーバーレイネットワーク内の近隣のノードのセットから少なくとも１つの他のノードうちの少なくとも１つのノードを検索することができる。自己認証式警報が転送される場合、少なくとも１つの他のノードうちの少なくとも１つのノードは、オーバーレイネットワーク内の近隣のノードをすべて含むことができる。この方法は、イベントリストに基づいて脆弱性を解消するためのパッチまたはフィルタを作成するステップをさらに含むことができる。
【０１４９】
別の例では、自己認証式警報のデータ構造をその上に格納しているコンピュータ可読媒体は、ワームの攻撃に対する検出された脆弱性を有するプログラムを識別するプログラム識別子を表すデータを含む第１のデータフィールドと、検出された脆弱性を示す１つまたは複数の非決定性のイベントを含むイベントリストを表すデータを含む第２のデータフィールドと、プログラム内で検出された脆弱性のタイプを示すための脆弱性タイプ識別子を表すデータを含む第３のデータフィールドとを含むことができる。このコンピュータ可読媒体では、脆弱性タイプ識別子は、プログラムの実行を任意のコードへリダイレクトする能力、任意のコードを実行する能力、または任意の引数を関数に提供する能力を示すことができる。このコンピュータ可読媒体は、検出された脆弱性をイベントリストがどのように示すかの表示を提供する１つまたは複数の検証ヒントを表すデータを含む第４のデータフィールドをさらに含むことができる。１つまたは複数の検証ヒントは、脆弱性のタイプに応じて、実行されるコードの任意のアドレスの、実行される任意のコードの、または関数に対する任意の引数の、イベントリスト内のイベントおよびそのイベント内のオフセットを示すことができる。このコンピュータ可読媒体は、検出された脆弱性を解消するのに適したパッチおよびフィルタの少なくとも１つを表すデータを含む第５のデータフィールドをさらに含むことができる。
【０１５０】
別の例では、コンピュータ実行可能コンポーネントを有する１つまたは複数のコンピュータ可読媒体は、ワームの攻撃を検出するための手段と、検出されたワームに対応して自己認証式警報を作成するための手段と、ネットワークオーバーレイの少なくとも１つの他のノードへ自己認証式警報を配信するための手段とを含むことができる。このコンピュータ可読媒体は、構造化されたネットワークオーバーレイのルーティングテーブルおよびリーフセットの少なくとも１つをさらに含むことができ、自己認証式警報を配信するための手段は、ルーティングテーブルおよびリーフセットの少なくとも１つにアクセスして、少なくとも１つの他のノードを決定する。このコンピュータ可読媒体は、ルーティングテーブル内の入力の漏洩を少なくするための手段をさらに含むことができる。自己認証式警報を作成するための手段は、イベントログにアクセスして、ワームの攻撃によって悪用できるプログラム内の脆弱性を示す少なくとも１つの非決定性のイベントを割り出すことができる。このコンピュータ可読媒体は、受信した自己認証式警報を認証するための手段をさらに含むことができ、配信するための手段は、プログラム内の脆弱性およびワームの攻撃の少なくとも１つを示す受信した自己認証式警報を検証することによってトリガされる。
【０１５１】
さらに別の例では、１つまたは複数のコンピュータ可読媒体は、実施されると、受信した情報をコンピューティングシステムのメモリの第１の部分に書き込むかまたは保存するための命令を受信するステップと、受信した情報が、信頼できないソースから、または「汚染されている」ことを示す汚染標識を有するメモリの部分から受信されたものである場合に「汚染されている」ことを表示する第１の汚染標識をメモリの第１の部分に関連付けるステップと、受信した情報をプログラムカウンタへロードするかまたは実行するための命令を受信するステップと、第１の汚染標識が「汚染されている」ことを示しているかどうかというプログラムの脆弱性の表示（ｉｎｄｉｃａｔｉｏｎ）を提供するステップとを含む方法を実行できるコンピュータ可読命令を含む。受信した情報をロードするかまたは実行するための受信された命令は、データを移動するための命令、算術命令および論理命令、ならびにプログラムの制御フローを変更する命令を含むことができる。プログラムの脆弱性の表示を提供するステップは、受信した情報に基づいてパッチまたはフィルタを作成するステップを含むことができる。プログラムの脆弱性の表示を提供するステップは、自己認証式警報を少なくとも１つの他のノードへ送信するステップを含むことができる。このコンピュータ可読媒体は、その少なくとも１つの他のノードをオーバーレイネットワーク内の近隣のノードのセットから識別するノード識別子を検索するステップをさらに含むことができる。このコンピュータ可読媒体は、受信した情報のソースを識別する入力イベント識別子をメモリの第１の部分に関連付けるステップをさらに含むことができる。第１の汚染標識は、入力イベント識別子を含むことができる。このコンピュータ可読媒体は、受信した情報から新たなデータを計算するステップと、その新たなデータをメモリの第２の部分に保存するステップと、受信した情報が、信頼できないソースから、または「汚染されている」ことを示す汚染標識を有するメモリ部分から受信されたものである場合に「汚染されている」ことを表示する第２の汚染標識をメモリの第２の部分に関連付けるステップとをさらに含むことができる。第２の汚染標識は、受信した情報から新たなデータを計算するステップの少なくとも１つのステップを示すデータフローグラフ、またはその情報の受信元であるメモリ部分の汚染標識内のデータフローグラフを含むことができる。メモリの第１の部分は、ＣＰＵレジスタ、メモリページ、およびページ内のメモリロケーションから構成されるグループの少なくとも１つを含むことができる。メモリの第１の部分は、第１のメモリページの一部であるメモリロケーションを含むことができ、この方法は、第１の汚染標識に基づいてページ汚染標識をメモリページに関連付けるステップをさらに含む。受信した情報をプログラムカウンタへロードするかまたは実行するための命令を受信するステップは、第１の汚染標識が「汚染されていない」ことを示している場合に、受信した情報を実行し、受信した情報によって参照される命令を保存しているメモリの第３の部分に関連付けられた第３の汚染標識を検査するための命令を受信するステップを含むことができる。このコンピュータ可読媒体は、第３の汚染標識が「汚染されている」ことを示している場合にプログラムの脆弱性の表示を提供するステップをさらに含むことができる。
【０１５２】
さらに別の例では、１つの方法は、保存された値のソースが信頼できないソースか信頼できるソースかを追跡記録する少なくとも１つの汚染データストアを保持するステップと、その保存された値をプログラムポインタへロードする前に少なくとも１つの汚染ストアを検査するステップと、その保存された値が信頼できるソースからのものであることを少なくとも１つの汚染データストアが示している場合に、その保存された値をロードするステップと、その保存された値が信頼できないソースからのものであることを少なくとも１つの汚染データストアが示している場合に、その保存された値を自動的にロードすることを拒否するステップと、その保存された値を自動的にロードすることを拒否するステップに応答して、その保存された値のストレージロケーションを割り出し、少なくとも１つの汚染データストアから、その保存された値の入力ソースを割り出すステップとを含むことができる。この少なくとも１つの汚染データストアは、保存された値を計算するために使用されるステップのセットを示すデータフローグラフを含むことができる。入力ソースを割り出すステップは、保存された値の入力ソースおよびその入力ソース内のオフセットを割り出すステップを含むことができる。この方法は、保存された値が信頼できるソースからのものであることを少なくとも１つの汚染データストアが示している場合に、その保存された値が指し示している命令が信頼できるソースからのものであるかどうかを判定するステップと、その保存された値およびその命令が双方とも少なくとも１つの信頼できるソースからのものである場合に限ってその命令を実行するステップとをさらに含むことができる。
【０１５３】
さらに別の例では、コンピュータ実行可能コンポーネントを含む１つまたは複数のコンピュータ可読媒体は、動的データフロー分析を使用してワームの攻撃を検出するための手段と、ワームの攻撃を検出したことに応答して警報を作成するための手段と、警報を作成したことに応答してその警報を配信するための手段とを含むことができる。このコンピュータ可読媒体は、検出するための手段の動的データフロー分析に基づいてパッチまたはフィルタを作成するための手段をさらに含むことができる。警報を作成するための手段は、検出するための手段の動的データフロー分析に少なくとも部分的に基づいて自己認証式警報を作成するための手段を含むことができる。
【０１５４】
さらに別の例では、１つの方法は、ワームの攻撃によって悪用できるプログラムの脆弱性を示す第１の実行パスを検索するステップと、その第１の実行パスの少なくとも一部を決定する受信メッセージ内の少なくとも１つのバイトを決定するステップと、その少なくとも１つのバイトの存在を検証するためにテストできる決定されたバイト上の少なくとも１つの条件を決定するステップと、その少なくとも１つの条件によって新たなメッセージの少なくとも一部をテストしてワームによる攻撃の存在を検出するステップと、そのテストに基づいてその新たなメッセージを処理することを拒否するステップとを含むことができる。この第１の実行パスは、脆弱性を検出するために使用されるイベントログから得ることができる。この方法は、別のコンピューティングデバイスから自己認証式警報を受信するステップをさらに含むことができ、第１の実行パスを検索するステップは、自己認証式警報を解析してイベントリストを検索するステップを含むことができる。少なくとも１つの条件を決定するステップは、汚染されているメモリ部分が制御フローの決定において使用されている場合に、その汚染されているメモリ部分からのデータ上で計算された論理演算を記録するステップを含むことができる。この方法は、フィルタ条件を「真」に初期設定するステップをさらに含むことができ、記録するステップは、フィルタ条件をそのフィルタ条件の前の値と少なくとも１つの条件との論理ＡＮＤ関数として更新するステップを含む。この方法は、汚染されているメモリ部分のデータフローグラフを含む命令のシーケンスを記録するステップをさらに含むことができる。この方法は、脆弱性を示す自己認証式警報内にフィルタ条件を含めるステップと、その自己認証式警報を別のコンピューティングデバイスへ送信するステップとをさらに含むことができる。第１の実行パスは、非決定性のイベントのイベントリストを含むことができる。
【０１５５】
別の例では、１つまたは複数のコンピュータ可読媒体は、実施されると、フィルタ条件の値を「真」に初期設定するステップと、プログラムカウンタへロードされるかまたは実行されるデータを含むメモリの部分に関連付けられた汚染標識の値を判定するステップと、条件付きの制御移行を実行するための命令を受信するステップと、フィルタ条件の前の値および判定された汚染標識の値に基づいてフィルタ条件を更新するステップと、そのフィルタ条件を受信メッセージに適用して、プログラム内の脆弱性を悪用するワームの攻撃を阻止するステップとを含む方法を実行できるコンピュータ可読命令を含む。この１つまたは複数のコンピュータ可読媒体は、検出モジュールから脆弱性の表示を受信するステップをさらに含むことができる。この１つまたは複数のコンピュータ可読媒体は、自己認証式警報から脆弱性の表示を受信するステップをさらに含むことができる。この１つまたは複数のコンピュータ可読媒体は、脆弱性を示す自己認証式警報内にフィルタ条件を含めるステップと、その自己認証式警報を別のコンピューティングデバイスへ送信するステップとをさらに含むことができる。汚染標識は、メモリの部分に含まれる値を計算するために使用された命令のシーケンスを含むデータフローグラフを含むことができる。
【０１５６】
さらに別の例では、コンピュータ実行可能コンポーネントを有する１つまたは複数のコンピュータ可読媒体は、ワームによって悪用できるプログラム内の脆弱性を示す命令のシーケンスを自動的に作成するための手段と、その命令のシーケンスに基づいて脆弱性に対する解決策を自動的に作成するための手段とを含むことができる。命令のシーケンスを自動的に作成するための手段は、ワームの攻撃を検出するための手段を含むことができる。命令のシーケンスを自動的に作成するための手段は、受信した自己認証式警報を認証するための手段を含むことができる。解決策を自動的に作成するための手段は、脆弱性を悪用する受信された命令用のフィルタを作成するための手段を含むことができる。解決策を自動的に作成するための手段は、プログラム内の脆弱性に対するパッチを作成するための手段を含むことができる。この１つまたは複数のコンピュータ可読媒体は、命令のシーケンスおよび解決策の少なくとも一部を含む自己認証式警報を作成するための手段をさらに含むことができる。この１つまたは複数のコンピュータ可読媒体は、自己認証式警報をネットワークオーバーレイの少なくとも１つの他のノードへ配信するための手段をさらに含むことができる。
【０１５７】
本発明の原理を適用できる多くの可能な実施形態を考慮すれば、詳細な実施形態は例示的なものにすぎず、本発明の範囲を限定するものとみなすべきではないことを理解されたい。むしろ、添付の特許請求の範囲およびその均等物の範囲および趣旨内に収まりうるそうしたすべての実施形態を本発明として特許請求する。
【図面の簡単な説明】
【０１５８】
【図１】ネットワークシステムのノードを実装するためのコンピューティングシステムの一例を示す概略図である。
【図２】コンピューティングネットワークの一例を示す概略図である。
【図３】封じ込めシステムの一例のデータフロー図である。
【図４】メモリロケーション汚染データストアの一例に関連付けられたページ汚染データストアの一例のテーブルを示す図である。
【図５】ページ汚染データストアの別の例のテーブルを示す図である。
【図６】ワームの攻撃および／またはプログラムの脆弱性を検出する方法の一例を示すフローチャートである。
【図７】警報の一例を示す概略図である。
【図８】自己認証式警報を認証する方法の一例を示すフローチャートである。
【図９】抽象計算機の一例用のコードリストである。
【図１０】安全性条件の一例用の条件リストである。
【図１１】脆弱な命令の命令リストである。
【図１２】ピアツーピアネットワークを示す概略図である。
【図１３】ピアツーピアネットワークの一例においてワームを検出したモジュールの比率が与えられた場合の感染を免れたノードの比率を示すグラフの一例である。
【図１４】レジスタ汚染データストアの一例のテーブルを示す図である。
【図１５】脆弱な命令の命令リストである。
【図１６】自己認証式警報を作成する方法の一例を示すフローチャートである。
【図１７】実行可能バッファへの任意のジャンプに対する脆弱性を有するソースコードリストの一例である。
【図１８】汚染データストアの一例のテーブルを示す図である。
【符号の説明】
【０１５９】
１０２  処理装置
１０４  システムメモリ
１０８  取り外し可能記憶装置
１１０  取り外し不能記憶装置
１１２  通信接続
１１４  （１つまたは複数の）入力デバイス
１１６  （１つまたは複数の）出力デバイス
２１０  ノード
２１１  ネットワーク
３３０  警報
３４０  検出モジュール
３５０  警報モジュール
３６０  警報検証モジュール
３７０  配信モジュール
３８０  対応モジュール
３９０  汚染データストア
【図１】
2006031718.tif 000008
【図２】
2006031718.tif 000009
【図３】
2006031718.tif 000010
【図４】
2006031718.tif 000011
【図５】
2006031718.tif 000012
【図６】
2006031718.tif 000013
【図７】
2006031718.tif 000014
【図８】
2006031718.tif 000015
【図９】
2006031718.tif 000016
【図１０】
2006031718.tif 000017
【図１１】
2006031718.tif 000018
【図１２】
2006031718.tif 000019
【図１３】
2006031718.tif 000020
【図１４】
2006031718.tif 000021
【図１５】
2006031718.tif 000022
【図１６】
2006031718.tif 000023
【図１７】
2006031718.tif 000024
【図１８】
2006031718.tif 000025
【外国語明細書】
2006031718000001.pdf