(57)【要約】  オペレーティングシステムの識別、ターゲットネットワークトポロジおよびターゲットコンピュータの識別、開いているターゲットポートの識別、ターゲットポート上の脆弱性の評価（３６４）、ターゲットコンピュータ（３４４）から取得された情報に基づく脆弱性のアクティブな評価、ネットワークセキュリティおよび脆弱性の定量的評価、ならびにテストレポート内のターゲットネットワーク、ターゲットコンピュータ、および脆弱性の階層的グラフィック表示を含む、ターゲットネットワーク（３１０）への侵入の脆弱性に関する包括的で高度に自動化されたテスト機能を提供するシステムと方法である。このシステムおよび方法では、目障りになるのを最小限に抑えた手法を使用して、テスト中またはテスト後のターゲットネットワークへの干渉またはダメージを回避する。
2005515541.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークに動作可能に接続されたターゲットコンピュータのオペレーティングシステムを判別するためのシステムであって、
前記ネットワークによりサポートされているプロトコルに準拠し、前記ネットワーク経由で前記ターゲットコンピュータに送信される、第１および第２のデータパケットと、
コンピュータ可読媒体に格納されているデータビットを含み、第１のオペレーティングシステムに関連付けられている、第１および第２のオペレーティングシステムの指紋と、
コンピュータ可読媒体に格納されているデータビットを含み、前記第１のデータパケットの前記送信に応答して受信されたデータの少なくとも一部の表示を含む、第１のターゲットコンピュータの指紋と、
コンピュータ可読媒体に格納されているデータビットを含み、前記第２のデータパケットの前記送信に応答して受信されたデータの少なくとも一部の表示を含む、第２のターゲットコンピュータの指紋と、
前記第１のオペレーティングシステムの指紋及び前記第１のターゲットコンピュータの指紋を比較し、前記第２のオペレーティングシステムの指紋及び前記第２のターゲットコンピュータの指紋を比較し、前記第１のオペレーティングシステムが前記ターゲットコンピュータ上で実行されていたか否かを示す結果を生成する、コンピュータにより実行可能な、指紋の比較命令とを含むシステム。
【請求項２】
前記第１のデータパケットの第１のビット範囲が、第１のパラメータ値を表し、
前記第２のデータパケットの前記第１のビット範囲が、前記第１のパラメータ値と異なる第２のパラメータ値を表す請求項１に記載のシステム。
【請求項３】
前記第２のパラメータ値が、前記第１のデータパケットの前記第１のビット範囲内の１つのビットを変更することにより導かれる請求項２に記載のシステム。
【請求項４】
前記第１のオペレーティングシステムの指紋と前記第２のオペレーティングシステムの指紋とが異なる請求項２に記載のシステム。
【請求項５】
第３のデータパケットであって、前記プロトコルに準拠し、該第３のデータパケットの前記第１のビット範囲が、前記第１および第２のパラメータ値と異なる第３のパラメータ値を表し、前記ネットワーク経由で前記ターゲットコンピュータに送信される第３のデータパケットと、
コンピュータ可読媒体に格納されているデータビットを含み、前記第１のオペレーティングシステムに関連付けられている、前記第１および第２のオペレーティングシステムの指紋と異なる、第３のオペレーティングシステムの指紋と、
コンピュータ可読媒体に格納されているデータビットを含み、前記第１のデータパケットの前記送信に応答して受信されたデータの少なくとも一部の表示を含む、第３のターゲットコンピュータの指紋であって、前記比較命令が、前記第３のオペレーティングシステムの指紋及び前記第３のターゲットコンピュータの指紋を比較するために、前記結果を生成する前に、コンピュータにより実行可能である第３のターゲットコンピュータの指紋とを、さらに含む請求項４に記載のシステム。
【請求項６】
コンピュータ可読媒体に格納されているデータビットを含み、第２のオペレーティングシステムに関連付けられている、第４、第５、および第６のオペレーティングシステムの指紋であって、前記第４、第５、および第６のオペレーティングシステムの指紋のうち少なくとも１つが、前記第１、第２、および第３のオペレーティングシステムの指紋のそれぞれ１つと異なり、前記比較命令が、前記第４のオペレーティングシステムの指紋及び前記第１のターゲットコンピュータの指紋を比較し、前記第５のオペレーティングシステムの指紋及び前記第２のターゲットコンピュータの指紋を比較し、前記第６のオペレーティングシステムの指紋及び前記第３のターゲットコンピュータの指紋を比較し、前記第２のオペレーティングシステムが前記ターゲットコンピュータ上で実行されていたか否かを示す第２の結果を生成する、コンピュータにより実行可能である、第４、第５、および第６のオペレーティングシステムの指紋をさらに含む請求項５に記載のシステム。
【請求項７】
前記プロトコルがＴＣＰ／ＩＰであり、
前記第１のビット範囲が、最大セグメントサイズを表すパケットフィールドに対応する請求項５に記載のシステム。
【請求項８】
前記第１のパラメータ値が、ビットをセットしないことで得られ、
前記第２のパラメータ値が、１つのビットをセットすることにより得られ、
前記第３のパラメータ値が、２つのビットをセットすることにより得られる請求項５に記載のシステム。
【請求項９】
前記第１のパラメータ値が０であり、
前記第２のパラメータ値が１２８であり、
前記第３のパラメータ値が、１２８に２５６の倍数を加算した値である請求項５に記載のシステム。
【請求項１０】
前記第１のビット範囲が、少なくとも２バイトを表し、
前記第２のパラメータの値が、１バイトの中の最後のビットをセットすることにより得られ、
前記第３のパラメータの値が、１バイトの中の最後のビットをセットすることにより得られる請求項５に記載のシステム。
【請求項１１】
前記第３のパラメータが、前記第１のビット範囲内の隣接ビットをセットすることにより得られる請求項１０に記載のシステム。
【請求項１２】
前記第１、第２、および第３のデータパケットが、最低パラメータ値を最初とする順序で送信される請求項５に記載のシステム。
【請求項１３】
ネットワーク経由でアクセス可能なターゲットコンピュータのオペレーティングシステムを判別するためのシステムであって、
前記ネットワークによりサポートされているプロトコルに準拠し、前記ネットワーク経由で前記ターゲットコンピュータに送信される、複数のデータパケットと、
それぞれ、コンピュータ可読媒体に格納されているデータビットを含み、それぞれ、第１のオペレーティングシステムに関連付けられている、第１の複数のオペレーティングシステムの指紋と、
それぞれ、コンピュータ可読媒体に格納されているデータビットを含み、それぞれ、前記複数のデータパケットの前記送信に応答して受信されたデータの少なくとも一部の表示を含む、複数のターゲットコンピュータの指紋と、
前記第１の複数の前記オペレーティングシステムの指紋及び前記複数の前記ターゲットコンピュータの指紋を比較し、前記第１のオペレーティングシステムが前記ターゲットコンピュータ上で実行されていたか否かを示す結果を生成する、コンピュータにより実行可能な、指紋の比較命令とを含むシステム。
【請求項１４】
前記プロトコルがＴＣＰ／ＩＰであり、
前記複数のデータバケットのそれぞれが、それぞれのパケットフィールド内で表される異なる値を持つ請求項１３に記載のシステム。
【請求項１５】
前記パケットフィールドが、最大セグメントサイズフィールドである請求項１４に記載のシステム。
【請求項１６】
それぞれが、コンピュータ可読媒体に格納されているデータビットを含み、それぞれが、第２のオペレーティングシステムに関連付けられている、第２の複数のオペレーティングシステムの指紋であって、前記指紋の比較命令が、前記第２の複数の前記オペレーティングシステムの指紋及び前記複数の前記ターゲットコンピュータの指紋を比較し、前記第２のオペレーティングシステムが前記ターゲットコンピュータ上で実行されていたか否かを示す第２の結果を生成する、第２の複数のオペレーティングシステムの指紋を、さらに含む請求項１３に記載のシステム。
【請求項１７】
ネットワーク経由でアクセス可能なターゲットコンピュータのオペレーティングシステムを判別するための方法であって、
前記ネットワークによりサポートされているプロトコルに準拠する複数のデータパケットを前記ターゲットコンピュータに送信するステップと、
各々が前記複数のデータパケットの前記送信に応答して前記ネットワーク経由で受信されたデータの少なくとも一部を含む、複数のターゲットコンピュータの指紋を生成するステップと、
前記複数のターゲットコンピュータの指紋を、それぞれ第１のオペレーティングシステムに関連付けられている前記第１の一組の所定のオペレーティングシステムの指紋と比較するステップと、
前記第１のオペレーティングシステムが前記ターゲットコンピュータ上で実行されていたか否かを示す結果を生成するステップとを含む方法。
【請求項１８】
前記複数のターゲットコンピュータの指紋を、それぞれ第２のオペレーティングシステムに関連付けられている前記第２の一組の所定のオペレーティングシステムの指紋と比較するステップと、
前記第２のオペレーティングシステムが前記ターゲットコンピュータ上で実行されたか否かを示す結果を生成するステップとを、さらに含む請求項１７に記載の方法。
【請求項１９】
前記プロトコルがＴＣＰ／ＩＰであり、
前記複数のデータバケットのいくつかが、同じパケットフィールド内で異なる値を持つ請求項１７に記載の方法。
【請求項２０】
前記プロトコルがＴＣＰ／ＩＰであり、
前記複数のデータパケットのうちの２つのデータパケットのＭＳＳオプションの値が、１２８で割り切れる請求項１７に記載の方法。
【請求項２１】
前記複数のデータパケットのうちの第１のものの最大セグメントサイズオプションが０であり、
前記複数のデータパケットのうちの第２のものの最大セグメントサイズオプションが１２８であり、
前記複数のデータパケットのうちの第３のものの最大セグメントサイズオプションが３８４である請求項１７に記載の方法。
【請求項２２】
ネットワーク経由でターゲットコンピュータのオペレーティングシステムを識別するための方法であって、
前記ネットワークのプロトコルに準拠し、第１のビット範囲内に第１のビットパターンがある第１のデータパケットを、前記ネットワーク経由で前記ターゲットコンピュータに送信するステップと、
前記第１のデータパケットの前記送信に応答して前記ネットワーク経由で受信されたデータの少なくとも一部を表す第１の応答値を生成するステップと、
前記プロトコルに準拠し、第１のビット範囲内に第２のビットパターンがあり、前記第１のパターンと異なる第２のデータパケットを、前記ネットワーク経由で前記ターゲットコンピュータに送信するステップと、
前記第２のデータパケットの前記送信に応答して前記ネットワーク経由で受信されたデータの少なくとも一部を表す第２の応答値を生成するステップと、
前記プロトコルに準拠し、第１のビット範囲内に第３のビットパターンがあり、前記第１または前記第２のパターンと異なる第３のデータパケットを、前記ネットワーク経由で前記ターゲットコンピュータに送信するステップと、
前記第３のデータパケットの前記送信に応答して前記ネットワーク経由で受信されたデータの少なくとも一部を表す第３の応答値を生成するステップと、
前記第１の応答値を、第１のオペレーティングシステムに関連付けられている第１の所定の値と比較するステップと、
前記第２の応答値を、前記第１のオペレーティングシステムに関連付けられている第２の所定の値と比較するステップと、
前記第３の応答値を、前記第１のオペレーティングシステムに関連付けられている第３の所定の値と比較するステップと、
前記第１のオペレーティングシステム及び前記ターゲットコンピュータの関係を示す値を生成するステップとを含む方法。
【請求項２３】
前記第１の応答値を、第２のオペレーティングシステムに関連付けられている第４の所定の値と比較するステップと、
前記第２の応答値を、前記第２のオペレーティングシステムに関連付けられている第５の所定の値と比較するステップと、
前記第３の応答値を、前記第２のオペレーティングシステムに関連付けられている第６の所定の値と比較するステップとを、さらに含む請求項２２に記載の方法。
【請求項２４】
前記第１のビットパターン内ではビットは一切セットされず、
前記第２のビットパターン内では１つのビットがセットされ、
前記第３のビットパターン内では２つのビットがセットされる請求項２２に記載の方法。
【請求項２５】
少なくとも１つのビットがセットされている前記第２のビットパターン内のバイト数が、少なくとも１つのビットがセットされている前記第１のビットパターン内のバイト数よりも多く、
少なくとも１つのビットがセットされている前記第３のビットパターン内のバイト数が、少なくとも１つのビットがセットされている前記第２のビットパターン内のバイトの個数よりも多い請求項２２に記載の方法。
【請求項２６】
前記第１のビットパターン内のどのバイトも、最下位ビットまたは最上位ビットがセットされず、
前記第２のビットパターン内の少なくとも１つのバイトには、最上位ビットがセットされ、
前記第３のビットパターン内の少なくとも１つのバイトには、最下位ビットがセットされている請求項２２に記載の方法。
【請求項２７】
ターゲットコンピュータがネットワークにつながっているか否かを判別するシステムであって、
コンピュータ可読媒体に格納され、それぞれが、前記ネットワークの第１のプロトコルに準拠するデータパケットを受信するためにコンピュータにより使用されるポートを表し、それぞれが、知られているネットワークサービスに関連付けられているポートを表す、第１の一組のポート識別子と、
それぞれが、前記第１の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれが、前記第１のプロトコルに準拠し、前記ネットワーク経由で前記ターゲットコンピュータに送信される、第１の一組のデータパケットと、
前記第１の一組のデータパケットの前記送信に応答して前記ネットワーク経由で受信される第１の一組の肯定応答パケットと、
ホスト識別子のリストであって、それぞれの前記ホスト識別子が、それぞれのコンピュータに送信されたパケットに応答してデータを送信する前記ネットワークにつながっているコンピュータを表し、前記ホスト識別子が、前記第１の一組の肯定応答パケットが前記ターゲットコンピュータの応答のあることを示す場合に、ホスト識別子の前記リストに追加された前記ターゲットコンピュータを表す、ホスト識別子のリストとを含むシステム。
【請求項２８】
コンピュータ可読媒体に格納され、それぞれが、前記ネットワークの第２のプロトコルに準拠するデータパケットを受信するためにコンピュータにより使用されるポートを表し、それぞれが、知られているネットワークサービスに関連付けられているポートを表す、第２の一組のポート識別子と、
それぞれが、前記第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれが、前記第２のプロトコルに準拠し、前記ネットワーク経由で前記ターゲットコンピュータに送信され、少なくとも１つが、前記知られているネットワークサービスに関連付けられているデータを含む第２の一組のデータパケットと、
前記第２の一組のデータパケットの前記送信に応答して前記ネットワーク経由で受信される第２の一組の肯定応答パケットと、
前記第２の一組の肯定応答パケットが前記ターゲットコンピュータに反応があることを示す場合に、ホスト識別子の前記リストに追加された前記ターゲットコンピュータを表すホスト識別子とを、さらに含む請求項２７に記載のシステム。
【請求項２９】
前記第１のプロトコルがＴＣＰであり、
前記第２のプロトコルがＵＤＰであり、
前記第２の一組の肯定応答パケットが、ＵＤＰデータ応答パケットの非ゼロの集まりである請求項２８に記載のシステム。
【請求項３０】
コンピュータ可読媒体に格納され、それぞれが、前記ネットワークの第２のプロトコルに準拠するデータパケットを受信するためにコンピュータにより使用されるポートを表し、それぞれが、知られているネットワークサービスに関連付けられているポートを表す、第２の一組のポート識別子と、
それぞれが、前記第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれが、前記第２のプロトコルに準拠し、前記ネットワーク経由で前記ターゲットコンピュータに送信され、少なくとも１つが、前記知られているネットワークサービスに関連付けられているデータを含む第２の一組のデータパケットと、
前記第２の一組のデータパケットの前記送信に応答して前記ネットワーク経由で受信される第２の一組の肯定応答パケットと、
前記第２の一組の肯定応答パケットが前記ターゲットコンピュータの無反応を示さない場合に、ホスト識別子の第２のリストに追加される前記ターゲットコンピュータを表すホスト識別子であって、ホスト識別子の前記第２のリストのそれぞれが無反応であることが知られていないコンピュータを表す、ホスト識別子とを、さらに含む請求項２７に記載のシステム。
【請求項３１】
前記第１のプロトコルがＴＣＰであり、
前記第２のプロトコルがＵＤＰであり、
前記第２の一組の肯定応答パケットが、ＩＣＭＰエラーパケットの空の集まりである請求項３０に記載のシステム。
【請求項３２】
それぞれが、前記第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれが、前記第２のプロトコルに準拠し、所定の最大待ち時間いっぱい、前記ターゲットコンピュータに送信される、第３の一組のデータパケットと、
前記第３の一組のデータパケットの前記送信に応答して時間内に最初に受信される第１の応答と、
前記第３の一組のデータパケットの前記送信に応答して時間内に２番目に受信される第２の応答であって、前記第１の応答の前記受信及び前記第２の応答の前記受信の間の時間が、ターゲットコンピュータの待ち時間を定める、第２の応答とを、さらに含む請求項３０に記載のシステム。
【請求項３３】
前記第２の一組のデータパケットのそれぞれが、前記ターゲットコンピュータの待ち時間の間に前記ターゲットコンピュータに連続的に送信される請求項３２に記載のシステム。
【請求項３４】
それぞれが、前記第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれが、前記第２のプロトコルに準拠し、所定の最大待ち時間いっぱい、前記ターゲットコンピュータに送信される、第３の一組のデータパケットと、
前記第３の一組のデータパケットの前記送信に応答して時間内に最初に受信される第１の応答と、
前記第３の一組のデータパケットの前記送信に応答して時間内に２番目に受信される第２の応答であって、前記第１の応答の前記受信及び前記第２の応答の前記受信の間の時間が、ターゲットコンピュータの待ち時間を定める、第２の応答とを、さらに含む請求項２８に記載のシステム。
【請求項３５】
前記第２の一組のデータパケットのそれぞれが、前記ターゲットコンピュータの待ち時間の間に前記ターゲットコンピュータに連続的に送信される請求項３４に記載のシステム。
【請求項３６】
ネットワーク経由でターゲットコンピュータのアクセス可能性をテストするためのシステムであって、
コンピュータ可読媒体に格納され、それぞれが、ＵＤＰ準拠ポートを表し、少なくとも１つが、知られているネットワークサービスに関連付けられているポートを表す、一組のポート識別子と、
それぞれが、前記一組のポート識別子の少なくとも１つにより表されるポートに関連付けられている、一組のＵＤＰ準拠データパケットであって、前記ＵＤＰ準拠データパケットのそれぞれが、前記ターゲットコンピュータの待ち時間とほぼ同じ時間の間前記ターゲットコンピュータに連続的に送信され、前記ＵＤＰ準拠データパケットのうちの少なくとも１つが、前記知られているネットワークサービスに関連付けられているデータを含む、一組のＵＤＰ準拠データパケットと、
前記ネットワーク経由でアクセス可能なコンピュータを表し、ゼロでない一組のＵＤＰデータ応答パケットが前記データパケットの前記送信に応答して受信された場合に、前記ターゲットコンピュータを含む、第１のリストと、
前記ネットワーク経由でアクセス不可能であることが知られていないコンピュータを表し、ＩＣＭＰエラーパケットの空集合が前記データパケットの前記送信に応答して受信された場合に、前記ターゲットコンピュータを含む、第２のリストとを含むシステム。
【請求項３７】
ターゲットコンピュータがネットワーク経由でアクセス可能かどうかを判別する方法であって、
ＴＣＰポートを識別するステップと、
前記ターゲットコンピュータの前記ＴＣＰポートに、それぞれがＴＣＰに準拠している第１のデータパケットを送信するステップと、
前記第１のデータパケットの前記送信に応答して第１の肯定応答パケットを受信するステップと、
前記第１の肯定応答パケットがゼロでない場合に、アクセス可能なコンピュータを表すリストに前記ターゲットコンピュータの表示を追加するステップとを含む方法。
【請求項３８】
ネットワークサービスに関連付けられているＵＤＰポートを識別するステップと、
第２のデータパケットを前記ターゲットコンピュータの前記ＵＤＰポートに送信し、前記第２のデータパケットの少なくとも１つが、前記ターゲットコンピュータの待ち時間の間中、前記ターゲットコンピュータに連続して送信されるステップと、
前記第２のデータパケットの前記送信に応答して第２の肯定応答パケットを受信するステップと、
前記第２の肯定応答パケットがゼロでないＵＤＰデータ応答パケットである場合に、アクセス可能なコンピュータを表すリストに前記ターゲットコンピュータの表示を追加するステップとを、さらに含む請求項３７に記載の方法。
【請求項３９】
前記ターゲットコンピュータにパケットが送信されたことに応答して受信される応答から応答までの時間を測定することにより、前記ターゲットコンピュータの前記待ち時間を決定するステップを含む請求項３８に記載の方法。
【請求項４０】
前記ネットワーク経由でアクセス可能でないと知られていないコンピュータを表すリストに前記ターゲットコンピュータの表示を追加するステップであって、前記追加が、前記第２の肯定応答パケットがＩＣＭＰエラーパケットの空集合を含む場合に、実行されるステップを、さらに含む請求項３８に記載の方法。
【請求項４１】
ネットワーク経由でターゲットコンピュータの脆弱性を評価するための方法であって、
一組のＩＣＭＰパケット、一組のＴＣＰパケット、および一組のＵＤＰパケットをネットワーク上のコンピュータ群に送信することにより、ネットワーク上の応答する一組のコンピュータを発見するステップと、
ＴＣＰパケットを前記一組の応答するコンピュータのそれぞれの第１のポートに送信し、ＵＤＰパケットを前記一組の応答するコンピュータのそれぞれの第２のポートに送信することにより、前記一組の応答するコンピュータのそれぞれでサービスを検出するステップであって、前記第１および第２のポートが一般に、ネットワーク越しにデータパケットを受信するためにコンピュータにより使用され、前記ＴＣＰパケットが、前記第１のポートのうちの１つを使用することが知られている少なくとも１つのコンピュータベースのサービスに関連付けられているデータを含み、前記ＵＤＰパケットが、前記第２のポートのうちの１つを使用することが知られている少なくとも１つのコンピュータベースのサービスに関連付けられているデータを含む、ステップと、
前記ＴＣＰパケットおよび前記ＵＤＰパケットの前記送信に応答して受信される応答を使用して、応答するポートのリストを生成するステップとを含む方法。
【請求項４２】
所定の値と、前記一組の応答するコンピュータのそれぞれへの複数のＴＣＰ準拠パケットの送信に応答して前記一組の応答するコンピュータのそれぞれから受信された応答の一部とを比較することにより、前記一組の応答するコンピュータのそれぞれにより使用されるオペレーティングシステムを判別するステップを、さらに含む請求項４１に記載の方法。
【請求項４３】
自動化脆弱性スクリプトを応答ポートの前記リストで表されるそれぞれの応答ポートに適用することにより、前記ネットワーク上の脆弱性の存在を確認し、前記自動化脆弱性スクリプトのそれぞれにより、特定の応答ポートおよび特定のオペレーティングシステムを含むコンピュータ構成に関連付けられていることが知られている脆弱性をテストするステップを、さらに含む請求項４２に記載の方法。
【請求項４４】
前記ネットワークのセキュリティの客観的な印を計算するステップであって、前記計算が、確認された脆弱性の加重総和に基づく、ステップを、さらに含む請求項４３に記載の方法。
【請求項４５】
前記ネットワークのトポロジを判別するステップであって、前記トポロジ判別が、さまざまな有効期間（ＴＴＬ）設定を持つ一組のＩＣＭＰパケットを送信し、さまざまなＴＴＬ設定を持つ一組のＴＣＰパケットを送信することにより実行されるステップを、さらに含む請求項４４に記載の方法。
【請求項４６】
前記ネットワークのグラフィック表示を出力するステップであって、前記表示が、前記ネットワークのトポロジマップ、加重された確認済み脆弱性の色分けされた表示、ならびに、前記グラフィック表示及び確認された脆弱性の情報記述子と、前記ネットワーク上のコンピュータとの関連付けを含む、ステップを、さらに含む請求項４５に記載の方法。
【請求項４７】
ネットワークのグラフィック表示を作成する方法であって、
ネットワーク上のノードのＩＰアドレスを取得するステップと、
前記ノード間のノード距離および接続関係を取得するステップと、
いくつかのノードをルータとして識別するステップと、
他のノードを前記ルータの１つに接続されている葉ノードとして識別するステップと、
ルータノードのグラフィック表示を生成するステップと、
ルータ毎に、前記それぞれのルータの前記グラフィック表示との空間関係を持つ直接接続されている葉ノードのグラフィック表示を示すことにより、前記直接接続されている葉ノードのグラフィック表示を生成するステップと、
介在するルータを持たないルータ間のリンクを示すステップとを含む方法。
【請求項４８】
ルータ毎に、前記それぞれのルータのＩＰアドレスと、前記直接接続されている葉ノードのそれぞれのＩＰアドレスとを比較して、直接接続されている葉ノードおよび前記それぞれのルータが、同じノードの２つのネットワーク接続を表すインスタンスを解決するステップを、さらに含む請求項４７に記載の方法。
【請求項４９】
ネットワークのトポロジ表示を作成する方法であって、
前記ネットワーク上の応答コンピュータを識別するステップと、
それぞれの応答コンピュータに、増大する有効期間（ＴＴＬ）値を持つパケットのシーケンスを送信することにより、複数のＩＰアドレスのシーケンスを取得するステップであって、それぞれのＩＰアドレスのシーケンスが発信元コンピュータと前記応答コンピュータのうちの１つとの間の前記ネットワーク内のノードを表し、各シーケンス内の隣接するＩＰアドレスが接続されているノードを表し、前記ノードのそれぞれがコンピュータまたはルータを含む、ステップと、
ノード構造のリストを生成するステップであって、前記ノード構造のそれぞれが、ノードを表すデータ及びそれが直接接続する他のノードを示すデータを含み、前記リストが、前記複数のシーケンス内のすべてのＩＰアドレスを表す、ステップと、
それぞれのＩＰアドレスに関して距離カウントを判別するステップであって、前記距離カウントが、前記ＩＰアドレスを持つノード及び発信元ノードの間のノード数を表す、ステップと、
ルータを備えるノードを表す、それぞれのノード構造に対するルータ構造を作成するステップと、
前期ルータ構造のそれぞれに、前記それぞれのルータ構造により表されている前記ルータを除いて、他のどのノードにも接続していない、それぞれの接続ノードを表す接続データを関連付けるステップと、
前記それぞれのルータ構造の前記接続データにより表される接続ノードに対応する、１つまたは複数のグラフィック形状に空間的に関係するグラフィック形状を、ルータ構造毎に視覚的に示すステップと、
前記それぞれのルータ構造および異なるルータ構造により表されるルータの前記ＩＰアドレスに関連付けられた距離カウントが直接的接続を示している場合に、前記それぞれのルータ構造に関連付けられたグラフィック形状及び前記異なるルータ構造に関連付けられた他のグラフィック形状の間の接続を、ルータ構造毎に視覚的に示すステップとを含む方法。
【請求項５０】
ルータ構造により表されるルータおよび接続データで表される接続ノードが、１つのノードの２つのネットワーク接続を含むか否かをテストするステップを、さらに含む請求項４９に記載の方法。
【請求項５１】
ルータを表す前記グラフィック形状が球形であり、
前記空間的に関係付けられたグラフィック形状のそれぞれが、前記ルータを表す前記球形の周囲を軌道を描いて回る球形である請求項４９に記載の方法。
【請求項５２】
客観的脆弱性スコアを計算する方法であって、
ネットワークの知られている脆弱性を識別するステップと、
搾取容易性または許可されたアクセスのレベルのいずれかに基づいて、前記知られている脆弱性に加重するステップと、
ネットワークの知られている加重脆弱性の組み合わせを数値的に表す脆弱性値を決定するステップとを含む方法。
【請求項５３】
ネットワークの客観的セキュリティスコアを計算する方法であって、
ネットワークの知られている脆弱性の組み合わせを数値的に表す脆弱性値を決定するステップと、
前記ネットワーク上のコンピュータのアクセス可能なポートの組み合わせを数値的に表す暴露値を決定するステップと、
前記脆弱性値及び前記暴露値を組み合わせることによりスコアを導くステップとを含む方法。
【請求項５４】
知られている脆弱性の前記組み合わせが、特定の脆弱性の加重数値表示の総和であり、
前記加重が、搾取容易性ランキングおよびそれぞれの脆弱性のアクセス付与ランキングに基づく請求項５３に記載の方法。
【請求項５５】
自動化ネットワーク脆弱性攻撃を実施する方法であって、
ネットワーク上のそれぞれの応答コンピュータについて一組の脆弱性攻撃を選択するステップであって、それぞれの応答コンピュータについて選択されたそれぞれの脆弱性攻撃が、アクセス可能であることが知られている前記それぞれのコンピュータのポートに関連付けられ、さらに前記それぞれのコンピュータにより使用されるオペレーティングシステムに関連付けられている脆弱性を暴露するように設計されている、ステップと、
それぞれが一意的な識別子によりデータベースで表示されるように前記一組の脆弱性攻撃を符号化するステップと、
自動化スクリプト言語の命令を使用して前記一組の脆弱性攻撃のそれぞれを表すステップと、
コンピュータで前記命令を処理することにより前記脆弱性攻撃を実行するステップとを含む方法。
【請求項５６】
前記ネットワークのセキュリティを表す客観的スコア、並びに
前記ネットワーク経由でアクセス可能なコンピュータのグラフィック表示および前記複数のコンピュータのうち少なくとも一部のコンピュータの前記脆弱性の色分けしたグラフィック表示を含む、ネットワークトポロジのグラフィック表示を含む第１のレポートレベルと、
前記コンピュータおよびその関連付けられた脆弱性を記述するテキスト形式のリスト、並びに
前記コンピュータのアクセス可能なポートおよびサービスを記述する暴露レポートを含む第２のレポートレベルとを含む階層型ネットワーク脆弱性レポート。
【請求項５７】
変数がすべてスタック変数であり、構文解析ツリーが読み取り専用データ構造として処理されるスレッドセーフ実行アーキテクチャで実行される実行可能スクリプトを作成するために使用される一組のプログラミング言語ステートメントと、
式の中で整数データ型と交換可能な、スクリプトで実現される脆弱性評価オペレーションをサポートするように構成されている一組の定数値をそれぞれが持つ、一組の特別スカラーデータ型と、
前記ネイティブオブジェクトを実行可能スクリプトから利用できるようにするためにスクリプトスコープを所有するメタスコープ内で宣言された一組のネイティブオブジェクトであって、前記ネイティブオブジェクトがネットワーク通信を円滑に行えるようにし、一意的なポートのリストを構築し、スクリプト実行権を特定のホストに送る呼び出し可能メンバ関数を備え、スクリプト用のＩＰアドレスを供給する、一組のネイティブオブジェクトと、
他のスクリプトがその情報にアクセスして他のマシンを損なうおそれのあるグローバルデータ領域に自分自身をコピーする動作をし、異なるスクリプトにより発見された脆弱性データを１つのスクリプトで使用しやすくする、脆弱性オブジェクトとを含む脆弱性評価言語。
【請求項５８】
ターゲットコンピュータ上で知られている脆弱性を自動的に適用する方法であって、
データオブジェクトを含む、知られている脆弱性のデータベースを供給するステップと、
前記データオブジェクトに関連付けられている、実行可能スクリプトを供給するステップと、
前記ターゲットコンピュータのポートで前記知られている脆弱性を実行する、前記実行可能スクリプトを前記ターゲットコンピュータに適用するステップと、
前記実行可能スクリプトの成功、失敗、または他の結果のうちの少なくとも１つを表す値を返すステップとを含む方法。
【請求項５９】
知られている脆弱性をネットワークのターゲットコンピュータに自動的に適用する方法であって、
知られている脆弱性のデータベースを供給するステップと、
知られている脆弱性を指定ターゲットコンピュータに適用するために、それぞれが実行可能な一組の実行可能スクリプトを供給するステップと、
第１の実行可能スクリプトを実行して指定ターゲットコンピュータに脆弱性を適用するステップと、
前記第１の実行可能スクリプトのそれぞれの成功、失敗、または他の結果を表す戻り値を監視するステップと、
前記戻り値を使用して、前記ネットワークのセキュリティレベルを表すレポートを生成するステップとを含む方法。
【請求項６０】
実行時間間隔を識別するステップであって、前記第１の実行可能スクリプトの実行が、前記時間間隔のそれぞれの始まりに開始し、前記時間間隔のそれぞれの終わりに一時停止し、これを前記第１の実行可能スクリプトすべてが実行し終えるまで続けるステップを、さらに含む請求項５９に記載の方法。
【請求項６１】
前記第１の実行可能スクリプトの実行が完了したときに、前記第１の実行可能スクリプトの前記実行を自動的に繰り返すステップを、さらに含む請求項６０に記載の方法。
【請求項６２】
前記第１の実行可能スクリプトの実行が完了する毎にレポートを生成するステップと、
複数の前記レポートを比較することにより、前記ネットワークのセキュリティトレンドを計算するステップとを、さらに含む請求項６１に記載の方法。
【請求項６３】
前記第１の実行可能スクリプトの前記実行時に、第２の実行可能スクリプトを実行して、コンピュータの第２のネットワークに脆弱性を適用するステップを、さらに含む請求項５９に記載の方法。
【請求項６４】
前記第２のネットワークが前記ネットワークのサブセットである請求項６３に記載の方法。
【請求項６５】
前記第１の実行可能スクリプトが、前記ターゲットコンピュータのすべての第２のポートに脆弱性を適用する前に、前記ターゲットコンピュータのすべての第１のポートに脆弱性を適用するように構成されている請求項５９に記載の方法。
【請求項６６】
それぞれが、前記実行可能スクリプトの１つによってパケットの非同期送信を可能とする、複数のパケットスロットを割り当てるステップを、さらに含む請求項５７に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワークシステムのセキュリティに関し、より詳細には、ネットワーク脆弱性の自動検出、監視、および報告のためのシステムおよび方法に関する。
【背景技術】
【０００２】
ネットワークの信頼性およびセキュリティは、コンピュータネットワークがエンティティ内およびエンティティ間の通信ならびにトランザクションにおける重要要素である世界では必須である。ネットワーク管理者、政府、セキュリティティコンサルタント、およびハッカーは、例えば、ネットワーク上のコンピュータに許可なくリモートからアクセスし、制御できるかどうかなど、ターゲットネットワークの脆弱性をテストするため、さまざまなツールを使用している。ターゲットネットワークは、このような集中的なテストを通じて、共通の脆弱性および秘密の攻撃に対して「強固」にすることができる。しかし、既存のテストシステムは、矛盾のある結果を出力し、未実証の、またはターゲットネットワークを損なう手法を使用し、絶えず変化しているネットワーク環境に反応すること、または新しい脆弱性を検出することができず、理解するのが困難なテキストベースのレポートで結果を報告する。
【０００３】
現在、侵入の可能性に関してネットワーク経路を調べるための周知のネットワークセキュリティツールが存在している。テストポイントから、ｔｒａｃｅｒｏｕｔｅおよびｐｉｎｇなどの単純なコマンドを使用して、ネットワークトポロジを手動でマッピングすれば、コンピュータがネットワーク上で「目覚めている」状態にある、「存続している」ネットワークアドレスをおおよそ突きとめる（すなわち、どのコンピュータが稼働し、ネットワークパケットに応答しているかを判定する）ことができる。ポートスキャナなどのツールを使用して、ターゲットネットワーク上の個々のターゲットコンピュータをテストし、どのようなネットワークポートが開いているかを判別することができる。開いているポートが見つかった場合、これらのポートは、侵入を許すアクセス口となる可能性があり、悪意あるハッカーによって利用されることがあり得る脆弱性を呈するおそれがある。
【０００４】
さまざまなネットワークツールを組み合わせたいくつかのパッケージソフトは、ターゲットネットワーク上のターゲットコンピュータをテストする準自動化プロセスに追随しようとする。これらのパッケージソフトは、上述のツールを変形したものであり、このテストの結果に基づく長い形態のテキストを出力する。これらのセキュリティテストの出力は、きわめて専門技術的であり、結果を解釈し、結果に基づいてアドバイスを与えるためにはネットワーク通信に関する膨大な知識を必要とする。そのため、これらの部分自動化パッケージソフトは、ネットワークを「強固にする」ことを求めるエンティティに対し包括的なセキュリティ対策を提供していない。
【０００５】
さらに、実際に、ターゲットネットワークにかなりのダメージを与える危険を冒すセキュリティパッケージソフトもある。例えば、異常な形式のネットワークパケットを使用してターゲットコンピュータをテストすることによりターゲットからの膨大な情報およびターゲットのセキュリティに関するフィードバックが得られるが、そのような異常な形式のパケットは、予測できない形でターゲットコンピュータを不安定にする。これにより、ときどき、ターゲットコンピュータへの情報が短期間、喪失するか、またはさらに重大な場合には、ターゲットコンピュータのオペレーティングシステム、もしくはハードウェアが完全にクラッシュすることがある。
【０００６】
他の場合には、既存のパッケージソフトで使用しているテスト方法は信頼性が高くない。例えば、ターゲットコンピュータ上で採用されているネットワークポートスキャン方法が、長時間にわたって８０％の精度であれば、単一のコンピュータ上の２１６個のすべてのポートの完全なテストを実行すると、約１３，０００個のポートが動作中の潜在的に脆弱なサービスとして誤って識別される可能性がある。ターゲットネットワーク全体にわたって、このような「偽陽性」は、ターゲットネットワークの本当のセキュリティレベルを判別することを事実上不可能にする。
【０００７】
既存のテスト方法は、ターゲットネットワークまたはターゲットコンピュータのセキュリティと他のシステムとを客観的に比較する標準的な定量的方法を欠いている。通常、ターゲットネットワークまたはターゲットコンピュータのランク付けは、「高リスク」、「中リスク」、または「低リスク」しかない。しかし、このような３層システムだけでは、経時的なネットワークの変化に関する実質的なフィードバックまたは比較情報、結果的に生じるリスクレベルを判別する際の異なる脆弱性の相対的重み、または、そうでない場合には異種のネットワーク環境の間でのネットワークセキュリティの客観的評価がほとんど得られない。
【発明の開示】
【課題を解決するための手段】
【０００８】
本発明は、包括的なネットワーク脆弱性テストおよび報告方法、ならびにシステムを通じて上記の問題点およびさらに多くの問題点を解決する。特に、テストシステムの機能は、（１）ターゲットコンピュータのオペレーティングシステムの非破壊識別、（２）アクティブ状態のネットワークアドレスおよびそれらのアドレスでアクティブなポートを判別するための多層ポートスキャニング方法、（３）ターゲットネットワークに関する収集された情報と知られている脆弱性のデータベースとの比較、（４）識別されたターゲットコンピュータの識別されたポート上のいくつかの脆弱な点に関する脆弱性評価、（５）すでに発見されているターゲットコンピュータから発見されたデータを再利用する脆弱性のアクティブな評価、（６）ターゲットネットワークのセキュリティを客観的に比較してランク付けするための定量的スコアの適用、および（７）収集された情報の詳細な結果をターゲットネットワーク、ターゲットコンピュータ、ならびにそこに見つかった脆弱性の階層的、動的、およびグラフィック表示に集約する作業の選択された組み合わせを含む。本明細書では、他の機能も予見され、開示されている。
【０００９】
好ましい実施形態では、テストシステムは、企業イントラネットまたはインターネットなどの現代の多層パケットネットワーク上で稼働する。ネットワークは、通常、１台または複数のコンピュータを含み、コンピュータには、オペレーティングシステムが稼働しているデスクトップステーション、ルータ、サーバ、および／またはＴＣＰ／ＩＰ（伝送制御プロトコル／インターネットプロトコル）、ＵＤＰ（ユーザデータグラムプロトコル）などの標準インターネットプロトコルを通じてパケットを送受信できる他のネットワーク接続デバイスが含まれる。このシステムおよび方法は、ターゲットネットワークの外部にある監視コンピュータからリモート実行することができ、またはターゲットネットワークに含まれる監視コンピュータにより実行することができる。ターゲットネットワーク自体は、通常、特定の事前に指定されたサブネットワークアドレス、ＩＰアドレスまたはサブアドレスの範囲、物理的ネットワーク境界、コンピュータ名または一意の識別子、所定のネットワークプロトコルを介した存在の指示または接続などにより束縛されている、相互接続されたコンピュータ群として定義される。ターゲットコンピュータは、ターゲットネットワーク内に見つかったコンピュータの全部または一部を含む。例えば、ＷＡＮ（ワイドエリアネットワーク）との単純な接続を行うターゲットコンピュータを、単一ピアターゲットネットワークとしてリモートでテストすることができる。より複雑な例では、分散ネットワークプロバイダは、世界中に複数のサブネットワークを地理的に分散させるが、数千台のターゲットコンピュータを備えるＷＡＮターゲットネットワークなど、内部プロトコルを介して相互接続される。
【００１０】
ターゲットネットワークは、通常、１つまたは複数のＩＰベースのネットワークプロトコルで稼働する。通常、プロトコルはＴＣＰ／ＩＰおよびＵＤＰである。同様に、テストシステムは、通常、ターゲットネットワークの物理レイヤ構造およびトポロジには関係していない。パケットをブロックしたり、経路変更したり、または変更するファイヤウォールまたはルータなどの構成要素のみ、テストシステムに影響を及ぼす。しかし、テストシステムでは、これらの構成要素に適合しようと試み、一般に、物理的実装にかかわりなく正確な結果を与える。
【００１１】
ＴＣＰ／ＩＰは、ローカルエリアネットワーク、ワイドエリアネットワーク、およびインターネットなどの世界的規模の通信ネットワーク上でパケットベースのネットワーク通信に使用される基本プロトコルである。ＴＣＰ／ＩＰ  ＳＹＮ（同期）パケットの構成例を表１に示す。
【００１２】
表１：代表的なＴＣＰ  ＳＹＮパケット
【表１】
2005515541.tif 000003
【００１３】
コンピュータは、通常、１つまたは複数のオペレーティングシステムで稼働する。通常、これらのオペレーティングシステムには、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）ファミリのオペレーティングシステムなどのＭｉｃｒｏｓｏｆｔ（登録商標）が提供するオペレーティングシステム、Ａｐｐｌｅ（登録商標）のＭａｃＯＳ（登録商標）、Ｌｉｎｕｘ（登録商標）、ＮｅｔＢＳＤ、ＦｒｅｅＢＳＤ、Ｓｏｌａｒｉｓ（登録商標）などのさまざまなＵＮＩＸタイプのオペレーティングシステムがある。さらに、ターゲットネットワーク上のデバイスとしては、ルータのオペレーティングシステム、移動体通信デバイスのオペレーティングシステム、パームトップまたはハンドヘルドのオペレーティングシステム、アプライアンスのオペレーティングシステム、セットトップボックスのオペレーティングシステム、ゲーム機のオペレーティングシステム、デジタル権利管理システム、サーベイランスシステム、スマートカードトランザクションシステム、輸送管理システムなどがあり、一意的なまたは一時的なネットワークアドレスを割り当て、ターゲットネットワークからトラフィックを送信および／または受信することができる。
【００１４】
ターゲットコンピュータは、一実施形態では、一意的なまたは一時的に一意的なＩＰ（インターネットプロトコル）アドレスにより、通常は、Ａ．Ｂ．Ｃ．Ｄの形式で識別され、Ａ、Ｂ、Ｃ、およびＤはそれぞれ、クラスＡ、クラスＢ、クラスＣ、およびクラスＤのサブネットワークを表し、それぞれ０から２５５の値を持つ。通常、ターゲットネットワークは、ターゲットネットワークにより制御されるＩＰアドレスの１つまたは複数の範囲により定義されるが、地形的にターゲットネットワークに接続される、しかし所定のＩＰの範囲または複数の範囲の一部ではない、追加ターゲットコンピュータまたはターゲットサブネットワークを含むことができる。
【００１５】
ＵＤＰ（ユーザデータグラムプロトコル）は、上記のＩＰ（インターネットプロトコル）を実行する代替え「コネクションレス」通信プロトコルである。ＵＤＰは、ＴＣＰなどの接続ベースのプロトコルの誤り訂正および肯定応答機能を欠いている。ＩＣＭＰ（インターネット制御メッセージプロトコル）は、ＩＰネットワーク上のホスト間の制御通信を実行できる（通常、ＩＣＭＰ  ＰＩＮＧ要求を通じて）ＩＰのもう１つの拡張機能である。
【００１６】
本発明の他の態様は、ターゲットコンピュータのターゲットオペレーティングシステムの非破壊および比較的非侵入の識別を含む。
【００１７】
本発明の他の態様は、ターゲットネットワーク上の複数のターゲットコンピュータの並行テストを含む。
【００１８】
本発明の他の態様は、ターゲットネットワーク上の特定のターゲットコンピュータが活動状態であるかどうかを判別するための改善されたテスト方法を含む。
【００１９】
本発明の他の態様は、一組の一般に使用されるポートがターゲットコンピュータ上で開いているかどうかを判別するための改善された方法を含む。
【００２０】
本発明の他の態様は、一組の一般に使用されるＵＤＰポートがターゲットコンピュータ上で開いているか閉じられているかを信頼できる形で判別するための改善された方法を含む。
【００２１】
本発明の他の態様は、ターゲットコンピュータ上で開いていることがわかったポートを一組の知られている脆弱性に関連付ける方法を含む。
【００２２】
本発明の他の態様は、複数のポートおよび複数のターゲットコンピュータの同時並行テストを含む。
【００２３】
本発明の他の態様は、ターゲットコンピュータでの知られているいくつかの脆弱性のアクティブな評価を含む。
【００２４】
本発明のさらに他の態様は、客観的定量的スコアをターゲットネットワーク上に見つかった脆弱性に適用することを含む。
【００２５】
本発明のさらに他の態様は、概要および詳細ドキュメントの両方を含む階層レポートの中でネットワークトポロジ、ネットワークコンピュータ、およびネットワーク脆弱性を表す動的でグラフィカルなレポートの編集を含む。
【００２６】
一実施形態では、本発明は、ネットワークに接続され動作可能なターゲットコンピュータのオペレーティングシステムを判別するためのシステムである。システムは、（１）ネットワークによりサポートされているプロトコルに準拠し、ネットワーク経由でターゲットコンピュータに送信される、第１および第２のデータパケット、（２）コンピュータ可読媒体に格納されているデータビットを含み、第１のオペレーティングシステムに関連付けられている、第１および第２のオペレーティングシステムの指紋、（３）コンピュータ可読媒体に格納されているデータビットを含み、第１のデータパケットの送信に応答して受信されたデータの少なくとも一部の表示を含む、第１のターゲットコンピュータの指紋、（４）コンピュータ可読媒体に格納されているデータビットを含み、第２のデータパケットの送信に応答して受信されたデータの少なくとも一部の表示を含む、第２のターゲットコンピュータの指紋、および（５）第１のオペレーティングシステムの指紋と第１のターゲットコンピュータの指紋とを比較し、第２のオペレーティングシステムの指紋と第２のターゲットコンピュータの指紋とを比較し、第１のオペレーティングシステムがターゲットコンピュータ上で実行されていたかどうかを示す結果を生成するためにコンピュータにより実行可能な指紋比較命令を含む。好ましい一態様では、本発明はさらに、（６）第３のデータパケットであって、プロトコルに準拠し、第３のデータパケットの第１のビットの範囲は第１および第２のパラメータ値と異なる第３のパラメータ値を表し、ネットワーク経由でターゲットコンピュータに送信される、第３のデータパケット、（７）コンピュータ可読媒体に格納されているデータビットを含み、第１のオペレーティングシステムに関連付けられている、第１および第２のオペレーティングシステムの指紋と異なる、第３のオペレーティングシステムの指紋、および（８）コンピュータ可読媒体に格納されているデータビットを含み、第１のデータパケットの送信に応答して受信されたデータの少なくとも一部の表示を含む、第３のターゲットコンピュータの指紋であって、比較命令は第３のオペレーティングシステムの指紋と第３のターゲットコンピュータの指紋とを比較してから結果を生成するためにコンピュータにより実行可能である、第３のターゲットコンピュータの指紋を含む。他の好ましい一態様では、本発明はさらに、（９）コンピュータ可読媒体に格納されているデータビットを含み、第２のオペレーティングシステムに関連付けられている、第４、第５、および第６のオペレーティングシステムの指紋であって、第４、第５、および第６のオペレーティングシステムの指紋のうち少なくとも１つは第１、第２、および第３のオペレーティングシステムの指紋のそれぞれ１つと異なる、第４、第５、および第６のオペレーティングシステムの指紋、第４のオペレーティングシステムの指紋と第１のターゲットコンピュータの指紋とを比較し、第５のオペレーティングシステムの指紋と第２のターゲットコンピュータの指紋とを比較し、第６のオペレーティングシステムの指紋と第３のターゲットコンピュータの指紋とを比較し、第２のオペレーティングシステムがターゲットコンピュータ上で実行されていたかどうかを示す第２の結果を生成するためにコンピュータにより実行可能な比較命令を含む。本実施形態の好ましい態様は、（１０）第１のパラメータ値はビットをいっさいセットしないことにより得られ、第２のパラメータ値は１つのビットをセットすることにより得られ、第３のパラメータ値は２つのビットをセットすることにより得られるか、または（１１）第１のパラメータ値は０、第２のパラメータ値は１２８、第３のパラメータ値は１２８に２５６の倍数を加えた値である態様である。
【００２７】
他の実施形態では、本発明は、ネットワーク経由でアクセス可能なターゲットコンピュータのオペレーティングシステムを判別するためのシステムである。このシステムは、（１）ネットワークによりサポートされているプロトコルに準拠し、ネットワーク経由でターゲットコンピュータに送信される、複数のデータパケット、（２）それぞれ、コンピュータ可読媒体に格納されているデータビットを含み、それぞれ、第１のオペレーティングシステムに関連付けられている、第１の複数のオペレーティングシステムの指紋、（３）それぞれ、コンピュータ可読媒体に格納されているデータビットを含み、それぞれ、複数のデータパケットの送信に応答して受信されたデータの少なくとも一部の表示を含む、複数のターゲットコンピュータの指紋、および（４）第１の複数のオペレーティングシステムの指紋と複数のターゲットコンピュータの指紋とを比較し、第１のオペレーティングシステムがターゲットコンピュータ上で実行されていたかどうかを示す結果を生成するためにコンピュータにより実行可能な指紋比較命令を含む。本実施形態の好ましい態様は、プロトコルがＴＣＰ／ＩＰである態様である。本実施形態の他の好ましい態様は、さらに、（５）それぞれが、コンピュータ可読媒体に格納されているデータビットを含み、それぞれが、第２のオペレーティングシステムに関連付けられている、第２の複数のオペレーティングシステムの指紋であって、指紋比較命令は第２の複数のオペレーティングシステムの指紋と複数のターゲットコンピュータの指紋とを比較し、第２のオペレーティングシステムがターゲットコンピュータ上で実行されていたかどうかを示す第２の結果を生成する、第２の複数のオペレーティングシステムの指紋を含む。
【００２８】
本発明の他の実施形態は、ネットワーク経由でアクセス可能なターゲットコンピュータのオペレーティングシステムを判別する方法である。この方法は、（１）ネットワークによりサポートされているプロトコルに準拠する複数のデータパケットをターゲットコンピュータに送信するステップ、（２）複数のターゲットコンピュータの指紋を生成し、それぞれ複数のデータパケットの送信に応答してネットワーク経由で受信されたデータの少なくとも一部を含むステップ、（３）複数のターゲットコンピュータの指紋と、それぞれ第1のオペレーティングシステムに関連付けられている第１の一組の所定のオペレーティングシステムの指紋とを比較するステップ、および（４）第１のオペレーティングシステムがターゲットコンピュータ上で実行されたかどうかを示す結果を生成するステップを含む。好ましい一態様では、本実施形態は、さらに（５）複数のターゲットコンピュータの指紋と、それぞれ第２のオペレーティングシステムに関連付けられている第２の一組の所定のオペレーティングシステムの指紋とを比較するステップ、および（６）第２のオペレーティングシステムがターゲットコンピュータ上で実行されたかどうかを示す結果を生成するステップを含む。本実施形態の好ましい一態様は、プロトコルがＴＣＰ／ＩＰで、複数のデータパケットのうちの２つのデータパケットのＭＳＳオプションの値が１２８で割り切れる場合の態様である。本実施形態の他の好ましい態様は、複数のデータパケットのうちの第１のものの最大セグメントサイズオプションが０であり、複数のデータパケットのうちの第２のものの最大セグメントサイズオプションが１２８であり、複数のデータパケットのうちの第３のものの最大セグメントサイズオプションが３８４である態様である。
【００２９】
本発明のさらに他の実施形態は、ネットワーク経由でターゲットコンピュータのオペレーティングシステムを判別する方法であって、（１）ネットワーク経由で第１のデータパケットをターゲットコンピュータに送信するステップ（ここで、第１のデータパケットはネットワークのプロトコルに準拠し、第１のビット範囲内に第１のビットパターン内にある）、（２）第１のデータパケットの送信に応答してネットワーク経由で受信されたデータの少なくとも一部を表す第１の応答値を生成するステップ、（３）ネットワーク経由で第２のデータパケットをターゲットコンピュータに送信するステップ（ここで、第２のデータパケットはプロトコルに準拠し、第１のビット範囲内に第２のビットパターンを持ち、第２のビットパターンは第１のパターンと異なる）、（４）第２のデータパケットの送信に応答してネットワーク経由で受信されたデータの少なくとも一部を表す第２の応答値を生成するステップ、（５）ネットワーク経由で第３のデータパケットをターゲットコンピュータに送信するステップ（ここで、第３のデータパケットはプロトコルに準拠し、第１のビット範囲内に第３のビットパターンを持ち、第３のビットパターンは第１または第２のパターンと異なる）、（６）第３のデータパケットの送信に応答してネットワーク経由で受信されたデータの少なくとも一部を表す第３の応答値を生成するステップ、（７）第１の応答値と、第１のオペレーティングシステムに関連付けられている第１の所定の値とを比較するステップ、（８）第２の応答値と、第１のオペレーティングシステムに関連付けられている第２の所定の値とを比較するステップ、（９）第３の応答値と、第１のオペレーティングシステムに関連付けられている第３の所定の値とを比較するステップ、および（１０）第１のオペレーティングシステムとターゲットコンピュータとの関係を示す値を生成するステップを含む方法である。本実施形態の好ましい一態様は、さらに、（１１）第１の応答値と、第２のオペレーティングシステムに関連付けられている第４の所定の値とを比較するステップ、（１２）第２の応答値と、第２のオペレーティングシステムに関連付けられている第４の所定の値とを比較するステップ、および（１３）第３の応答値と、第２のオペレーティングシステムに関連付けられている第６の所定の値とを比較するステップを含む。本実施形態の好ましい一態様は、第１のビットパターン内ではビットは一切セットされず、第２のビットパターン内では１つのビットがセットされ、第３のビットパターン内では２つのビットがセットされる態様である。本実施形態の他の好ましい態様は、少なくとも１つのビットがセットされている第２のビットパターン内のバイトの個数は少なくとも１つのビットがセットされている第１のビットパターン内のバイトの個数よりも多く、少なくとも１つのビットがセットされている第３のビットパターン内のバイトの個数は少なくとも１つのビットがセットされている第２のビットパターン内のバイトの個数よりも多い態様である。
【００３０】
本発明のさらに他の実施形態は、ターゲットコンピュータがネットワークにつながっているかどうかを判別するシステムであって、（１）コンピュータ可読媒体に格納され、それぞれネットワークの第１のプロトコルに準拠するデータパケットを受信するためコンピュータにより使用されるポートを表し、それぞれ知られているネットワークサービスに関連付けられているポートを表す、第１の一組のポート識別子、（２）それぞれ第１の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれ第１のプロトコルに準拠し、ネットワーク経由でターゲットコンピュータに送信される、第１の一組のデータパケット、（３）第１の一組のデータパケットの送信に応答してネットワーク経由で受信される第１の一組の肯定応答パケット、および（４）ホスト識別子のリストであって、それぞれのホスト識別子が各コンピュータに送信されたパケットに応答してデータを送信するネットワーク上のコンピュータを表し、ホスト識別子が第１の一組の肯定応答パケットがターゲットコンピュータの反応を示した場合にホスト識別子のリストに追加されるターゲットコンピュータを表すホスト識別子のリストを含むシステムである。本実施形態の他の好ましい一態様は、さらに、（５ａ）コンピュータ可読媒体に格納され、それぞれネットワークの第２のプロトコルに準拠するデータパケットを受信するためコンピュータにより使用されるポートを表し、それぞれ知られているネットワークサービスに関連付けられているポートを表す、第２の一組のポート識別子、（６ａ）それぞれ第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれ第２のプロトコルに準拠し、ネットワーク経由でターゲットコンピュータに送信される、第２の一組のデータパケットであって、そのうち少なくとも１つは知られているネットワークサービスに関連付けられているデータを含む第２の一組のデータパケット、（７ａ）第２の一組のデータパケットの送信に応答してネットワーク経由で受信される第２の一組の肯定応答パケット、および（８）第２の一組の肯定応答パケットがターゲットコンピュータに反応があることを示す場合ホスト識別子のリストに追加されるターゲットコンピュータを表すホスト識別子を含む。本実施形態の好ましい一態様は、第１のプロトコルがＴＣＰであり、第２のプロトコルがＵＤＰであり、第２の一組の肯定応答パケットがＵＤＰデータ応答パケットの非ゼロの集まりである態様である。本実施形態の他の好ましい一態様は、さらに、（５ｂ）コンピュータ可読媒体に格納され、それぞれネットワークの第２のプロトコルに準拠するデータパケットを受信するためコンピュータにより使用されるポートを表し、それぞれ知られているネットワークサービスに関連付けられているポートを表す、第２の一組のポート識別子、（６ｂ）それぞれ第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれ第２のプロトコルに準拠し、ネットワーク経由でターゲットコンピュータに送信される、第２の一組のデータパケットであって、そのうち少なくとも１つは知られているネットワークサービスに関連付けられているデータを含む第２の一組のデータパケット、（７ｂ）第２の一組のデータパケットの送信に応答してネットワーク経由で受信される第２の一組の肯定応答パケット、および（８ｂ）第２の一組の肯定応答パケットがターゲットコンピュータが無反応であることを示さない場合ホスト識別子の第２のリストに追加されるターゲットコンピュータを表すホスト識別子であって、ホスト識別子の第２のリストのそれぞれが無反応であることが知られていないコンピュータを表す、ホスト識別子を含む。本実施形態の好ましい一態様は、第１のプロトコルがＴＣＰであり、第２のプロトコルがＵＤＰであり、第２の一組の肯定応答パケットがＩＣＭＰエラーパケットの空集合である態様である。他の実施形態の他の好ましい一態様は、さらに、（９）それぞれ第２の一組のポート識別子の少なくとも１つにより表されるポートに送られ、それぞれ第２のプロトコルに準拠し、所定の最大待ち時間いっぱい、ターゲットコンピュータに送信される、第３の一組のデータパケット、（１０）第３の一組のデータパケットの送信に応答して時間内に最初に受信される第１の応答と、（１１）第３の一組のデータパケットの送信に応答して時間内に第２に受信される第２の応答であって、時間は第１の応答の受信からターゲットコンピュータの待ち時間を定める第２の応答の受信までの間である、第２の応答を含む。実施形態の他の好ましい態様は、第２の一組のデータパケットのそれぞれがターゲットコンピュータの待ち時間の間にターゲットコンピュータに連続的に送信される態様である。
【００３１】
本発明のさらに他の実施形態は、ネットワーク経由でターゲットコンピュータにアクセス可能であるかどうかをテストするシステムである。このシステムは、（１）コンピュータ可読媒体に格納され、それぞれＵＤＰ準拠ポートを表す一組のポート識別子であって、その少なくとも１つが知られているネットワークサービスに関連付けられているポートを表す、一組のポート識別子、（２）それぞれ一組のポート識別子の少なくとも１つにより表されるポートに関連付けられている一組のＵＤＰ準拠データパケットであって、ＵＤＰ準拠データパケットのそれぞれがターゲットコンピュータの待ち時間とほぼ同じ時間の間ターゲットコンピュータに連続的に送信され、ＵＤＰ準拠データパケットのうちの少なくとも１つが知られているネットワークサービスに関連付けられているデータを含んでいる、一組のＵＤＰ準拠データパケット、（３）ネットワーク経由でアクセス可能なコンピュータを表し、ゼロでない一組のＵＤＰデータ応答パケットがデータパケットの送信に応答して受信された場合にターゲットコンピュータを含む、第１のリスト、および（４）ネットワーク経由でアクセス不可能であることが知られていないコンピュータを表し、ＩＣＭＰエラーパケットの空集合がデータパケットの送信に応答して受信された場合にターゲットコンピュータを含む、第２のリストを含む。
【００３２】
本発明の他の実施形態は、ネットワーク経由でターゲットコンピュータがアクセス可能かどうかを判別する方法である。この方法は、（１）ＴＣＰポートを識別するステップ、（２）ターゲットコンピュータのＴＣＰポートに、それぞれＴＣＰに準拠している第１のデータパケットを送信するステップ、（３）第１のデータパケットの送信に応答して第１の肯定応答パケットを受信するステップ、および（４）第１の肯定応答パケットがゼロでない場合にアクセス可能なコンピュータを表すリストにターゲットコンピュータの表示を追加するステップを含む。本実施形態の好ましい一態様は、さらに、（５）ネットワークサービスに関連付けられているＵＤＰポートを識別するステップ、（６）第２のデータパケットをターゲットコンピュータのＵＤＰポートに送信するステップ（ここで、第２のデータパケットの少なくとも１つがターゲットコンピュータの待ち時間の間中、ターゲットコンピュータに連続して送信される）、（７）第２のデータパケットの送信に応答して第２の肯定応答パケットを受信するステップ、および（８）第２の肯定応答パケットがゼロでないＵＤＰデータ応答パケットの場合にアクセス可能なコンピュータを表すリストにターゲットコンピュータの表示を追加するステップを含む。本実施形態の他の好ましい一態様は、さらに、（９）ターゲットコンピュータにパケットが送信されたことに応答して受信される応答から応答までの時間を測定することによりターゲットコンピュータの待ち時間を判別するステップを含む。本実施形態の他の好ましい一態様は、さらに、（１０）ネットワーク経由でアクセス可能でないと知られていないコンピュータを表すリストにターゲットコンピュータの表示を追加するステップ（ここで、追加は第２の肯定応答パケットがＩＣＭＰエラーパケットの空集合を含む場合に実行される）を含む。
【００３３】
本発明の他の実施形態は、ネットワーク経由でターゲットコンピュータの脆弱性を評価する方法である。この方法は、（１）一組のＩＣＭＰパケット、一組のＴＣＰパケット、および一組のＵＤＰパケットをネットワーク上のコンピュータ群に送信することによりネットワーク上の応答する一組のコンピュータを発見するステップ、（２）ＴＣＰパケットを応答する一組のコンピュータのそれぞれの第１のポートに送信し、ＵＤＰパケットを応答する一組のコンピュータのそれぞれの第２のポートに送信することにより一組の応答するコンピュータのそれぞれでサービスを検出するステップ（ここで、第１および第２のポートは一般に、ネットワーク越しにデータパケットを受信するためコンピュータにより使用され、ＴＣＰパケットは第１のポートのうちの１つを使用することが知られている少なくとも１つのコンピュータベースのサービスに関連付けられているデータを含み、ＵＤＰパケットは第２のポートのうちの１つを使用することが知られている少なくとも１つのコンピュータベースのサービスに関連付けられているデータを含む）、および（３）ＴＣＰパケットおよびＵＤＰパケットの送信に応答して受信される応答を使用して応答するポートのリストを生成するステップを含む。本実施形態の好ましい一態様は、さらに、（４）所定の値と一組の応答コンピュータのそれぞれへの複数のＴＣＰ準拠パケットの送信に応答して一組の応答コンピュータのそれぞれから受信された応答の一部とを比較することにより、一組の応答コンピュータのそれぞれにより使用されるオペレーティングシステムを判別するステップを含む。本実施形態の他の好ましい一態様は、さらに、（５）自動化脆弱性スクリプトを応答ポートのリストで表されるそれぞれの応答ポートに適用することにより、ネットワーク上の脆弱性の存在を確認し、自動化脆弱性スクリプトのそれぞれにより、特定の応答ポートおよび特定のオペレーティングシステムを含むコンピュータ構成に関連付けられていることが知られている脆弱性をテストするステップを含む。本実施形態のさらに他の好ましい一態様は、さらに、（６）ネットワークのセキュリティの客観的な印を計算するステップ（ここで、計算は確認された脆弱性の加重総和に基づく）を含む。本実施形態の好ましい一態様は、さらに、（７）ネットワークのトポロジを判別するステップ（ここで、トポロジ判別は、さまざまな有効期間（ＴＴＬ）設定を持つ一組のＩＣＭＰパケットを送信し、さまざまなＴＴＬ設定を持つ一組のＴＣＰパケットを送信することにより実行される）を含む。本実施形態の他の好ましい一態様は、さらに、（８）ネットワークのグラフィック表示を出力するステップ（ここで、この表示はネットワークのトポロジマップ、加重された確認済み脆弱性の色分けされた表示、ならびにネットワーク上の確認された脆弱性およびコンピュータを記述するグラフィック表示と情報との関連付けを含む）を含む。
【００３４】
本発明の他の実施形態は、ネットワークのトポロジ表示を作成する方法である。この方法は、（１）ネットワーク上の応答コンピュータを識別するステップ、（２）それぞれの応答コンピュータに、増大するＴＴＬ値を持つパケットのシーケンスを送信することにより複数のＩＰアドレスのシーケンスを取得するステップ（ここで、それぞれのＩＰアドレスのシーケンスは発信元コンピュータと応答コンピュータのうちの１つとの間のネットワーク内のノードを表し、各シーケンス内の隣接するＩＰアドレスは接続されているノードを表し、ノードのそれぞれはコンピュータまたはルータを含む）、（３）ノード構造のリストを生成するステップ（ここで、ノード構造のそれぞれは直接の接続先である他のノードを示すノードおよびデータを表すデータを含み、リストが複数のシーケンス内のすべてのＩＰアドレスを表す）、（４）それぞれのアドレスに関して距離カウントを判別するステップ（ここで、距離カウントがＩＰアドレスを持つノードと発信元ノードとの間のノード数を表す）、（５）ルータを備えるノードを表すそれぞれのノード構造に対するルータ構造を作成するステップ、（６）それぞれのルータ構造により表されるルータを除く他のどのノードにも接続しないそれぞれの接続ノードを表すルータ構造のそれぞれに接続データを関連付けるステップ、（７）ルータ構造毎に、それぞれのルータ構造の接続データにより表される接続ノードに対応する１つまたは複数のグラフィック形状に空間的に関係するグラフィック形状を視覚的に示すステップ、および（８）それぞれのルータ構造および異なるルータ構造により表されるルータのＩＰアドレスに関連付けられた距離カウントが直接的接続を示している場合、ルータ構造毎にそれぞれのルータ構造に関連付けられたグラフィック形状と異なるルータ構造に関連付けられた他のグラフィック形状との接続を視覚的に示すステップを含む。本実施形態の好ましい一態様は、さらに、（９）ルータ構造により表されるルータおよび接続データで表される接続ノードが１つのノードの２つのネットワーク接続を含むかどうかをテストするステップを含む。本実施形態の他の好ましい態様は、ルータを表す図形が球形であり、空間的に関係付けられた図形のそれぞれがルータを表す球形の周囲を軌道を描いて回る球である。
【００３５】
本発明のさらに他の実施形態は、ネットワークの客観的セキュリティスコアを計算する方法である。この方法は、（１）ネットワークの知られている脆弱性の組み合わせを数値で表す脆弱性値を決定するステップ、（２）ネットワーク上のコンピュータのアクセス可能なポートの組み合わせを数値で表す暴露値を決定するステップ、および（３）脆弱性値と暴露値とを組み合わせることによりスコアを導くステップを含む。本実施形態の好ましい態様は、知られている脆弱性の組み合わせが特定の脆弱性の加重数値表示の総和であり、加重が、それぞれの脆弱性に関する搾取容易性ランキングおよびアクセス付与ランキングに基づく。
【００３６】
本発明のさらに他の実施形態は、自動化ネットワーク脆弱性攻撃を実行する方法であって、（１）ネットワーク上のそれぞれの応答コンピュータについて一組の脆弱性攻撃を選択するステップ（ここで、それぞれの応答コンピュータについて選択されたそれぞれの脆弱性攻撃はアクセス可能であることが知られているそれぞれのコンピュータのポートに関連付けられ、さらにそれぞれのコンピュータにより使用されるオペレーティングシステムに関連付けられている脆弱性を暴露するように設計されている）、（２）それぞれが一意的な識別子によりデータベースで表示されるように一組の脆弱性攻撃を符号化するステップ、（３）自動化スクリプト言語の命令を使用して一組の脆弱性攻撃のそれぞれを表すステップ、および（４）コンピュータで命令を処理することにより脆弱性攻撃を実行するステップを含む。
【００３７】
本発明の更なる一実施形態は、階層型ネットワーク脆弱性レポートである。このレポートは、（１）第１のレポートレベルであって、（ａ）ネットワークのセキュリティを表す客観的スコア、および（ｂ）ネットワーク経由でアクセス可能なコンピュータのグラフィック表示および複数のコンピュータのうち少なくとも一部のコンピュータの脆弱性の色分けしたグラフィック表示を含む、ネットワークトポロジのグラフィック表示を含む第１のレポートレベル、ならびに（２）第２のレポートレベルであって、（ａ）コンピュータおよびその関連付けられた脆弱性を記述するテキスト形式のリスト、および（ｂ）コンピュータのアクセス可能なポートおよびサービスを記述する暴露レポートを含む第２のレポートレベルを含む。
【００３８】
本発明の他の実施形態は、脆弱性評価言語である。脆弱性評価言語は、（１）すべての変数がスタック変数であり、構文解析ツリーは読み取り専用データ構造として処理されるスレッドセーフ実行アーキテクチャで実行される実行可能スクリプトを作成するために使用される一組のプログラミング言語ステートメント、（２）式の中で整数データ型と交換可能な、スクリプトで実現される脆弱性評価オペレーションをサポートするように構成されている一組の定数値をそれぞれが持つ一組の特別スカラーデータ型、（３）ネイティブオブジェクトを実行可能スクリプトから利用できるようにするためスクリプトスコープを所有するメタスコープ内で宣言された一組のネイティブオブジェクトであって、ネイティブオブジェクトはネットワーク通信を円滑に行えるようにし、一意的なポートのリストを構築し、スクリプト実行権を特定のホストに送る呼び出し可能メンバ関数を備え、スクリプト用のＩＰアドレスを供給する、一組のネイティブオブジェクト、および（４）他のスクリプトがその情報にアクセスして他のマシンを損なうおそれのあるグローバルデータ領域に自分自身をコピーする動作をし、異なるスクリプトにより発見された脆弱性データを１つのスクリプトで使用しやすくする、脆弱性オブジェクトを含む。
【００３９】
本発明の他の実施形態は、ターゲットコンピュータ上で知られている脆弱性を自動的に適用する方法である。この方法は、（１）データオブジェクトを含む知られている脆弱性のデータベースを供給するステップ、（２）データオブジェクトに関連付けられている実行可能スクリプトを供給するステップ、（３）ターゲットコンピュータのポートで知られている脆弱性を実行する、実行可能スクリプトをターゲットコンピュータに適用するステップ、および（４）実行可能スクリプトの成功、失敗、または他の結果のうちの少なくとも１つを表す値を返すステップを含む。
【００４０】
本発明のさらに他の実施形態は、ネットワークの知られている脆弱性をターゲットコンピュータに自動的に適用する方法である。この方法は、（１）知られている脆弱性のデータベースを供給するステップ、（２）知られている脆弱性を指定ターゲットコンピュータに適用するためにそれぞれが実行可能な一組の実行可能スクリプトを供給するステップ、（３）第１の実行可能スクリプトを実行して指定ターゲットコンピュータに脆弱性を適用するステップと、（４）第１の実行可能スクリプトのそれぞれの成功、失敗、または他の結果を表す戻り値を監視するステップ、および（５）戻り値を使用して、ネットワークのセキュリティレベルを表すレポートを生成するステップを含む。本実施形態の好ましい一態様は、さらに、（６）実行時間間隔を識別するステップ（ここで、第１の実行可能スクリプトの実行がこの時間間隔のそれぞれの始まりに開始し、時間間隔のそれぞれの終わりに一時停止し、これを第１の実行可能スクリプトすべてが実行し終えるまで続ける）を含む。本実施形態の好ましい一態様は、さらに、（７）第１の実行可能スクリプトの実行が完了したときに第１の実行可能スクリプトの実行を自動的に繰り返すステップを含む。本実施形態の好ましい他の態様は、さらに、（８）第１の実行可能スクリプトが完了する毎にレポートを生成するステップ、および（９）複数のレポートを比較することによりネットワークのセキュリティトレンドを計算するステップを含む。本実施形態の他の好ましい態様は、さらに、（１０）第１の実行可能スクリプトの実行中に、第２の実行可能スクリプトを実行して、コンピュータの第２のネットワークに脆弱性を適用するステップを含む。本実施形態の他の好ましい態様は、第２のネットワークがネットワークの部分集合である態様である。本実施形態のさらに他の好ましい態様は、第１の実行可能スクリプトはターゲットコンピュータのすべての第２のポートに脆弱性を適用する前に、ターゲットコンピュータのすべての第１のポートに脆弱性を適用するように構成されている態様である。本実施形態の他の好ましい態様は、複数のパケットスロットを割り当て、それぞれのパケットスロットでは実行可能スクリプトの１つでパケットの非同期送信が可能である、他のステップを含む。
【発明を実施するための最良の形態】
【００４１】
本発明の好ましい実施形態について以下に図面を参照して説明する。
【００４２】
Ｉ．基本的な実装、構造、および制御言語
図１は、ターゲットネットワークの一実施形態を示す。本発明のネットワークセキュリティシステム１００は、一実施形態では、Ｗｉｎｄｏｗｓ  ２０００オペレーティングシステム上で稼働している少なくとも１つのＩｎｔｅｌベースのサーバであるが、ＩＰネットワークを扱うことができ、また大規模データ処理が可能なコンピュータシステムまたはオペレーティングシステムであればどのようなものでも使用できる。ネットワークセキュリティシステム１００は、ターゲットネットワーク１０２の外側にあっても、ターゲットネットワークの内側にあってもよい（図に示されていない）。いずれの場合も、システム１００は、１つまたは複数のノード１０４を介して、インターネットなどのネットワークを通じてターゲットネットワーク１０２に接続される。ターゲットネットワーク１０２は、一実施例では、中央イントラネットハブ１０６を備えるイントラネットからなる。ターゲットネットワーク１０２は、さらに、ターゲットネットワーク１０２に入るトラフィックまたはターゲットネットワーク１０２から出るネットワークトラフィックの一部をブロックするファイヤウォール１０８を含む。ターゲットネットワークは、さらに、インターネットプロトコル（ＩＰ）アドレスの所定の範囲内にあるとして定義されている、多数のホスト１１０を含む。場合によっては、外部ホスト１１２は、ターゲットネットワークの外側に置かれていてもよいが、それでも、ターゲットネットワーク１０２に接続することが可能である。
【００４３】
図２は、ターゲットネットワークにつながっているターゲットコンピュータの一実施形態の図である。一般に、ホストＩＰアドレスは、ターゲットネットワークで使用されている場合には、以下でより一般的に定義されているように、ターゲットコンピュータを表す。ホスト１１０のターゲットコンピュータ２００の簡素化された表示において、ターゲットコンピュータ２００では、オペレーティングシステム２０２が実行されている。オペレーティングシステムは、好ましくはターゲットコンピュータ２００とネットワークとの間のロウ（ｒａｗ）ソケット２０６を実現するインターフェースを備える、パケット転送を実現する少なくとも１つのネットワークＴＣＰ／ＩＰスタック２０４を含むのが好ましい。ネットワーク２０８との物理的接続は、一実施形態では、ネットワークインターフェースカード（ＮＩＣ）２１０により実行される。ＩＰネットワークでは、ターゲットコンピュータ２００の６５，５３６個の論理ポート２１２のうちどれか１つでパケットを受信できる。同様に、任意の数のネットワークサービス２１４を提供することが可能である。
【００４４】
図３は、本発明の一実施形態による包括的テスト方法の一実施形態を示す。図３は、この方法の概要を示している。方法の他の詳細は、図４〜１１に関して以下で説明する。
【００４５】
図３の第１のステップまたはルーチン３１０において、このテスト方法により、ターゲットネットワークが定義され、またＩＰアドレスのスキャンリストが作成される。スキャンリストは、スキャンリストデータベース３１２に格納される。その後、この方法では、ルーチン３１４において、スキャンリストデータベース３１２からＩＰアドレスの第１のバッチを取得し、ブロック３２０で始まるホスト発見ルーチンを実行することによりターゲットネットワークの詳細分析を開始する。
【００４６】
ホスト発見ルーチンは、ＩＣＭＰホスト発見ルーチン３２２を含むが、これについては、以下で詳述する。ＩＣＭＰホスト発見ルーチン３２２の実行中に、この方法は、ＩＰアドレスの現在のバッチで識別されたターゲットコンピュータにｐｉｎｇを実行する。ＩＣＭＰホスト発見ルーチン３２２は、応答または応答無しに基づいて、特定のターゲットコンピュータが「稼働している」かまたは「おそらく稼働している」ことを判別することができ、その判別に従って、関連付けられているＩＰアドレスがそれぞれの稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に追加される。
【００４７】
ＩＣＭＰホスト発見ルーチン３２２を完了した後、この方法は、決定ルーチン３２８を実行し、そこで、ＩＰアドレスの現在のバッチでのすべてのＩＰアドレスがすでに発見されているかどうか（すなわち、すべてのＩＰアドレスが稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に割り当てられているかどうか）を判別する。ＩＰアドレスが発見されなかった場合、この方法は、ＴＣＰホスト発見ルーチン３３０に進むが、これについて以下で詳述する。ＴＣＰホスト発見ルーチン３３０の実行中に、この方法は、ＩＰアドレスの現在のバッチで識別された残りのターゲットコンピュータにＴＣＰパケットを送信する。ＴＣＰホスト発見ルーチン３３０は、応答または応答無しに基づいて、残りのターゲットコンピュータのうちの特定のターゲットコンピュータが「稼働している」かまたは「おそらく稼働している」ことを判別することができ、その判別に従って、関連付けられているＩＰアドレスがそれぞれの稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に追加される。
【００４８】
ＴＣＰホスト発見ルーチン３３０を完了した後、この方法は、決定ルーチン３３２を実行し、そこで、ＩＰアドレスの現在のバッチでのすべてのＩＰアドレスがすでに発見されているかどうか（すなわち、すべてのＩＰアドレスが稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に割り当てられているかどうか）を判別する。ＩＰアドレスが発見されなかった場合、この方法は、インテリジェント型ＵＤＰホスト発見ルーチン３３４に進むが、これについて以下で詳述する。インテリジェント型ＵＤＰホスト発見ルーチン３３４の実行中に、この方法は、ＩＰアドレスの現在のバッチで識別された残りのターゲットコンピュータにＵＤＰパケットを送信する。インテリジェント型ＵＤＰホスト発見ルーチン３３４は、応答または応答無しに基づいて、残りのターゲットコンピュータのうちの特定のターゲットコンピュータが「稼働している」かまたは「おそらく稼働している」ことを判別することができ、その判別に従って、関連付けられているＩＰアドレスがそれぞれの稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に追加される。
【００４９】
インテリジェント型ＵＤＰホスト発見ルーチン３３４を完了した後、この方法は、決定ルーチン３３６を実行し、そこで、ＩＰアドレスの現在のバッチでのすべてのＩＰアドレスがすでに発見されているかどうか（すなわち、すべてのＩＰアドレスが稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に割り当てられているかどうか）を判別する。ＩＰアドレスが発見されなかった場合、この方法は、一実施形態では、集約的ＵＤＰホスト発見ルーチン３３８に進むが、これについて以下で詳述する。集約的ＵＤＰホスト発見ルーチン３３８の実行中に、この方法は、ＩＰアドレスの現在のバッチで識別された残りのターゲットコンピュータに追加ＵＤＰパケットを送信する。集約的ＵＤＰホスト発見ルーチン３３８は、応答または応答無しに基づいて、残りのターゲットコンピュータのうちの特定のターゲットコンピュータが「稼働している」かまたは「おそらく稼働している」ことを判別することができ、その判別に従って、関連付けられているＩＰアドレスがそれぞれの稼働しているデータベース３２４またはおそらく稼働しているデータベース３２６に追加される。集約的ＵＤＰホスト発見ルーチン３３８は、オプションであり、すべての実施形態に含めなくてもよい。
【００５０】
集約的ＵＤＰホスト発見ルーチン３３８を完了した後、この方法は、ブロック３４０から始まるサービス発見ルーチンに進むのが好ましい。それとは別に、いくつかの実施形態では、前述のホスト発見ルーチン３２２、３３０、３３４、３３８は、ターゲットコンピュータに対応する追加ＩＰアドレスを活動しているデータベース３２４およびおそらく活動しているデータベース３２６に割り当てることができるかどうかを判別するために繰り返すと都合がよい。このような他の実施形態では、この方法は、ホスト発見ルーチンを最大所定回数繰り返してから、サービス発見ルーチン３４０に進む。どの方法も応答を受信していないこれらのＩＰアドレスは、一実施形態では、ホストの不稼働リスト３３９に追加される。
【００５１】
サービス発見ルーチンでは、この方法は、ＴＣＰサービス発見ルーチン３４２を実行するが、これについては、以下で詳述する。ＴＣＰサービス発見ルーチン３４２では、この方法は、ＴＣＰパケットを稼働しているリスト３２４およびおそらく稼働しているリスト３２６内の発見されたターゲットコンピュータの選択されたポートに送信し、応答が来ないか監視する。ＴＣＰ発見ルーチン３４２は、応答または応答無しに基づいて、ターゲットコンピュータの開いているポートに関する情報をターゲットコンピュータデータベース３４４に追加する。
【００５２】
この方法は、ＴＣＰサービス発見ルーチン３４２を実行した後、ＵＤＰサービス発見ルーチン３４６を実行するが、これについて以下で詳述する。ＵＤＰサービス発見ルーチン３４６では、この方法は、ＵＤＰパケットを稼働しているリスト３２４およびおそらく稼働しているリスト３２６内の発見されたターゲットコンピュータの選択されたポートに送信し、応答が来ないか監視する。ＵＤＰ発見ルーチン３４６は、応答または応答無しに基づいて、ターゲットコンピュータの開いているポートに関する情報をターゲットコンピュータデータベース３４４に追加する。他の実施形態では、開いている追加ポートが発見されているかどうかを判別するために限られた回数だけＴＣＰサービス発見ルーチン３４２およびＵＤＰサービス発見ルーチン３４６を繰り返すと都合がよい。
【００５３】
ＵＤＰサービス発見ルーチン３４６を完了した後（またはそのルーチンを限られた回数繰り返して完了した後）、この方法は、オペレーティングシステム（ＯＳ）識別ルーチン３５０に進み、そこで、開いているポートを持つ稼働しているコンピュータのそれぞれに存在しているオペレーティングシステムの種類およびバージョンを判別する。以下で詳しく説明するが、この方法は、２つまたはそれ以上の（好ましくは３つの）ＲＦＣ準拠ＴＣＰパケットをターゲットコンピュータに送信する。ＴＣＰパケットは、少なくとも１つの選択されたフィールド内に所定のデータを格納している。それぞれのターゲットコンピュータは、ＴＣＰパケットのそれぞれに応答する。それぞれのコンピュータからの応答情報は、それぞれのコンピュータの「指紋」として取り扱われる。それぞれのコンピュータの指紋を指紋データベース３５２内の指紋と比較し、その比較結果を使用して高い精度でターゲットコンピュータを識別する。
【００５４】
ターゲットコンピュータのオペレーティングシステム識別ルーチン３５０を完了した後、この方法は、ブロック３５４から始まるｔｒａｃｅｒｏｕｔｅルーチンに進む。ｔｒａｃｅｒｏｕｔｅルーチンでは、この方法はまず、ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅ手法を使用するＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅルーチン３５６を実行するが、これについては、以下で詳述する。特に、この方法では、ＴＣＰ／ＩＰヘッダの中にさまざまなＴＴＬ（有効期間）値を入れた複数のＩＣＭＰエコー要求パケットをターゲットコンピュータに送信する。この方法は、知られているＴＴＬ値、システムとターゲットコンピュータとの間の「ホップ」回数、および各「ホップ」でのルータ／ホストに基づいてネットワークトポロジを作成する。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅルーチン３５６からの情報が、ネットワークマップデータベース３５８に追加される。送信されたすべてのパケットが到着するか、到着できなかったか、またはタイムアウトになった場合、ｔｒａｃｅｒｏｕｔｅステップはそのターゲットコンピュータについては完了する。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅステップは、完了トレースが受信されるか、または選択された所定の最大回数のパスが完了するまで、繰り返される。
【００５５】
所定の回数のＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅパスが完了した後、この方法は、決定ルーチン３６０に進み、そこで、ターゲットコンピュータのトレースが完了しているか不完了であるかを判別する。トレースが完了している場合、この方法は、ＴＣＰ  ｔｒａｃｅｒｏｕｔｅルーチン３６２に進む。そうでない場合、この方法は、ＴＣＰ  ｔｒａｃｅｒｏｕｔｅルーチンをバイパスし、直接、脆弱性評価ルーチン３６４に進む。
【００５６】
以下で詳述するように、ＴＣＰ  ｔｒａｃｅｒｏｕｔｅルーチン３６２は、ＴＣＰ  ＳＹＮパケットがターゲットコンピュータに送信されることを除きＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅルーチン３５４と同様の動作をする。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅを実行した場合のように、各ＳＹＮパケット内のＴＴＬ値は漸次増加し、ＩＣＭＰ到達不能パケットおよびＳＹＮ  ＡＣＫパケットが戻るかどうかが、スキャニングシステムとターゲットホストの間のすべての「ホップ」に関して監視される。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅとＴＣＰ  ｔｒａｃｅｒｏｕｔｅを組み合わせることで、各ターゲットコンピュータへの完全なマップ、および合わせて、ターゲットネットワークトポロジの比較的完全なマップを作成し、ネットワークマップデータベース３５８内に格納すると都合がよい。
【００５７】
ＴＣＰ  ｔｒａｃｅｒｏｕｔｅルーチン３６２を完了した後、この方法は、脆弱性評価ルーチン３６４に進む。以下で詳述するように、脆弱性評価ルーチン３６４では、この方法は、知られている脆弱性を稼働しているターゲットコンピュータの開いているポートに適用する脆弱性スクリプトを実行して、ターゲットコンピュータのポートに潜在的脆弱性があるかどうかを判別する。この方法は、知られている脆弱性データベース３６６内に格納されている情報を使用して、アクティブなポート毎に実行するために脆弱性スクリプトを選択する。脆弱なターゲットコンピュータから収集された情報は、ターゲットコンピュータデータベース３４４に格納すると都合がよい。
【００５８】
一実施形態では、脆弱性評価ルーチン３６４は、オペレーティングシステム識別ルーチン３５０およびサービス発見ルーチン３４０により判別されたとおり、ターゲットコンピュータの識別されたオペレーティングシステムおよび開いているポートに関連付けられている脆弱性チェックのみを実行するのが好ましい。オペレーティングシステムが最終的に識別されない場合、通常、ターゲットコンピュータの開いているポートに対してルーチンは知られているすべての脆弱性評価を実行する。
【００５９】
一実施形態では、この方法は、アクティブな評価ルーチン３６５に進む。以下で詳述するように、アクティブな評価ルーチン３６５では、脆弱性評価ルーチン３６４内のターゲットコンピュータから収集された情報を使用して、稼働しているターゲットコンピュータの開いているポートにさらに脆弱性スクリプトを実行する。特に、アクティブな評価ルーチン３６５は、知られている脆弱性およびターゲットコンピュータから収集された情報を再利用して、ターゲットコンピュータのポートに潜在的脆弱性があるかどうかを判別する作業を続け、その際に、知られている脆弱性データベース３６６からの情報およびターゲットコンピュータデータベース３４４内の収集された情報を使用する。
【００６０】
アクティブな評価ルーチン３６５を完了した後、この方法は、決定ルーチン３６８に進み、この方法で潜在的ターゲットコンピュータすべてを分析したかどうかを判別する。特に、決定ルーチン３６８では、この方法は、ＩＰアドレスの最後のバッチが分析されているかどうかを判別する。まだ分析されていないターゲットコンピュータのバッチがまだあれば、この方法は、ルーチン３１４に進み、ＩＰアドレスの次のバッチを取得する。そうでない場合、この方法は、スコアリングルーチン３７０に進む。
【００６１】
この方法は、以下で詳述するスコアリングルーチン３７０において、アクティブな評価の結果に基づき、また知られている脆弱性データベース３６６内の脆弱性情報に基づいて、各ターゲットコンピュータおよびネットワークの脆弱性スコアを確定する。次にこの方法は、さらに以下で詳述する報告ルーチン３７２に進み、そこで、スキャニング、アクティブな評価、およびスコアリングの結果を報告する。
【００６２】
この方法は、ターゲットネットワーク上で連続して繰り返すと都合がよく、この方法が時間をかけて実行されるようにスケジュールを所定のスキャン時間枠内に設定することができる。例えば、好ましい実施形態では、ネットワークの使用頻度が低い可能性がそれほど高くないときに、混雑していない時間帯にスキャンするようにこの方法をスケジュールする。特に好ましい実施形態では、この方法は、混雑していない時間帯の終わりに中断可能であり、次の混雑していない時間帯の始めに一時停止したところから再開する。特に都合のよい実施形態では、この方法は、複数のターゲットネットワーク上でネットワーク資源を共有するスレッド実行により同時に動作する。
【００６３】
ＩＩ．非破壊オペレーティングシステム識別
ターゲットコンピュータの脆弱性およびアクセスは、どの特定のオペレーティングシステムがコンピュータ上で実行されているかがわかれば、高めることができる。ターゲットコンピュータのオペレーティングシステムの識別は、ネットワーク上で受信するデータパケットに対するオペレーティングシステムの応答を調べることにより実行できる。パケットの形式およびそれらのパケットへの応答は、ネットワークプロトコルに従って生成される。インターネット上での通信に使用されるプロトコルの定義は、Ｉｎｔｅｒｎｅｔ  Ｒｅｑｕｅｓｔ  ｆｏｒ  Ｃｏｍｍｅｎｔ（ＲＦＣ）文書で規定され、文書化されている。例えば、ＴＣＰ／ＩＰプロトコルは、一部、参照により本明細書に組み込まれているＲＦＣ７９３で定義されており、ネットワーク越しのＴＣＰパケット通信の標準モデルを含む。事実上すべてのオペレーティングシステムがＴＣＰ／ＩＰスタックを備えているが、それぞれのＴＣＰ／ＩＰスタックの実装は少しずつ異なる。したがって、特定のオペレーティングシステムに特有のＴＣＰ／ＩＰスタックからの知られている応答を「指紋」として使用して、ターゲットコンピュータの実際のオペレーティングシステムを判別することができる。
【００６４】
オペレーティングシステムの検出は、従来、ＲＦＣ準拠ＴＣＰパケットと非ＲＦＣ準拠ＴＣＰパケットの組み合わせを送出することにより、実行されてきた。そのため従来のシステムでは、ターゲットコンピュータから一意的な非標準応答を収集し、その応答をＴＣＰ／ＩＰスタックおよび関連するオペレーティングシステムの知られているデータベースにマッピングする。しかし、この方法は、ターゲットコンピュータの特定のパケット形状およびＴＣＰ／ＩＰスタックに大きく依存し、不正確になる傾向があり、高い信頼度でターゲットオペレーティングシステムを識別するためには多数のパケットを必要とする。この方法は、ターゲットコンピュータでのセキュリティまたはファイヤウォールアラームをトリガし、より詳しくいうと、この方法は、大部分ターゲットに送信された非ＲＦＣ準拠パケットのせいでターゲットコンピュータに干渉したり、あるいは実際にクラッシュさせたりする可能性がある。
【００６５】
本システムは、通常、ターゲットコンピュータのオペレーションへの侵入と干渉を最小限に抑えながらオペレーティングシステム検出の精度を最大にするため独自の一組の新しい機能を採用している。一実施形態では、本発明は、ＲＦＣ準拠ＴＣＰ「ＳＹＮ」（同期）パケットをターゲットコンピュータに送信する。ＲＦＣ準拠ＴＣＰパケットを使用すると、検出パケットがルータまたはファイヤウォールによりブロックされる確率が低くなり、検出パケットがターゲットコンピュータに損傷を引き起こす原因となる、またはクラッシュする確率が大幅に小さくなり、都合がよい。特に好ましい一実施形態では、本発明は、３つのＲＦＣ準拠ＴＣＰパケットだけを使用する。したがって、ネットワークの歪みは、ターゲットネットワークにつながる多数のターゲットコンピュータのオペレーティングシステムを検出する際に著しく低減される。
【００６６】
一実施形態では、送信された第１のパケットは、ターゲットコンピュータ上の開いているポートに対する完全に標準的なＴＣＰ  ＳＹＮである。第１のパケットのオプションフィールド内のＭＳＳ（最大セグメントサイズ）オプションは、０に設定される（すなわち、ＭＳＳオプションで設定されているビットはない）。図５を参照されたい。肯定応答パケット、ＳＹＮ  ＡＣＫパケットがターゲットコンピュータから検出システムにより受信されると、そのパケットからの特定のビットがシステムによって保存される。例えば、一実施形態では、ＴＣＰ広告ウィンドウ、ＴＴＬ（有効期間）、オプション、フラグ、およびＤＦ（断片化しない）フィールドは第１の指紋に保存される。
【００６７】
この実施形態では、その後、第２のパケットが送信される。第２のＴＣＰ  ＳＹＮパケットは、これもまた、標準ＴＣＰ  ＳＹＮパケットであるが、ＭＳＳオプションは第２のパケット内で１２８に設定される（ＭＳＳオプション内の単一ビットの設定に対応する）。ターゲットコンピュータからの応答ＳＹＮ  ＡＣＫの一部（好ましくは、ＴＣＰ広告ウィンドウ、ＴＴＬ、およびＤＦビット）もまた、第２の指紋に保存される。最後に、第３のＴＣＰ  ＳＹＮパケットが送信される。第３のパケットも、標準ＴＣＰ  ＳＹＮパケットであるが、ＭＳＳオプションは第３のパケット内で３８４に設定される（ＭＳＳオプション内の２つのビットの設定に対応する）。ここでもまた、ターゲットコンピュータからの応答ＳＹＮ  ＡＣＫの一部（好ましくは、ＴＣＰ広告ウィンドウ、ＴＴＬ、およびＤＦビット）は、第３の指紋に保存される。
【００６８】
一実施形態では、指紋は次の形式で保存される。
ＡＷＭＳＳ＝０：ＡＷＭＳＳ＝１２８：ＡＷＭＳＳ＝３８４：ＴＴＬ：ＤＦ：ＯＳ
ここで、例えば、
ＡＷ＝ＴＣＰ広告ウィンドウ
ＭＳＳ＝ＴＣＰオプション最大セグメントサイズ
ＴＴＬ＝ＴＣＰオプション有効期間
ＤＦ＝ＴＣＰオプション「断片化しない」フラグ、および
ＯＳ＝オペレーティングシステム識別子
である。
【００６９】
他の実施形態では、指紋は次の形式で保存される。
ＡＷＭＳＳ＝０：ＡＷＭＳＳ＝１２８：ＡＷＭＳＳ＝３８４：ＯＰＴＭＳＳ＝３８４：ＯＰＴＭＳＳ＝０：ＯＰＴＭＳＳ＝１２８：ＴＴＬ：ＤＦ：ＦＬ：ＯＳ
ここで、例えば、
ＯＰＴ＝ＴＣＰオプションバイト、および
ＦＬ＝ＴＣＰフラグ
である。
【００７０】
その後、指紋は、さまざまなオペレーティングシステムおよびオペレーティングシステムバージョンに関連付けられている指紋の知られているデータベースと比較される。知られている指紋は、上記の方法を、テストの前に特定のオペレーティングシステムを持つことが知られているさまざまなターゲットコンピュータに適用することにより編集することができる。例えば、さまざまなバージョンのＳｏｌａｒｉｓ（登録商標）オペレーティングシステムが実行される知られているコンピュータのテストにより、以下のオペレーティングシステムの指紋が得られる。
【００７１】
表２：ＳｏｌａｒｉｓおよびＢＳＤオペレーティングシステムのＯＳ指紋例
【表２】
2005515541.tif 000004
【００７２】
複数のＯＳ指紋がそれぞれのオペレーティングシステムに関連付けられている場合があるが、異なるオペレーティングシステムの指紋同士の衝突は、それほど頻繁に見られたわけではない。他のオペレーティングシステムについては、表２に示されているのと同様に、表を作成することができる。時間がたつうちにオペレーティングシステムのバージョンが変わり、人気も移り変わるのに合わせて、指紋データベースを定期的に更新して、パッチ、バージョン変更、および新しいオペレーティングシステムに対応するようにすると都合がよい。上に示されている指紋スタイルは、そのようなデータベースの１つの実施形態にすぎず、変更されたＴＣＰオプション、通常ターゲットコンピュータに送信されるパケットの個数、認識用に格納される他のＴＣＰフィールド、および特定のオペレーティングシステムおよびバージョンなどを表すために使用される識別フィールドに基づいて、オペレーティングシステム指紋を格納する効率的な方法を使用できる。一実施例では、特定のオペレーティングシステムに対する一意的なデータ列は、ＭＤ５などのダイジェストアルゴリズムを使用して圧縮され格納される。他の例については、指紋の完全な照合を必要としない、すなわち、システムでは、例えば、２つの指紋の間の９０％の類似性などのパーセンテージ照合を採用することができ、これはターゲットコンピュータを特定のオペレーティングシステムを持つか、または少なくともオペレーティングシステムの特定のファミリ内にあるものとして識別するのに十分である。
【００７３】
以下に、ＯＳ識別の実行時のパケットの交換例を示す。３つの標準ＴＣＰ  ＳＹＮパケットがリモートホストに送信される。第１のパケットは、データが入っていない、またＩＰもＴＣＰオプションもないＳＹＮパケットである。パケット２は、ＴＣＰ  ＳＹＮパケットでもあるが、ＴＣＰオプションフィールドのＴＣＰ最大セグメントサイズは１２８に設定される。ここでもまた、第３およびさ最後のパケットは、ＴＣＰ  ＳＹＮパケットであるが、ＴＣＰオプションフィールドにおいてＴＣＰ最大セグメントサイズは３８４に設定される。
【００７４】
上記のように、３個のパケットからの返信を分析することにより、次のようにテキスト形式で表示される指紋を組み立てる。
ｗｉｎｄｏｗ１：ｗｉｎｄｏｗ２：ｗｉｎｄｏｗ３：ｏｐｔｉｏｎｓ１：ｏｐｔｉｏｎｓ２：ｏｐｔｉｏｎｓ３：ｔｔｌ：ｄｏｎｔｆｒａｇ：ｆｌａｇｓ
ここで、
ｗｉｎｄｏｗ１＝第１の応答から受信したＴＣＰウィンドウサイズ
ｗｉｎｄｏｗ２＝第２の応答から受信したＴＣＰウィンドウサイズ
ｗｉｎｄｏｗ３＝第３の応答から受信したＴＣＰウィンドウサイズ
ｏｐｔｉｏｎｓ１＝第１の応答から受信したオプションバイト
ｏｐｔｉｏｎｓ２＝第２の応答から受信したオプションバイト
ｏｐｔｉｏｎｓ３＝第３の応答から受信したオプションバイト
ｔｔｌ＝第１の応答からのＩＰ  ＴＴＬフィールド
ｄｏｎｔｆｒａｇ＝第１の応答からのＩＰ  ｄｏｎｔＦｒａｇｍｅｎｔビット
ｆｌａｇｓ＝第１の応答からのＴＣＰフラグの単一文字表示
である。
【００７５】
以下のＴＣＰパケットの例には、この結果得られる指紋が示されている。
４０Ｅ８：４０００：４０８０：０２０４０５Ｂ４：０２０４０５Ｂ４：０２０４０５Ｂ４：８０：１：ＳＡ−−−−
これから、指紋を知られているオペレーティングシステム指紋のデータベースと比較し、リモートオペレーティングシステムを識別する最も近い一致を見つける。この例では、送信される３つのＴＣＰパケット例および返される３つのＴＣＰパケット例が以下に示されている。
----------
Packet 1 send 
TCP
Source port: 272 
Destination port: 80
Sequence: 0x01100000 (17825792)
Acknowledgement: 0x00000000 (0)
Header length: 0x05 (5)-20 bytes
Flags: SYN
URG: 0
ACK: 0
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x0040 (64)
Checksum: 0x4518 (17688)-correct
Urgent Pointer: 0x0000 (0)
TCP Options: None
Data length: 0x0 (0) 
---------
Packet 1 reply
TCP
Source port: 80
Destination port: 272
Sequence: 0x659A2C81 (1704602753)
Acknowledgement: 0x01100001 (17825793)
Header length: 0x06 (6) - 24 bytes
Flags: SYN ACK
URG: 0
ACK: 1
PSH: 0
RST: 0
SYN: I
FIN: 0
Window: 0xE840 (59456)
Checksum: 0x9A47 (39495) - correct
Urgent Pointer: 0x0000 (0)
TCP Options
Maximum Segment Size: 0x5B4 (1460)
Data length: 0x0 (0)
--------
Packet 2 send
TCP
Source port: 528
Destination port: 80
Sequence: 0x03100000 (51380224)
Acknowledgement: 0x00000000 (0)
Header length: 0x07 (7) - 28 bytes
Flags: SYN
URG: 0
ACK: 0
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x0040 (64)
Checksum: 0x1E8A (7818) - correct
Urgent Pointer: 0x0000 (0)
TCP Options
Maximum Segment Size: 0x80 (128)
Data length: 0x0 (0)
---------
Packet 2 reply 
TCP
Source port: 80
Destination port: 528
Sequence: 0x659ABB23 (1704639267)
Acknowledgement: 0x03100001 (51380225)
Header length: 0x06 (6) - 24 bytes 
Flags: SYN ACK
URG: 0
ACK: 1
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x0040 (64)
Checksum: 0x098D (2445) - correct
Urgent Pointer: 0x0000 (0)
TCP Options
Maximum Segment Size: 0x5B4 (1460)
Data length: 0x0 (0)
----------
Packet 3 send
TCP
Source port: 784
Destination port: 80
Sequence: 0x05100000 (84934656)
Acknowledgement: 0x00000000 (0)
Header length: 0x07 (7) - 28 bytes
Flags: SYN
URG: 0
ACK: 0
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x0040 (64)
Checksum: 0x1A8A (6794) - correct
Urgent Pointer: 0X0000 (0)
TCP Options
Maximum Segment Size: 0x180 (384)
Data length: 0x0 (0)
---------
Packet 3 reply
TCP
Source port: 80
Destination port: 784
Sequence: 0x659B732B (1704686379)
Acknowledgement: 0x05100001 (84934657) 
Header length: 0x06 (6) - 24 bytes
Flags: SYN ACK
URG: 0
ACK: 1
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x8040 (32832)
Checksum: 0x4E04 (19972) - correct
Urgent Pointer: 0x0000 (0)
TCP Options
Maximum Segment Size: 0x5B4 (1460) 
Data length: 0x0 (0)
------------
ターゲットコンピュータに関して導かれる上述の指紋の繰り返し数はいくつでもかまわないが、過度の繰り返しをせずにオペレーティングシステムを最も正確に識別できるのは３つの指紋であると判断されている。同様に、他のＴＣＰオプションフラグを変更してターゲットオペレーティングシステムを検出するようにすることも可能であるが、複数のテストＳＹＮパケットにわたって、好ましくはＴＣＰオプションＭＳＳ値がそれぞれ０、１２８、および３８４である３つのテストＳＹＮパケットを使用して、ＴＣＰ広告ウィンドウを変更することが最も効果的であることがわかっている。さらに、ＴＣＰ広告ウィンドウ内のＭＳＳ値を変更することは、パケット内の他の値を変更することに比べてターゲットコンピュータのオペレーションへの干渉の可能性も低い。
【００７６】
前記のオペレーティングシステム識別方法は、図４に要約されて示されている。上述のように、図４の方法により、ネットワークセキュリティシステム４１０はまず、矢印線４２０で表されている第１のパケット伝送を介して、第１のＲＦＣ準拠ＴＣＰ  ＳＹＮパケットをターゲットコンピュータ４１２に送信する。第１のＴＣＰ  ＳＹＮパケットでは、ＴＣＰオプション最大セグメントサイズ（ＭＳＳ）が値０に設定されている（すなわち、すべてのビットがクリアされている）。ターゲットコンピュータ４１２は、矢印線４２２で表されている第１のＳＹＮ  ＡＣＫパケットで第１のＴＣＰ  ＳＹＮパケットに応答する。上述のように、ターゲットコンピュータ４１２から受け取った第１のＳＹＮ  ＡＣＫパケットに含まれている情報の少なくとも一部が、ターゲットコンピュータ内４１２のＴＣＰ／ＩＰスタック内のデータにより判別され、データは、少なくとも一部は、ターゲットコンピュータ４１２上で実行されている特定のオペレーティングシステムにより判別される。
【００７７】
ネットワークセキュリティシステム４１０は次に、矢印線４３０で表されている第２のパケット伝送を介して、第２のＲＦＣ準拠ＴＣＰ  ＳＹＮパケットをターゲットコンピュータ４１２に送信する。第１のＴＣＰ  ＳＹＮパケットでは、ＴＣＰオプション最大セグメントサイズ（ＭＳＳ）が値１２８に設定されている（すなわち、ビット７がセットされている）。ターゲットコンピュータ４１２は、矢印線４３２で表されている第２のＳＹＮ  ＡＣＫパケットで第２のＴＣＰ  ＳＹＮパケットに応答する。上述のように、ターゲットコンピュータ４１２から受け取った第２のＳＹＮ  ＡＣＫパケットに含まれている情報の少なくとも一部も、ターゲットコンピュータ４１２内のＴＣＰ／ＩＰスタック内のデータにより判別され、データは、少なくとも一部は、ターゲットコンピュータ４１２上で実行されている特定のオペレーティングシステムにより判別される。
【００７８】
ネットワークセキュリティシステム４１０は次に、矢印線４４０で表されている第３のパケット伝送を介して、第３のＲＦＣ準拠ＴＣＰ  ＳＹＮパケットをターゲットコンピュータ４１２に送信するのが好ましい。第１のＴＣＰ  ＳＹＮパケットでは、ＴＣＰオプション最大セグメントサイズ（ＭＳＳ）が値３８４に設定されている（すなわち、ビット７および８がセットされている）。ターゲットコンピュータ４１２は、矢印線４４２で表されている第３のＳＹＮ  ＡＣＫパケットで第３のＴＣＰ  ＳＹＮパケットに応答する。上述のように、ターゲットコンピュータ４１２から受け取った第３のＳＹＮ  ＡＣＫパケットに含まれている情報の少なくとも一部も、ターゲットコンピュータ４１２内のＴＣＰ／ＩＰスタック内のデータにより判別され、データは、少なくとも一部は、ターゲットコンピュータ４１２上で実行されている特定のオペレーティングシステムにより判別される。
【００７９】
それとともに、ＴＣＰ  ＳＹＮパケットに応答してターゲットコンピュータ４１２からネットワークセキュリティシステム４１０により受信した３つのＳＹＮ  ＡＣＫパケット内の情報は、図３に関して上で説明されている指紋データベース３５２と比較される指紋を含む。
【００８０】
図５は、図３のオペレーティングシステム識別方法で使用されるＴＣＰ  ＳＹＮパケット５００の一実施例の図である。より上位の（ＩＰ）レイヤでは、パケットは通常、送信元および送信先のインターネットプロトコルアドレスおよび一意的なネットワークアドレス（図に示されていない）を運ぶ。ＴＣＰレベルでは、パケットには、パケットの送信元である送信元ポート５１０およびパケットの送信先であるターゲットコンピュータ上の送信先ポート５１２が含まれる。３２ビットシーケンス数５１４は、データウィンドウ内でパケットに含まれるデータの開始点を記述し、３２ビット肯定応答数５１６は、ターゲットコンピュータにより受信された最終バイトを含む。データオフセット５１８および予約セクション５２０も、パケットの一部である。
【００８１】
ＴＣＰフラグ５２２は、パケットに関する重要な情報であることを示す。特に、ＳＹＮは、新しいストリーム内の第１のパケットを表し、シーケンス５１４および５１６内のスペースは、通常、ＴＣＰフラグ領域５２２内の単一ビットのほかのＳＹＮフラグ用に予約されている。ウィンドウ５２４には、ＴＣＰパケット通信で末端コンピュータの１つにおけるバッファに転送できるデータ量が示される。チェックサム５２６および緊急ポインタ５２８が含まれる。ＴＣＰオプション５３０は、通常、最大セグメントサイズを含む。パケットパディング５３２の後に、パケットにより運ばれる実際のデータ５３４が付加される。
【００８２】
ＩＩＩ．ターゲットコンピュータ識別およびターゲットポート識別のための多層ポートスキャニング
ポートスキャニングは、ネットワークセキュリティを確実なものとするための欠かせないツールである。通常、不審な侵入者は、ポートスキャナを選択されたターゲットコンピュータに適用して、開いているポートを見つけようと試みる。これらの開いているポートを通じて、侵入者は知られているまたは知られていない脆弱性を利用してターゲットコンピュータへのアクセス権を取得することを望む可能性がある。ネットワークセキュリティコンテキストに関しては、通常のポートスキャナをターゲットネットワークにつながっているそれぞれのターゲットコンピュータ上の２１６個すべての（６５，５３６個の）ポートに適用することは、ネットワーク資源を著しく枯渇させ、途方もない時間を要す可能性があり、そのためターゲットコンピュータの実際の脆弱性を正確に突きとめられない場合がある。
【００８３】
一実施形態では、本発明は、ホスト発見およびサービス発見のオペレーションの少なくとも２つの段階を含む反復ポートスキャニングシステムを採用している。ターゲットネットワーク内のＩＰアドレス範囲の特定の集まり（「スキャンリスト」）について、ホスト発見では、どのＩＰアドレスが稼働しているターゲットコンピュータ（すなわち、ネットワークパケットに応答するコンピュータ）かを判別し、それぞれのそのようなアドレスを「稼働しているリスト」に追加し、どのＩＰアドレスが後述のように、部分的に応答するコンピュータを表すかを判別し、それぞれのそのようなドレスを「潜在的に稼働しているリスト」に追加し、どのＩＰアドレスが非応答のコンピュータを表すかを判別し、それぞれのそのようなアドレスを「不稼働リスト」に追加する。サービススキャンでは、ホスト発見段階で稼働していると報告されたそれぞれのターゲットコンピュータは、トラフィックに対して開いている可能性のある知られている一組のポートのスキャニングを受ける。
【００８４】
Ａ．ホスト発見
以下で詳述するが、ホスト発見段階では、１つ、２つ、または３つの異なるテストをスキャンリスト上の各ＩＰアドレスに適用する。バッチでスキャンリストをスキャンし、そこでＩＰアドレスのそれぞれのバッチが（以下で詳述するように）並行してスキャンされ、ホストコンピュータ（すなわち、稼働しているターゲットコンピュータ）を識別する。
【００８５】
ｉ．第１のテスト（ＩＣＭＰ  ｐｉｎｇ要求）
第１のホスト発見テストでは、標準のＩＣＭＰパイプ要求を各ターゲットコンピュータに送信する。応答を受信すると、ターゲットコンピュータは、スキャンリストから外され、稼働しているリストに入れられる、一実施形態では、これは、ＩＣＭＰエコー要求パケットをそれぞれのホストに送信することを引き起こす。複数のＩＣＭＰパケットは、並行して、バッチ内の複数のＩＰアドレスに送出できると都合がよい。通常、システムは、ＩＣＭＰエコー返信がバッチ内のすべてのＩＰアドレスから受信されるか、またはＩＣＭＰエコー要求がタイムアウトになるまでシステムは待機する。このプロセスの結果として、スキャンリスト上のＩＰアドレスのバッチ毎に、ＩＣＭＰエコー要求に応答するＩＰアドレスのリストがスキャンリストから削除され、稼働しているリスト上に置かれる。
【００８６】
ｉｉ．第２のテスト（ＴＣＰパケットの送信）
第１のテストでリストに載っている１つまたは複数のＩＰアドレスから応答を受け取らなかった場合、第２のホスト発見テストとしてスキャンリスト内の残りのターゲットコンピュータに一組のＴＣＰパケット（単一のＳＹＮパケットまたは完全ＴＣＰ接続シーケンス（「ＴＣＰ完全接続」））が送信される。特に、一実施形態では「ＴＣＰ発見ポート」のリストが選択されている。選択は、開いている可能性が最も高いＴＣＰポートに基づく。ＴＣＰ発見ポートリストは、比較的短いと都合がよく、ＨＴＴＰ（Ｈｙｐｅｒｔｅｘｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ）、ＳＭＴＰ（Ｓｉｍｐｌｅ  Ｍａｉｌ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ）などの周知のサービスポートを含むのが好ましい。ＴＣＰホスト発見リストの非独占的な一実施例を表３に示した。
【００８７】
表３：ＴＣＰ発見リスト例
【表３】
2005515541.tif 000005
【００８８】
リストに他の共通ポートを追加したり、そこから削除したりすることができ、例えば、特定のポートが他のポートよりも使用される可能性が高い特定のネットワーク環境に合わせてリストを手直しすることができる。この例では、Ｆｉｌｅ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ（ＦＴＰ）、Ｓｅｃｕｒｅ  Ｓｈｅｌｌ（ＳＳＨ）、Ｔｅｌｎｅｔ、Ｓｉｍｐｌｅ  Ｍａｉｌ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ（ＳＭＴＰ）、ＨｙｐｅｒＴｅｘｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ（ＨＴＴＰ）、Ｐｏｓｔ  Ｏｆｆｉｃｅ  Ｐｒｏｔｏｃｏｌ（ＰＯＰ３）、ＮｅｔＢｉｏｓ、Ｓｅｃｕｒｅ  Ｓｏｃｋｅｔｓ  Ｌａｙｅｒ（ＳＳＬ）、およびＰｏｉｎｔ−ｔｏ−Ｐｏｉｎｔ  Ｔｕｎｎｅｌｉｎｇ  Ｐｒｏｔｏｃｏｌ（ＰＰＴＰ）を使用すると都合がよい。
【００８９】
一実施形態では、各ターゲットＩＰアドレス（ターゲットコンピュータ）のＴＣＰホスト発見リストに載っているポートの一部または全部に標準のＴＣＰ  ＳＹＮパケットが送信される。従来のＩＣＭＰ  ｐｉｎｇテストの場合のように、好ましい一実施形態において、並行して（すなわち、バッチで）複数のＩＰアドレスをテストすると都合がよい。ターゲットコンピュータがＴＣＰ  ＳＹＮ  ＡＣＫで応答した場合、ターゲットコンピュータは稼働しているリストに追加される。そうでない場合、ターゲットへのＴＣＰ  ＳＹＮ要求はタイムアウトになる（すなわち、ターゲットコンピュータから応答がないまま最大期間が経過する）。
【００９０】
ＴＣＰスキャンテストの他の実施形態では、標準のＴＣＰ完全接続要求が標準のＷｉｎｄｏｗｓ（登録商標）Ｗｉｎｓｏｃｋインターフェースを使用して開始される。オペレーティングシステム側で、ＴＣＰ三方向ハンドシェークが完了したことを確認すると、ターゲットコンピュータは稼働しているリストに追加される。ターゲットがＴＣＰ  ＲＳＴ  ＡＣＫ、あいまいな応答で応答した場合、ターゲットコンピュータは「潜在的に稼働している」リストに追加される。そうでない場合、ターゲットへのＴＣＰ要求はタイムアウトになる。
【００９１】
前述のテストの結果、稼働しているターゲットコンピュータ（ＩＰアドレス）のリストが稼働しているリストに入る。稼働しているリストに載っているターゲットコンピュータは、スキャンリストから削除される。「稼働しているリスト」または「潜在的に稼働しているリスト」上で確認されていないＩＰアドレスがある場合、ターゲットコンピュータ上の選択されたＵＤＰポートをスキャンする第３のステップが、スキャンリスト上に残っているＩＰアドレスについて実行される。
【００９２】
ｉｉｉ．第３のテスト（インテリジェント型ＵＤＰポートスキャニング）
ＩＰアドレス（すなわち、ターゲットコンピュータ）が第１の２つのテストの後もスキャンリストに残っている場合、インテリジェント型ＵＤＰポートスキャニングの第３のテストが残りのアドレスに対して実行される。後述のように、インテリジェント型ＵＤＰポートスキャニングは、不正確なことで悪名の高いＵＤＰポートの従来型スキャニングとは異なる。ＴＣＰポートをスキャンする場合、ターゲットコンピュータからの応答により、ターゲットコンピュータ上のターゲットポートが開いていることが示される。それとは対照的に、ＵＤＰポートをスキャンしている間、ターゲットコンピュータから応答があっても、ターゲットポートが開いていることを示さず、スキャンされたＵＤＰポートが閉じられた場合にのみ応答（ＩＣＭＰエラーメッセージ）が送信される。ＵＤＰポートをスキャンする従来の方法では、「偽陽性」がかなりの回数発生し、その場合ＵＤＰスキャンの結果、応答がない（開いているポートを示唆する）が、スキャンされたＵＤＰポートは実際には閉じられている。例えば、これは、ファイヤウォールまたはルータがターゲットコンピュータから返るＩＣＭＰエラーメッセージをブロックした場合に発生するか、またはターゲットコンピュータから返送中にＩＣＭＰエラーメッセージが単に喪失しただけの場合にも発生する。数千回の試験を行うと、そのようなエラーが発生する可能性がある。
【００９３】
ときには、侵入者は、ターゲットコンピュータからの応答を「強制する」ために、不正な形式のパケットをターゲットポートに送信する場合がある。このような知られている手法によりターゲットコンピュータ上の開いているＵＤＰポートを識別できる可能性が高まるが、この手法では、不正な形式のパケットによりターゲットコンピュータがダメージをかなり受けるおそれもある。さらに、ファイヤウォールまたはルータは、不正な形式のパケットを検出して除去することができ、そのようなパケットがあった場合、セキュリティ違反の試みのあったことをターゲットネットワークに警告することができる。
【００９４】
本発明のこの実施形態によるインテリジェント型ＵＤＰポートスキャニングテストでは、ターゲットコンピュータ上のＵＤＰポートをスキャンするために効率のよい、侵入性が低く、より正確な方法を採用している。ＴＣＰスキャニングの場合と同様に、一般的に使用されるＵＤＰポートのＵＤＰホスト発見リストを作成する。
【００９５】
ＵＤＰ発見リストの一例を表４に示す。
【００９６】
表４：ＵＤＰホスト発見リスト例
【表４】
2005515541.tif 000006
【００９７】
従来のＵＤＰポート検出パケット内のデータとは異なり、本発明により送信されたＵＤＰパケットに含まれるデータは、特に、ＵＤＰポートに通常関連するサービスを知っているということに基づいてスキャンされたホスト（すなわち、ターゲットコンピュータ）からの応答を促すように設計されている。ＵＤＰポートに関する情報が得られない場合、標準のデータ（例えば、単純なＡＳＣＩＩ復帰文字または制御文字を表すデータ）がＵＤＰパケット内に入れられる。一実施形態では、ＵＤＰデータプローブパケット例は、ポート１３７でＵＤＰプロトコル上で通常実行されるＮｅｔＢｉｏｓネームサービスに応答を求めるように設計されている。ＵＤＰポート１３７に対するＵＤＰデータプローブ例を表５に示す。この場合、プローブは、ＮｅｔＢｉｏｓノードステータス要求であると都合がよく、その結果、通常、ＵＤＰポートから知られている応答がある。
【００９８】
表５：ＵＤＰデータプローブ例
【表５】
2005515541.tif 000007
【００９９】
Ｉｎｔｅｒｎｅｔ  Ｒｅｑｕｅｓｔｓ  Ｆｏｒ  Ｃｏｍｍｅｎｔ（ＲＦＣ）の周知の情報、プライベートな標準に関する公刊されている仕様書、知られているポートでのトラフィックの分析および監視、または正しく定められているリバースエンジニアリング手法に基づいて、特定のサービスに関連することが知られている他のＵＤＰポートについて、類似のＵＤＰデータプローブパケットを作成することができる。特定のプロトコルおよび特定のＵＤＰポートは、規格、技術、オペレーティングシステムなどの変更により、時間がたつうちにかなり変更される可能性がある。知られているプロトコルからのデータプローブが特定のＵＤＰポートについて利用できない場合、少なくとも１つの単純なＡＳＣＩＩ復帰改行を表すデータを含む標準のＵＤＰパケットが送信される。
【０１００】
ＴＣＰポートスキャニングの場合と同様、複数のＵＤＰポートを並行してスキャンできると都合がよい。通常、システムは、それぞれのターゲットコンピュータ上の一組のＵＤＰポートにＵＤＰデータプローブパケットを送信する。システムは、１つまたは複数のターゲットコンピュータからＵＤＰデータ応答を受信するか、または送信されたパケットが「タイムアウト」になるまで待機する。ＩＣＭＰ到達不能応答を受信した場合、ホストは「潜在的に稼働している」リストに追加される。ＩＣＭＰ、ＴＣＰ、およびＵＤＰスキャニングの後、稼働しているまたは潜在的に稼働しているターゲットコンピュータに対応するとまだ判別されていないターゲットコンピュータのＩＰアドレスのみがスキャンリスト上に残される。
【０１０１】
３ステップ発見段階は、ＩＣＭＰ、ＴＣＰ、およびＵＤＰスキャニングステップを採用しており、オプションにより、複数回適用し、ターゲットネットワークにつながっている稼働しているターゲットコンピュータの識別の性能を高めることもできる。一実施形態では、３つのステップすべてを通じて初期パスを実行した後、「稼働しているリスト」または「潜在的に稼働しているリスト」上で識別されていないターゲットコンピュータのＩＰアドレスがスキャンリスト上に残っている場合、少なくともＩＣＭＰおよびＴＣＰのステップは、それらの残っているスキャンリストのターゲットコンピュータについて所定の回数だけ繰り返される。オプションにより、ＵＤＰステップを繰り返すこともできる。特に好ましい実施形態では、より多くのポート、異なるデータプローブパケット、またはより多くのデータパケットを採用している、より集約的なＵＤＰスキャニング手法を、スキャンリスト上に残っているターゲットコンピュータに適用することにより、ネットワークにつながっている稼働しているターゲットコンピュータのより限定的なリストを提供することができる。それとは別に、不正な形式のパケットを使用する従来のＵＤＰスキャニングも試みることができる。
【０１０２】
ＵＤＰスキャニングの有用性に対する障害の１つは、いくつかのターゲットコンピュータが、約２５０ミリ秒から約１秒までの範囲の所定の「応答待ち時間」の間に送信されるＩＣＭＰ応答の数を制限することである。したがって、ターゲットコンピュータが１回の応答待ち時間で２０個のＵＤＰ要求をさまざまなポートに送信した場合、テストされた２０個のポートすべてが閉じられているとしても、ポートが閉じられていることを示す１つまたは２つのＩＣＭＰエラー応答のみを送信することができる。このため、ＵＤＰポートステータスに関してかなりあいまいになる。特に、従来のＵＤＰスキャニング手法を適用する場合、多くの「偽陽性」（すなわち、開いていると誤って報告されたポート）があり得る。
【０１０３】
本発明は、（１）ターゲットコンピュータの待ち時間を動的に判別し、（２）少なくとも１つの待ち時間まるまる（またはＩＣＭＰエラー応答もしくはＵＤＰデータ応答が受信されるまで）各ターゲットポートのＵＤＰポートスキャニングを続行し、無応答ＵＤＰポートが実際には開いており、単に応答待ち時間によりマスクされていないことを保証することにより前記の問題を有利に克服できる。待ち時間は、ＵＤＰポート、好ましくは、閉じていることが知られているＵＤＰポートを選択して、所定の最大応答待ち時間の間（すなわち、少なくともターゲットコンピュータの不稼働時間程度の間（特定の実施形態では２秒ほど））ＵＤＰデータグラム要求を送信することにより、決定される。応答ＩＣＭＰエラーメッセージの間の時間またはＵＤＰ応答パケットの間の時間は、標準待ち時間を表す。このテストを繰り返して、待ち時間（不稼働時間）を確認することができる。
【０１０４】
待ち時間が決定されたら、少なくとも所定の待ち時間の間またはＩＣＭＰエラー応答もしくはＵＤＰデータ応答を受信するまでＵＤＰ要求を連続的にターゲットポートに送信することにより応答の有効性を確認する。ＩＣＭＰエラー応答を受信した場合、プロンプトＵＤＰ要求に関連するポートは閉じていると想定することができる。ＵＤＰデータ応答を受信した場合、関連するポートは開いていると想定することができる。待ち時間いっぱい、応答が受信されない場合、関連するポートは、ルータ、ファイヤウォール、またはパケット喪失がＵＤＰポート応答に干渉していない限り、開いていると想定することができる。
【０１０５】
前述の３ステップ発見段階およびオプションの集約的ＵＤＰスキャニングステップは、図６のプロセスフローチャートに例示されている。上述のように、また図６に例示されているように、発見段階はスキャンリスト６１０から始まり、このリストを解析してＩＰアドレス６１２のバッチに入れると都合がよい。ステップ６２０で、処理のためＩＰアドレスのバッチを取得する。ステップ６３０で、ＩＣＭＰ  ｐｉｎｇテストが上述のように実行される。このテスト結果に応じて、それぞれのＩＰアドレスが稼働しているリスト６３２に追加されるか、またはＩＰアドレス６１２の現在のバッチ内に残る。例示されているように、このプロセスは、さらに、潜在的に稼働しているリスト６３４および不稼働リスト６３６とともに動作する。
【０１０６】
ＩＣＭＰ  ｐｉｎｇテストを実行した後、このプロセスは、決定ステップ６３８で、現在のバッチ内のどれかのＩＰアドレスが稼働しているリストに追加されていないかどうかを判別する。残っているＩＰアドレスがなければ、このプロセスは、決定ステップ６４０に進み、そこで、ＩＰアドレスのすべてのバッチがスキャンされたかどうかを判別する。ＩＰアドレスのバッチが残っている場合、このプロセスは、ステップ６２０に戻り、ＩＰアドレスの新しいバッチを取得する。そうでない場合、プロセスは終了する。
【０１０７】
このプロセスは、決定ステップ６３８で、１つまたは複数のＩＰアドレスが稼働しているリストに追加されていないと判定した場合、ステップ６５０に進み、そこで、ＴＣＰ発見ポートリスト６５２を使用して、上述のＴＣＰ発見スキャンを実行する。ＩＰアドレスは、スキャンの結果に応じて、稼働しているリスト６３２に追加されるか、または潜在的に稼働しているリスト６３４に追加される。その後、決定ステップ６５４で、このプロセスは、現在のバッチ内のＩＰアドレスのどれかが稼働しているリストまたは潜在的に稼働しているリストに追加されていないかどうかを判別する。ＩＰアドレスが残っていなければ、プロセスは、上述の決定ステップ６４０に進む。
【０１０８】
このプロセスは、決定ステップ６５４で、１つまたは複数のＩＰアドレスが稼働しているリストまたは潜在的に稼働しているリストに追加されていないと判定した場合、ステップ６６０に進み、そこで、ＵＤＰ発見ポートリスト６６２を使用して、上述のインテリジェント型ＵＤＰ発見スキャンが実行される。ＩＰアドレスは、スキャンの結果に応じて、稼働しているリスト６３２、潜在的に稼働しているリスト６３４、または不稼働リスト６３６に追加される。その後、決定ステップ６６４で、このプロセスは、現在のバッチ内のＩＰアドレスのどれかが稼働しているリスト、潜在的に稼働しているリスト、または不稼働リストに追加されていないかどうかを判別する。ＩＰアドレスが残っていなければ、プロセスは、上述の決定ステップ６４０に進む。
【０１０９】
このプロセスは、決定ステップ６６２で、１つまたは複数のＩＰアドレスが稼働しているリスト、潜在的に稼働しているリスト、または不稼働リストに追加されていないと判定した場合、ステップ６７０に進み、そこで、スキャンする追加ポートを含んでいると都合がよい、第２のＵＤＰポートリスト６７２を使用して、上述の集約的ＵＤＰ発見スキャンが実行される。一実施形態では、第２のＵＤＰポートリスト６７２は有利な形で以下で説明されているＵＤＰサービスポートリストであるが、ＵＤＰポートの任意の組み合わせを使用することができる。ここでもまたＩＰアドレスは、集約的スキャンの結果に応じて、稼働しているリスト６３２、潜在的に稼働しているリスト６３４、および不稼働リスト６３６に追加される。その後、このプロセスは、決定ステップ６７４で、発見テストを繰り返す必要があるかどうかを決定する。すべてのＩＰアドレスが３つのリストのうちの１つに追加されており、どのＩＰアドレスも残っていなければ、プロセスは、上述の決定ステップ６４０に進む。リストの１つに追加されていない残っているＩＰアドレスが残る場合、このプロセスにおいて、ＩＰアドレスの現在のバッチについて、スキャニングステップを所定の回数実行したかどうかを判別する。これらのステップが所定の回数実行された場合、このプロセスは、決定ステップ６４０に進む。そうでない場合、このプロセスは、ＩＣＭＰ  ｐｉｎｇテスト６３０に戻り、再び、残っているＩＰアドレスを処理する。
【０１１０】
上述のように、集約的ＵＤＰ発見スキャン６７０はオプションである。集約的ＵＤＰ発見スキャン６７０が含まれていない場合、インテリジェント型ＵＤＰ発見スキャン６６０の後に続く決定ステップ６６４は、スキャニングプロセスが所定の回数実行されたかどうかに基づき、スキャニングプロセスを繰り返すかどうかの追加決定を含むと都合がよい。
【０１１１】
Ｂ．サービス発見
一実施形態では、本発明はさらに進み、それぞれのホスト（すなわち、ターゲットコンピュータ）をより詳しく調べるが、その際に、稼働しているリストを使用し、またオプションにより、潜在的に稼働しているリストも使用する。サービス発見では、一組の共通ＴＣＰサービスポートおよび一組の共通ＵＤＰサービスポートがスキャンされる。ＴＣＰサービス発見リストおよびＵＤＰサービス発見リストは、通常、ＴＣＰホスト発見リストおよびＵＤＰホスト発見リストに比べてかなり大きい。それぞれのリストは、通常、通信に一般に使用されるポートの何らかの部分集合を含む。例えば、それぞれのリストは、数個から数百までの任意のポートを含むことができる。通常、それぞれのリストは、表６に示されているようなポートを含む（Ｗｉｎｄｏｗｓ（登録商標）２０００に関してＭｉｃｒｏｓｏｆｔ（登録商標）社が公開報告している既定のポートのリスト例）。このリストは、網羅しているわけではなく、技術、プロトコル、ネットワーク基盤、およびオペレーティングシステムが変わると、ポートの要件も変更されるのがしばしばである。
【０１１２】
表６：サービス発見のＵＤＰおよびＴＣＰポート群の例
【表６】
2005515541.tif 000008
【０１１３】
それぞれのターゲットコンピュータは２１６（６５，５３６）個のポートを備えることが可能なので、一般に時間の制約により、特に大きなネットワークでは、それぞれのターゲットコンピュータ上のすべてのポートをスキャンすることができないため、ポートの部分集合を選択するのが好ましい。同様に、それぞれのターゲットコンピュータ上でポートをランダムに選択することが有益である可能性はまったくないが、それは、平均的なターゲットコンピュータでは、実行されるサービスの数は１０数個未満であり、まれなケースでは、数十あるいは数百個であって、ポートをランダムに選択して開いているポートに当たる確率は、非効率で不正確なものとなる。
【０１１４】
本発明の好ましい実施形態によれば、ＴＣＰサービス発見では、ＴＣＰサービススキャンポートの大きなリストを使用し、それぞれのターゲットコンピュータ上のそれぞれのターゲットポートに接続を試みるが、それらのスキャンポートの一部のみ上に示されている。上述のホスト発見の場合と同様、標準のＴＣＰ  ＳＹＮスキャニングでは、それぞれのターゲットポートからのＳＹＮ  ＡＣＫ応答を待つ必要があるか、またはＴＣＰ「完全接続」スキャニングでは、ターゲットコンピュータとスキャニングシステムとの間の３方向ハンドシェークが完了したことを示すオペレーティングシステムメッセージが来るのを待つ必要がある。これらの攻撃のいずれかに肯定的に応答するターゲットコンピュータは、脆弱性のあるコンピュータのリストに追加され、見つかったそれぞれの開いているターゲットポートについて脆弱性評価を受ける。
【０１１５】
本発明の好ましい実施形態によれば、ＵＤＰサービス発見では、ＵＤＰサービススキャンポートの大きなリストを使用し、それぞれのターゲットコンピュータ上のそれぞれのターゲットポートに接続を試みるが、それらのスキャンポートの一部のみ上に示されている。上述のホスト発見の場合と同様に、本発明では、特定のサービスに一般に関連付けられていると認識されている任意のポートに対して改良されたＵＤＰデータプローブパケットを使用することができ都合がよい。それとは別に、１つまたは複数のＡＳＣＩＩ復帰文字などの標準文字を表すデータを含むパケットを使用することもできる。この攻撃に肯定的に応答するターゲットコンピュータは、脆弱性のあるコンピュータのリストに追加され、見つかったそれぞれの開いているターゲットポートについて脆弱性評価を受ける。使用される脆弱性は、通常、すでに述べたオペレーティングシステム識別システムおよびターゲットコンピュータ上に見つかった、開いているポートに関連付けられた脆弱性により発見されたターゲットコンピュータのオペレーティングシステムに関連するものに限定される。ターゲットコンピュータのオペレーティングシステムが最終的に識別できない場合、本明細書で説明されているサービス発見システムの実行中にターゲットコンピュータ上で開いている見つかったポートに関連付けられた通常すべての脆弱性がターゲットコンピュータに対してテストされる。
【０１１６】
ホスト発見の場合と同様、より集約的なＵＤＰスキャニング方式を、単純なＵＤＰデータプローブパケットに応答しないターゲットコンピュータに適用することができる。より集約的なＵＤＰスキャニング方式では、例えば、上述のオプションの待ち時間解決方式と従来のＵＤＰポートスキャニングとを併用すると都合がよい。
【０１１７】
脆弱性評価の後、ターゲットコンピュータのオプションのアクティブな評価が実行される。アクティブな評価では、ターゲットコンピュータのオペレーティングシステム、開いているポート、ならびに脆弱性評価時にターゲットネットワークから復旧された情報を知っているということを適用し、各ターゲットコンピュータに対し知られている脆弱性をさらにテストする。
【０１１８】
複数のポートの並列処理
好ましい一実施形態では、本発明は個々のポートの直列スキャニングを次から次へと完了して行くのではなく、ポートスキャニングを「バッチ」で実行するので都合がよい。このため、大きなスキャンの小さな断片を完了し、データベースに保存することができ、大きなスキャンの結果全体をすべて一度にメモリ内に保持する必要はない。例えば、クラスＡネットワークをテストする場合、ただ単にホスト発見のためだけに、数億個のポートをスキャンする必要がある。旧いネットワーク機器の技術的制限にシステムを適合させ、複数の著しいＩＰアドレス範囲を持つ非常に大きなターゲットネットワーク内のコンピュータのポートをスキャンするようにできると都合がよい。ネットワークまたはシステムの障害が発生した場合、システムは最後に知られている正常に完了したバッチの後に特に大きなスキャンを再開する。
【０１１９】
ポートスキャニングプロセスの実行中に、本発明の好ましい実施形態により、例えば、スキャン範囲内で表されている６４台のターゲットコンピュータを含む、ＩＰアドレスのスキャン範囲全体の小さな部分または「バッチ」を識別する。ホスト発見では、ターゲットコンピュータの第１のバッチの使用を開始する。第１のバッチ内の稼働しているすべてのホストが発見された場合、ＴＣＰおよびＵＤＰサービスのサービス発見は、本明細書で説明されている、オペレーティングシステム識別、ネットワークトポロジのｔｒａｃｅｒｏｕｔｅの実行、および脆弱性のアクティブな評価などの他のテストサービスとともに、第１のバッチで稼働しているホストに対して実行される。バッチが完了すると、結果が脆弱性データベースに格納される。その後、６４台のターゲットコンピュータの次のバッチも同様に、処理され、スキャンリスト全体がターゲットネットワークに対して処理されるまで続けられる。
【０１２０】
単一または少数のターゲットコンピュータ上で並列に多数のポートをテストするのではなく、１つまたは少数のポート上で並列に多数のターゲットコンピュータをテストするのが好ましい。通常、前者の方法では、単一のターゲットコンピュータへの過度の負荷の防止、ネットワークの過負荷の防止、およびターゲットネットワークセキュリティアラートのトリガのリスク低減が行われる。ときには、例えば、少数のターゲットコンピュータがスキャニングの対象として選び出された場合には、後者の方法が好ましいこともあり得る。
【０１２１】
より具体的には、一実施例では、本発明は、同時に、６４０個のパケットスロットを一組として使用する。パケットスロットは、応答を待つ間または送信されたパケットがタイムアウトになるのを待つ間、送信済みパケットを追跡する、メモリ内の都合よく割り当てられた空間である。したがって、１バッチ分のターゲットコンピュータを処理する場合、最大６４０個までのＩＣＭＰ要求パケットを同時に処理することができるが、６４０個よりも多いまたは少ない、異なる個数のスロットを同時に割り当てて使用することも可能であることを理解されたい。送信されたパケットの１つについてＩＣＭＰ応答が受信されると、またはパケットがタイムアウトになった後、そのパケットに割り当てられているスロットを割り当て直して、新しいパケットを送信し応答がないか、またはタイムアウトになっていないかを監視する。そこで、１つのパケットを送信してから別のパケットの応答および／またはタイムアウトを受け取るまでの間の平均的遅延時間は短いので、パケットの移動を高速に保つことができる。例えば、６４０番目のＩＣＭＰ要求パケットが送信されるまでに、送信されたパケットの１つに対する応答が受信され、それにより、関連付けられているスロットが解放され、他のパケットの処理に使用できるようになると思われる。一般にＴＣＰ  ＳＹＮパケット、ＵＤＰホスト発見、およびサービス発見の処理に対し類似の方法を適用する。当業者であれば、オペレーティングシステム識別およびｔｒａｃｅｒｏｕｔｅ実行で、類似のバッチ並列ポート監視を使用できることを理解するであろう。これらのプロセスでは、使用されるスロットの数は、６４０に限られず、プログラミングまたはスキャニングの効率に応じて変更することができる。
【０１２２】
例えば、本発明の一実施形態では、同時スキャニングに１００台のターゲットコンピュータのバッチサイズを使用する。ホスト発見のため、ＩＣＭＰスキャニングプロセスは１００個のＩＣＭＰエコー要求を送信し、応答およびタイムアウトを監視する。これはこの実施形態の６４０個のパケットスロットよりも少ないため、すべてのＩＣＭＰ要求パケットを送出することができ、すべてのパケットに対する応答またはタイムアウトを同時に監視することができる。１０個のＴＣＰポートのＴＣＰホスト発見リストを仮定すると、ＴＣＰホスト発見スキャナは、最終的に、１０００個のパケット（１００台のターゲットコンピュータ×１０個のポート＝１０００パケット）をリストに挙がっているすべてのコンピュータのリストに挙がっているすべてのポートをプローブするために送出する。この実施形態では、スキャナは、最初に、６４０個すべてのパケットスロットを使用して逐次バーストで６４０個のパケットを送出する。しかし、上述のように、６４０番目のパケットが送信されるまでに、（タイムアウトの設定およびシステムが受け取る応答の数に応じて）６４０個のすでに送信されているパケットのうちの少なくとも１つは、応答またはタイムアウトを生成しており、残り３６０個のパケットのうちの１つを送信できるようにそのバケットスロットを解放する可能性がある。応答パケットおよびタイムアウトの受信を常時監視することにより、ターゲットコンピュータのリスト全体をテストすることができ、しかも無駄な時間はほとんどかからない。
【０１２３】
より大きなバッチサイズおよびより多くのパケットスロットを使用することができるが、そのような使用の効率は、稼働しているホスト、タイムアウト値、ネットワーク応答時間、メモリおよびその他のシステム資源などを含むターゲットネットワークの個数にもよる。一般に、非常に大きなバッチサイズだと、それに応じてホスト発見段階が長くなり、システムがサービススキャニング段階で発見されたホストのスキャニングを開始するまでに、ターゲットコンピュータが何らかの形で変更されている可能性が高い。
【０１２４】
上述のサービス発見段階は、図７のプロセスフローチャートに示されている。プロセスは、都合よく図６により例示されているホスト発見プロセスにより生成された稼働しているリスト６３２に対応している、稼働しているリスト７１０から始まる。このプロセスは、さらに、図６で生成された潜在的に稼働しているリスト６３４も含むことができるが、説明を簡単にするため、潜在的に稼働しているリストは図７に示されていない。稼働しているリスト７１０内のＩＰアドレスは、解析してＩＰアドレス７１２のバッチにまとめると都合がよい。後述のように、図７のプロセスはターゲットコンピュータ脆弱性データベース７１４および知られている脆弱性データベース７１６に作用する。
【０１２５】
図７の第１の決定ステップ７２０で、このプロセスは、ＴＣＰ  ＳＹＮスキャニングまたはＴＣＰ「完全接続」スキャニングが実行されているかどうかを判別する。上述のように、ＴＣＰ完全接続スキャニングプロセスでは、プロセスはターゲットコンピュータとスキャニングシステムとの間の３方向ハンドシェークが確立されていることを示すオペレーティングシステムメッセージの届くのを待つ必要がある。ＴＣＰ  ＳＹＮスキャニングプロセスでは、このプロセスは、それぞれのターゲットポートからＳＹＮ  ＡＣＫ応答が来るのを待ち、その場合、上述のように、ターゲットコンピュータは並列処理することができる。いずれの場合も、プロセスは、ステップ７２２に進み、第１のバッチの稼働している（または潜在力に稼働している）ターゲットコンピュータを表す第１のバッチのＩＰアドレスを取得する。ＴＣＰ完全接続スキャニングが実行されている場合、このプロセスは、ターゲットコンピュータにつながっている比較的少数のポートを１度に操作する。このプロセスは決定ステップ７３０に進む。
【０１２６】
決定ステップ７３０で、このプロセスは、すべての稼働しているターゲットコンピュータがＴＣＰ完全接続スキャニングで処理されているか、または稼働しているターゲットコンピュータのすべてのバッチがＴＣＰ  ＳＹＮスキャニングで指示されているかを判別する。すべてのターゲットコンピュータまたはすべてのバッチのターゲットコンピュータがすでに処理されている場合、このプロセスは終了する。そうでない場合、このプロセスはＴＣＰサービススキャンルーチン７４０に進み、そこで、ＴＣＰサービス発見リスト７４２を使用してターゲットコンピュータ毎に調査すべきＴＣＰサービスポートを識別する。上述のように、ＴＣＰパケットは、各ターゲットコンピュータの識別されたＴＣＰサービスポートに送信され、ターゲットコンピュータ脆弱性データベース７１４は、応答が受信されたか、あるいはスキャンされたそれぞれのＴＣＰサービスポートについてそれぞれのターゲットコンピュータから受信されないかに応じて、知られている脆弱性データベースを使用して開いていると判別される特定のＴＣＰサービスポートに関する脆弱性情報を取得することで、ターゲットコンピュータ毎に更新される。
【０１２７】
ＴＣＰサービススキャンルーチン７４０を実行した後、プロセスはオプションのＵＤＰ待ち時間テスト７５０に進み、そこで、それぞれのターゲットコンピュータの待ち時間が判別され、待ち時間データベース７５２に格納される。プロセスは、待ち時間テスト７５０または直接ＴＣＰサービススキャンルーチン７４０からＵＤＰサービススキャン７６０に進み、そこで、ＵＤＰサービス発見リスト７６２を使用してターゲットコンピュータ毎に調査すべきＵＤＰサービスポートを識別する。上述のように、ＵＤＰパケットは、各ターゲットコンピュータの識別されたＵＤＰサービスポートに送信され、ターゲットコンピュータ脆弱性データベース７１４は、応答が受信されたか、あるいはスキャンされたそれぞれのＵＤＰサービスポートについてそれぞれのターゲットコンピュータから受信されないかに応じて、知られている脆弱性データベースを使用して開いていると判別される特定のＵＤＰサービスポートに関する脆弱性情報を取得することで、ターゲットコンピュータ毎に更新される。
【０１２８】
ＵＤＰサービススキャンルーチン７６０を完了した後、プロセスは、決定ステップ７７０に進み、そこで、スキャンされたすべてのサービスポートから応答が受信されたかどうかを判別する。受信されていない場合、プロセスは、現在のターゲットコンピュータまたはバッチのターゲットコンピュータのスキャンが所定の回数、実行されたかどうかを判別する。スキャンされたすべてのサービスポートが応答したか、またはスキャニングが所定回数、実行された場合に、プロセスは、ステップ７２０に戻る。そうでない場合、プロセスは、ＴＣＰサービススキャンルーチン７４０に戻り、応答しなかったサービスポートをスキャンする。
【０１２９】
Ｃ．バナーグラビング
「バナーグラビング」は、ターゲットコンピュータから受信されたパケットから関連する情報を剥ぎ取る方法である。一実施形態では、稼働しているリスト内のターゲットコンピュータ毎に、サービススキャン段階で発見されたそれぞれの開いているＴＣＰポートおよびそれぞれの開いているＵＤＰポートに対してバナーグラビングの実行を試みる。情報が応答ＴＣＰまたはＵＤＰパケットから正常に受信された場合、この情報は、取得元のターゲットコンピュータと関連してデータベースに格納される。その後、格納されている情報は、ターゲットコンピュータ上の脆弱性情報を収集するために使用され、脆弱性情報はさらに、データベースにも格納される。
【０１３０】
サービス発見段階で特定された開いているＴＣＰポート毎に、そのポートが特定のサービスに通常関連付けられていることが知られている場合にＴＣＰデータプローブはそのポートに送信される。そこで、例えば、ＴＣＰデータプローブをターゲットコンピュータ上のターゲットＴＣＰポート８０に送信する場合、ＴＣＰポート８０がＨＴＴＰの共通サービスポートとしてよく知られていれば、システムは、ＨＴＴＰ準拠ＧＥＴ要求を送信し、ターゲットコンピュータから送り返されたＴＣＰ応答パケットから有用な情報を剥ぎ取る。上の表に示されているように、周知のサービスが実行されている状態で類似のコマンドを他のポートについても使用することができる。得られた有用な情報は、読み取り可能な、もしくは処理可能な形式（例えば、テキスト）に変換または翻訳し、後で報告できるように格納しておくと都合がよい。
【０１３１】
サービス発見段階で発見されたＵＤＰポート毎に、通常サービスに関連付けられていることが知られているターゲットコンピュータ上の各ＵＤＰポートに類似のＵＤＰデータプローブが送信される。したがって、例えば、前述の表から、ＵＤＰポート１３７は、ＮｅｔＢＩＯＳサービスに関連付けられていることが知られる。一実施形態では、このシステムは、例えば、ＮｅｔＢＩＯＳノードステータスコマンドを送信し、ターゲットコンピュータにより送信された応答パケットから有用な情報を剥ぎ取って格納する。ここでもまた、このようにして得られた有用な情報は、読み取り可能な、もしくは処理可能な形式（例えば、テキスト）に変換または翻訳し、後で報告できるように格納しておくと都合がよい。
【０１３２】
ＩＶ．Ｔｒａｃｅｒｏｕｔｅの実行
一実施形態では、稼働しているリスト内のターゲットコンピュータ毎に、システムとターゲットコンピュータとの間のＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅの実行を試みる。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅが不完全な場合、システムとターゲットコンピュータとの間のＴＣＰ  ｔｒａｃｅｒｏｕｔｅの実行を試みる。それぞれのターゲットコンピュータに対するｔｒａｃｅｒｏｕｔｅの結果に基づいて、ターゲットネットワークトポロジのマップが作成され、データベースに格納される。
【０１３３】
最初に、従来のＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅが実行される。ＴＣＰ／ＩＰヘッダ内に、ＴＴＬ  １から始まる、さまざまなＴＴＬ（有効期間）値を入れて、ターゲットコンピュータに多数のパケットが送信される。ＩＣＭＰエコー要求パケットが送信先ターゲットコンピュータに到達できなかった場合、これは、パケットの送信元のルータ／ホストのＩＰアドレスを含むＩＣＭＰ送信先到達不能パケットを返す。ターゲットコンピュータ自体に到着したパケットは、ＩＣＭＰエコー返信パケットを返す。知られているＴＴＬ値に基づいて、システムとターゲットコンピュータとの間の「ホップ」回数および各「ホップ」でのルータ／ホストをマッピングすることができる。すべてのパケットが到着するか、またはタイムアウトになった場合、システムとターゲットコンピュータとの間のそれぞれの「ホップ」に関連付けられているルータ／ホストおよびＩＰアドレスがあれば、ｔｒａｃｅｒｏｕｔｅステップはそのターゲットコンピュータについて完了する。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅは、完了トレースが受信されるか、または最大回数のパスが完了するまで、所定の回数のパスを続行する。所定の回数のパスの後、ターゲットコンピュータのｔｒａｃｅｒｏｕｔｅが不完全であれば、ＴＣＰ  ｔｒａｃｅｒｏｕｔｅが試みられる。
【０１３４】
ＴＣＰ  ｔｒａｃｅｒｏｕｔｅは、ＴＣＰ  ＳＹＮパケットが使用されるのを除き、ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅと同様の動作をする。場合によっては、例えば、ＩＣＭＰパケットはファイヤウォールまたはルータによってブロックされることもあるため、ＴＣＰパケットは、他の方法では不完全なトレースを完了させる場合により信頼性が高い。通常、選択されたＴＣＰポートは、ｔｒａｃｅｒｏｕｔｅの対象であるターゲットコンピュータについて発見された開いているポートのリストから取り出される。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅを実行した場合のように、各ＳＹＮパケット内のＴＴＬ値は漸次増加し、ＩＣＭＰ到達不能パケットおよびＳＹＮ  ＡＣＫパケットが戻るかどうかが、スキャニングシステムとターゲットホストの間のすべての「ホップ」に関して監視される。ＩＣＭＰ  ｔｒａｃｅｒｏｕｔｅとＴＣＰ  ｔｒａｃｅｒｏｕｔｅを組み合わせることで、各ターゲットコンピュータへの完全なマップ、および合わせて、ターゲットネットワークトポロジの比較的完全なマップを作成すると都合がよい。
【０１３５】
ネットワークマップは、ｔｒａｃｅｒｏｕｔｅを実行する方法で発見されたとおりにネットワークのトポロジをできる限り簡潔に表そうとする試みである。基本的に、パケットはスキャンされたネットワーク内で発見されたそれぞれのホストに送信され、その際に、有効期間フィールドはホップカウントのせいで送信できないことを示すパケットがスキャニングマシンから数ホップ離れているマシンにより送信されるホップカウントに設定される。ＴＴＬを高くし、注目されているホストから応答を取得するまで応答するマシンのＩＰを格納することにより、そのホストに至るマシンを表すＩＰ文字列を構築する。この手順は完全と言うにはほど遠い。所定のホップでのマシンは、ｔｒａｃｅｒｏｕｔｅアルゴリズムにより期待される時間内に応答しないか、またはｔｒａｃｅｒｏｕｔｅパケットをブロックするファイヤウォールである場合に全く応答しないことがある。存在し得るアプローチでは、このような不確定性を何らかの方法で処置しなければならない。一実施形態では、未知の対象物をファイヤウォールと想定する。
【０１３６】
採用されるアルゴリズムは、通常、一組の発見されたホストを与えられ、それぞれのホストはｔｒａｃｅｒｏｕｔｅアルゴリズムでホストに至るマシンであると最初に判別するものを表すＩＰアドレスを含む。この文字列は、０ｘＦＦＦＦＦＦＦＦまたは２５５．２５５．２５５．２５５で示される未知の対象物を含むことができる。アルゴリズムは以下のように動作する。
・ＣＯＮＤＥＮＳＥ  ＵＮＫＮＯＷＮＳ：連続する未知の対象物を、未知のＩＰアドレス（ＯｘＦＦＦＦＦＦＦＦ）を持つ単一ホップに圧縮する。ｔｒａｃｅｒｏｕｔｅが所定のホップまで実行され、未知の対象物を受け取った場合、第１の未知のホップがパケットをブロックしているファイヤウォールであるため、それ以降のすべてのホップはさらに未知のものとなることが考えられる。
・ＵＮＫＮＯＷＮ  ＲＥＳＯＬＵＴＩＯＮ：他の経路を見て、知られているすべてのマシンによって接続されているこの経路内の未知の対象物のいずれかの側のＩＰアドレスを持つ経路が存在するか調べることにより、未知の対象物を解決しようと試みる。見つかった場合、その未知の対象物をそれらのマシンで置き換える。こうして、ファイヤウォールとして違ったラベルを貼らないように、見せかけの未知の対象物を排除しようと試みる。実際のファイヤウォールは、通常、未知となるので、排除されない。
・ＢＵＩＬＤ  ＳＥＴ  ＯＦ  ＮＯＤＥＳ：型ＲＯＵＴＥＮＯＤＥの構造（ｓｔｒｕｃｔｓ）のリストを構築する。これは、ＩＰアドレスが一意であると保証されるリストであり（後述の未知の対象物を除く）、ネットワーク内で発見されたすべてのＩＰアドレスの集まりを表す（すなわち、スキャニングプロセスにより発見されたホストおよびｔｒａｃｅｒｏｕｔｅプロセスにより発見されたそこに至るホップ）。各ＲＯＵＴＥＮＯＤＥ  ｓｔｒｕｃｔのｍ＿ｐＨｏｓｔメンバは、ＩＰアドレスがスキャニングプロセスで発見されたホストの１つでない場合にＮＵＬＬとなり、そうでなければ、そのプロセスにより発見されたホストデータを指す。上述のように、知られているマシンは、ＩＰアドレスにより一意である。さらに、未知の対象物は、その直前のＩＰアドレスにより修飾される。その結果、同じＩＰアドレスが前に付く未知の対象物は、通常、同じファイヤウォールであると考えられ、したがって、リスト内の単一のＲＯＵＴＥＮＯＤＥにより表される。
・ＦＩＬＬ  ＩＮ  ＣＯＮＮＥＣＴＩＯＮＳ：各ＲＯＵＴＥＮＯＤＥ  ｓｔｒｕｃｔは、ＲＯＵＴＥＮＯＤＥの直接の接続先であるマシンを表すＲＯＵＴＥＮＯＤＥポインタのリストを含む。アルゴリズムは、次に、これを埋めて、ＩＰアドレスが接続の各リスト内で一意であることを保証する。これらのポインタはリスト内の他のＲＯＵＴＥＮＯＤＥ  ｓｔｒｕｃｔを指すことに注意されたい（すなわち、リストは、通常、自給自足型のデータ群である）。
・ＣＯＭＰＵＴＥ  ＤＩＳＴＡＮＣＥ  ＦＲＯＭ  ＩＮＴＥＲＮＥＴ：もう一度、ホスト毎、およびＩＰアドレス毎に、ｔｒａｃｅｒｏｕｔｅ情報がトラバースされる。リスト内の対応するＲＯＵＴＥＮＯＤＥ  ｓｔｒｕｃｔが検索され、ｓｔｒｕｃｔのｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔはその経路内のホップカウントに応じて設定される。これは、通常、最大ホップカウントを表すために実行される。すなわち、ｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔフィールドは０に初期化され、その後、ｔｒａｃｅｒｏｕｔｅ  ＩＰ文字列内のホップカウントが大きければ、ｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔはそのホップカウントに設定される。例えば、ＩＰアドレス（例えば、「ｄ」とする）は１つの経路内にａ−ｂ−ｄとして現れ、他の経路では、ａ−ｂ−ｃ−ｄとして現れるが、ただし、「ａ」、「ｂ」、および「ｃ」はＩＰアドレスｃへの経路上の他のＩＰアドレスである。アルゴリズムのこの部分が完結している場合、ｄはｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔ＝４となる。この情報は、一方のマシンが他方のマシンの前にあるかどうかを知るためにアルゴリズムによって使用される。この最大発見ホップ長は、問題を十分計算可能なものにするための発見的手法となることに注意されたい。特定マシンが他のマシンに接続されているものとして描かれるとうまくいかない可能性があり（直接接続されているため）、１つの経路内でその前に置くが、マシンは、ｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔが他の経路内で接続されているマシンと同じまたはそれ以上のマシンにぶつかる他の何らかの経路内にあるためそのようには描かれない。この状況はまれであり、この発見的手法は、通常、許容可能である。
・ＢＵＩＬＤ  ＲＯＵＴＥＲ  ＬＩＳＴ：次にアルゴリズムは、ＲＯＵＴＥＮＯＤＥリストをトラバースし、ＲＯＵＴＥＲ  ｓｔｒｕｃｔのリストを構築する。ＲＯＵＴＥＲ  ｓｔｒｕｃｔは、ＲＯＵＴＥＲであると信じられるＲＯＵＴＥＮＯＤＥへのポインタおよび接続先となっている葉（経路末端）マシンであるＲＯＵＴＥＮＯＤＥポインタのリストを含む。葉は、ただ１つのマシン（自分自身以外）に直接接続されているＲＯＵＴＥＮＯＤＥである。このアルゴリズムの目的のために、ＲＯＵＴＥＲは、そのマシンであるとする。アルゴリズムのこの段階では、ＲＯＵＴＥＲ  ｓｔｒｕｃｔのリストを構築し、それぞれのＲＯＵＴＥＲ内に、そのＲＯＵＴＥＲに接続されている葉ＲＯＵＴＥＲＮＯＤＥのリストを構築する。このアルゴリズムはさらに、ＲＯＵＴＥＲリストを参照せずにＲＯＵＴＥＮＯＤＥリスト内のどのマシンがルータであるかを知る必要があるときに、ＲＯＵＴＥＲとして指定されているＲＯＵＴＥＮＯＤＥ内のブール型フィールドにマーク付けも行う。
【０１３７】
次に、このアルゴリズムの精密化について説明するが、まず、アルゴリズムがここで終了した場合にマップがどのように描画されるかについて説明すると有益であろう。このときに、アルゴリズムは一組のＲＯＵＴＥＲを持ち、それぞれの中にそのＲＯＵＴＥＲに接続されているその一組の葉を持つ。精密化について詳述する前に、マップレンダラは、それぞれのＲＯＵＴＥＲを球体として描き、その葉すべてをＲＯＵＴＥＲ球の回りの軌道内のリングに埋め込まれた小さな球として描くことを指摘しておく。次に、アルゴリズムは、ｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔフィールドがこのＲＯＵＴＥＲのｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔよりも小さい他のＲＯＵＴＥＲを探す（すなわち、このＲＯＵＴＥＲに直接接続され、それに先行するＲＯＵＴＥＲを探す）。このアルゴリズムは、見つかった最大のｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔルータを取り、それにこのＲＯＵＴＥＲを視覚的に接続する。先行するＲＯＵＴＥＲが見つからない場合には、このＲＯＵＴＥＲをマップの中央に描かれているインターネットの雲に接続する。この精密化されたアルゴリズムは、それでも、上述のことをすべて実行するが、通常は、少し処理を行ってからである。
・ＲＯＵＴＥＲ  ＰＲＯＭＯＴＩＯＮ：これまでに詳述したとおりこのアルゴリズムにより、ＲＯＵＴＥＲがこれを囲む葉ノードを持ち、そのすべてが同じサブネットを持つ、例えば、すべて１４９．１７．１．ｘｘｘであるようなマップが出力されるという状況がある。最初の１、２、または３桁（それぞれ８ビット）は同じである。そのＲＯＵＴＥＲは、ちょうど１つの葉ノードを持つ直接接続されている少ないｍ＿ｎＤｉｓｔＦｒｏｍＩｎｔｅｒｎｅｔのＲＯＵＴＥＲを持ち、その葉ノードは第１のＲＯＵＴＥＲの葉リスト内のすべてと同じＩＰアドレスの桁を共通に持つ。この場合、ｔｒａｃｅｒｏｕｔｅデータは、第１のＲＯＵＴＥＲおよびその単一の葉が異なるマシンであることを示唆するが、同じマシン上の２つのＮＩＣ（ネットワークインターフェースカード）である可能性がある。したがって、アルゴリズムは、そのＩＰアドレスを第１のＲＯＵＴＥＲのＲＯＵＴＥＮＯＤＥのｍ＿ｌｎＯｔｈｅｒＮｉｃｓメンバに追加し、その後、他のＲＯＵＴＥＲの葉のリストからそれを削除し、ＲＯＵＴＥＲのＲＯＵＴＥＮＯＤＥにもはやＲＯＵＴＥＲでないというマークを付けることにより、そのＲＯＵＴＥＮＯＤＥを「格上げする」。そのＲＯＵＴＥＲは、さらに、ＲＯＵＴＥＲリストからも削除される。その後、マップ上で、ＲＯＵＴＥＲの一次ＩＰアドレスは通常通り表されるが、今度は、灰色のバーがあり、その下に他のＩＰアドレスがある。アルゴリズムでは、マルチホームＲＯＵＴＥＲの実行をサポートしており、格上げされたすべてのＩＰを表す。マルチホームのケースは、ここで説明するデュアルホームの例を拡大解釈することにより容易に想像される。
・ＯＴＨＥＲ  ＴＹＰＥ  ＯＦ  ＲＯＵＴＥＲ  ＰＲＯＭＯＴＩＯＮ：好ましいアルゴリズムでは、さらに他の種類のルータ格上げをも実行する。何らかのＲＯＵＴＥＲの回りのちょうど１つの葉で発見的手法が実行されると、ＲＯＵＴＥＲの他のＮＩＣへの格上げが行われる。発見的手法のテストを行うためには、マシンはスキャニングプロセスで発見されたホストである必要があるが、それは、情報の出所であるためである。ほとんどの葉は発見されたホストであるのは注目すべきことである。アルゴリズムではこのことを要求しないが、また１つのものしか接続されていない非発見ホストホップがｔｒａｃｅｒｏｕｔｅ情報から出力され、それによりそこから葉が作られる可能性があるが、ｔｒａｃｅｒｏｕｔｅは発見されたホストに対して実行されるので、葉は発見されたホストとなる傾向がある。一実施形態では、発見的手法は以下のとおりである。ＴＣＰ  ２００１、４００１、６００１、または９００１が発見された場合、あるいはＵＤＰ  ５２０、またはＵＤＰ  ２３および７９  の両方が発見された場合、あるいは発見されたオペレーティングシステムがＣｉｓｃｏである場合、そのＲＯＵＴＥＮＯＤＥはルータＩＰアドレスであると想定され、また格上げされる（ＩＰアドレスはＲＯＵＴＥＲのｍ＿ｌｎＯｔｈｅｒＮｉｃｓに追加され、ＲＯＵＴＥＮＯＤＥポインタはその葉から削除される）。
・ＦＩＲＥＷＡＬＬ  ＰＲＯＭＯＴＩＯＮ：ファイヤウォールの格上げは、上述のルータの格上げ発見的手法に似ている。一実施形態では、ファイヤウォールの回りのちょうど１つの葉が発見的手法の条件を満たした場合、ファイヤウォールの他のＮＩＣリストに格上げされ、その結果、「ファイヤウォール」と表示するマップが得られるが、今度は、知られているＩＰアドレスは灰色のバーで区切られ下に示される。一実施形態では、発見的手法は、ＴＣＰ  ２５６、２５７、２６４、２６５がマシン上に見つかった場合であり、それはファイヤウォールであると想定される。
・ＮＵＭＢＥＲ  ＦＩＲＥＷＡＬＬＳ：これは、アルゴリズムの最後のステップである。ファイヤウォールは、その前にあるＩＰアドレスの順序でソートされ、その後、レポート上のマップに「Ｆｉｒｅｗａｌｌ−１、Ｆｉｒｅｗａｌｌ−２、．．．など」とプリントできるように番号が振られる。
【０１３８】
このようにして、ネットワークマップ全体を比較的正確に、内部に格納し、報告できるように視覚的表示に変換することができる。
【０１３９】
Ｖ．脆弱性識別およびアクティブな評価
知られているそれぞれのＴＣＰポート、ＵＤＰポート、およびオペレーティングシステムについて、その構成に対する知られている脆弱性は、脆弱性識別符号に基づいて脆弱性データベースに格納される。脆弱性識別データベース内の多くの脆弱性項目について、脆弱性をテストするための方法を自動スクリプトに書き込むことができ、これで、疑わしい脆弱性に照らしてターゲットシステムの実際の弱点を評価すると都合がよい。一実施形態では、これらのスクリプトは、評価セキュリティスクリプト言語で作成され、またＦＡＳＬで作成されるのが好ましい。ＦＡＳＬは、一実施形態では、Ｃ＋＋およびＪａｖａ実装に基づくスクリプト言語である。ＦＡＳＬは、さまざまな脆弱性に関するセキュリティテストを行うための調整可能な自動化言語を実装している。複数のＦＡＳＬスクリプトを並列実行できるため都合がよい。例えば、一実施形態では、最大８個までのスクリプトを同時に実行することができる。例えば、それぞれのＦＡＳＬスクリプトは、所定の脆弱性識別符号に照らしてターゲットコンピュータに脆弱性があったかどうかを示す成功または失敗の結果で応答する。ＦＡＳＬスクリプトによりターゲットコンピュータから収集された情報、およびこの試みの成功または失敗の情報は、後で報告できるようにターゲットコンピュータに関係するデータベースに格納され、さらに脆弱性テストで使用したり、これで追加テストを繰り返したりする。
【０１４０】
ＶＩ．ＦＡＳＬスクリプト言語
ＦＡＳＬ言語の実装は、構文の面でＣ＋＋と類似している。一実施形態では、ＦＡＳＬは構造体オブジェクトのメンバ関数、構造体オブジェクトのコンストラクタおよびデストラクタ、構造体オブジェクトの継承、スカラー型の配列、新しいスカラー型「バイナリ」および関連関数、埋め込みゼロバイトを含む埋め込み１６進数符号をサポートする文字列定数、ＲＰＣおよびＮｅｔＢＩＯＳチェック用のＲＰＣＣｈｅｃｋ（）およびＳＭＢＣｈｅｃｋ（）関数、バイナリ型で１６進数出力するすべてのスカラー型に対するｄｅｂｕｇＭｅｓｓａｇｅ（）、再帰、関数オーバーロード、参照パラメータ、ならびにＡｃｔｉｖｅ−Ａｓｓｅｓｓｍｅｎｔのサポートを含む。
【０１４１】
ＦＡＳＬの特定の一実装では、すべての変数はスタック変数である。再帰を許可することに加えて、さらに、構文解析ツリーを１回作成し、その後、これを使用して、複数のスレッドにより同じスクリプトを実行することができる。ＦＡＳＬの実行アーキテクチャでは、構文解析ツリーを読み取り専用データ構造として扱う。したがって、同じターゲットコンピュータのＩＰおよびポート上でＳｏｃｋｅｔをインスタンス化することを試みる同じスクリプトの２つのインスタンスなどの考慮事項以外に（実際には、発生しないであろう）、ＦＡＳＬは完全にスレッドセーフである。
【０１４２】
Ａ．スカラーデータ型
スカラーデータ型は、実行スタック上でスロットを１つ占有する、言語にネイティブの型である。基本的に、宣言することが可能な変数はスカラー型、スカラー型の配列、または構造体のインスタンスである。スカラー型は次のとおりである。
【０１４３】
表７：ＦＡＳＬデータ型
【表７】
2005515541.tif 000009
【０１４４】
通常、文字列はＮＵＬＬ終端である。すなわち、文字列は、内部的に、末尾を示すゼロを含む文字の列として表されるということである。しかし、このゼロは、常に、暗黙のうちに存在する。すなわち、ゼロを返す文字列関数はないということである。文字列の長さは、ゼロの位置までの（ゼロを含まない）文字の個数をカウントすることにより計算される。これでなんとかうまくゆくので、定数が、例えば、「ｔｈｉｓ  ｉｓ  ａ  ｓｔｒｉｎｇ＼ｘ０  ｗｉｔｈ  ｓｔｕｆｆ  ｂｅｙｏｎｄ  ｔｈｅ  ｚｅｒｏ．」という文字列に割り当てられた場合、その文字列の値は「ｔｈｉｓ  ｉｓ  ａ  ｓｔｒｉｎｇ」となり、長さは１６である。バイナリ型では、通常、内部表示内では０または他の区切り文字を使用しない。０が埋め込まれている文字列定数の例では、バイナリの中にもあるゼロの後にすべてがある。
【０１４５】
例えば、
ｂｉｎａｒｙ  ｂ＝“１２３４”；／／  長さ＝４
ｓｔｒｉｎｇ  ｓ＝“１２３４”；／／  長さ＝４
ｂｉｎａｒｙ  ｂ＝“ｚｚｚｚ＼ｘ０ｓｓｓｓ”；／／  値＝“ｚｚｚｚ＼ｘ０ｓｓｓｓ”，長さ＝９
ｓｔｒｉｎｇ  ｓ＝“ｚｚｚｚ＼ｘ０ｓｓｓｓ”；／／  値＝“ｚｚｚｚ”，長さ＝４
である。
【０１４６】
ｉｎｔと同等の型（ｉｎｔを含む式の中で交換可能）は以下のとおりである。
【０１４７】
表８：ｉｎｔに似た追加ＦＡＳＬ型
【表８】
2005515541.tif 000010
【０１４８】
所定の型の定数値を示すキーワードは以下のとおりである。
【０１４９】
表９：追加ＦＡＳＬ定数
【表９】
2005515541.tif 000011
【０１５０】
ｉｎｔと同等の上の型はさらに、それらの型の定数値を示すキーワードを持つ。例えば、これらは（上記に関して）以下のとおりである。
【０１５１】
表１０：ＦＡＳＬ型定数
【表１０】
2005515541.tif 000012
【０１５２】
Ｂ．ステートメント
ＦＡＳＬスクリプトは、通常、ステートメントのリストである。これらのステートメントは、一般に、セミコロンによって区切られる。この規則の例外は、ブロックを含むステートメント（｛と｝で囲まれている他のステートメントリスト）は、通常、区切るためにセミコロンを必要としないという点である。セミコロンは、有効な（空）ステートメントとなり、したがって、ブロックを伴うステートメントの後にセミコロンを入れても何ら問題はなく、何も実行されないだけである。新しいブロックは、新しいスコープを表す。そのスコープ内で宣言されている変数は、そのスコープ内でのみアクセス可能であり、デストラクタがある場合には、それらのデストラクタはスコープの終わりで呼び出される。変数は、変数が宣言されているスコープを閉じるスコープ内の変数と同じ名前で宣言することができる。これらは、外側のスコープ内の変数をオーバーライドするが、これらの変数は閉じられているスコープから他の方法でアクセス可能である。しかし、同じスコープ内の他の変数と同じ名前の変数があると、エラーが発生する。ステートメントは、以下のうちの１つであり、それぞれ以下で詳しく説明する。
・関数宣言：スコープ内で宣言された変数としてステートメントのリストに現れるが、その値は式からコピーされるか、さもなければ、式の型である関数呼び出しにより供給される変数を参照する、パラメータを持つステートメントの名前付きリスト。関数宣言は、スクリプトの最上位のスコープ内にのみ出現できる。
・構造体宣言：データメンバおよびメンバ関数の両方を持つことができるエンティティの宣言。メンバ関数はすべて、関数が呼び出されるオブジェクトインスタンスへの参照である暗黙の第１のパラメータを持つ。
・変数宣言：変数が宣言されていたスコープ内に存在する変数の宣言。変数は、単に宣言することができるか、あるいはその宣言の一部として、式に代入することにより初期化するか、または変数の後のかっこ内にコンストラクタパラメータを入れることにより作成できる。スカラー型にはコンストラクタはないことに注意されたい。コンストラクタを持つ型では、パラメータリストは、その型に対して存在するコンストラクタと一致していなければならない。
・式：これは、関数呼び出し、定数値、変数、メンバ選択（メンバ変数またはメンバ関数のいずれか）、ならびに変数、定数などの算術および論理演算とすることができる。
・Ｗｈｉｌｅループ：これは、所定の条件（式）が真に解決される場合に実行されるブロック／ステートメント／スコープを持つ制御構造である。
・Ｒｅｐｅａｔループ：これは、式が解決される整数値を実行回数としてブロックを実行する制御構造である。
・Ｉｆステートメント：これは、式が真に評価されるとブロックを実行し、偽であればオプションのｅｌｓｅブロックを実行する制御構造である。
・Ｆｏｒループ：この制御構造は、かっこで囲まれた、セミコロンで区切られた、式の３つのリストを持つ。リスト内で（空の場合も、式を１つ持つ場合も、複数の場合もある）、複数の式がある場合、それらはカンマで区切る。最初に第１のリストが実行される。次は、ブロックが実行されるには真でなければならない（式のリスト内ですべて真でなければならない）条件であり、最後は、ループを通る毎に実行される式のイテレータリストである。
・ブロック：多数のステートメントがブロックを所有することに注意されたい。ブロックは、制御ステートメントまたは関数宣言により所有されなくてもそのまま存在していてよい。所有されないブロックは、何かの作成と破壊を、「通常の」スコープ内で遂行できない与えられた位置で実行する必要がある状況でコーディングすることができる。
【０１５３】
Ｃ．関数宣言
関数は、「ｆｕｎｃｔｉｏｎ」キーワードを使用して宣言される。これらは、以下のように宣言される。
function [<scalar-return-type]<functionname>(<argument-list>)
{
<body>
}
戻り型が指定されていない場合、ｉｎｔが暗黙のうちに仮定される。引数リストは、空とすることができる（すなわち、「ｆｕｎｃｔｉｏｎ  ＜ｆｕｎｃｔｉｏｎｎａｍｅ＞（）．．．」）。すべてのスクリプトは、通常、「ｆｕｎｃｔｉｏｎ  ｆａｓｌｍａｉｎ（）」を必要とし、見つからないとエラーになる。関数ｆａｓｌｍａｉｎ（）は、スクリプト内の任意の場所から明示して呼び出すことができるが、ｆａｓｌｍａｉｎ（）の呼び出しが最上位スコープ内にない場合、呼び出しはスクリプトの終わりに暗黙のうちに挿入される。関数はオーバーロードすることができ、その引数リストが異なれば、同じ関数名を持つ複数の関数が存在することが可能である。引数リストは、「＜ａｒｇｕｍｅｎｔ＞、＜ａｒｇｕｍｅｎｔ＞、．．．、＜ａｒｇｕｍｅｎｔ＞」という形式である。引数は以下の形式とすることができる。
・コピー渡し。＜ｓｃａｌａｒ−ｔｙｐｅ＞＜ｄｉｓｔｉｎｃｔ−ｖａｒｉａｂｌｅ−ｎａｍｅ＞：関数がこの変数に対し実行するものは、呼び出しの中で与えられる対応する式に反映されない。式は定数とすることができる。
・参照渡し。＜ｓｃａｌａｒ−ｔｙｐｅ＞＆  ＜ｄｉｓｔｉｎｃｔ−ｖａｒｉａｂｌｅ−ｎａｍｅ＞：関数がこの変数に対し実行するものは、呼び出しの中で与えられる対応する変数に反映される。呼び出しでは、この引数に対応する変数に縮小する式を与えなければならない（すなわち、変数、あるいは変数に縮小する構造体メンバ選択のみ）。
【０１５４】
（場合によっては空の）＜ｂｏｄｙ＞は、ステートメントのリストからなる。「ｒｅｔｕｒｎ  ＜ｅｘｐｒｅｓｓｉｏｎ＞」というステートメントがこのボディのどこかにあった場合、関数の実行はその位置で停止し、制御権は関数の呼び出し側に返され、返される値は関数が、その関数を含む式に与える値となる。関数は、返す値を使用しなくても呼び出せる。
【０１５５】
例えば、
----------------------
function faslmain()
{
int x;
X = 5;
}
function string DoStringStuff(int x)
{
return intToString(x);
}
function void DoStringThing(string& s)
{
s = "the string";
// DoStringThing(szThing) will set
// szThing to "the string"
}
-------------------
である。
【０１５６】
変数宣言
変数宣言は以下のとおりである。
＜ｔｙｐｅｎａｍｅ＞  ＜ｖａｒ＞  ［，  ＜ｖａｒ＞．．．］；
構造体の場合、＜ｔｙｐｅｎａｍｅ＞は、通常、「ｓｔｒｕｃｔｕｒｅ  ＜ｓｔｒｕｃｔｕｒｅｎａｍｅ＞」と表されるか、またはそれとは別に、型「ＯＢＪＥＣＴ」の構造体変数を「ＯＢＪＥＣＴ  ｏ；」と宣言することができる。
【０１５７】
＜ｖａｒ＞は、以下のうちの１つである。
・＜ｉｄｅｎｔｉｆｉｅｒ＞：これは単純な宣言である。＜ｔｙｐｅｎａｍｅ＞が構造体であり、既定の（引数なし）コンストラクタが存在する場合、それが呼び出される。
・＜ｉｄｅｎｔｉｆｉｅｒ＞＝＜ｉｎｉｔｉａｌｉｚｅｒ  ｅｘｐｒｅｓｓｉｏｎ＞：式は評価され、結果は宣言時に変数に代入される。式によって返される型は」＜ｔｙｐｅｎａｍｅ＞と互換性がなければならないことに注意されたい。
・＜ｉｄｅｎｔｉｆｉｅｒ＞（＜ｐａｒａｍｓ＞）：＜ｐａｒａｍｓ＞は、カンマで区切られた、式のリストである。＜ｔｙｐｅｎａｍｅ＞内のシグネチャと一致するコンストラクタが呼び出される。＜ｔｙｐｅｎａｍｅ＞は、構造体である必要があることに注意されたい。
・＜ｉｄｅｎｔｉｆｉｅｒ＞［＜ａｒｒａｙ−ｄｉｍｅｎｓｉｏｎ−ｅｘｐｒｅｓｓｉｏｎ＞］：＜ｔｙｐｅｎａｍｅ＞は、スカラー（非構造体）型を示していなければならない。式は、整数定数に解決しなければならない（すなわち、その中に変数も関数呼び出しもあってはならない）。これにより、＜ｉｄｅｎｔｉｆｉｅｒ＞が所定の次元＜ｔｙｐｅｎａｍｅ＞の配列変数として宣言される。
【０１５８】
例えば、
------------
OBJECT o;
structure OBJECT o;
OBJECT o (5, 6,  "something");
int x = 8, y, z[6 + 7];
-----------
である。
【０１５９】
Ｄ．構造体宣言
構造体は、「ｓｔｒｕｃｔｕｒｅ」キーワードを使用して宣言される。これらは、以下のように、
structure <structurename> [extends <parentstructurename>]
{
<member-list>
};
と宣言される。
【０１６０】
パラメータ＜ｍｅｍｂｅｒ−ｌｉｓｔ＞は場合によっては空の＜ｍｅｍｂｅｒ＞のリストである。＜ｍｅｍｂｅｒ＞は、通常、関数宣言または変数宣言のいずれかである。構造体宣言で使用したときとそうでないときのこれらの構文上の唯一の違いは、メンバ変数がイニシャライザ式またはコンストラクタパラメータを持つことができないという点である。ただし、メンバ変数は配列であってもよい。
「ｅｘｔｅｎｄｓ」が使用されている場合、この構造体は親のすべてのメンバを「継承」する。親構造体の中にあるのと同じ名前およびシグネチャであるこの構造体の中のメンバ関数は、その親構造体の関数をオーバーライドする。
【０１６１】
「コンストラクタ」は、構造体変数が宣言されたときに呼び出されるメンバ関数であり、「デストラクタ」は、変数がスコープを抜けたときに呼び出されるメンバ関数である。
【０１６２】
名前が＜ｓｔｒｕｃｔｕｒｅｎａｍｅ＞であるメンバ関数はコンストラクタであり、パラメータを持つ場合も持たない場合もある。名前が〜＜ｓｔｒｕｃｔｕｒｅｎａｍｅ＞であり、パラメータを持たない０または１つのメンバ関数があり得、これはデストラクタである。すぐにはわからないいくつかの微妙な点を以下に示す。この構造体はコンストラクタおよび／またはデストラクタを持つ、あるいはコンストラクタおよび／またはデストラクタを持つ構造体であるメンバ変数を持つオブジェクトを拡張する場合、このオブジェクト内のそれぞれのコンストラクタは暗黙のうちに、親および／または所有されるオブジェクト内の既定のコンストラクタへの呼び出しを含み、また同様に、このオブジェクトのデストラクタは親／所有されたオブジェクトのデストラクタへの呼び出しを持つ。さらに、親オブジェクトまたは所有されたオブジェクトがコンストラクタおよび／またはデストラクタを持ち、このオブジェクトはそうでない場合、親／所有されたオブジェクトのすべてのコンストラクタ／デストラクタを呼び出すためにこのオブジェクト内に１つ作成される。コンストラクタおよびデストラクタは、「ｆｕｎｃｔｉｏｎ  ＜ｓｔｒｕｃｔｕｒｅｎａｍｅ＞．．．」または「ｆｕｎｃｔｉｏｎ〜＜ｓｔｒｕｃｔｕｒｅｎａｍｅ＞．．．」（すなわち、戻り型がない）として宣言しなければならない。
【０１６３】
宣言された構造体変数の使用は、「．」文字を使用したメンバ選択により実行される。例えば、
------------
OBJECT o;
o.m＿intmember = 5;
o.m＿ownedstructuremember.m＿x = 8;
o.DoSomething(5, 6,  "stuff");
------------
である。
【０１６４】
Ｅ．式
式は、変数、関数呼び出し、定数、メンバ選択、およびこれらとコネクタとして使用される演算子との組み合わせである。ここでの説明のために、式を再帰的に、例えば、＜ｅｘｐｒｅｓｓｉｏｎ＞＋＜ｅｘｐｒｅｓｓｉｏｎ＞が式となるように定義することができる。演算子を伴う式（代入、算術演算、論理演算など）では、式の左側を「ｌｖａｌｕｅ」、式の右側を「ｒｖａｌｕｅ」と呼ぶのが通例である。ＦＡＳＬでは、大半の言語と同様、式の中のｌｖａｌｕｅとｒｖａｌｕｅは互換性のある型を返さなければならない（通常、型は同じでなければならないが、ときには、ＦＡＳＬのｉｎｔおよびｃｈａｒと同様、異なる型も互換性があり得る）。さらに、特定の型にしか作用しない演算子もある。また、演算子の優先度という概念もあり、オーバーライドするかっこがない場合の演算子の優先度が決まる。したがって、例えば、３−５＋７は、左から右へ評価されるが、３−５＊７では、５＊７を先に計算し、その結果を３から引く。優先度順のすべての演算子のリストを以下に示す。
【０１６５】
関数および定数
・関数呼び出し：＜ｆｕｎｃｔｉｏｎ−ｎａｍｅ＞  （［＜ａｒｇｕｍｅｎｔ−ｌｉｓｔ＞］）。＜ａｒｇｕｍｅｎｔ−ｌｉｓｔ＞は、場合によっては空の、カンマで区切られた、式のリストである。スクリプトのどこかに、出現する順序でこれらの式の戻り型と一致するパラメータをとる関数がなければならない。参照をとる関数の場合、関数呼び出しの＜ａｒｇｕｍｅｎｔ−ｌｉｓｔ＞内の対応する式は変数に解決されなければならない（複数の変数の定数または算術／論理／関係演算式ではなく）。関数呼び出しの式の型は、対応する関数宣言の戻り型である。
・文字列定数：「ｓａｍｐｌｅ  ｓｔｒｉｎｇ＼ｘ３ｆ」。これらは、たいていは文字列を含むリテラル文字を表す、引用符で囲まれた文字列値である。この例外はエスケープ文字であり、「＼ｔ」はタブ、「＼ｎ」は改行、「＼ｒ」は復帰、および「＼ｘ［０−９ａ−ｆＡ−Ｆ］［０−９ａ−ｆＡ−Ｆ］＊」は１つの文字に解決される埋め込まれた１６進数符号である。正規表現は単に、例えば、「＼ｘ３ｆ−ｓａｍｐｌｅ」は４７（０ｘ３Ｆ）の後に「−」、さらに「ｓ」が続き、というようになるだけであることに注意されたい。埋め込まれたゼロ（「＼ｘ０」）は、文字列式の中で定数が使用された場合に文字列の終端となるが、バイナリ型の式で使用した場合には、文字列全体が処理されて、エスケープシーケンスに解決され、その後、バイナリ型に変換される。文字列定数は、通常、関数と同じ優先度を持つ。
・ｃｈａｒ定数：例えば、「Ａ」である。これらは、一重引用符と単一文字であることを除き文字列定数と同じように扱われる（エスケープシーケンスで表すことができる）。
・ｉｎｔ定数：これらは、「１０４８５７６」のような１０進数または「０ｘ１００Ｆ」のような１６進数である。
【０１６６】
単項演算子
・＋＋＜ｖａｒｉａｂｌｅ＞：変数の値に１を足し、その値を返す。ｉｎｔとｃｈａｒに作用する。
・−−＜ｖａｒｉａｂｌｅ＞：変数の値から１を引き、その値を返す。ｉｎｔとｃｈａｒに作用する。
・＜ｖａｒｉａｂｌｅ＞＋＋：変数の値を返して、その後１を足す。ｉｎｔとｃｈａｒに作用する。
・＜ｖａｒｉａｂｌｅ＞−−：変数の値を返して、その後１を引く。ｉｎｔとｃｈａｒに作用する。
・−＜ｅｘｐｒｅｓｓｉｏｎ＞：＜ｅｘｐｒｅｓｓｉｏｎ＞で返されるものを否定し、その値を返す。ｉｎｔとｃｈａｒに作用する。
・〜＜ｅｘｐｒｅｓｓｉｏｎ＞：＜ｅｘｐｒｅｓｓｉｏｎ＞で返されるもののビットを反転し、その値を返す。ｉｎｔとｃｈａｒに作用する。
・！＜ｅｘｐｒｅｓｓｉｏｎ＞：＜ｅｘｐｒｅｓｓｉｏｎ＞の論理否定。ブール型に作用する。
・ｓｉｚｅｏｆ（＜ｔｙｐｅｎａｍｅ＞または＜ｖａｒｉａｂｌｅ＞）：＜ｔｙｐｅｎａｍｅ＞または＜ｖａｒｉａｂｌｅ＞によって占有されているスタックセルの個数であるｉｎｔを返す。
【０１６７】
メンバ選択演算子
・<ｓｔｒｕｃｔｕｒｅｖａｒｉａｂｌｅ＞．＜ｍｅｍｂｅｒ＞［．＜ｍｅｍｂｅｒ＞．．．］：一番右の＜ｍｅｍｂｅｒ＞のとる型／値を返す。
【０１６８】
べき乗演算子
・＜ｅｘｐｒｅｓｓｉｏｎ＞ｐｏｗｅｒ＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅおよびｒｖａｌｕｅはｉｎｔまたはｃｈａｒでなければならない。ｉｎｔおよびｃｈａｒが混在している場合、ｃｈａｒはｉｎｔに格上げされる。
【０１６９】
乗法演算子
・＜ｅｘｐｒｅｓｓｉｏｎ＞＊＜ｅｘｐｒｅｓｓｉｏｎ＞：乗算．．．ｌｖａｌｕｅおよびｒｖａｌｕｅはｉｎｔまたはｃｈａｒでなければならない。ｉｎｔおよびｃｈａｒが混在している場合、ｃｈａｒはｉｎｔに格上げされる。
・＜ｅｘｐｒｅｓｓｉｏｎ＞／＜ｅｘｐｒｅｓｓｉｏｎ＞：除算．．．ｌｖａｌｕｅおよびｒｖａｌｕｅはｉｎｔまたはｃｈａｒでなければならない。ｉｎｔおよびｃｈａｒが混在している場合、ｃｈａｒはｉｎｔに格上げされる。
・＜ｅｘｐｒｅｓｓｉｏｎ＞％＜ｅｘｐｒｅｓｓｉｏｎ＞：剰余．．．ｌｖａｌｕｅおよびｒｖａｌｕｅはｉｎｔまたはｃｈａｒでなければならない。ｉｎｔおよびｃｈａｒが混在している場合、ｃｈａｒはｉｎｔに格上げされる。
【０１７０】
加法演算子
・＜ｅｘｐｒｅｓｓｉｏｎ＞＋＜ｅｘｐｒｅｓｓｉｏｎ＞：加算．．．乗法演算子と同じ型規則であるが、２つの文字列（文字列を返す）または２つのバイナリ（バイナリを返す）の連結も行う。式の一方が文字列定数で、他方がバイナリ変数の場合、文字列定数はバイナリ定数とみなされる。
・＜ｅｘｐｒｅｓｓｉｏｎ＞−＜ｅｘｐｒｅｓｓｉｏｎ＞：減算．．．乗法演算子と同じ型規則であるが、文字列にも作用する（演算子＋とは異なりバイナリには適用されない）。文字列の場合、減算を実行すると、ｒｖａｌｕｅと一致するｌｖａｌｕｅからすべての部分文字列が削除され、その結果の文字列が返される。
【０１７１】
ビット演算子
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＜＜  ＜ｅｘｐｒｅｓｓｉｏｎ＞：１ビット左シフトする（実際には２を掛ける）。乗法演算子と同じ型規則。
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＞＞  ＜ｅｘｐｒｅｓｓｉｏｎ＞：１ビット右シフトする（実際には２で除算し余りを捨てる）。乗法演算子と同じ型規則。最上位ビット（符号ビット）は、次のビットでも繰り返される。
・＜ｅｘｐｒｅｓｓｉｏｎ＞＆＜ｅｘｐｒｅｓｓｉｏｎ＞：ビット毎のＡＮＤ。乗法演算子と同じ型規則。
・＜ｅｘｐｒｅｓｓｉｏｎ＞｜＜ｅｘｐｒｅｓｓｉｏｎ＞：ビット毎のＯＲ。乗法演算子と同じ型規則。
・＜ｅｘｐｒｅｓｓｉｏｎ＞＾＜ｅｘｐｒｅｓｓｉｏｎ＞：ビット毎の排他的ＯＲ。乗法演算子と同じ型規則。
【０１７２】
関係演算子
これらの演算子はすべて、通常、演算対象の型に関係なくブール値を返す（演算対象と同じ型を返す大半の演算子とは対照的である）。特に断りのない限り、ｌｖａｌｕｅおよびｒｖａｌｕｅはｉｎｔ／ｃｈａｒとｉｎｔ／ｃｈａｒまたは文字列と文字列とすることができる。文字列の場合、比較はアルファベットの大文字小文字を区別する。
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＜  ＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅがｒｖａｌｕｅよりも小さい場合に真を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＜＝  ＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅがｒｖａｌｕｅ以下の場合に真を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＞  ＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅがｒｖａｌｕｅよりも大きい場合に真を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＞＝  ＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅがｒｖａｌｕｅ以上の場合に真を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞＝＝＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅとｒｖａｌｕｅが等しい場合に真を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞！＝＜ｅｘｐｒｅｓｓｉｏｎ＞：ｌｖａｌｕｅとｒｖａｌｕｅが等しくない場合に真を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞ｉｎ＜ｅｘｐｒｅｓｓｉｏｎ＞：これは、文字列およびバイナリ型の式にのみ作用する。
ｌｖａｌｕｅがｒｖａｌｕｅの中に部分文字列／部分バイナリパターンとして出現した場合に真を返す。
【０１７３】
論理演算子
これらの演算子では、ｌｖａｌｕｅおよびｒｖａｌｕｅがブール型を返すことを予期しており、演算子はブール型を返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞｜｜＜ｅｘｐｒｅｓｓｉｏｎ＞：「ｏｒ  ｅｌｓｅ」．．．ｌｖａｌｕｅ  が真の場合、ｒｖａｌｕｅを評価せずに真を返し、真でない場合、ｒｖａｌｕｅが返すものを返す。
・＜ｅｘｐｒｅｓｓｉｏｎ＞＆＆＜ｅｘｐｒｅｓｓｉｏｎ＞：「ａｎｄ  ｔｈｅｎ」．．．ｌｖａｌｕｅ  が偽の場合、ｒｖａｌｕｅを評価せずに偽を返し、真の場合、ｒｖａｌｕｅが返すものを返す。
【０１７４】
代入演算子
これらの演算子は、型互換性を要求する、すなわち、ほとんどの時間、型が等しいことを意味する。例外は、ｉｎｔとｃｈａｒを混在させたときに、ｌｖａｌｕｅ型が優勢となり、文字列定数をバイナリ変数に代入した場合、文字列定数はバイナリ定数になる。ｌｖａｌｕｅおよびｒｖａｌｕｅは、スカラー型に解決しなければならず、ｌｖａｌｕｅは変数に解決しなければならない。
・＜ｅｘｐｒｅｓｓｉｏｎ＞＝＜ｅｘｐｒｅｓｓｉｏｎ＞：単純な代入：ｒｖａｌｕｅをｌｖａｌｕｅにコピーする。
・＜ｅｘｐｒｅｓｓｉｏｎ＞＊＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞／＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞％＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞＋＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞−＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＞＞＝  ＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞  ＜＜＝  ＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞＆＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞｜＝＜ｅｘｐｒｅｓｓｉｏｎ＞：
・＜ｅｘｐｒｅｓｓｉｏｎ＞＾＝＜ｅｘｐｒｅｓｓｉｏｎ＞：上の項目はすべて、上で指定された演算子の規則に従ってｒｖａｌｕｅの「＝」の前の演算子を実行し、その結果をｌｖａｌｕｅに入れる。
【０１７５】
条件式
また、Ｃ／Ｃ＋＋の条件式と原則的に同一の構文と文法がある。文法は以下のとおりである。
（＜ｅｘｐｒｅｓｓｉｏｎ＞）？＜ｅｘｐｒｅｓｓｉｏｎ−ｅｖａｌ−ｉｆ−ｔｒｕｅ＞：＜ｅｘｐｒｅｓｓｉｏｎ−ｅｖａｌ−ｉｆ−ｆａｌｓｅ＞；
かっこ内の式が真に評価されると、疑問符の後の式が実行され、そうでなければ、コロンの後の式が実行される。かっこ内の式は、ブール型に解決しなければならず、他の２つの式は型互換性がなければならない。条件式の戻り型／値は、式の戻り型／値であり、これは、条件式を評価した後実行される。
【０１７６】
Ｆ．制御構文
Ｗｈｉｌｅループ
A while loop is expresses as:
while (<expression>)
{
<statement-list>
}
または、
while (<expression>)
<statement>;
である。
【０１７７】
これは、ブール型を返さなければならない＜ｅｘｐｒｅｓｓｉｏｎ＞を評価し、＜ｓｔａｔｅｍｅｎｔ−ｌｉｓｔ＞または＜ｓｔａｔｅｍｅｎｔ＞を実行し、その後、＜ｅｘｐｒｅｓｓｉｏｎ＞が真を返す限り、＜ｅｘｐｒｅｓｓｉｏｎ＞を再評価する。最初に＜ｅｘｐｒｅｓｓｉｏｎ＞が偽を返した場合、＜ｓｔａｔｅｍｅｎｔ−ｌｉｓｔ＞または＜ｓｔａｔｅｍｅｎｔ＞は決して実行されることはない。
【０１７８】
Ｒｅｐｅａｔループ
repeat (<expression>) 
{
<statement-list>
}
または、
repeat (<expression>)
<statement>;
である。
【０１７９】
これは、＜ｅｘｐｒｅｓｓｉｏｎ＞を１回評価し（ブロックを実行する前に毎回「イテレータ」式を実行する大半のループ構文とは対照的に）、ブロックを何回実行するかを示すｉｎｔまたはｃｈａｒを返さなければならない。その後、その回数だけブロックが実行される。この関係が明確でない場合があり、ｗｈｉｌｅループ内で、例えば、ループの本体は、最後に＜ｅｘｐｒｅｓｓｉｏｎ＞が偽に評価される式を実行しなければならず、そうでないと、いつまでもループを回り続けることになることに注意されたい。しかし、ｒｅｐｅａｔループのブロックが＜ｅｘｐｒｅｓｓｉｏｎ＞が別の値に評価されるようなものを実行する場合、＜ｅｘｐｒｅｓｓｉｏｎ＞はブロックが実行される前に１回だけ評価されるので、何ら違いはない。したがって、「ｖ＝２；ｒｅｐｅａｔ（ｖ）｛ｖ＝５；｝」とすれば、無限ループに入ることはない。というよりは、ｖに５を２回代入することになる。
【０１８０】
Ｉｆステートメント
if (<expression>)
{
<statement-list>
}
または、
if (<expression>)
{
<statement-list>
}
else
{
<statement-list>
}
である。
【０１８１】
簡単のため、単一の＜ｓｔａｔｅｍｅｎｔ＞を｛＜ｓｔａｔｅｍｅｎｔ−ｌｉｓｔ＞｝の変わりに使用する場合の可能なすべてのオプションを列挙してはいないが、そのようなオプションは存在している。ブール型に解決しなければならない＜ｅｘｐｒｅｓｓｉｏｎ＞が真に評価された場合、第１のブロックが実行される。偽に評価され、ｅｌｓｅブロックが存在していれば、そのブロックが実行され、存在していなければ、ブロックは何も実行されない。
【０１８２】
Ｆｏｒループ
for (<expression-list>; <expression-list>; <expression-list>) 
{
<statement-list>
}
または、
for (<expression-list>; <expression-list>; <expression-list>)
<statement>;
である。
【０１８３】
＜ｅｘｐｒｅｓｓｉｏｎ−ｌｉｓｔ＞は全くないか、または単一の＜ｅｘｐｒｅｓｓｉｏｎ＞であるか、またはカンマで区切られた式のリストである。第１の＜ｅｘｐｒｅｓｓｉｏｎ−ｌｉｓｔ＞は、最初に呼び出され、戻り値は無視されるので式のどのような混合でもよい。真ん中の＜ｅｘｐｒｅｓｓｉｏｎ−ｌｉｓｔ＞は、ブロックを実行するかどうか、ループが繰り返しを続けるかどうかを決定する条件である。このリスト内のすべての式は、ブール型を返さなければならず、すべて、ブロックが実行される順序で真を返さなければならない。最後の＜ｅｘｐｒｅｓｓｉｏｎ−ｌｉｓｔ＞は、式の混合でよく、毎回ブロックが実行された後に実行される。
【０１８４】
古典的な例は、「ｆｏｒ（ｘ＝０；  ｘ＜８；  ｘ＋＋）｛＜ｓｔａｔｅｍｅｎｔ−ｌｉｓｔ＞｝」である。ｘを０に設定し、ｘが８未満かどうか検査し、真であることがわかると、ブロックを実行し、ｘを１にインクリメントし、ｘが８未満か検査し、それが真であることがわかると、ブロックを実行し、...と、ｘが８になり、条件が偽になり、ループ実行が終了するまで続ける。
【０１８５】
Ｇ．ネイティブオブジェクト
ＦＡＳＬ言語の一実施形態の文法／構文要素は上で規定されている。これらだけで、計算を実行し、アルゴリズムを実装するのに十分であるが、ネットワーク経由でデータを送受信するような操作については何もなく、あれば便利なことであるが、これまでに規定した文法では表現できないスカラー型に関してはいくつかの演算があることに注意されたい。このような理由から、この機能にアクセスするためのスクリプトスコープ（言うなれば「メタスコープ」）を所有するスコープ内で宣言された構造体および関数が存在する。本明細書で使用しているように、「Ｆａｕｌｔｌｉｎｅ」は、ネットワークセキュリティシステム全体を指している。
【０１８６】
ＦＡＳＬオブジェクト
すべてのスクリプトは、「ＦＡＳＬ」という名前の、型が「ＦＡＳＬ＿ＯＢＪＥＣＴ」である変数にアクセスすることができる。この変数の型は、以下のように指定される。
--------------
structure FASL＿OBJECT 
{
private:
string      m＿szName,
m＿szDescription,
m＿szSummary,
m＿szReturnString;
RETURNVALUE     m＿eReturnCode;
int         m＿nDefaultPort,
m＿nIPAddress;
ATTACK      m＿eAttackType;
OPERATINGSYSTEM
m＿e0SMajor,
m＿eOSMinor;
PROTOCOL    m＿eDefaultProtocol;
public:
function FASL＿OBJECT()
{
m＿nDefaultPort = 0;
m＿nIPAddress = 0;
m＿szReturnString = "Return string not set."
}
function void setScriptName(string s)
{
m＿szName = s;
}
function void setScriptVulnerabilityCode (int 
nFaultlineID)
{
// This sets the vulnerability id as it exists in the Faultline database that uniquely
// identifies the vulnerability being sought by the script.
m＿nFaultlineID = nFaultlineID;
}
function void setScriptDesc (string s)
{
m＿szDescription = s;
}
function void setScriptSummary(string s)
{
m＿szSummary = s;
}
function void setScriptAttackType(ATTACK e)
{
m＿eAttackType = e;
}
function void setScriptReturn(string szReturnString, RETURNVALUE eReturnCode)
{
m＿szReturnString = szReturnString;
m＿eReturnCode = eReturnCode;
}
function void addValidPort(int n)
{
// When a script successfully compiles, it will execute all these that it finds
// in the main scope. It builds a list of ports on which to run the script.
m＿nValidPort = n;
}
function void setScriptPort (int n)
{
m＿nDefaultPort = n;
}
function void setScriptOS(OPERATINGSYSTEM eMajor, OPERATINGSYSTEM eMinor)
{
// When a script successfully compiles, it will execute all these that it finds
// in the main scope. It will use this information to decide whether this script
// needs to be run on a given host. 
m＿eOSMajor = eMajor;
m＿eOSMinor = eMinor;
}
function void setScriptProtocol(PROTOCOL e)
{
m＿eDefaultProtocol = e;
}
function int getIPAddress ()
{
return m＿nIPAddress;
}
function int getScriptPort ()
{
return m nDefaultPort;
}
function string strTok(string& s, string szDelimiters)
{
// Like strtok in UNIX, this skips past any characters at the beginning of the string
// that are in szDelimiters. Return the substring that includes all the leftmost
// characters up to but not including the next instance of a character in
// szDelimiters, or the end of the string whichever comes first. Remove the
// returned string from s (note it is a reference).
return STRTOK(s, szDelimiters);
}
};
-----------
スクリプトが正常にコンパイルされると、メインスコープ内にある「ＦＡＳＬ．ｍｅｍｂｅｒｆｕｎｃｔｉｏｎ（）」という形式のすべてのステートメントは、実行される（この位置では、スクリプト内の他のステートメントは実行されない）。これらのメンバ関数が設定する情報はスクリプトオブジェクトのデータの中に取り込まれ、これにより、システムはスクリプトをいつどのように実行するかに関して理にかなった決定を下すことができる。ＦＡＳＬ．ａｄｄＶａｌｉｄＰｏｒｔ（ｎＰｏｒｔ）は、何回でも呼び出すことができ、呼び出すことで、一意的なポートのリストが作成される。システムが実行されると、スクリプトのメインスコープ内でＦＡＳＬ．ａｄｄＶａｌｉｄＰｏｒｔ（ｎＰｏｒｔ）が呼び出されなかったことを見いだし、その場合、スクリプトはホスト毎に１回実行され、ＦＡＳＬ．ｇｅｔＳｃｒｉｐｔＰｏｒｔ（）はそのスクリプト内で０を返す。ＦＡＳＬ．ａｄｄＶａｌｉｄＰｏｒｔ（ｎＰｏｒｔ）がスクリプトのメインスコープ内に出現した場合、システムは、所定のホスト上の一意的なポート毎に１回スクリプトを実行し、ＦＡＳＬ．ｇｅｔＳｃｒｉｐｔＰｏｒｔ（）はその実行でシステムが渡すポートを返す。ＦＡＳＬ．ｓｅｔＳｃｒｉｐｔＯＳ（）も類似の原理で動作する（すなわち、これを呼び出すと、ＯＳが特に指定されているホスト上でのみスクリプトを実行することを要求するが、呼び出さないと、スクリプトはＯＳに関係なく呼び出される）。これを複数回呼び出しても、ａｄｄＶａｌｉｄＰｏｒｔがポートのリストを作成するようには、ＯＳのリストは作成されない。ｓｅｔＳｃｒｉｐｔＯＳの最後の呼び出しは、使用された呼び出しである。
【０１８７】
スクリプトのスコープに入ると、ＦＡＳＬ変数のｍ＿ｎＩＰＡｄｄｒｅｓｓメンバは、ＦＡＳＬスクリプトが実行されるときのターゲットマシンのＩＰアドレスに設定されている。ＦＡＳＬスクリプトで実行されるすべてのネットワーク活動では、このＩＰアドレスを宛て先として使用するので、これから指定しようとしている関数およびオブジェクトでは、ＩＰアドレスは決してパラメータではない。ＦＡＳＬ．ｓｅｔＳｃｒｉｐｔＲｅｔｕｒｎ（ｓｔｒｉｎｇ，ＲＥＴＵＲＮＶＡＬＵＥ）を呼び出すと、ｍ＿ｓｚＲｅｔｕｒｎＳｔｒｉｎｇメンバが設定され、その後、スクリプトの実行が完了した後、スクリプト実行コマンドラインアプリケーション「ｆａｓｌ．ｅｘｅ」により出力される。他の呼び出し、最も顕著なｓｅｔＳｃｒｉｐｔＯＳ（）が、Ｆａｕｌｔｌｉｎｅ．ｅｘｅにより使用される情報を設定し、所定のホストでスクリプトを実行するかしないかを決定する。すなわち、システムは、スクリプト内の「ＦＡＳＬ．ｘｘｘ（）」ステートメントのみを実行し、その後、システムはメタデータを調べて、そのＩＰアドレスでスクリプト全体を実行するかどうかを決定する。一実施形態では、ＦＡＳＬ＿ＯＢＪＥＣＴのコンストラクタは、実際には、ＦＡＳＬ変数については呼び出されない。そこで、ｍ＿ｎＩＰＡｄｄｒｅｓｓ以外の変数は、ときには、最初は何にも設定されない。構造体は、ＦＡＳＬ＿ＯＢＪＥＣＴから派生することができ、型ＦＡＳＬ＿ＯＢＪＥＣＴの変数を初期化することができ、その場合、コンストラクタが呼び出される。また、ＦＡＳＬのメンバ変数はスクリプトコード（プライベートと宣言されている）により直接アクセスできないことにも注意されたい。
【０１８８】
Ｓｏｃｋｅｔオブジェクト
これは、メタスコープ内で宣言されている構造体であるが、ＦＡＳＬ＿ＯＢＪＥＣＴの場合のようには、メタスコープ内で宣言されているインスタンスはない。ほとんどの場合、通常のＦＡＳＬ構造体と同様であるが、コンストラクタはコンストラクタの第１引数に渡すものに応じてウィンドウＴＣＰまたはＵＤＰソケットを作成し、デストラクタはそのオブジェクトをクリーンアップする。接続が適切であると仮定とすると、メンバ関数を使用して、そのソケット上でデータの送受信を行うことができる。構造体は以下のとおりである（データメンバは、知らなくてもよいので省略されている）。
-----------
structure Socket
{
function Socket(PROTOCOL eProtocol, int nPort)
{
// eProtocol is either TCP or UDP and the port is the IP port
// Creates a windows socket object.
}
function 〜Socket()
{
// Cleans up the Windows socket object associated with this socket.
}
function boolean socketOpen()
{
// Typically must be called before sending or receiving data for either protocol.
// if returns false then it could not open the socket and communication
// will fail.
}
function boolean socketClose()
{
// Close the socket. destructor will do this if not done here.
}
function void BindPort(int nPort)
{
// Use when you want specify the source port explicitly.
BIND＿PORT (nPort);
}
function string socketRead(int nBytes, int nTimeout)
{
// Read nBytes from Socket... returns empty string if fail.
}
function string socketReadLine(int nBytes, int nTimeout)
{
// Read nBytes or up to end of line whichever comes first.
// return empty string on fail.
}
function binary socketReadBinary(int nBytes, int nTimeout)
{
// Read nBytes of raw binary data, empty binary on fail.
}
function int socketWrite (string szBuffer, int nLength)
{
// Write nLength characters out of szBuffer. return 0 on fail
// or number of bytes written on success.
}
function int socketWrite(string szBuffer)
{
// Write the entire string (length implicit), otherwise same as above.
}
function int socketWrite(binary bBuffer)
{
// Write the binary raw data... length implicit, otherwise same as above.
}
};
-------------
アクティブ評価に対する脆弱性オブジェクト
このオブジェクトは、アクティブ評価に使用され、そのカスタムビヘイビア−一般的ＦＡＳＬスクリプトには異常な−は自分自身、および後で自分自身を見つけるたために必要とするすべてのデータを、他のスクリプトがデータにアクセスし、その情報を使用して他のマシンに危害を及ぼすことを試みることができる、グローバルデータ領域にコピーする方法を知っているということである。オブジェクトは以下のとおりである。
-------------
structure Vulnerability
{
private:
int  m＿nFaultlineID,
m＿nIPAddress,
m＿nExploitIPAddress;
string     m＿szDescription;
public:
function Vulnerability()
{
m＿nFaultlineID = 0;
m＿nIPAddress = 0xFFFFFFFF;
m＿szDescription          =         ＼"Vulnerability
uninitialized.＼";
}
function void addToExploitableData(
int nFaultlineID,
int nIPAddress,
int nExploitIPAddress,
string szDescription)
{
// This sets all the member variables of this structure. This function may be
// called from a derived structure and this function will know that. It stores the
// entire contents of the object as well as the object's typename and size in the
// global vulnerability data area.
}
function boolean getExploitableData(int nIndex)
{
// this function searches the global vulnerability
// data area for the nIndex-the instance of a variable of the same type as this (this
// could be and probably will be a derived structure from vulnerability) and copies
// its contents into this object. If there is no nIndex-th object, return false and
// no change to this object's data will have
occurred.
}
// Accessor functions. the members of this structure need to be read only once they
// have been stored with addToExploitableData(). 
function int getFaultlineID()
{
return m＿nFaultlineID;
}
function int getIPAddress()
{
return m＿nIPAddress; 
}
function int getExploitIPAddress()
{
return m＿nExploitIPAddress;
}
function string getDescription()
{
return m＿szDescription;
}
};
---------------
このオブジェクトの背後に、一方のスクリプトが、他のマシンに危害を及ぼすために他方のスクリプトで使用できる何かを発見することが可能であるという概念がある。脆弱性はどれも、この実施形態では、この基底クラスに含まれる情報を必要とする。ｍ＿ｎＦａｕｌｔｌｉｎｅＩＤは、発見された脆弱性の脆弱性ＩＤである。ｍ＿ｎＩＰＡｄｄｒｅｓｓは、脆弱性が発見されたマシンである。ｍ＿ｎＥｘｐｌｏｉｔＩＰＡｄｄｒｅｓｓは、この脆弱性を見つけるのに有益であることを実証した、データが発見されたマシンである。ｍ＿ｓｚＤｅｓｃｒｉｐｔｉｏｎは、Ａｃｔｉｖｅ−Ａｓｓｅｓｓｍｅｎｔレポートに表示したい内容である。ｍ＿ｎＥｘｐｌｏｉｔＩＰＡｄｄｒｅｓｓは、通常、この脆弱性を見つけるために他の脆弱性が使用されていなかった場合に、−１に設定されなければならない。他の脆弱性が使用される場合、そのｍ＿ｎＩＰＡｄｄｒｅｓｓ（通常はｏｔｈｅｒｖｕｌｎ．ｇｅｔＩＰＡｄｄｒｅｓｓ（）を使用して）はこの脆弱性のｍ＿ｎＥｘｐｌｏｉｔＩＰＡｄｄｒｅｓｓに入力される。これにより、レポートがグラフで表示できる監査証跡が定められる。
【０１８９】
この一般的な使い方は、脆弱性から構造を派生させることである（すなわち、「ｓｔｒｕｃｔｕｒｅ  ＵｎｉｃｏｄｅＶｕｌｎｅｒａｂｉｌｉｔｙ  ｛／／ｅｘｔｒａ  ｉｎｆｏ  ｓｐｅｃｉｆｉｃ  ｔｏ  ｕｎｉｃｏｄｅ  ｖｕｌｎ  ｔｈａｔ  ｃａｎ  ｂｅ  ｕｓｅｄ  ｂｙ  ｏｔｈｅｒ  ｓｃｒｉｐｔｓ｝；」）。一例ではユニコード脆弱性が見つかった場合、「ＵｎｉｃｏｄｅＶｕｌｎｅｒａｂｉｌｉｔｙ  ｕｖ；」などの変数が作成され、「ｕｖ．ＡｄｄＴｏＥｘｐｌｏｉｔａｂｌｅＤａｔａ（．．．）」への呼び出しを介して特別データが設定され追加される。この呼び出しの後、この特定の脆弱性を利用しようとする他のスクリプトは、以下のものに似たコードを持つ。
-----------
int               i;
UnicodeVulnerability         uv;
for (i = 0; uv.getExploitableData(i); i++)
{
// Attempt to use this data to compromise this host.
if (succeed at compromising this host)
{
// create a vulnerability representing this host's vulnerability that was
// found using the UnicodeVulnerability. Note that this vulnerability
// may or may not be a UnicodeVulnerability... it could be some other
// vulnerability. When you have populated it with its specific data, call:
newvuln. addToExploitableData(
nNewVulnFaultlineID,
FASL.getIPAddress(),
uv.getIPAddress(),
"we got this vuln by exploiting Unicode on another machine");
}
}
-----------
デバッグメッセージ
「ｄｅｂｕｇＭｅｓｓａｇｅ  （＜ｓｃａｌａｒ＞  ｅ）」という関数がすべてのスカラー型についてオーバーロードされる。ほとんどの場合、これは、デバッギングシステムから予想されるものを出力する。ｉｎｔおよびｃｈａｒは数値として出力され、ブール型は「真」または「偽」として出力され、文字列はその内容を出力する。バイナリの場合、ｄｅｂｕｇＭｅｓｓａｇｅ（ｂｉｎａｒｙ  Ｂ）を通じて、１６進ダンプ出力が得られるが、これは、ＭＳ−ＤＯＳのＤＥＢＵＧ．ＥＸＥの「ｄ」オプションで出力されるものとよく似ている。すなわち、それぞれ１６バイトを表す行を出力し、行の形式は＜４桁１６進数オフセット＞：＜空白で区切られた８個の２桁１６進数＞−＜他の８＞＜印刷可能文字はそのまま表され、印刷不可能文字はピリオドとして表される１６個の文字＞である。例えば、
「００６０：  ６７  ６５  ６Ｃ  ７３  ２０  ６Ｃ  ６Ｆ  ６Ｆ−６Ｂ  ２０  ６Ｃ  ６９  ６Ｂ  ６５  ２０  ７４  ｇｅｌｓ  ｌｏｏｋ  ｌｉｋｅ  ｔ」
である。
【０１９０】
関数を指定することになっている場合、容易に他の型を文字列に変換し、式全体に対しｄｅｂｕｇＭｅｓｓａｇｅを実行することができる。すなわち、ｄｅｂｕｇＭｅｓｓａｇｅ（“ｈｅｒｅ  ｉｓ  ｗｈａｔ  ｘ  ｅｑｕａｌｓ：”＋  ｉｎｔＴｏＳｔｒｉｎｇ  （ｈｅｘ））；を実行する。通常は、スクリプトのシステム実行ではデバグ出力を無視するのがふつうなので、「サインオフ」されたスクリプトの中のｄｅｂｕｇＭｅｓｓａｇｅ呼び出しを削除することもコメントアウトすることも必要ない。
【０１９１】
文字列関数
------------
function string leftTrim(string s)
{
// Lops off whitespace up to the first non-whitespace character.
}
function string rightTrim(string s)
{
// Lops off all trailing whitespace.
}
function int stringLength(string s)
{
// self-explanatory.
}
function string toLower(string s)
{
// Makes any characters that are upper-case lower-case.
}
function string toUpper(string s)
{
// Makes any characters that are lower-case upper-case.
}
function int stringToInt(string s)
{
// similar to atoi in C
}
function string intToString(int n)
{
// i.e 1048576 becomes string "1048576"
}
function string intToString(char c)
{
// Similar to intToString(int)
}
function string intToHexString(int n)
{
// i.e. 16383 becomes "3FFF"
function int hexStringToInt(string s)
{
// i.e. "3FFF-blahblahblah" becomes 16383.
}
function string intToBinaryString(int n)
{
// i.e. 85 becomes "1010101"
}
function int binaryStringToInt(string s)
{
// i.e. "1010101blahblahblah" becomes 85.
}
function string intToIPString (int n)
{
// i.e. 16777215 becomes "0.255.255.255"
}
function string grep(string sl, string s2)
{
return ＼"to be implemented＼";
}
function int locate (string sl, string s2)
{
// return 0-based position of s1 in s2 or -1 if s1 not in s2.
}
function string subString (string  s, int  nStart, int nNumChars)
{
// i.e. subString("one law for the lion and ox is oppression", 4, 3} = "law"
// it is smart about boundries ... if you ask for more characters than exist
// you only get the ones that exist.
}
function string garbageString(char c, int nLength)
{
// i.e. garbagestring('Al', 7) = "AAAAAAA"
}
function string garbageString(int nLength)
{
// return string of nLength length whose characters are random
// upper and lower case alphanumerics.
}
----------------
バイナリ関数：
----------------
function int binaryLength(binary b)
{
// self-explanatory.
}
function char binaryNthByte(binary b, int n)
{
// return nth byte numbered from 0. If out of bounds, 
// return -1.
}
function boolean binaryChangeByte(binary& b, int n, char c)
{
// Change byte #n in binary b to c. If out of bounds,
// do nothing to b and return false.
}
function binary binaryRight(binary b, int n)
{
// return a binary which is the rightmost n bytes of b.
If there
// are not n bytes in b, you get all of b (not padded to n).
}
function binary binaryLeft(binary b, int n)
{
// same like binaryRight except from left.
}
function binary binaryMid (binary b, int nStart, int nLength)
{
// nStart is 0-based... return binary which is the nLength bytes starting
// at nStart. If there are not nLength bytes, return however many there are.
}
----------
一般グローバル関数：
--------------
function string getLocalHostIP()
{
// return string "xxx.xxx.xxx.xxx" representing the IP 
of the machine
// on which the FASL script is running.
}
function string getTargetHostIP()
{
// This is in here for compatibility reasons... you can get the same
// effect by doing:
intToIPString(FASL.getIPAddress());
}
function ant getTargetPort()
{
return FASL.m＿nDefaultPort;
}
function boolean RPCCheck(int nRPCProgNum)
{
// Attempt to make an RPC call on the given nRPCProgNum 
to see if it exists
// on the target machine. Return true if it does.
}
function boolean SMBCheck(string szUserName, string szPassWord, string szShare)
{
// Attempt to do a "net use" sort of thing on the given share... i.e. "IPC$",
// "＼＼HOSTNAME＼C$", "＼＼xxx.xxx.xxx.xxx＼C$", etc. If it succeeds then
// promptly delete the share and return true, otherwise return false.
}
-------------
ＦＡＳＬスクリプト言語のこの実装では、知られている開いているポートを持つ知られているターゲットコンピュータに潜在的脆弱性のアクティブ評価を実行することができる。例えば、ユニコード脆弱性をテストするＦＡＳＬスクリプトは以下の形式をとる。
-----------
structure UnicodeVulnerability extends Vulnerability
{
string    m＿szUnicodeString;
};
function fas1main ()
{
UnicodeVulnerability uv;
uv.m＿szUnicodeString = "The unicode string"; 
uv.addToExploitableData(1,   FASL.m＿nIPAddress,       "the string for reporting purposes");
debugMessage("vulnfind executed.");
}
structure UnicodeVulnerability extends Vulnerability
{
string    m＿szUnicodeString;
};
function faslmain()
{
UnicodeVulnerability      uv;
if (uv.getExploitab1eData(0))
{
debugMessage("getExploitableData()...
m＿nFaultlineID  =  "  +  intToString(uv.m＿nFaultlineID)  +  ",
m＿nIPAddress  =  "  +  intToIPString(uv.m＿nIPAddress)  +  ",
m＿szDescription  =  "  +  uv.m＿szDescription  +  ",
m＿szUnicodeString  =  +  uv.m＿szUnicodeString);
}
else
{
debugMessage("getExploitableData() failed.");
}
}
-----------------
顕著なことであるが、一実施形態では、正常に行われた脆弱性テストから収集された情報を使用して、ターゲットネットワークおよび個々のターゲットコンピュータの脆弱性をさらにテストすると都合がよい。特に、脆弱性テストが正常に行われた場合、アカウントアクセスの追加ポートまたはレベルがターゲットコンピュータ上で利用可能であるのがふつうである。したがって、他の前の脆弱性テストが失敗した場合であっても、正常に行われた脆弱性テストの後に再試行すると都合がよい。
【０１９２】
図８は、ターゲットネットワークにつながっているターゲットコンピュータの脆弱性のアクティブな評価の一実施形態の図である。簡単のため、ネットワークは、ターゲット１コンピュータ８００およびターゲット２コンピュータ８０２を備えるように示されている。簡単のため、単一の脆弱性を２台のコンピュータのすべてのＴＣＰおよびＵＤＰポートに適用すると仮定する。単一の脆弱性「ＴＥＳＴ」を、両方のターゲットコンピュータ上のさまざまなＴＣＰおよびＵＤＰポート上でテストする。以前のホスト発見およびポート発見では、ターゲット１データ８０４およびターゲット２データ８０６が得られており、これらは、各ターゲットコンピュータ上で見つかった開いているポートの識別を含む。特に、図８に示されている例では、ＴＣＰポート８０ならびにＵＤＰポート５０００および５３は、ターゲット１コンピュータ８００上で開いていることが判明しており、ＴＣＰポート２３および８０ならびにＵＤＰポート５００、５３、および１７２１はターゲット２コンピュータ８０２上で開いていることが判明している。アクティブ評価プロセスは、ステップ８０６で始まり、まず、ＴＥＳＴルーチン８０８を実行し、ＴＥＳＴ脆弱性をターゲット１コンピュータ８００上の各ポートに適用することによって始まる。図８の例では、ターゲット１コンピュータ８００をテストする第１ラウンド８１０で、ポート８０、５０００、および５３をテストすると、脆弱性の適用は成功しない。その後、システムは、ターゲット２コンピュータをテストする第１ラウンド８１２に入り、そこでは、ポート８０および５３のテストは成功しないが、ポート２３、５０００、および１７２１のテストは成功している。テストが成功すると、ターゲットコンピュータから有用な情報を剥ぎ取る試みが行われ、取り出された情報がターゲット２データ８０６内に格納される。取り出された新しい情報に基づいて、ターゲット１コンピュータをテストする第２ラウンド８１４が試みられる。この試みで、ポート８０のテストはまだ不成功であるが、ポート５０００および５３のテストは今度は成功しており、ターゲット２データ８０６から収集された追加情報が含まれる。このようにして、ターゲット２コンピュータをテストする第２ラウンド８１６が試みられる。テストのラウンドは、脆弱性評価がターゲットネットワーク全体に対して前向きに完了できるまで繰り返される。
【０１９３】
知られている脆弱性は、通常、データベース内に格納され、脆弱性評価検証、アクティブ評価、および報告に取り込まれる。一実施形態では、「ｓｔａｔｉｃ  ｄａｔａ」という名前の「Ｖｕｌｎｓ」テーブルは、新しいパッチを展開するときにのみ変更され、新しい脆弱性を取り込む。これは、例えば、新しい脆弱性が発見され、既存の現場システムインストールにおいて認識するようにする必要がある場合に行われる。一実施例では、本システムは、以下のＶｕｌｎｓＦｏｕｎｄテーブルを使用して、特定のスキャンで見つかった脆弱性を示す。ＶｕｌｎｓＦｏｕｎｄは、Ｖｕｌｎｓテーブルの単なるインデックスであるが、これを使用すると、同じデータを何回も繰り返し、領域を無駄にすることがなくて済む。
-----
TABLE: Vulns
COLUMN: BID, TYPE: varchar(10)
COLUMN: CVE, TYPE: varchar(20)
//"Common Vulnerabilities and Exposures" number.
COLUMN: CyberID, TYPE: int(10)
COLUMN: Description, TYPE: text (2147483647}
COLUMN: ExploitDataType, TYPE: varchar(64)
//Name of the FASL type, where applicable, that 
contains extra data for this vulnerability.
COLUMN: ExploitDate, TYPE: smalldatetime(16)
COLUMN: ExploitLink, TYPE: varchar(255)
//Site where you can download the exploit/patch.
COLUMN: FaultlineID, TYPE: int(10)
//Primary key field... linked to VulnsFound table.
COLUMN: Impact, TYPE: tinyint (3)
COLUMN: ISSID, TYPE: int(10) 
COLUMN: LHF, TYPE: bit(l) 
//short term intrusion opportunity.., true or 
false.
COLUMN: Name, TYPE: varchar(128)
COLUMN: NID, TYPE: int(10)
COLUMN: Observation, TYPE: text (2147483647}
COLUMN: Person, TYPE: varchar(50)
COLUMN: Popularity, TYPE: tinyint(3)
COLUMN: Recommendation, TYPE: text(2147483647) 
COLUMN : Risk, TYPE: tinyint(3)
COLUMN: Risktext, TYPE: text(2147483647)
COLUMN: Simplicity, TYPE: tinyint(3) 
COLUMN: Type, TYPE: varchar(50)
//web, rauter, unix, trojan, etc.
TABLE: VulnsFound
COLUMN: ConfigurationID, TYPE: int (10) 
COLUMN: CustomerID, TYPE: int(10) 
COLUMN: FaultlineID, TYPE: int(10) 
COLUMN: HostID, TYPE: int(10)
COLUMN: JobID, TYPE: int(10)
COLUMN: VulnFoundID, TYPE: int identity(10)
-------
ＶＩＩ．ターゲットネットワーク脆弱性の定量的スコアリング
ネットワーク脆弱性は、従来より、「低リスク」、「中リスク」、および「高リスク」の尺度で格付けされてきた。この主観的尺度は、脆弱性によって与えられるターゲットシステムへのアクセスレベル、脆弱性を検出して搾取容易性、脆弱性に関する一般大衆の知識、脆弱性の影響を受けるコンピュータの割合などに基づく。しかし、この主観的尺度は、相対的セキュリティを比較するため他の何らかの形で異なるネットワークを比較することができる客観的印を欠いている。さらに、この主観的な３レベル尺度だと、時間の経過によるセキュリティ改善または追加リスクに関する情報はほとんど得られない。
【０１９４】
一実施形態では、本システムは、ターゲットネットワークの全体的セキュリティの客観的で定量的な印を与える。この定量的印は、十分な精度の定量的尺度となり得、１〜１０、１〜１００などの範囲で、時間が経過したときのネットワーク脆弱性の変化があっても意味のある区別を行うことができ、都合がよい。さらに、この客観的印では、標準的公式をターゲットネットワークおよびネットワーク構成で発見されたさまざまな脆弱性に適用し、他の何らかの形で異なるネットワーク構成、オペレーティングシステム、およびコンピュータのセキュリティの有効な比較を行うことができる。
【０１９５】
例えば、客観的印は、ＦｏｕｎｄＳｃｏｒｅ  Ｆなどのリスク測定アルゴリズムである。図９のフローチャートに例示されている一実施形態では、ＦｏｕｎｄＳｃｏｒｅ  Ｆは以下のように定義される。
Ｆ＝１００−Ｖ−Ｅ  （式１）
ここで、
Ｆ＝ＦｏｕｎｄＳｃｏｒｅ
Ｖ＝脆弱性損失
Ｅ＝暴露損失
である。
【０１９６】
より具体的には、好ましい一実施形態において、脆弱性損失Ｖは、ターゲットネットワーク上に見つかったそれぞれの脆弱性に割り当てられた値の総和として定義される。ターゲットネットワーク上に見つかったｎ個の脆弱性のそれぞれについて、その脆弱性に重みが割り当てられる。
【０１９７】
したがって、特定の脆弱性Ｖｘについて、１≦ｘ≦ｎとすると、脆弱性重みＶｗ，ｘは以下のように定義される。
【０１９８】
【数１】
2005515541.tif 000013
ここで、
ＰＥＡ（ＶＸ）＝ｆｌｏｏｒ（｛Ｐ（ＶＸ）＋Ｅ（ＶＸ）＋Ａ（ＶＸ）｝／３）    （式３）
および、
ｆｌｏｏｒ（ｘ）は、標準床関数であり、
Ｐ（ＶＸ）は、１〜３尺度による脆弱性の人気度であり、
Ｅ（ＶＸ）は、１〜３尺度による脆弱性の搾取容易性であり、
Ａ（ＶＸ）は、１〜３尺度による脆弱性により与えられるアクセス／特権のレベルである。
ここで、この尺度でスコアが高いほど、リスクは大きい。
【０１９９】
それとは別に、脆弱性は、単に、次のような脆弱性に関連付けられているリスクレベルとして定義することができる。
ＰＥＡ（ＶＸ）＝Ｒ（ＶＸ）    （式３ａ）
ここで、Ｒ（ＶＸ）は、１〜３尺度による脆弱性に関連するリスクである。
【０２００】
通常、特定の脆弱性についてＰＥＡ（Ｖ）を決定するために使用される係数は、前述の脆弱性データベースから得られる。他の実施形態では、脆弱性基本関数（例えば、ＰＥＡ（Ｖ））は、例えば、脆弱性分布の容易さ、脆弱性防止の容易さなど、多数の異なる変数から定義することができる。したがって、脆弱性スコア合計Ｖは、一実施形態では、以下に等しい。
Ｖ＝ｍｉｎ（５０，Σ（Ｘ＝１→ｎ）｛Ｖｗ，ｘ｝）    （式４）
ここで、
ｎ＝ターゲットネットワーク上で見つかった脆弱性の個数。
Σ＝総和記号
ＶＷ，Ｘ＝上で定義した脆弱性重み、および
ｍｉｎ（ｘ，ｙ）＝標準最小関数
である。
【０２０１】
一実施形態では、暴露スコア合計Ｅは以下のように定義される。
Ｅ＝ｍｉｎ（５０，Σ（ｙ＝１→ｑ）｛１０×Ｕｙ＋５×Ｉｙ＋Ｎｙ＋２×Ｍｙ｝）    （式５）
ここで、
ｑ＝ターゲットネットワーク上で見つかった稼働しているターゲットコンピュータの台数。
Ｕｙ＝ＤＮＳを除く、ｙ番目のターゲットコンピュータ上で見つかった開いているＵＤＰポート
Ｉｙ＝ｙ番目のターゲットコンピュータ上で見つかった開いているＩＣＭＰポート
Ｎｙ＝ｙ番目のターゲットコンピュータ上で見つかった非本質的サービス
Ｍｙ＝本質的サービスのないターゲットコンピュータに対するペナルティ
Σ＝総和記号、および
ｍｉｎ（ｘ，ｙ）は標準最小関数
である。
【０２０２】
特に、稼働しているターゲットコンピュータの台数ｑは、通常、上述のホスト発見プロセスから推論される。ｙ番目のターゲットコンピュータ上に見つかった開いているＵＤＰポートＵｙの個数は、通常、上で説明したサービス発見およびアクティブ評価プロセスから推論される。ｙ番目のターゲットコンピュータ上に見つかった非本質的サービスＮｙの個数は、通常、ＴＣＰおよびＵＤＰポートのサービス発見から推論され、好ましい一実施形態では、特定の所定のサービスを除き、それぞれのターゲットコンピュータ上に見つかったすべての開いているポートをカウントする。表１１は、本発明の一実施形態によよる非本質的サービスＮのカウントに含まれない所定のサービスの例をまとめたものである。
【０２０３】
表１１：Ｎｙカウントに含まれない本質的サービスの例
【表１１】
2005515541.tif 000014
【０２０４】
オペレーティングシステム、プロトコルなどの変更に基づいて、本質的サービスの他の組み合わせも可能である。最後に、Ｎｙ＞０である各ターゲットコンピュータについて１に設定されている本質的サービスペナルティフラグＭｙはなく、また表７に示されているように本質的サービスも実行されていない。そうでなければ、Ｍｙは０に設定される。
【０２０５】
その結果、ＦｏｕｎｄＳｃｏｒｅ  Ｆ＝１００−Ｖ−Ｅから、０から１００までの範囲の定量的スコアが得られ、これはターゲットコンピュータの相対的セキュリティの客観的印を表す。一般に、Ｆｏｕｎｄｓｃｏｒｅが高いほど（すなわち、Ｆが高いほど）、ターゲットネットワークの相対的セキュリティは大きくなる。他の実施形態も可能であり、例えば、
Ｅａｌｔ＝［Σ（ｙ＝１→ｑ）｛（５×Ｕｙ＋２×Ｉｙ＋２×Ｎｙ＋２×Ｍｙ）２｝］１／２／ｑ    （式７）
Ｖａｌｔ＝［Σ（ｘ＝１→ｎ）｛（Ｖｗ，ｘ）２｝］１／２／ｎ    （式８）
Ｆａｌｔ＝Ｅａｌｔ＋Ｖａｌｔ    （式９）
ようなものがある。
【０２０６】
この他のスコアリング方式では、Ｆａｌｔスコアが高いほど、ターゲットネットワークのセキュリティは悪化する。
【０２０７】
図９は、ターゲットネットワークのセキュリティスコアを判定する方法の一実施形態の図である。第１の決定ステップ９００で、この方法は、ターゲットネットワーク内に見つかったすべての脆弱性をカウントしたかどうかを判別する。カウントしていなければ、この方法は、ステップ９０２で、脆弱性データベース９０４に格納されている所定の値に基づく脆弱性の数値ｘについて、上のＰＥＡ（ＶＸ）（式３）またはその変更形態を計算する。ＰＥＡ（ＶＸ）の値は、ステップ９０６で、脆弱性ｘに対する加重脆弱性ＶＷ，ｘ（式２）を計算するために使用される。通常、この後、特定の実施形態で必要ならば、ステップ９０８で脆弱性カウンタがインクリメントされる。この後、この方法は、決定ステップ９００に戻り、再びすべての脆弱性がカウントされたかどうかを判定する。
【０２０８】
すべての脆弱性がカウントされた後、好ましい実施形態では、ステップ９１０で脆弱性総計Ｖを計算する。上述のように、この実施形態では、脆弱性総計Ｖは５０またはすべての加重脆弱性スコアＶｗ，ｘの総和のいずれか小さい方である。それとは別に、他のスコアも可能であり、また総スコアＶの表を従来のループと組み合わせることもできる。
【０２０９】
この後、決定ステップ９１２で、この方法は、ターゲットネットワーク内に見つかったすべてのターゲットコンピュータがカウントされているかどうかを判別する。カウントされていない場合、ステップ９１４で暴露値を決定する。好ましい実施形態では、暴露値はＵｙ（ポート５３のＤＮＳを除く、ｙ番目のターゲットコンピュータ上に見つかった開いているＵＤＰポート）、Ｉｙ（ｙ番目のターゲットコンピュータ上に見つかった開いているＩＣＭＰポート）、およびＮｙ（ｙ番目のターゲットコンピュータ上に見つかった非本質的サービス）を含み、決定される。暴露値は、ネットワークセキュリティテストに基づいて動的に決定され、一実施形態では、ターゲットコンピュータの脆弱性データベース９０４または他のデータベースに格納される。ステップ９１６で、ペナルティＭｙは、本質的サービスが存在しないターゲットコンピュータについて決定される。その後、ステップ９１８で暴露カウンタがインクリメントされ、この方法は決定ステップ９１２に戻り、すべてのターゲットコンピュータがカウントされたかどうかを判別するのが好ましい。
【０２１０】
すべてのターゲットコンピュータがカウントされたら、ステップ９２０で、暴露合計Ｅが５０または見つかった暴露値の加重総和のいずれか小さい方として計算される。その後、好ましい実施形態では、ステップ９９２で、１００から脆弱性および暴露スコア合計を引いた値としてスコアＦを計算し、ネットワークセキュリティスコアの表示を出力する。好ましい実施形態では、Ｆの値が大きいほど、客観的尺度ではネットワークセキュリティが高くなる。
【０２１１】
他の実施例は、脆弱性スコアリングおよび暴露スコアリングに関連する係数のさまざまな順列を適用し、また同様に、本明細書の開示の範囲内に予見される。
【０２１２】
ＶＩＩＩ．ターゲットネットワークトポロジおよび脆弱性のグラフィック階層報告
一般に、従来のネットワークセキュリティシステムでは、テキストダンプ形式で報告情報を出力している。ネットワークトポロジ、ターゲットコンピュータ、脆弱性などに関する収集されたデータレコードは、ＡＳＣＩＩファイルにダンプされるため、解釈するためにかなりの労力を要する。このようなデータダンプが従来から使用されているのは、ネットワークセキュリティユーザに高危険脆弱性があることを知らせること以外に、既存のシステムは、特定の脆弱性を識別し、是正するユーザを支援する見つかったネットワーク、ターゲットコンピュータ、および脆弱を表すデータの対話的で階層的なグラフィック表示を出力しないからである。
【０２１３】
本システムは、セキュリティテスト時に発見されたデータを、グラフィック情報階層に配置され対話的に利用できるドキュメント集合体に編集し、さまざまな詳細レベルで文書としてレビューできるようにしている。したがって、本発明の一実施形態では、レポートエンジンは（１）ネットワークトポロジ、見つかったターゲットコンピュータ、およびターゲットネットワーク全体を通して見つかった脆弱性を表す動的グラフィック表示、（２）ターゲットコンピュータ、見つかった脆弱性、および脆弱性説明の包括的リスト、（３）ターゲットネットワークの近似的セキュリティ格付けを記述する客観的スコアリングレポート、（４）ポート、サービスを記述する暴露レポート、ならびに（５）マシン毎、ポート毎、または脆弱性毎にテスト結果を記述する詳細情報を出力する。組織内の特定の個人は、異なる詳細レベルを望むことがある。例えば、上級管理職は、ターゲットネットワークの近似的セキュリティ格付けを記述する客観的スコアリングレポート（３）のみをほしがる場合がある。それとは対照的に、ネットワーク管理者は、すべてのレポート、特に、管理者側で是正する必要のあるマシンおよびマシン上のポートを識別するのに使用できる詳細情報レポート（５）を受け取ることを望む。
【０２１４】
例えば、レポートエンジンにより生成されるレポートの機能的表示は、通常、（１）実際のスコア、（２）スコア暴露の色分け表示、および（３）定量的スコアのグラフィック表示をはじめとする、定量的スコア表示を含む。実際のスコアは、Ｆスコアまたは、例えば、すでに説明したように１から１００の数値格付けなどの他の実施形態である。色分け表示は、スコアの全体的な脆弱性範囲を表す。したがって、一実施形態では、１から３３までの範囲のスコアは高い脆弱性を示す赤色、３４から６６までのスコアは中間の脆弱性を示す黄色、６６よりも高いスコアは低い脆弱性を示す緑色とする。他の色、範囲、および表示、例えば、アイコンまたは絵を使用して脆弱性レベルを表示することなども予見される。
【０２１５】
図１０は、例えば、ユーザが見られるように、表示装置上に表示された階層型セキュリティレポート１０００の一実施形態を示している。階層型セキュリティレポートは、相対的に高いリスクに対応する値１５を示す、Ｆｏｕｎｄｓｔｏｎｅスコアの表示１０１０を含む。このセキュリティレポートは、さらに、稼働しているターゲットコンピュータおよびターゲットコンピュータ上に配置されているサービスを含む、マッピングされたネットワークトポロジのグラフィック表示１０２０を含む。このセキュリティレポートは、さらに、発見されたホストのリスト１０３０、および発見されたサービスのリスト１０４０を含む。
【０２１６】
ユーザは、図１０に示されているレポート（または図に示されていない他のレポート）のいずれかを選択し、さらに詳細内容を要求することができる。図１１は、例えば、２台のターゲットコンピュータの脆弱性に関してさらに詳しい内容を示す階層型セキュリティレポート１１００の一実施形態を示している。例えば、表示の上部分では、ウィンドウ１１１０により表される第１の開いているポートおよびウィンドウ１１２０により表される第２の開いているポートを備える第１のターゲットコンピュータ（ＩＰアドレス２５５．２５５．２５５．２５５の“ｌｏｃａｌｈｏｓｔ．ｌｏｃａｌ．ｎｅｔ”）を識別する。第１のターゲットコンピュータの開いている各ポートは、それぞれ脆弱性を持ち、脆弱性を低減するためにターゲットコンピュータ上にインストールする脆弱性パッチを識別することができる。他の例として、セキュリティレポート１１００の下位部分では、ウィンドウ１１３０により表される単一のを開いているポートを備える第２のターゲットコンピュータ（ＩＰアドレス２５４．２５５．２５５．２５５の“ｌｏｃａｌｈｏｓｔ２．ｌｏｃａｌ．ｎｅｔ”）を識別する。ウィンドウ１１３０内の情報は、ポート上のサービスが期限切れになっていることを示し、削除すべきであることを示唆しており、サービスが保持される場合にインストールする脆弱性パッチを識別すると都合がよい。
【０２１７】
Ｃ＋＋には「オブジェクトレイヤ」が実装されており、ＦＡＳＬスクリプト言語に関して上で説明したように、システムで扱うデータオブジェクトの階層を表す。すべてのオブジェクトは、１）データメンバとしてそのオブジェクトに直接関係するデータを含む（これらは、データベース内の行を持つ１対１対応である）、２）場合によっては、本発明に従う他のオブジェクトのリストを含むモデルに従う。それぞれのオブジェクトは、データベースとの間でロードまたは保存を行うことによりオブジェクトが直接かかわるデータを扱うＬＯＡＤ（）およびＳＡＶＥ（）メンバを持つ。「子」オブジェクトリストでは、ＵｐｄａｔｅＴｏＤａｔａｂａｓｅ（）およびＵｐｄａｔｅＦｒｏｍＤａｔａｂａｓｅ（）メンバ関数が使用される。これらは、オブジェクトのＳａｖｅ（）またはＬｏａｄ（）メンバをそれぞれ呼び出す。次に、再帰的に子リストのＵｐｄａｔｅＴｏＤａｔａｂａｓｅ（）またはＵｐｄａｔｅＦｒｏｍＤａｔａｂａｓｅ（）メンバを呼び出す。このようにして、オブジェクトとその子を階層内の任意の位置から選択的にロードすることができる。このように実行されるのは、オジェクトは一般に大きすぎて、すべて一度に扱えないためである。
【０２１８】
データがロードされると、単一のスキャンを表すオブジェクトはＧｅｎｅｒａｔｅＲｅｐｏｒｔメンバ関数を持つが、これにより、レポートに含まれるすべてのｈｔｍｌ、ｇｉｆ、ｊｐｇ、およびｐｎｇファイルをプログラムにより生成できる。ｈｔｍｌファイルは、文例集ソースおよびキーワードを含む「ｔｅｍｐｌａｔｅ」ｈｔｍｌファイルをロードし、キーワードをそのレポートデータを表すｈｔｍｌソースで置き換えることにより生成される。ｇｉｆおよびｊｐｇは、単なる背景グラフィックスであり、レポートが変わっても変わらず、したがって、ｇｉｆおよびｊｐｇ符号化の詳細を知らなくてもレポートメカニズムを使わずそのまま作成される。動的に計算する必要がある画像については、ｐｎｇグラフィックス形式を使用する。これは、パブリックライブラリが存在するパブリック（ライセンスのない）形式であり、われわれはこのライブラリをシステム実行可能ファイルにリンクしている。画像は、Ｗｉｎｄｏｗｓ  ＨＤＣ（表示デバイスを表すウィンドウソフトウェアオブジェクト）上に描画され、固有の形式でオブジェクトをラップするカスタムクラスによりｐｎｇに変換される。
【０２１９】
スキャンサマリレポートの例を以下の付録Ａに掲載した。対応するＦｏｕｎｄＳｃｏｒｅレポートの例を以下の付録Ｂに掲載した。対応するネットワークトポロジレポートの例を以下の付録Ｃに掲載した。
【０２２０】
本発明の説明はシステムの少なくとも１つの実施形態を含むが、本明細書の請求項で定義されている本発明の精神と範囲から逸脱することなく、システムにさまざまな変更、置き換え、および改変を加えることができることは理解されるであろう。例えば、上述のこの方法の他の実施形態はその例が図１２に示されている。
【０２２１】
【表１２】
2005515541.tif 000015
【０２２２】
【表１３】
2005515541.tif 000016
【０２２３】
【表１４】
2005515541.tif 000017
【０２２４】
【表１５】
2005515541.tif 000018
【０２２５】
【表１６】
2005515541.tif 000019
【０２２６】
【表１７】
2005515541.tif 000020
【０２２７】
【表１８】
2005515541.tif 000021
【０２２８】
【表１９】
2005515541.tif 000022
【０２２９】
【表２０】
2005515541.tif 000023
【０２３０】
【表２１】
2005515541.tif 000024
【０２３１】
【表２２】
2005515541.tif 000025
【０２３２】
【表２３】
2005515541.tif 000026
【０２３３】
【表２４】
2005515541.tif 000027
【図面の簡単な説明】
【０２３４】
【図１】ターゲットネットワークの一実施形態を示す図である。
【図２】ターゲットネットワーク上のターゲットコンピュータの一実施形態を示す図である。
【図３】包括的テスト方法の一実施形態を示す図である。
【図４】オペレーティングシステム識別方法の一実施形態を示す図である。
【図５】図３のオペレーティングシステム識別方法で使用されるＴＣＰ  ＳＹＮパケットの一実施例を示す図である。
【図６】どのようなターゲットコンピュータが稼働状態であるかを判別するため行う第１段階のスキャニングの一実施形態を示す図である。
【図７】ターゲットコンピュータ上でどのようなポートが開いているかを判別するために行う第２段階のスキャニングの一実施形態を示す図である。
【図８】ターゲットネットワーク上のターゲットコンピュータの脆弱性のアクティブな評価の一実施形態を示す図である。
【図９】ターゲットネットワークのセキュリティスコアを判定する方法の一実施形態を示す図である。
【図１０】ネットワークトポロジおよびネットワーク脆弱性のグラフィック表示を含む、階層型セキュリティレポートの一実施形態を示す図である。
【図１１】階層型セキュリティレポートの第２の実施形態を示すより詳細な図である。
【図１２】包括的テスト方法の第２の実施形態を示す図である。
【図１２ａ】包括的テスト方法の第２の実施形態を示す図である。
【図１２ｂ】包括的テスト方法の第２の実施形態を示す図である。
【図１２ｃ】包括的テスト方法の第２の実施形態を示す図である。
【図１２ｄ】包括的テスト方法の第２の実施形態を示す図である。
【図１】
2005515541.tif 000028
【図２】
2005515541.tif 000029
【図３】
2005515541.tif 000030
【図４】
2005515541.tif 000031
【図５】
2005515541.tif 000032
【図６】
2005515541.tif 000033
【図７】
2005515541.tif 000034
【図８】
2005515541.tif 000035
【図９】
2005515541.tif 000036
【図１０】
2005515541.tif 000037
【図１１】
2005515541.tif 000038
【図１２】
2005515541.tif 000039
【図１２ａ】
2005515541.tif 000040
【図１２ｂ】
2005515541.tif 000041
【図１２ｃ】
2005515541.tif 000042
【図１２ｄ】
2005515541.tif 000043
【国際調査報告】
2005515541.tif 000044
2005515541.tif 000045