(57)【要約】ソースコードの脆弱点を検出するための方法およびシステム。ソースコードは構文解析されて中間表現にまとめられる。モデル（例えば、格子の形の）が、コードの変数、および、ルーチンコールに関連して使用される変数および／または数式について得られる。次に、このモデルが、ルーチンに関してあらかじめ指定された規則との関連において分析され、そのルーチンコールが、あらかじめ指定の脆弱点の内の1個以上を持つかどうかが決められる。
2006523898.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード中の脆弱点を検出する方法であって、
ソースコード中の変数を分析し、その分析に基づいて、各モデルが各変数についてあらかじめ指定された特徴の明細を記述するモデルを作成すること；
該変数モデルを用いて、ソースコード中のルーチンコールに対する引数のモデルを作成すること；および、
該引数モデルを、対応するルーチンコールに関してあらかじめ指定された基準と関連させて用いて、そのルーチンコールが、引数および既知のルーチンの振る舞いの結果として脆弱点を有するかどうかを決めること、
を含む方法。
【請求項２】
前記モデルは、変数のメモリーサイズの明細を記述することを特徴とする、請求項1の方法。
【請求項３】
前記モデルは、変数のデータサイズの明細を記述することを特徴とする、請求項1の方法。
【請求項４】
前記モデルは、変数が、文字列値タイプの変数についてnull終止文字列であるのか、null終止文字列でないのかを特定することを特徴とする、請求項1の方法。
【請求項５】
前記モデルは、変数のメモリータイプの明細を記述することを特徴とする、請求項1の方法。
【請求項６】
前記モデルは、文字列値タイプである変数の文字列値を特定することを特徴とする、請求項1の方法。
【請求項７】
前記モデルは、変数のデータの起源を特定することを特徴とする、請求項1の方法。
【請求項８】
前記引数モデルは、変数引数の特徴の明細を記述することを特徴とする、請求項１の方法。
【請求項９】
前記引数モデルは、数式引数の特徴の明細を記述することを特徴とする、請求項１の方法。
【請求項１０】
前記モデルは格子として詳細に記述されることを特徴とする、請求項１の方法。
【請求項１１】
格子値は、無知を表す値、矛盾知識を表す値、および、洗練知識を表す値を含むことを特徴とする、請求項10の方法。
【請求項１２】
洗練知識を表す前記値は、ある範囲の特定値を特定するための値を含むことを特徴とする、請求項11の方法。
【請求項１３】
対応するルーチンに関する前記あらかじめ指定された基準は、ルーチンの意味論的振る舞いに関する規則を含むことを特徴とする、請求項1の方法。
【請求項１４】
前記脆弱点がバッファーオーバーフローであることを特徴とする、請求項1の方法。
【請求項１５】
ソースコード中の脆弱点を検出する方法であって、
ルーチンのフローについていくつかの特徴を記述するモデルを作成すること；および、
該モデルを、対応するルーチンに関してあらかじめ指定された基準と関連させて用いて、そのルーチンコールが、そのルーチンのフローの結果として脆弱点を有するかどうかを決めること、
を含む方法。
【請求項１６】
前記脆弱点が競合状態であることを特徴とする、請求項15の方法。
【請求項１７】
ソースコード中の脆弱点を検出する方法であって、
ルーチンにおいて実行される活動についていくつかの特徴を記述するモデルを作成すること；および、
該モデルを、対応するルーチンに関してあらかじめ指定された基準と関連させて用いて、ルーチン内の活動を設計意図以外にも実行可能とする脆弱点を、ルーチンコールが所有しているかどうかを決めること、
を含む方法。
【請求項１８】
前記脆弱点が特権エスカレーションであることを特徴とする、請求項17の方法。
【請求項１９】
ソースコード中の脆弱点を検出する方法であって、
ソースコードを分析して、ソースコード中のルーチンコールに対する引数のモデルを作成すること；
該引数モデルを、対応するルーチンコールに関してあらかじめ指定された基準と関連させて用いて、そのルーチンコールが、引数およびルーチンの振る舞いの結果として脆弱点を有するかどうかを決めること、
を含む方法。
【請求項２０】
ソースコード中の脆弱点を検出するシステムであって、
ソースコード中の変数を分析し、その分析に基づいて、各モデルが各変数についてあらかじめ指定された特徴の明細を記述するモデルを作成するためのコンピュータ搭載ロジック；
該変数モデルを用いて、ソースコード中のルーチンコールに対する引数のモデルを作成するためのコンピュータ搭載ロジック；および、
該引数モデルを、対応するルーチンコールに関してあらかじめ指定された基準と関連させて用いて、そのルーチンコールが、引数および既知のルーチンの振る舞いの結果として脆弱点を有するかどうかを決めるためのコンピュータ搭載ロジック、
を含むシステム。
【請求項２１】
前記引数モデルを、対応するルーチンコールに関してあらかじめ指定された基準と関連させて用いて、そのルーチンコールが、引数および既知のルーチンの振る舞いの結果として脆弱点を有するかどうかを決めるためのコンピュータ搭載ロジックは、引数モデルの分析に基づいて脆弱点を検出するための規則の明細を記述するデータベースを含むことを特徴とする、請求項20のシステム。
【請求項２２】
ソースコード中の脆弱点を検出するシステムであって、
ルーチンのフローについていくつかの特徴を記述するモデルを作成するコンピュータ搭載ロジック；および、
該モデルを、対応するルーチンに関してあらかじめ指定された基準と関連させて用いて、そのルーチンコールが、そのルーチンのフローの結果として脆弱点を有するかどうかを決めるコンピュータ搭載ロジック、
を含むシステム。
【請求項２３】
ソースコード中の脆弱点を検出するシステムであって、
ルーチンにおいて実行される活動についていくつかの特徴を記述するモデルを作成するコンピュータ搭載ロジック；および、
該モデルを、対応するルーチンに関してあらかじめ指定された基準と関連させて用いて、ルーチン内の活動を設計意図以外にも実行可能とする脆弱点を、ルーチンコールが所有しているかどうかを決めるコンピュータ搭載ロジック、
を含むシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムのセキュリティ、さらに詳細には、セキュリティ・リスク問題を起こす可能性のあるコンピュータ・ソースコードの脆弱点を検出する方法およびシステムに関する。
【背景技術】
【０００２】
＜関連技術＞
コンピュータプログラムの開発に関連する問題点の一つは、そのプログラムの「脆弱点」を検出することの困難である。本明細書で用いる「脆弱点」という用語は、ユーザーのソースコードのセクションであって、実行した場合、外部入力に対して、不適正な、または、好ましからざる実行を起こさせる可能性を持つセクションを指す。典型的な脆弱点としては、バッファーオーバーフロー、競合状態、および、特権エスカレーションが挙げられ、これらはそれぞれ、プログラムの望ましい、調節された実行に対して脆弱性を構成する。脆弱点の有無を求めてソースコードを検閲することは、困難であり、手間のかかる過程となる。それは、可能性のあるあらゆる脆弱点、その場所の特定法、および、それらの修正法について完全に理解することを要求する。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
ソースコードの脆弱点を検出するための従来法は、ソースコードの字句解析を実行することを含む。これは、既知の脆弱点の探索を実行し、かつ、それらを潜在的な脆弱点として指摘することを含む。この方法の問題点は、この方法はあまりにも多くの擬似陽性を発生させることである。別の方法は、手動による、コードの一行ずつの分析実行を含む。しかしながら、この方法は極めて労働過重である。
【課題を解決するための手段】
【０００４】
＜発明の概括＞
本発明は、ソースコードにおける脆弱点を検出する方法およびシステムを提供する。
【０００５】
本発明の一つの局面において、ソースコード中の脆弱点を検出するための方法およびシステムが提供される。この方法は、ソースコードにおける変数を分析し、その分析に基づいて各モデルが各変数について指定の特徴の明細を記述する複数のモデルを作成する工程；該モデルを用いてソースコードのルーチンコールに対する引数モデルを作成する工程；および、引数モデルを、対応するルーチンコールについてあらかじめ指定された基準と組み合わせて用いて、ルーチンコールが、引数および既知のルーチン行動の結果として脆弱点を持つかどうかを決定する工程を含む。
【０００６】
本発明の別の局面では、ソースコード中の脆弱点を検出するための方法およびシステムが提供される。この方法は、ルーチンのフローに関する特徴の明細を記述するモデルを形成する工程；および、このモデルを、対応するルーチンについてあらかじめ指定された基準と組み合わせて用いて、ルーチンコールが、ルーチンフローの結果として脆弱点を持つのかどうかを決定する工程を含む。
【０００７】
本発明の別の局面では、ソースコード中の脆弱点を検出するための方法が提供される。この方法は、ルーチンで実行されるべき活動の特徴を記述するモデルを形成する工程；および、このモデルを、対応するルーチンについてあらかじめ指定された基準と組み合わせて用いて、ルーチンコールが、ルーチンの活動が、設計意図から外れて実行されることを可能とする脆弱点を持つかどうかを決定する工程を含む。
【発明を実施するための最良の形態】
【０００８】
本発明の好ましい実施態様は、ソースコードにおける脆弱点を検出するための方法およびシステムを提供する。本明細書で用いる「脆弱点」という用語は、ユーザーのソースコードのセクションであって、実行した場合、外部入力に対して、不適切な、または、好ましからざる実行を起こさせる可能性を持つセクションを指す。
【０００９】
本発明の好ましい実施態様は、バッファーオーバーフロー、競合状態、および特権エスカレーションのような脆弱点を検出する方法およびシステムを提供する。
【００１０】
図13は、バッファーオーバーフロー、競合状態、および特権エスカレーションのような脆弱点を検出するためにコンピュータプログラムを分析するための例示のロジックを示すフローチャートである。この処理は、二つの基本的ブロックを持つ。すなわち、言語特異的処理および脆弱性分析である。言語特異的処理はソースコードを分析し、モデルを作成する。言語特異的処理は、言語構文解析器136が分析対象となるソースコード134を受け取り、それから中間再現形（IR）を作成することから始まる。IRは従来技術で既知であり、従ってその言語解析ロジックをここでは説明しない。
ソースコードのいくつかの特性を記述するためにモデル138が創成されるが、このモデルは、脆弱性評価140において、脆弱性データベース142と組み合わせて、脆弱性が存在するかどうかを判定するのに用いられる。
【００１１】
図1は、本発明のある実施態様に従ってバッファーオーバーフロー脆弱性の有無に関しコンピュータプログラムを分析するに際して用いられる例示のロジックを示すフローチャートである。処理は二つの基本ブロックを持つ。すなわち、言語特異的処理および脆弱性分析である。
【００１２】
言語特異的処理はソースコードを分析し、選択された手順、機能、またはルーチンを呼び出すのに用いられる引数をモデル化する。モデルは、「脆弱性格子」と呼ばれる独特の構造を用いる。脆弱性格子は、引数（変数であれ、数式であれ）に関する関連情報、例えば、そのメモリーサイズ、そのメモリータイプ等を指定するのに用いられる。この格子指定は言語特異的である。
【００１３】
脆弱性分析は、ルーチンコールがその引数に及ぼす影響を分析するために、脆弱性格子およびその他の情報を用いる。この分析は言語依存性である。この分析は、ソースコード中の、ある任意のルーチンコールが、そのコールの中の引数を含め、ある種のエラーに対して内在的な脆弱性、または被害の危険性を持つかどうかを判断するために、規則を適用する。例えば、分析は、ソースコードのある位置の、ある引数を持つあるルーチンコールが、バッファーオーバーフローエラーの危険性を誘発するかどうかを決定してもよい。
【００１４】
言語特異的処理、脆弱性評価の両方とも、ルーチンに対する引数として使用される変数および数式をモデル化および分析するために格子構造を利用する。背景知識として言えば、格子は、実体の数値に関する知識の洗練度を表す。図2は、整数値に関する整数格子22の例を示す。格子の頂上の頂上値（┬）は、数値に関して知識の無いことを表す。格子の底辺の底辺値（⊥）は未知の値（すなわち、可能な値の内どの値を適用すべきかを決定できない）を表す。頂上値と底辺値の間の数値は、実体の可能性のある値を表す。図2に示した整数格子22では、整数0、1、2、3、4および5が、実体の可能な数値である。
【００１５】
＜ルーチン選択用引数決定のための脆弱性格子を創成する言語特異的処理＞
言語特異的処理は、言語構文解析器12が分析対象となるソースコード10を受け取り、それから中間再現形（IR）を創造することから始まる。
【００１６】
フローインセンシティブ解析14がIRを分析し、コード中の各変数についてモデルを得る。これらのモデルは格子型に記述され、脆弱性格子と呼ばれる（一般に格子という名で知られる）。好ましい実施態様では、脆弱性格子（場合によって、下記では、同様に「数式格子」とも呼ばれる）は、変数または数式の重要特性を記述するために他のいくつかの格子を含む（その脆弱格子が変数または数式に関連するかどうかに応じて）。もっと具体的に言うと、脆弱性格子は下記に関する情報を提供する。すなわち、
・メモリーサイズ
・データサイズ
・データがnull終止しているかどうか
・メモリーブロックに含まれるメモリーの種類
・メモリーブロックの、一つの、または複数の引数定常値
・データの起源
【００１７】
格子をどのように設定または修正すべきかを決める場合には、フローインセンシティブ解析ロジックは、各種格子タイプに対してあらかじめ指定された融合規則を適用する。これは、例えば、数式を分析する際に用いられる。
【００１８】
フローインセンシティブ解析ロジックは、積分型変数を記述する場合にも（この場合も格子形）、整数格子を利用する。
【００１９】
図3は、メモリーサイズ格子24の例を示す。メモリーサイズ格子24は、高数値、低数値、および、一対の負ではない整数値から成る格子であって、直接に、またはポインターを介して参照されるメモリーブロックの可能なサイズ範囲を示す。この格子は、あるメモリー操作が、現在利用可能なメモリーをオーバーフローさせるかどうかを判定するのに用いてもよい。メモリーサイズ格子24の融合規則は下記の通りである。
・高数値（┬）と他の任意の数値との融合は、その別の数値となる。
・低数値（⊥）と他の任意の数値との融合は、低数値となる。
・二つのメモリー範囲格子数値の融合は下記の結果を取る。すなわち、
・範囲最大  ←範囲1最大┌範囲2最大（┌  はオペレータの「最大」である）。
・範囲最小  ←範囲1最小└範囲2最小（└  はオペレータの「最小」である）。
【００２０】
例えば、ｃまたはｃ＋＋で下記のように宣言されたアレイは
2006523898.tif 000003
【００２１】
100バイトのサイズを持つ、すなわち、1入力（１バイト）をアレイ中の要素の数（100）で倍したサイズとなる。
【００２２】
別の例として、ある範囲のサイズ数値を表すメモリーサイズ格子は有用となる可能性がある。すなわち、
2006523898.tif 000004
【００２３】
この場合、変数ｃによってポイントされたメモリーブロックのサイズは、アレイaが選択されるのか、あるいは、アレイbが選択されるのかに応じて100バイトか200バイトかどちらかの可能性がある。後者の選択は、今度は、別の変数iが0かどうかに依存する。この変数に関するメモリー格子の結果は、最大サイズ200バイト、最小サイズ100バイトを指定することとなる。
【００２４】
図４は、データサイズ格子26の例を示す。データサイズ格子は、直接に、またはポインターを介して参照されるメモリーブロックにおける既知のデータの可能なサイズ範囲を示す。この格子は、あるメモリー操作が、現在利用可能なメモリーをオーバーフローさせるかどうかを判定するのに用いることが可能である。特に、この格子は、一般に、含まれるメモリーブロックよりも短いnull終止文字列のサイズを示すのに用いられる。データサイズ格子26の融合規則は下記の通りである。
・高数値（┬）と他の任意の数値との融合は、その別の数値となる。
・低数値（⊥）と他の任意の数値との融合は、低数値となる。
・二つのメモリー範囲格子数値の融合は下記の結果を取る。すなわち、
・範囲最大  ←範囲1最大┌範囲2最大。
・範囲最小  ←範囲1最小└範囲2最小。
【００２５】
図5は、null終止格子28の例を示す。null終止格子は、データがnull終止であることが既知であるかどうか、例えば、データが、データの終末を示すために最後の入力として0値を持つのかどうかを示す。これは、通常、文字列構造と結びつけて使用される。データの範囲は、データがnull終止であるか、null終止でないのかを指定することを含む。null終止格子の融合規則は下記の通りである。
・高数値（┬）と他の任意の数値との融合は、その別の数値となる。
・低数値（⊥）と他の任意の数値との融合は、低数値となる。
・二つの同じ、非高、非低格子数値の融合は、同じ格子値となる。および、
・二つの異なる、非高、非低格子数値の融合は、低（⊥）格子値となる。
【００２６】
図6は、メモリーサイズ格子30の例を示す。メモリー位置格子は、メモリーブロックの含まれるメモリーの種類、例えば、スタックメモリー、ヒープメモリー、静的メモリー、および、定常メモリーを示す。他の種類のメモリーを指定することも可能である。メモリー位置格子30の融合規則は下記の通りである。
・高数値（┬）と他の任意の数値との融合は、その別の数値となる。
・低数値（⊥）と他の任意の数値との融合は、低数値となる。
・二つの同じ、非高、非低格子数値の融合は、同じ格子値となる。および、
・二つの異なる、非高、非低格子数値の融合は、低（⊥）格子値となる。
【００２７】
図７は、文字列値格子32の例を示す。文字列値格子は、ブロックメモリーの文字列の、一つの一定数値または複数の一定数値を示す。文字列値格子の融合規則は下記の通りである。
・高数値（┬）と他の任意の数値との融合は、その別の数値となる。
・低数値（⊥）と他の任意の数値との融合は、低数値となる。
・二つの同じ、定常文字列の融合は、定常文字列格子値となる。および、
・二つの異なる、定常文字列の融合は、低（⊥）格子値となる。
【００２８】
図8は、データ起源格子34の例を示す。データ起源格子は、データの起源を示す、例えば、データが内部的に生成されたのか（分析されるルーチンに対して）、または、データが外部的に生成されたのかを指定する。起源が未知のデータは低い値を持つ。データ起源格子の融合規則は下記の通りである。
・高数値（┬）と他の任意の数値との融合は、その別の数値となる。
・低数値（⊥）と他の任意の数値との融合は、低数値となる。
・二つの同じ、非高、非低格子数値の融合は、同じ格子値となる。および、
・二つの異なる、非高、非低格子数値の融合は、低（⊥）格子値となる。
【００２９】
「脆弱性格子」は、非積分型変数（または数式）の属性を表す。好ましい実施態様では、この格子は、メモリーサイズ格子24、データサイズ格子26、null終止格子28、メモリー位置格子30、文字列値格子32、およびデータ起源格子34を含む。
【００３０】
図9は、本発明の好ましい実施態様のフローインセンシティブ解析14において実行される工程のフローチャートを示す。フローインセンシティブ解析14は、各非積分型変数または数式について脆弱性格子を、各積分型変数または数式について整数格子を得る。本明細書で用いる「数式格子」という用語は、非積分型変数または数式の場合には脆弱性格子を、積分型変数または数式の場合には整数格子を意味する。
【００３１】
フローは、分析される変数がアレイか構造かを判断するための開始テスト36で始まる。もしそうであれば、変数は脆弱性格子に関連付けられる。次に、ステップ38において、変数は他のルーチンに見えるか、または、引数として他のルーチンに送られるかを決定するためのテストが行われる。
【００３２】
変数が他のルーチンに見える、または、引数として他のルーチンに送られるのであれば、その変数に関する脆弱性格子がステップ40において設定され、変数サイズに対して設定された値を持つメモリーサイズ格子が指定される。ステップ40において、脆弱性格子の他の全ての値は低く設定される。このフローチャートには示されていないが、変数が定常な初期化変数である場合、データサイズ格子、null終止格子、および文字列値格子は、変数の、その初期化値を示すように設定される。
【００３３】
変数が他のルーチンには見えず、または、他のルーチンに引数として送られない場合は、メモリーサイズ格子は、変数のサイズと同じ数値に設定される。脆弱性格子の他の全ての値は、ステップ42において、高く設定される。
【００３４】
ステップ36の結果が”false”（変数はアレイでも構造でもないことを意味する）である場合、フローはステップ44に進む。ステップ44では、分析される変数がポインターかどうかを判断するためにテストが行われる。もしそうであれば、ロジックは、ステップ46に進み、そのポインター変数が他のルーチンに見えるかどうか、または、引数として他のルーチンに送られたかどうかを決定する。
【００３５】
変数が他のルーチンに見える、または、引数として他のルーチンに送られるのであれば、そのポインター変数は脆弱性格子に関連させられ、ステップ49において脆弱性格子の全ての値は低く設定される。
【００３６】
変数が他のルーチンには見えず、または、他のルーチンに引数として送られない場合は、そのポインター変数は脆弱性格子に関連させられ、ステップ48において脆弱性格子の全ての値は高く設定される。
【００３７】
ステップ44の結果が”false”（変数はアレイでも構造でもポインターでもないことを意味する）である場合、フローはステップ50に進む。ステップ50では、分析される変数が積分型変数かどうかを判断するためにテストが行われる。積分型変数は整数格子と関連付けられる。もしそうであれば、ロジックは、ステップ52に進み、その積分型変数が他のルーチンに見えるかどうか、または、引数として他のルーチンに送られるかどうかを決定する。
【００３８】
変数が他のルーチンに見える、または、引数として他のルーチンに送られるのであれば、その変数は整数格子に関連させられ、ステップ56において全ての値が低く設定される。
【００３９】
変数が他のルーチンには見えず、または、他のルーチンに引数として送られない場合は、ステップ54において整数格子の値は高く設定される。
【００４０】
フローインセンシティブ解析14は、ルーチンの各変数について脆弱性格子または整数格子を得ると、ルーチンの各ステートメントを訪れる。この訪問は任意の順序で行われてよい。ステートメント内の各数式に対する訪問は、その数式を処理する前に、その数式に対して入力（すなわち、従属変数）として与えられている全ての式を処理するという順序で行われる。例えば、数式  
ａ  ＝  （ｂ  ＋  ｃ）  ＋ｄ；
において、部分、すなわちサブ式ｂおよびｃを、数式（ｂ＋ｃ）を処理する前に処理しなければならない。同様に、サブ式（ｂ＋ｃ）およびｄを、数式（ｂ＋ｃ）＋ｄを処理する前に処理しなければならない。
【００４１】
図10A-10Bは、好ましい実施態様における、ルーチンの各数式を処理するためのフローインセンシティブ解析ロジックのフローチャートを示す。フローは、分析される数式が変数のアドレスに関するものかどうかを判断するための開始テスト58で始まる。もしそうであれば、ステップ60において、その変数は、アレイまたは構造に対するものかどうか、または、その変数は定常文字列かどうかを判断するためのテストが行われる。もしそうなら、ステップ64において、脆弱性格子が、その数式に関連付けられ、そのメモリーサイズ格子は、変数のサイズに設定され、そのメモリー位置格子は、参照される変数のメモリーの種類に設定される。変数が定常（const）属性を有し、それが文字列である場合、データサイズ格子は、文字列のサイズに設定され、null終止格子はnull終止に設定される。文字列値格子は、文字列の値に設定される。データ起源格子は、データ起源は内部であることを特定するように設定される。その数式が変数のアドレスを参照しているが、その変数は定常文字列でない場合は、ステップ62において、脆弱性格子がその数式に関連付けられ、そのメモリーサイズ格子は、その変数のサイズに設定され、そのメモリー位置格子は、参照される変数のメモリーの種類に設定される。格子のその他の入力は低値に設定される。さらに、変数は、アドレス開放的であるので（すなわち、アドレスに対するポインターが存在し、かつ、そのポインターに対する任意のポインター書き込みによってアドレスは修飾される可能性がある）、ステップ62において、アドレスが捕捉された脆弱格子は、そのデータサイズ格子、null終止格子、文字列値格子、およびデータ起源格子を低く設定させる（メモリーサイズ格子とメモリー位置格子は元のまま）。
【００４２】
ステップ58の結果が”false”（数式は変数のアドレスを参照していないことを意味する）である場合、フローはステップ66に進む。ステップ66では、数式が変数の値を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ68において、脆弱性格子がその数式に関連付けられ、格子の入力値は全て低く設定される。
【００４３】
ステップ66の結果が”false”（数式は変数のアドレスまたは値を参照していないことを意味する）である場合、フローはステップ70に進む。ステップ70では、数式が定常文字列を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ72において、脆弱性格子がその数式に関連付けられ、そのメモリーサイズ格子は、null終止バイトを含めて定常文字列のサイズに設定され、そのデータサイズ格子は、null終止バイトを含めて定常文字列のサイズに設定され、そのnull終止格子は、それがnull終止であることを示すように設定され、そのメモリー位置格子は定常メモリーを示すように設定され、その文字列値格子は、文字列の内容に対して設定され、そのデータ起源格子は内部に設定される。
【００４４】
ステップ70の結果が”false”（数式は変数のアドレスまたは値を参照しておらず、定常な文字列も参照していないことを意味する）である場合、フローはステップ74に進む。ステップ74では、数式が積分定数（すなわち、整数）を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ76において、整数格子がその数式に関連付けられ、その値は整数値に設定される。
【００４５】
ステップ74の結果が”false”（数式は変数のアドレスまたは値を参照しておらず、定常な文字列または積分定数も参照していないことを意味する）である場合、フローはステップ78に進む。ステップ78では、数式が「疑問符／コロン操作」かどうかを判断するためにテストが行われる。疑問符／コロン操作とは、
2006523898.tif 000005
の形を取る。もしそうなら、ステップ80において、脆弱性格子がその数式に関連付けられ、その格子入力は、
2006523898.tif 000006
および
2006523898.tif 000007
の脆弱性格子（これらは以前に設定されている）を融合させることによって得られる結果に設定される。
【００４６】
ステップ78の結果が”false”である場合、フローはステップ82に進む。ステップ82では、数式が、割り当て操作、すなわち、その数式を変数に割り当てるのかどうかを判断するためにテストが行われる。もしそうなら、ステップ84において、標的変数（すなわち、割り当てを受ける変数）の数式格子が更新される。具体的に言うと、数式格子の前の数値は、標的変数に割り当てられる数式の数式格子と融合される。
【００４７】
ステップ82の結果が”false”である場合、フローはステップ86に進む。ステップ86では、数式が積分操作を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ88において、操作の各入力の整数値格子を用いて、数式の整数格子および値を計算する。
【００４８】
ステップ86の結果が”false”である場合、フローはステップ90に進む。ステップ86では、数式が操作「のサイズ ( size of )」を表すのかどうか、すなわち、
2006523898.tif 000008
の形を取るのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ92において、整数格子がその数式に関連付けられ、その値は変数のサイズ（またはタイプ）に設定される。
【００４９】
ステップ58、66、70、74、78、82、86、および90のテストがfalseである場合には、ステップ94において、数式格子の全ての値が低く設定されるという、デフォールト任務が実行される。
【００５０】
下記の例は、バッファーフロー脆弱性が存在するかどうかを判断するために、フローインセンシティブ解析ロジックによって分析される、例示のコードセクションである。各コードセクションの後ろには、フローインセンシティブ解析ロジックが、前述の各種格子を用いて、どのように変数および数式をモデル化するかについて注記が付けられる
【００５１】
例１：
2006523898.tif 000009
【００５２】
変数iの整数格子は、それが”int”タイプであることが宣言されているので創出されるが、その整数格子は低く設定される： i←⊥
2006523898.tif 000010
【００５３】
脆弱性格子が変数”buf”と関連しており、かつ、これはアレイであるので、そのメモリーサイズは構造のサイズに設定される：buf ←100
この変数は局地的であり、他のルーチンには見えず、また、引数として通過されないから、他の全ての値は高く設定される：←  ┬。図9のステップ42参照。
2006523898.tif 000011
【００５４】
脆弱性格子が変数pに関連付けられる。これはポインターであり、他のルーチンには見えず、また、引数として通過されないから、全ての格子は高く設定される：←  ┬。図9のステップ48参照。
2006523898.tif 000012
【００５５】
“i”の整数格子は値⊥を持つ。上記参照。
2006523898.tif 000013
【００５６】
これは割り当て操作であり、従って、図10A-Bのステップ82および84のロジックを喚起する。割り当てを受ける変数の数式格子は、変数の格子の前の値（この場合は高┬）と、その変数に割り当てられる数式の数式格子、この場合は数式”1”との融合結果となる。数式”1”は下記の格子を持つ、すなわち、
メモリーサイズ格子  ←2
データサイズ格子  ←2
null終止格子  ←null終止
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
文字列値格子  ←“1”
【００５７】
pの脆弱性格子に対して融合規則の結果を用いると、下記のようになる。すなわち、
メモリーサイズ格子  ←2
データサイズ格子  ←2
null終止格子  ←null終止
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
文字列値格子  ←“1”
2006523898.tif 000014
【００５８】
これも割り当て操作であり、従って、図10A-Bのステップ82および84のロジックを喚起する。割り当てを受ける変数の数式格子は、変数の格子の前の値（上記参照）と、その変数に割り当てられる数式の数式格子、この場合は数式”12”との融合結果となる。数式12は下記の格子を持つ、すなわち、
メモリーサイズ格子  ←3
データサイズ格子  ←3
null終止格子  ←null終止
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
文字列値格子  ←“12”
【００５９】
ｐの脆弱性格子に対して融合規則の結果を用いると、下記のようになる。すなわち、
メモリーサイズ格子  ←2から3の範囲
データサイズ格子  ←2から3の範囲
null終止格子  ←null終止
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
文字列値格子  ←⊥
2006523898.tif 000015
【００６０】
これも割り当て操作であり、従って、図10A-Bのステップ82および84のロジックを喚起する。割り当てを受ける変数の数式格子は、変数の格子の前の値（上記参照）と、その変数に割り当てられる数式の数式格子、この場合は数式”123”との融合結果となる。数式”123”は下記の格子を持つ、すなわち、
メモリーサイズ格子  ←4
データサイズ格子  ←4
null終止格子  ←null終止
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
文字列値格子  ←“123”
【００６１】
ｐの脆弱性格子に対して融合規則の結果を用いると、下記のようになる。すなわち、
メモリーサイズ格子  ←2から4の範囲
データサイズ格子  ←2から4の範囲
null終止格子  ←null終止
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
文字列値格子  ←⊥
2006523898.tif 000016
【００６２】
bufのアドレスは暗黙の前提として引数と受け取られるから、ステップ62のロジックが喚起され、bufの脆弱性格子は、データサイズ格子、メモリーサイズ格子、文字列値格子、および、データ起源格子を未知に設定するように改変される。
【００６３】
数式ｐは変数の値を参照するので、ステップ68のロジックが喚起され、数式pの脆弱性格子の全ての値は未知に設定される。
【００６４】
例2:
2006523898.tif 000017
【００６５】
脆弱性格子が、アレイｙに関連付けられる。そのメモリーサイズは100に設定され、そのメモリー種類格子は静的に設定され、他のすべての格子は低く設定される：←⊥。ｙは他のルーチンに見えるため、これは完了する。図9のステップ40を参照。
2006523898.tif 000018
【００６６】
脆弱性格子がポインター変数ｚに関連付けられる。格子はすべて低く設定される：←⊥。変数ｚは引数として他のルーチンに通されるため、これは完了する。図9のステップ49参照。
2006523898.tif 000019
【００６７】
yのアドレスは暗黙の前提として引数と受け取られるから、ステップ62のロジックが喚起され、yの脆弱性格子は、データサイズ格子、メモリーサイズ格子、文字列値格子、および、データ起源格子を未知に設定するように改変される。
【００６８】
数式zは変数の値を参照するので、ステップ68のロジックが喚起され、数式zの脆弱性格子の全ての値は未知に設定される。
【００６９】
フローインセンシティブ解析を実行した後、コール部位解析ロジック16が喚起される。コール部位解析16は、分析対象のルーチン内部のコール部位を通過した各変数または数式の引数について脆弱性格子を得る。（「コール部位」とは、ルーチンに対してコールが発せられた場合の、コード内のそのルーチンの位置である。）引数は、変数であっても、数式であってもよい。好ましい実施態様では、コール部位解析は、必ずしも全てのルーチンが脆弱性リスクを抱えているわけではないので、ルーチン、手順、または機能を選択するコールのみに限定される。
【００７０】
好ましい実施態様では、コール部位解析16は、各コール部位を訪問することを必要とするが、この訪問は何かある特定の順序で行われる必要はない。コールの各引数の分析は、何かサブ数式の従属変数があるならば先ずそれを処理するように、すなわち、例えば、引数を構成する数式を処理する前に、その数式に入力として与えられる全てのサブ数式を処理するように行われる。
【００７１】
コール部位解析ロジックは、フローインセンシティブ解析ロジックと同様である。しかしながら、フローインセンシティブ解析ロジックと違って、コール部位解析ロジックでは、変数値を参照する数式は全てその変数の脆弱性格子と関連させられる。さらに、変数に対するいかなる割り当て操作も、その変数に対する脆弱性格子を変えない。
【００７２】
図11A-Bは、コール部位解析16において数式を分析するために実行されるステップのフローチャートを示す。フローは、分析される数式が変数のアドレスに関するものかどうかを判断するための開始テスト96で始まる。もしそうであれば、ステップ98において、その変数は、アレイまたは構造に対するものかどうか、または、その変数は定常文字列かどうかを判断するためにテストが行われる。もしそうなら、ステップ102において、脆弱性格子が、その数式に関連付けられ、そのメモリーサイズ格子は、変数のサイズに設定され、そのメモリー位置格子は、参照される変数のメモリーの種類に設定される。変数が定常（const）属性を有し、それが文字列である場合、データサイズ格子は、文字列のサイズに設定され、null終止格子はnull終止に設定される。文字列値格子は、文字列の値に設定される。データ起源格子は、データ起源は内部であることを特定するように設定される。その数式が変数のアドレスを参照しているが、その変数は定常文字列でない場合は、ステップ100において、脆弱性格子がその数式に関連付けられ、そのメモリーサイズ格子は、その変数のサイズに設定され、そのメモリー位置格子は、参照される変数のメモリーの種類に設定される。格子のその他の入力は低値に設定される。
【００７３】
ステップ96の結果が”false”である場合、フローはステップ104に進む。ステップ104では、数式が変数の値を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ106において、脆弱性格子がその数式に関連付けられ、格子の入力値は全てその変数に関連付けられる格子値に設定される。
【００７４】
ステップ104の結果が”false”である場合、フローはステップ108に進む。ステップ108では、数式が定常文字列を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ110において、脆弱性格子がその数式に関連付けられ、そのメモリーサイズ格子は、null終止バイトを含めて定常文字列のサイズに設定され、そのデータサイズ格子は、null終止バイトを含めて定常文字列のサイズに設定され、そのnull終止格子は、それがnull終止であることを示すように設定され、そのメモリー位置格子は定常メモリーを示すように設定され、その文字列値格子は、文字列の内容に対して設定され、そのデータ起源格子は内部に設定される。
【００７５】
ステップ108の結果が”false”である場合、フローはステップ112に進む。ステップ112では、数式が積分定数（すなわち、整数）を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ114において、整数格子がその数式に関連付けられ、その値は整数値に設定される。
【００７６】
ステップ112の結果が”false”である場合、フローはステップ116に進む。ステップ116では、数式が「疑問符／コロン操作」かどうかを判断するためにテストが行われる。もしそうなら、ステップ118において、脆弱性格子がその数式に関連付けられ、その格子入力は、
2006523898.tif 000020
および
2006523898.tif 000021
の脆弱性格子（これらは以前に設定されている）を融合させることによって得られる結果に設定される。
【００７７】
ステップ116の結果が”false”である場合、フローはステップ120に進む。ステップ120では、数式が、割り当て操作、すなわち、その数式を変数に割り当てるのかどうかを判断するためにテストが行われる。もしそうなら、ステップ122において、標的変数（すなわち、割り当てを受ける変数）の数式格子は、その変数の前の数式格子と同じままである。
【００７８】
ステップ120の結果が”false”である場合、フローはステップ124に進む。ステップ124では、数式が積分操作を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ126において、操作の各入力の積分値格子を用いて、数式の整数格子および値を計算する。
【００７９】
ステップ124の結果が”false”である場合、フローはステップ128に進む。ステップ128では、数式が操作「のサイズ」を表すのかどうかを判断するためにテストが行われる。もしそうであれば、ステップ130において、整数格子がその数式に関連付けられ、その値は変数のサイズ（またはタイプ）に設定される。
【００８０】
ステップ96、104、108、112、116、120、124、および128のテストがfalseである場合には、ステップ94において、数式格子の全ての値が低く設定されるという、デフォールト任務が実行される。
【００８１】
フローインセンシティブ解析ロジックに関連して分析された例示のコード分節に戻って参照すると、下記の処理が行われる。すなわち、
【００８２】
例1:
2006523898.tif 000022
【００８３】
strcpyに対するコールは、格子値を求めるためにその引数が分析される。引数1は、値bufを持ち、後者は下記の脆弱性格子値を持つ。すなわち、
メモリーサイズ格子  ←100 
データサイズ格子  ←⊥
null終止格子  ←⊥
文字列値格子  ←⊥
メモリー位置格子  ←スタックメモリー
データ起源格子  ←⊥
【００８４】
引数2は値ｐを持ち、後者は、下記の脆弱性格子値を持つ。すなわち、
メモリーサイズ格子  ←2から4の範囲
データサイズ格子  ←2から4の範囲
null終止格子  ←null終止
文字列値格子  ←⊥
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
｝
【００８５】
例2:
2006523898.tif 000023
【００８６】
strcpyに対するこのコールは、格子値を求めるためにその引数が分析される。引数1は、値yを持ち、後者は下記の脆弱性格子値を持つ。すなわち、
メモリーサイズ格子  ←100 
データサイズ格子  ←⊥
null終止格子  ←⊥
文字列値格子  ←⊥
メモリー位置格子  ←静的メモリー
データ起源格子  ←⊥
【００８７】
引数2は値zを持ち、後者は、下記の脆弱性格子値を持つ。すなわち、
メモリーサイズ格子  ←⊥
データサイズ格子  ←⊥
null終止格子  ←⊥
文字列値格子  ←⊥
メモリー位置格子  ←⊥ 
データ起源格子  ←⊥
｝
【００８８】
本発明の一つの実施態様によれば、脆弱性格子は上記引数について作成され、脆弱性の危険性が知られるコール部位のライブラリーを製作する。ライブラリーコール部位は、データベース20において特定することが可能である。
【００８９】
＜選択コール部位における脆弱性格子の言語独立的分析＞
ルーチンコールを選択するための引数について脆弱性格子が作成されたならば、ソースコードを、そのソースコードは報告すべき脆弱性を持つかどうかを決定するために、言語独立的なやり方でさらに分析する。本発明の好ましい実施態様は、脆弱性データベース20と共同で動作する脆弱性評価ロジック18を用いてこの分析を実行する。
【００９０】
脆弱性データベース20は、いくつかのあらかじめ特定されたルーチンに関する情報を含むデータベースである。何よりも、データベース20は、脆弱性の原因となり得る条件を詳細に記述する。条件は、ルーチンに渡される引数の脆弱性格子に対する制限として記述される。
【００９１】
脆弱性評価ロジック18は下記のように動作する。コール部位解析16によって分析されたように、ソースコードの各コール部位が調べられる。ただし、これは何ら特定の順序で行う必要はない。コールされたルーチンの名称、そして場合によってはその引数タイプに関する情報を用いて、ルーチン探索名が作成される。このルーチン探索名は、このコール部位は、脆弱点の可能性があるかどうかを見出すための、脆弱性データベース20におけるキーとして用いられる。
【００９２】
探索が対応する入力記事を発見できなかった場合には、そのコール部位は脆弱ではないと判断される。なぜなら、そのルーチン名は、データベース20において指定される既知の脆弱性を持たないからである。
【００９３】
探索が対応する入力記事を発見した場合、入力記事に関し、一致活動のリストが調べられる。これは、特定のコールを評価するために使用される規則集である。これら一致活動は特定の順序で支給される。各一致活動は、引数について得られた脆弱性格子が一致活動の要件に一致しているかどうかを判断するために、各引数について、脆弱性格子と比較される。後述の例で具体的に説明されるように、一致が見られる場合、活動は、調査対象であるコール部位の脆弱性を告知する。ある特定のコール部位について複数の脆弱点が検出されることがある。
【００９４】
言語特異的処理ロジックに関連して分析された例示のコード分節に戻って参照すると、脆弱性評価において下記の処理が行われる。すなわち、
【００９５】
例1:
これは、下記の言語特異的コードを持つ例である。
2006523898.tif 000024
【００９６】
このコールに対するコール部位解析によって、第1引数bufについて下記の脆弱性格子が得られた。
メモリーサイズ格子  ←100 
データサイズ格子  ←⊥
null終止格子  ←⊥
文字列値格子  ←⊥
メモリー位置格子  ←スタックメモリー
データ起源格子  ←⊥
【００９７】
このコール部位解析によって、第2引数pについて下記の脆弱性分析が得られた。
メモリーサイズ格子  ←2から4の範囲
データサイズ格子  ←2から4の範囲
null終止格子  ←null終止
文字列値格子  ←⊥
メモリー位置格子  ←定常メモリー
データ起源格子  ←内部
【００９８】
データベース20から戻された一致活動は、ルーチンstrcpy()に対するコールの脆弱性格子を評価する際に運用するいくつかの規則を指定する。strcpyに対するコールという特定の場合では、規則は、第1引数は、第2引数の最大データサイズよりも大きい、または、等しい最小メモリーサイズを持つことをチェックする。このようにして規則（一致活動）は、この特定のコールがバッファーオーバーフローの危険性を生み出すかどうかを判断する。この場合、ソースコードの効果的な意味論的分析が行われている限りオーバーフローは起こりえない。
【００９９】
引数1(100)の最小メモリーサイズは、引数2（4）の最大データサイズ以上であり、そのためバッファーがオーバーフローすることはあり得ない。引数2のデータ起源は内部であるから、脆弱とはなり得ない。このコールは脆弱点とはマークされない。
【０１００】
例2:
これは、下記の言語特異的コードを持つ例である。
2006523898.tif 000025
【０１０１】
このコールに対するコール部位解析によって、第1引数yについて下記の脆弱性格子が得られた。
メモリーサイズ格子  ←100 
データサイズ格子  ←⊥
null終止格子  ←⊥
文字列値格子  ←⊥
メモリー位置格子  ←静的メモリー
データ起源格子  ←⊥
【０１０２】
このコール部位解析によって、第2引数zについて下記の脆弱性分析が得られた。
メモリーサイズ格子  ←⊥ 
データサイズ格子  ←⊥ 
null終止格子  ←⊥ 
文字列値格子  ←⊥
メモリー位置格子  ←⊥ 
データ起源格子  ←⊥
【０１０３】
データベース20から戻された一致活動は、ルーチンstrcpy()に対するコールの脆弱性格子を評価する際に運用するいくつかの規則を指定する。strcpyに対するコールという特定の場合では、規則は、第2引数の最大データは⊥であり、従って未知であることをチェックする。従って、バッファーがオーバーフローする可能性がある。同様に、第2引数のデータ起源は⊥であり、従って未知である。故に、第2の脆弱点の可能性がある。（入力が未知で外部の場合、サイズが小さすぎるため、または、入力が内部起源ではないために、脆弱点を構成する可能性がある。）このstrcpyに対するコールという特定の場合では、引数2の最大データサイズは⊥であるために、バッファーはオーバーフローする可能性がある。引数2のデータ起源は⊥であるために、脆弱点となる可能性がある。このコールは脆弱点とマークされる。
【０１０４】
前述の実施態様はバッファーオーバーフロー脆弱点の検出法に向けられた。前述のように、この方法は、他の
脆弱点、例えば、競合状態および特権エスカレーションを検出するのに使用することも可能である。
【０１０５】
＜競合状態＞
本明細書で用いる「競合状態」という用語は、プログラムにおいて継時的に起こる一対のルーチンコールであって、素形式で（すなわち、マシン上で別の行程または過程によって中断されないで）実行されない場合、脆弱点となる恐れのある一対のルーチンコールを意味する。典型的な例は、ファイルのアクセス権を決定するコールと、それに続く、アクセスに基づいてそのファイルの書き込みまたは読み取りをするコールである。この過程が二つのコールの間で中断され、その中断の間にファイルの属性が改変されたならば、その2番目のコールは、誤った情報を読み取るか、または、不適切なファイルに書き込みをすることになる可能性がある。
【０１０６】
下記は、競合状態が存在するかどうかを決定するために分析される例示のコードセクションである。このコードセクションでは、脆弱である可能性を持つ関連コールペアを示すのにaccess()およびfopen()が用いられている。
【０１０７】
例3:
2006523898.tif 000026
【０１０８】
この例では、ある特定のファイル名に対するaccess()コールがあり、次いで、access()からの復帰値のテストがある。テストに合格すると、同じファイル名に対してfopen()がコールされる。番号を付したステートメントの周囲で起こりえる任意のコードに対して位置設定記号が掲げられる。fopen()コールは、access()コールから近づくことができる。このことは、この二つのコールの間に、ファイルに対して他の操作は及ばないことを意味する。テストに合格すると、fopen()がaccess()コールに続く。
【０１０９】
この例は、access()およびfopen()に対する引数を単一変数名として示しているが、この引数は、任意の式、例えば、filename_list[i]（名前アレイの一つの入力項目）、またはfullpath+baselen（fullpathへのbaselen文字の文字列に対するポインター）であることが可能である。重要なことは、この引数の操作時間値は、両方のコールにおいて同じであることである。
【０１１０】
バッファーオーバーフロー条件に関して上述した実施態様の場合のように、分析対象となるコードの競合状態に関するIRを生成するために字句分析器が用いられる。この実施態様では、IRは、プログラム中の宣言に関する情報を含み、プログラム中の識別子、例えば、そのタイプに関する情報を記録する。IRは、機能宣言を機能コールと区別する。
【０１１１】
基本的ブロック構造、および、プログラムのコントロールフローを決める、ブロック間の枝を示すコントロールフローグラフが提示される。コントロールフローグラフの例が図12に示される。四角の実体140は基本ブロックである（枝の無い、独立した直線的ステートメントは、”if”、”while”等を表す）。卵形142は、内部に任意のコントールフローを持つコード領域である。矢印144は、基本ブロック間、または、コード領域間におけるコントロールフローを表す。
【０１１２】
このコントロールフローグラフを用いて説明すると、システムは、open()コールを含むブロックから、それに先行するブロックを通過して後方に戻る。図示した例では、システムは、access()へのコールを含むブロックに行き、access()コールがopen()コールに先行することを銘記する。これらのコールが関連することを知っているので、システムは、ファイル名に対応する引数に注目しながら、各コールの引数リストを調べる。発見的方法として、システムは、対応する式の構造を比較する。この例では、システムは、二つの式が同じ変数に対する参照値であることを認め、この二つのコールは同じファイルを参照しようとしており、従って、競合状態脆弱性に関してフラグ記号を付すべきであると結論する。
【０１１３】
競合状態脆弱性検出システムの別の実施態様では、前述のシステムを用いてデータフロー分析を行い、プログラムの様々な点における変数値に関する情報を得ることが可能である。例えば、システムは、変数ファイル名が、access()コールとfopen()コールの両方で同じ値を持つかどうかを決めることができる。データフロー分析も、fullpath+baselenと記述される、access()に対する引数が、ファイル名と記述される、fopen()に対する引数と同じ値を持つかどうかを決めるのに使用することができる。
【０１１４】
＜特権エスカレーション＞
特権エスカレーション脆弱点は、高度のシステム特権を持つアプリケーションが、設計意図から外れた活動を実行するように仕向けられると、外部の第三者に、それ以外の場合であれば所有できないはずの、システムに対する特権的アクセスを許してしまう場合に発生する可能性がある。
【０１１５】
下記は、特権エスカレーション検出のための例示のコードセクションである。
【０１１６】
例4:
2006523898.tif 000027
【０１１７】
この例では、Windows（登録商標） APIコールが、リソースに対するセキュリティ属性を設定する。脆弱性注意点は、リソースのACL（access control list）は決してnullに設定してはならないことで、なぜなら、そうすると、リソースが、無認可のユーザーによってアクセスされ、改変される可能性がある。
【０１１８】
前述の実施態様の場合のように、言語分析器を用いて、ソースコードからIRを作成する。IRは、ファイルにおいて宣言された全てのタイプ、定数、変数、および機能に関する情報を含む符号表を提供する。機能”sumfunc”に関する情報は、”somefunc”ステートメントに対する参照を含む。IRのステートメントは、使用可能な言語（CまたはC++では”if”、”while”、”for”等）、および表現式（割り当て、機能コール、代数操作等を含む）のコントロールフロー・ステートメントを含む。機能コール情報は、コールされるルーチンの符号表入力記事、および、引数に対応する表現式のリストを含む。可能な脆弱コールに関するデータベースが提供される。
【０１１９】
IRを横断し、各機能定義、およびその機能内部のステートメントを訪問する。機能コールノードでコールされたルーチンは、データベース情報と照らし合わせられる。一致があれば、その機能はさらに精しく検査される。
【０１２０】
ある特定のコールを脆弱にする特定の条件はあらかじめ判断される。上に示した例では、注意すべき点は、SetSecurityDescriptionDacl()に対する第3の引数はNULLであってはならないということである。このコールに対するIRは、SetScecurityDescriptorDaclをコールされるルーチンとして指摘し、引数に対する式リストには4個の入力事項があるとする。第1は、変数”descriptor”のアドレスであり、終わりの三つは、TRUE、NULL、およびFALSEに関するIR定数である。
【０１２１】
SetSecurityDescriptorDaclに対する一致物が認められた場合、それは、コールに対する引数についてさらに詳細な検査を誘発することになる。この場合、SetSecurityDescriptorDaclの脆弱の可能性についての知識があれば、それは、第3引数の検査に導く。IRは、これを直接NULLと記述し、このコール部位には脆弱というフラグ記号が付せられる。
【産業上の利用可能性】
【０１２２】
前述したように、本発明の好ましい実施態様は、脆弱性の可能性が存在するかどうかを判断するために、ソースコードそのもののいくつかの意味特徴を分析する。例えば、問題となるコールを検出するのに、ルーチンに対する引数を、そのルーチンに関するある既知の振る舞い（例えば、あるルーチンは、ある引数を、別の引数によって指摘されるバッファーにコピーする）に基づいてアルゴリスム的に分析することが可能である。この解決法では、従来技術で既知の方法および提案に認められる、多くの擬似陽性が回避される。
【０１２３】
現在まで、セキュリティ専門家は、脆弱点を探すのに既知の規則を用いてコードを分析しているが、これは手間がかかり、間違いが起こり易い。本発明は、脆弱点、例えば、バッファーオーバーフロー、競合状態、および特権エスカレーションについての意味論的分析を自動化する。本発明はさらに、その他の脆弱点が発見されるにつれて、そのような脆弱点検出のための比較活動の詳細が具体的に解明され、好ましいシステムに組み込まれるようにするための枠組みを提供する。
【０１２４】
前述の実施態様において、ソースコードは、(a)ANSI Standard X3J11で記述されたANSI C言語で書かれた実行可能なプログラムで、MicrosoftおよびGNUコンパイラーによって提供されるものと同じ、一般に用いられる拡張子を含むテキストの全てまたは一部、あるいは、(b) ANSI Standard X3J16で記述されたANSI C++言語で書かれた実行可能なプログラムで、MicrosoftおよびGNUコンパイラーによって提供されるものと同じ、一般に用いられる拡張子を含むテキストの全てまたは一部である。しかしながら、本発明は、他の言語で書かれたソースコードを分析するためにも同様に使用が可能であることが理解される。
【０１２５】
本発明は、上に、いくつかの好ましい実施態様と関連して説明されたけれども、これは、本発明を、それら特定の実施態様に限定することを意図したものではないことが理解されよう。それとは逆に、付属の特許請求項に含められる可能性のある全ての別態様、修正、および等価物を包含することが意図される。いくつかの特定の図面およびソースコードについて言及が為されたけれども、これらの図面および言語は、例示のためにのみ示されたものであって、いかなる意味でも本発明の範囲を限定することを意図するものではないことを理解しなければならない。
【図面の簡単な説明】
【０１２６】
【図１】図１は、本発明の一つの実施態様のシステムおよび方法の工程を表すフローチャートを示す。
【図２】図２は、整数格子の例を示す。
【図３】図３は、メモリーサイズ格子の例を示す。
【図４】図４は、データサイズ格子の例を示す。
【図５】図５は、null終止格子の例を示す。
【図６】図６は、メモリー位置格子の例を示す。
【図７】図７は、文字列値格子の例を示す。
【図８】図８は、データ起源格子の例を示す。
【図９】図９は、本発明の一つの実施態様によるフローインセンシティブ解析によって実行される工程を表すフローチャートを示す。
【図１０Ａ】図１０Aと図１０Bは、本発明のフローインセンシティブ解析による数式処理で実行される工程のフローチャートである。
【図１０Ｂ】図１０Aと図１０Bは、本発明のフローインセンシティブ解析による数式処理で実行される工程のフローチャートである。
【図１１Ａ】図１１Aと図１１Bは、本発明の一つの実施態様によるコール部位解析による数式処理で実行される工程のフローチャートである。
【図１１Ｂ】図１１Aと図１１Bは、本発明の一つの実施態様によるコール部位解析による数式処理で実行される工程のフローチャートである。
【図１２】図１２は、本発明の一つの実施態様によるコントロールフロー・グラフである。
【図１３】図１３は、本発明の一つの実施態様のシステムおよび方法の工程を表すフローチャートを示す。
【図１】
2006523898.tif 000028
【図２】
2006523898.tif 000029
【図３】
2006523898.tif 000030
【図４】
2006523898.tif 000031
【図５】
2006523898.tif 000032
【図６】
2006523898.tif 000033
【図７】
2006523898.tif 000034
【図８】
2006523898.tif 000035
【図９】
2006523898.tif 000036
【図１０Ａ】
2006523898.tif 000037
【図１０Ｂ】
2006523898.tif 000038
【図１１Ａ】
2006523898.tif 000039
【図１１Ｂ】
2006523898.tif 000040
【図１２】
2006523898.tif 000041
【図１３】
2006523898.tif 000042
【国際調査報告】
2006523898.tif 000043