(57)【要約】  コンピュータプログラムの応用プログラム段階のセキュリティ脆弱性を解明するために、応用プログラムの応用ソースコード（１６）を自動的に分析するツール(２２)。このツールはソフトウェア開発過程を継ぎ目なく統合しているため、脆弱性はソフトウェア開発の早い時点で発見される。欠陥部分を除く場合も、生産後の時期に比べてはるかに低コストで除去できる。このツールの動作は静的分析に基づいているが、例えば難読化されたコードを扱う手法など、種々の技術を活用している。【選択図】図１
2010507165.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、
コンピュータプログラムの命令を内蔵する記憶装置と、
入出力装置と、
前記記憶装置にアクセスし前記命令を読む演算処理装置と、
からなり、
前記命令は、前記演算処理装置に対し、
分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、
ここに前記ソースコードはコード要素と文からなり、前記文の少なくとも一部は変数を参照し、
前記変数は要素変数を有するデータ構造からなり、
前記要素変数は要素名を有し、
前記命令は前記演算処理装置に対し、
前記ソースコードのオブジェクト指向モデルを生成するようにさせ、
ここに前記コード要素は夫々オブジェクトを表し、
また、前記モデルの生成は、夫々の識別子を前記要素変数に割り当てるステップからなり、
前記演算処理装置は、
前記モデルを使用して、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、前記夫々の識別子を使用して既定の要素変数に対する参照を同定することにより、セキュリティ脆弱性を有する前記ソースコードの部位を同定し、
ここに前記既定の要素変数の前記要素名は、もう一つの要素変数の前記要素名と同じであり、
前記セキュリティ脆弱性を報告する、
ように動作可能であることを特徴とするシステム。
【請求項２】
前記演算処理装置は、前記セキュリティ脆弱性を除去するために前記ソースコードを変更するように動作可能である、ことを特徴とする請求項１に記載のデータ処理システム。
【請求項３】
前記演算処理装置は、前記ソースコードの、単一アクションのみが行われる原子要素を表す、前記制御依存図のブロックを定義するために、前記制御依存図をコード切削するように動作可能である、ことを特徴とする請求項１に記載のデータ処理システム。
【請求項４】
前記演算処理装置は、入力データが有効とされる前記データフロー図のデータフローノードを同定し、前記入力データが前記同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明する、ように動作可能であることを特徴とする請求項１に記載のデータ処理システム。
【請求項５】
前記演算処理装置は、前記ソースコードにソフトウェア故障の木解析を適用するように動作可能である、ことを特徴とする請求項１に記載のデータ処理システム。
【請求項６】
前記演算処理装置は、前記データ評価関数が誤りとなるシナリオを同定するために、
データ評価関数に対しテストケースを生成するように動作可能である、ことを特徴とする請求項１に記載のデータ処理システム。
【請求項７】
コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、
コンピュータプログラムの命令を内蔵する記憶装置と、
入出力装置と、
前記記憶装置にアクセスし前記命令を読む演算処理装置と、
からなり、
前記命令は、前記演算処理装置に対し、
分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、
ここに前記ソースコードはコード要素と文からなり、前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成するようにさせ、
ここに前記コード要素は夫々オブジェクトを表し、
前記演算処理装置は、
前記モデルを使用して、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
前記制御依存図の第１部位を１回目に横断処理して前記制御依存図の処理済部分に標識を付け、その後２回目に前記標識の付いた部分を含む前記制御依存図の第２部位を、前記標識の付いた部分を飛ばして横断処理することにより、
セキュリティ脆弱性を有する前記ソースコードの部位を同定して、
前記セキュリティ脆弱性を報告する、
ように動作可能であることを特徴とするシステム。
【請求項８】
前記演算処理装置は、前記変数の既定の１つに影響を与える前記制御依存ノードのみを同定するため、前記制御依存図をコード切削するように動作可能であり、前記制御依存図には意味を保存する処理だけが行われる、ことを特徴とする請求項７に記載のデータ処理システム。
【請求項９】
コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、
コンピュータプログラムの命令を内蔵する記憶装置と、
入出力装置と、
前記記憶装置にアクセスし前記命令を読む演算処理装置と、
からなり、
前記命令は、前記演算処理装置に対し、
分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、
ここに前記ソースコードはコード要素と文からなり、
前記ソースコードのオブジェクト指向モデルを生成するようにさせ、
ここに前記コード要素は夫々オブジェクトを表し、
前記演算処理装置は、
前記モデルを使用して、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し
前記データフロー図内に、入力が受入れられた第１データフローノード、データが有効とされた第２データフローノード、およびデータが使用された第３データフローノードを同定する工程と、前記データフロー図から前記第２データフローノードを削除する工程と、その後前記第３データフローノードの１つと前記第１データフローノードの１つが前記データフローエッジの１つにより繋がっていることを判定する工程とにより、
第３データフローノードの１つが、未評価入力の脆弱性を有することを報告する、
ように動作可能であることを特徴とするシステム。
【請求項１０】
前記演算処理装置は、前記データフロー図のデータフローノードを同定し、前記入力データが前記同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明する、ように動作可能であることを特徴とする請求項９に記載のデータ処理システム。  
【請求項１１】
コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、
コンピュータプログラムの命令を内蔵する記憶装置と、
入出力装置と、
前記記憶装置にアクセスし前記命令を読む演算処理装置と、
からなり、
前記命令は、前記演算処理装置に対し、
分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、
ここに前記ソースコードはコード要素と文からなり、前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成するようにさせ、
ここに前記コード要素は夫々オブジェクトを表し、
前記演算処理装置は、
前記モデルを使用して、ノードから構成される制御フロー図を生成し、
ここに前記制御フロー図は、前記ソースコードにおける複数の関数を記述し、
前記変数はさらにグローバル変数からなり、
前記グローバル変数は、前記制御フロー図からデータフロー図を導出するため、前記関数に、前記グローバル変数をデータ要素として有する、超グローバル変数として渡され、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
セキュリティ脆弱性を有する前記ソースコードの部位を同定して、
前記セキュリティ脆弱性を報告する、
ように動作可能であることを特徴とするシステム。
【請求項１２】
コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、
コンピュータプログラムの命令を内蔵する記憶装置と、
入出力装置と、
前記記憶装置にアクセスし前記命令を読む演算処理装置と、
からなり、
前記命令は、前記演算処理装置に対し、
分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、
ここに前記ソースコードはコード要素と文からなり、前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成するようにさせ、
ここに前記コード要素は夫々オブジェクトを表し、
前記モデルを使用して、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
ここに前記演算処理装置は、
第１配列と第２配列を前記データフローノードの夫々に随伴させることにより、前記データフロー図を導出し、
ここに前記第１配列は、随伴されたデータフローノードが依存する前記変数に関する
静的情報を有し、
前記第２配列は、前記随伴されたデータフローノードに影響を与える他の変数を同定する情報を有し、
前記他の変数は前記データフローノードのその他のノードに随伴されており、
前記制御フロー図を横断処理し、
前記ノードの夫々において、前記情報に応じて、前記データフロー図の対応するデータフローノードの前記第２配列内に情報を設定し、
前記データフローエッジを前記データフローノードと前記他のデータフローノードと夫々繋ぐことにより生成し、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
セキュリティ脆弱性を有する前記ソースコードの部位を同定して、
前記セキュリティ脆弱性を報告する、
ように動作可能であることを特徴とするシステム。
【請求項１３】
コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、
コンピュータプログラムの命令を内蔵する記憶装置と、
入出力装置と、
前記記憶装置にアクセスし前記命令を読む演算処理装置と、
からなり、
前記命令は、前記演算処理装置に対し、
分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、
ここに前記ソースコードはコード要素と文からなり、前記文の少なくとも一部は変数を参照し、
前記変数は要素変数からなり、
前記要素変数は要素名を有し、
前記ソースコードのオブジェクト指向モデルを生成させ、
ここにおいて前記コード要素は夫々のオブジェクトによって表され、
前記演算処理装置は、
前記モデルを使用して、ノードから構成される制御フロー図を生成し、
ここに前記各ノードは前記制御フロー図上で位相順序を有し、
前記ノードの一部は少なくとも１つの子ノードを有し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
ここに前記演算処理装置は、
前記制御フロー図の前記ノードに対し先天性値を与えることにより前記制御依存図を導出し、
ここに前記先天性値は、前記少なくとも１つの子ノードによって平等に継承値として継承され、
前記各ノードで継承値の合計が先天性値に等しい時はその継承値を削除し、
前記ノードの前記継承値の各継承記録を維持し、
ここに前記継承記録は前記各継承値の継承元を示す前記ノードの同定番号を含み、
前記制御フロー図の入口ノードを同定し、
前記ノードの最初の１組のノード群を同定し、
ここに前記最初の１組のノード群の構成ノードは前記継承値を持たず、
夫々第１エッジを最初の１組のノード群と前記入口ノードとの間に確立し、
前記ノードの第２組のノード群を同定し、
ここに前記第２組のノード群の構成ノードは前記継承値を有し、
前記継承記録において、前記第２組のノード群間に継承元ノードの近接位相順序を同定し、
第２のエッジを前記第２組のノード群の前記構成ノードと最接位相順序の前記継承元ノードとの間に夫々生成し、
ここにおいて前記演算処理装置は、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
セキュリティ脆弱性を有する前記ソースコードの部位を同定して、
前記セキュリティ脆弱性を報告する、
ように動作可能であることを特徴とするシステム。
【請求項１４】
コンピュータプログラムのセキュリティ脆弱性を検出するための、コンピュータにより実現される方法であって、
解析対象のソースコードを受領する工程と、
ここに前記ソースコードはコード要素と文でできており、
前記文の少なくとも一部は変数を参照し、
前記変数は要素変数を有するデータ構造からなり、
前記要素変数は要素名を有し、
前記ソースコードのオブジェクト指向モデルを生成する工程と、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記モデルを生成する工程は前記要素変数に夫々識別子を割当ることからなり、
前記モデルを使用しノードを有する制御フロー図を生成する工程と、
前記制御フロー図からデータフロー図を導出する工程と、
ここに前記データフロー図はデータフローノードおよび前記データフローノードを接続するデータフローエッジより構成され、
前記制御フロー図より制御依存ノードを有する制御依存図を導出する工程と、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、前記夫々の識別子を使用して、既定の要素変数に対する参照を同定することにより、セキュリティ脆弱性を有する前記ソースコードの部位を同定する工程と、
ここに前記既定の要素変数の前記要素名は、もう１つの要素変数の前記要素名と同一であり、
前記セキュリティ脆弱性を報告する工程と、
からなることを特徴とする方法。
【請求項１５】
前記ソースコードはオブジェクト指向言語で記述されていることを特徴とする請求項１４に記載の方法。
【請求項１６】
前記オブジェクト指向言語は、現在活性化しているオブジェクトから成り、前記データフロー図は呼び出されるメソッド群から成り、データフロー図を導出する前記工程は、前記現在活性化しているオブジェクトを、前記呼び出されるメソッド群へのパラメータとして使用する工程であることを特徴とする請求項１５に記載の方法。
【請求項１７】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項１４に記載の方法。
【請求項１８】
前記分析工程は、前記ソースコードの、単一アクションのみが行われる原子要素を表わす前記制御依存図のブロックを定義するため、前記制御依存図をコード切削する工程を含むことを特徴とする請求項１４に記載の方法。
【請求項１９】
前記分析工程は、問合せ言語を使用して行われることを特徴とする請求項１４に記載の方法。
【請求項２０】
前記分析工程は、入力データが有効とされる前記データフロー図のデータフローノードを同定する工程と、前記入力データが前記同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明する工程と、を含むことを特徴とする請求項１４に記載の方法。
【請求項２１】
前記セキュリティ脆弱性は、前記ソースコードの一部が仕様に従っていないという論理的誤りを含むことを特徴とする請求項１４に記載の方法。
【請求項２２】
前記セキュリティ脆弱性は、ユーザのアクセスに対する非強制制限を含むことを特徴とする請求項１４に記載の方法。
【請求項２３】
前記分析工程は、データアクセス層の方法論の新しい開示を含むことを特徴とする請求項１４に記載の方法。
【請求項２４】
前記セキュリティ脆弱性は、ユーザがウェブページの隠し分野を表示する能力を含むことを特徴とする請求項１４に記載の方法。
【請求項２５】
前記セキュリティ脆弱性は、仮想ディレクトリ上で入出力操作が可能であることを含むことを特徴とする請求項１４に記載の方法。
【請求項２６】
前記分析工程は、前記ソースコードに対しソフトウェア故障の木解析を適用する工程を含むことを特徴とする請求項１４に記載の方法。
【請求項２７】
データ検証関数が誤りとなるシナリオを同定するため、前記データ検証関数に対しテストケースを生成する工程をさらに含むことを特徴とする請求項１４に記載の方法。
【請求項２８】
前記コンピュータプログラムのオブジェクトに対する、アクセス特権を特定する構成ファイルを自動的に準備する工程をさらに含むことを特徴とする請求項１４に記載の方法。
【請求項２９】
前記制御フロー図、前記データフロー図及び前記制御依存図は前記コンピュータプログラムの単一関数に対応することを特徴とする請求項１４に記載の方法。
【請求項３０】
前記ソースコードは難読化されていることを特徴とする請求項１４に記載の方法。
【請求項３１】
コンピュータプログラムのセキュリティ脆弱性を検出するための、コンピュータにより実現される方法であって、
解析対象のソースコードを受領する工程と、
ここに前記ソースコードはコード要素と文でできており、
前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成する工程と、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記モデルを使用し、ノードから構成される制御フロー図を生成する工程と、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出する工程と、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、セキュリティ脆弱性を有する前記ソースコードの部位を同定する工程と、
ここにおいて前記分析工程は、前記制御依存図の第１部位を１回目に横断処理して前記制御依存図の処理済部分に標識を付け、その後２回目に前記標識の付いた部分を含む前記制御依存図の第２部位を、前記標識の付いた部分を飛ばして横断処理する工程を含み、
前記セキュリティ脆弱性を報告する工程と、
からなることを特徴とする方法。
【請求項３２】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項３１に記載の方法。
【請求項３３】
前記分析工程は、前記変数の既定の１つに影響を与える前記制御依存ノードのみを同定するため、前記制御依存図をコード切削する工程を含み、前記制御依存図には意味を保存する処理だけが行われる、ことを特徴とする請求項３１に記載の方法。
【請求項３４】
前記分析工程は、問合せ言語を使用して行われることを特徴とする請求項３１に記載の方法。
【請求項３５】
前記制御フロー図、前記データフロー図及び前記制御依存図は前記コンピュータプログラムの単一関数に対応することを特徴とする請求項３１に記載の方法。
【請求項３６】
コンピュータプログラムのセキュリティ脆弱性を検出するための、コンピュータにより実現される方法であって、
解析対象のソースコードを受領する工程と、
ここに前記ソースコードはコード要素と文でできており、
前記モデルを使用し、ノードから構成される制御フロー図を生成する工程と、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出する工程と、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、セキュリティ脆弱性を有する前記ソースコードの部位を同定する工程と、
ここにおいて前記分析工程は、前記データフロー図内に、入力が受入れられた第１データフローノード、データが有効とされた第２データフローノード、およびデータが使用された第３データフローノードを同定する工程を含み、
前記データフロー図から前記第２データフローノードを削除する工程と、
その後前記第３データフローノードの１つと前記第１データフローノードの１つが前記データフローエッジの１つにより繋がっていることを判定する工程と、
前記第３データフローノードが未評価入力の脆弱性を有することを報告する工程と、
からなることを特徴とする方法。
【請求項３７】
前記分析工程は、入力データが有効とされる前記データフロー図のデータフローノードを同定する工程と、前記入力データが前記同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明する工程と、を含むことを特徴とする請求項３６に記載の方法。
【請求項３８】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項３６に記載の方法。
【請求項３９】
前記分析工程は、問合せ言語を使用して行われることを特徴とする請求項３６に記載の方法。
【請求項４０】
前記制御フロー図、前記データフロー図及び前記制御依存図は前記コンピュータプログラムの単一関数に対応することを特徴とする請求項３６に記載の方法。
【請求項４１】
コンピュータプログラムのセキュリティ脆弱性を検出するための、コンピュータにより実現される方法であって、
解析対象のソースコードを受領する工程と、
ここに前記ソースコードはコード要素と文でできており、
前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成する工程と、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記モデルを使用し、ノードから構成される制御フロー図を生成する工程と、
ここに前記制御フロー図は、前記ソースコードにおける複数の関数を記述し、
前記変数はさらにグローバル変数からなり、
前記グローバル変数は、前記関数に、前記グローバル変数をデータ要素として有する、超グローバル変数として渡され、
前記制御フロー図からデータフロー図を導出する工程と、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出する工程と、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析する工程と、
セキュリティ脆弱性を有する前記ソースコードの部位を同定する工程と、
前記セキュリティ脆弱性を報告する工程と、
からなることを特徴とする方法。
【請求項４２】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項４１に記載の方法。
【請求項４３】
前記分析工程は、問合せ言語を使用して行われることを特徴とする請求項４１に記載の方法。
【請求項４４】
前記制御フロー図、前記データフロー図及び前記制御依存図は前記コンピュータプログラムの単一関数に対応することを特徴とする請求項４１に記載の方法。
【請求項４５】
コンピュータプログラムのセキュリティ脆弱性を検出するための、コンピュータにより実現される方法であって、
解析対象のソースコードを受領する工程と、
ここに前記ソースコードはコード要素と文でできており、
前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成する工程と、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記モデルを使用し、ノードから構成される制御フロー図を生成する工程と、
前記制御フロー図からデータフロー図を導出する工程と、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
ここに前記データフロー図の導出は、
第１配列と第２配列を前記データフローノードの夫々に随伴させる工程からなり、
ここに前記第１配列は、随伴されたデータフローノードが依存する前記変数に関する
静的情報を有し、
前記第２配列は、前記随伴されたデータフローノードに影響を与える他の変数を同定する情報を有し、
前記他の変数は前記データフローノードのその他のノードに随伴されており、
前記制御フロー図を横断処理する工程と、
前記ノードの夫々において、前記情報に応じて、前記データフロー図の対応するデータフローノードの前記第２配列内に前記情報を設定する工程と、
前記データフローエッジを前記データフローノードと前記他のデータフローノードと夫々繋ぐことにより生成する工程と、
前記制御フロー図より制御依存ノードを有する制御依存図を導出する工程と、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析する工程と、
セキュリティ脆弱性を有する前記ソースコードの部位を同定する工程と、
前記セキュリティ脆弱性を報告する工程と、
からなることを特徴とする方法。
【請求項４６】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項４５に記載の方法。
【請求項４７】
前記分析工程は、問合せ言語を使用して行われることを特徴とする請求項４５に記載の方法。
【請求項４８】
前記制御フロー図、前記データフロー図及び前記制御依存図は前記コンピュータプログラムの単一関数に対応することを特徴とする請求項４５に記載の方法。
【請求項４９】
コンピュータプログラムのセキュリティ脆弱性を検出するための、コンピュータにより実現される方法であって、
解析対象のソースコードを受領する工程と、
ここに前記ソースコードはコード要素と文でできており、
前記文の少なくとも一部は変数を参照し、
前記変数は要素変数からなり、
前記要素変数は要素名を有し
前記ソースコードのオブジェクト指向モデルを生成する工程と、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記モデルを使用し、ノードから構成される制御フロー図を生成する工程と、
ここに前記各ノードは前記制御フロー図上で位相順序を有し、
前記ノードの一部は少なくとも１つの子ノードを有し、
前記制御フロー図からデータフロー図を導出する工程と、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出する工程と、
ここに制御依存図を導出する工程は、
前記制御フロー図の前記ノードに対し先天性値を与えるステップと、
ここに前記先天性値は、前記少なくとも１つの子ノードによって平等に継承値として継承され、
前記各ノードで継承値の合計が先天性値に等しい時はその継承値を削除するステップと、
前記ノードの前記継承値の各継承記録を維持するステップと、
ここに前記継承記録は前記各継承値の継承元を示す前記ノードの同定番号を含み、
前記制御フロー図の入口ノードを同定するステップと、
前記ノードの最初の１組のノード群を同定するステップと、
ここに前記最初の１組のノード群の構成ノードは前記継承値を持たず、
夫々第１エッジを最初の１組のノード群と前記入口ノードとの間に確立するステップと、
前記ノードの第２組のノード群を同定するステップと、
ここに前記第２組のノード群の構成ノードは前記継承値を有し、
前記継承記録において、前記第２組のノード群間に継承元ノードの近接位相順序を設定するステップと、
第２のエッジを前記第２組のノード群の前記構成ノードと前記最接位相順序の前記継承元ノードとの間に夫々生成するステップと、からなり、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、セキュリティ脆弱性を有する前記ソースコードの部位を同定する工程と、
前記セキュリティ脆弱性を報告する工程と、
からなることを特徴とする方法。
【請求項５０】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項４９に記載の方法。
【請求項５１】
前記分析工程は、問合せ言語を使用して行われることを特徴とする請求項４９に記載の方法。
【請求項５２】
前記制御フロー図、前記データフロー図及び前記制御依存図は前記コンピュータプログラムの単一関数に対応することを特徴とする請求項４９に記載の方法。
【請求項５３】
コンピュータプログラムのセキュリティ脆弱性を検出するためのコンピュータソフトウエァ製品であって、コンピュータプログラム命令を保管し接触可能でコンピュータ読込み可能な媒体を含み、
前記命令は、コンピュータに読込まれた場合、コンピュータに対しコード要素と文からなるソースコードを受け取らせ、
前記文の少なくとも一部は変数を参照し、
前記変数は要素変数を有するデータ構造からなり、
前記要素変数は要素名を有し、
前記コンピュータはさらに、
前記ソースコードのオブジェクト指向モデルを生成することと、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記モデルを生成する工程は前記要素変数に夫々識別子を割当ることからなり、
前記モデルを使用しノードを有する制御フロー図を生成することと、
前記制御フロー図からデータフロー図を導出することと、
ここに前記データフロー図はデータフローノードおよび前記データフローノードを接続するデータフローエッジより構成され、
前記制御フロー図より制御依存ノードを有する制御依存図を導出することと、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、前記夫々の識別子を使用して、既定の要素変数に対する参照を同定することにより、セキュリティ脆弱性を有する前記ソースコードの部位を同定することと、
ここに前記既定の要素変数の前記要素名は、もう１つの要素変数の前記要素名と同一であり、
前記セキュリティ脆弱性を報告することと、
を命令されることを特徴とする製品。
【請求項５４】
前記セキュリティ脆弱性を除去するため、前記ソースコードを変更する工程をさらに含むことを特徴とする請求項５３に記載のコンピュータソフトウエァ製品。
【請求項５５】
前記コンピュータはさらに、前記ソースコードの、単一アクションのみが行われる原子要素を表す、前記制御依存図のブロックを定義するために、前記制御依存図をコード切削するように命令されることを特徴とする請求項５３に記載のコンピュータソフトウエァ製品。
【請求項５６】
前記コンピュータはさらに、入力データが有効とされる前記データフロー図のデータフローノードを同定し、前記入力データが前記同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明するように命令されることを特徴とする請求項５３に記載のコンピュータソフトウエァ製品。
【請求項５７】
前記コンピュータはさらに、前記ソースコードに対しソフトウェア故障の木解析を適用するように命令されることを特徴とする請求項５３に記載のコンピュータソフトウエァ製品。
【請求項５８】
前記コンピュータはさらに、データ検証関数が誤りとなるシナリオを同定するため、前記データ検証関数に対しテストケースを生成するように命令されることを特徴とする請求項５３に記載のコンピュータソフトウエァ製品。
【請求項５９】
前記コンピュータはさらに、前記コンピュータプログラムのオブジェクト群に対する、アクセス特権を特定する構成ファイルを自動的に準備し、前記アクセス特権が前記オブジェクト群の既定のオブジェクトに対し存在するか否か判定するよう前記構成ファイルに問合わせし、前記オブジェクト群の既定のオブジェクトに対する前記特権を削除するように命令されることを特徴とする請求項５３に記載のコンピュータソフトウエァ製品。
【請求項６０】
コンピュータプログラムのセキュリティ脆弱性を検出するためのコンピュータソフトウエァ製品であって、コンピュータプログラム命令を保管し接触可能でコンピュータ読込み可能な媒体を含み、
前記命令は、コンピュータに読込まれた場合、コンピュータに対し、
コード要素と文からなるソースコードを受け取らせ、
ここに前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成させ、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記コンピュータはさらに、
前記モデルを使用し、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析して、セキュリティ脆弱性を有する前記ソースコードの部位を同定し、
ここにおいて前記分析は、前記制御依存図の第１部位を１回目に横断処理して前記制御依存図の処理済部分に標識を付け、その後２回目に前記標識の付いた部分を含む前記制御依存図の第２部位を、前記標識の付いた部分を飛ばして横断処理することにより行われ、
前記セキュリティ脆弱性を報告する、ように命令されることを特徴とする製品。
【請求項６１】
前記コンピュータはさらに、前記変数の既定の１つに影響を与える前記制御依存ノードのみを同定するため、前記制御依存図をコード切削するように命令され、ここにおいて前記制御依存図には意味を保存する処理だけが行われる、ことを特徴とする請求項６０に記載のコンピュータソフトウエァ製品。
【請求項６２】
コンピュータプログラムのセキュリティ脆弱性を検出するためのコンピュータソフトウエァ製品であって、コンピュータプログラム命令を保管し接触可能でコンピュータ読込み可能な媒体を含み、
前記命令は、コンピュータに読込まれた場合、コンピュータに対し、
コード要素と文からなるソースコードを受け取らせ、
前記ソースコードのオブジェクト指向モデルを生成させ、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記コンピュータはさらに、
前記モデルを使用し、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
セキュリティ脆弱性を有する前記ソースコードの部位を同定するために、前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
ここに前記分析は、
前記データフロー図内に、入力が受入れられた第１データフローノード、データが有効とされた第２データフローノード、およびデータが使用された第３データフローノードを同定するステップと、
前記データフロー図から前記第２データフローノードを削除するステップと、
その後前記第３データフローノードの１つと前記第１データフローノードの１つが前記データフローエッジの１つにより繋がっていることを判定するステップと、により行われ、
前記第３データフローノードが未評価入力の脆弱性を有することを報告する、
ように命令されることを特徴とする製品。
【請求項６３】
前記コンピュータはさらに、入力データが有効とされる前記データフロー図のデータフローノードを同定し、前記入力データが前記同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明するように命令されることを特徴とする
請求項６２に記載のコンピュータソフトウエァ製品。
【請求項６４】
ンピュータプログラムのセキュリティ脆弱性を検出するためのコンピュータソフトウエァ製品であって、コンピュータプログラム命令を保管し接触可能でコンピュータ読込み可能な媒体を含み、
前記命令は、コンピュータに読込まれた場合、コンピュータに対し、
コード要素と文からなるソースコードを受け取らせ、
ここに前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成させ、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記コンピュータはさらに、
前記モデルを使用し、ノードから構成される制御フロー図を生成し、
ここに前記制御フロー図は、前記ソースコードにおける複数の関数を記述し、
前記変数はさらにグローバル変数からなり、
前記グローバル変数は、前記関数に、前記グローバル変数をデータ要素として有する、超グローバル変数として渡され、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
セキュリティ脆弱性を有する前記ソースコードの部位を同定し、
前記セキュリティ脆弱性を報告する、
ことを命令されることを特徴とする製品。
【請求項６５】
コンピュータプログラムのセキュリティ脆弱性を検出するためのコンピュータソフトウエァ製品であって、コンピュータプログラム命令を保管し接触可能でコンピュータ読込み可能な媒体を含み、
前記命令は、コンピュータに読込まれた場合、コンピュータに対し、
コード要素と文からなるソースコードを受け取らせ、
ここに前記文の少なくとも一部は変数を参照し、
前記ソースコードのオブジェクト指向モデルを生成させ、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記コンピュータはさらに、
記モデルを使用し、ノードから構成される制御フロー図を生成し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
ここに前記データフロー図の導出は、
第１配列と第２配列を前記データフローノードの夫々に随伴させる工程からなり、
ここに前記第１配列は、随伴されたデータフローノードが依存する前記変数に関する
静的情報を有し、
前記第２配列は、前記随伴されたデータフローノードに影響を与える他の変数を同定する情報を有し、
前記他の変数は前記データフローノードのその他のノードに随伴されており、
前記制御フロー図を横断処理し、
前記ノードの夫々において、前記情報に応じて、前記データフロー図の対応するデータフローノードの前記第２配列内に前記情報を設定し、
前記データフローエッジを前記データフローノードと前記他のデータフローノードと夫々繋ぐことにより生成し、
前記制御フロー図より制御依存ノードを有する制御依存図を導出し、
前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
セキュリティ脆弱性を有する前記ソースコードの部位を同定し、
前記セキュリティ脆弱性を報告する、
ことを命令されることを特徴とする製品。
【請求項６６】
コンピュータプログラムのセキュリティ脆弱性を検出するためのコンピュータソフトウエァ製品であって、コンピュータプログラム命令を保管し接触可能でコンピュータ読込み可能な媒体を含み、
前記命令は、コンピュータに読込まれた場合、コンピュータに対し、
コード要素と文からなるソースコードを受け取らせ、
ここに前記文の少なくとも一部は変数を参照し、
前記変数は要素変数からなり、
前記要素変数は要素名を有し
前記ソースコードのオブジェクト指向モデルを生成させ、
ここに前記コード要素は夫々オブジェクトにて表わされ、
前記コンピュータはさらに、
前記モデルを使用し、ノードから構成される制御フロー図を生成し、
ここに前記各ノードは前記制御フロー図上で位相順序を有し、
前記ノードの一部は少なくとも１つの子ノードを有し、
前記制御フロー図からデータフロー図を導出し、
ここに前記データフロー図は、データフローノードと、前記データフローノードを繋ぐデータフローエッジと、からなり、
前記制御フロー図より制御依存ノードを有する制御依存図を導出するように命令され、、
前記コンピュータは、
前記制御フロー図の前記ノードに対し先天性値を与えるステップと、
ここに前記先天性値は、前記少なくとも１つの子ノードによって平等に継承値として継承され、
前記各ノードで継承値の合計が先天性値に等しい時はその継承値を削除するステップと、
前記ノードの前記継承値の各継承記録を維持するステップと、
ここに前記継承記録は前記各継承値の継承元を示す前記ノードの同定番号を含み、
前記制御フロー図の入口ノードを同定するステップと、
前記ノードの最初の１組のノード群を同定するステップと、
ここに前記最初の１組のノード群の構成ノードは前記継承値を持たず、
夫々第１エッジを最初の１組のノード群と前記入口ノードとの間に確立するステップと、
前記ノードの第２組のノード群を同定するステップと、
ここに前記第２組のノード群の構成ノードは前記継承値を有し、
前記継承記録において、前記第２組のノード群間に継承元ノードの近接位相順序を同定するステップと、
第２のエッジを前記第２組のノード群の前記構成ノードと最接位相順序の前記継承元ノードとの間に夫々生成するステップと、
の各ステップにより前記制御依存図を導出するように命令され、
前記コンピュータは、
セキュリティ脆弱性を有する前記ソースコードの部位を同定するため、前記制御フロー図、前記データフロー図及び前記制御依存図を分析し、
前記セキュリティ脆弱性を報告する、
ように命令されることを特徴とする製品。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の参照
本出願は、ここに参照文献として取り入れられている２００６年１０月１９日出願のアメリカ仮出願Ｎｏ．６０／８５３，３４９の利益を要求するものである。
【背景技術】
【０００２】
１．本発明の技術分野
本発明は、コンピュータ・ソフトウェアの脆弱性評価に関するものである。特に、応用プログラムのソースコードを自動的にスキャンし、応用プログラムレベルの脆弱性を検出することに関するものである。
【０００３】
２．従来技術の記載
企業のセキュリティ対策は、歴史的にネットワークとホストの安全対策に、即ち「前線防衛」技術に集中してきた。これらの努力にも関わらず、応用プログラムレベルの脆弱性はいまだに重大な危機として残されている。そのような脆弱性の検出のためにはソースコードの構文解析が試みられてきた。この結果、典型的に多数の誤った積極的示唆がもたらされた。１行毎のコード解析も提案されてきた。しかしながらこの方法は、現在のソフトウェアが一般的に数千行のコードで作られるため、非実用的と実証されている。実際、Ｊ２ＥＥ（Ｊａｖａ２標準版、登録商標）のような比較的コンパクトな環境でも、実行モジュールには数千のクラスを含む。
【０００４】
「ソフトウェア解析フレームワーク」と題した特許文献２により、脆弱性の検出のための1つの技術が例示されている。この技術は実行コードを説明するために逆コンパイルを使用している。データフローを同定し、かつ再帰的にモデル化し、また、制御フローを同定し、かつ再帰的にモデル化し、これらのモデルを最小単位の完全なモデルが出来上がるまで繰り返し校正する。
【０００５】
「静的解析による応用ソフトウェアの誤謬低減」と題した特許文献３により、プログラムコードの静的解析が開示されている。一組の解析がプログラムコード上を移動し、プログラミングの安全性、そして/または、私的情報モデルのコード作成の誤りを特定する。更に、制御フローとデータフローの解析を使用してプログラムの評価が行われる。
【０００６】
「ソースコードの競合状態脆弱性の検出のための方法およびシステム」と題した特許文献４により、別のアプローチが提案されている。ソースコードは構文解析され、中間表現となる。コードに対してモデルが導出され、ルーチンについての既定の規則について分析され、ルーチンが１つ以上の既定の脆弱性を有しているか否かを決定する。
ソースコードを検査するいくつかの試みもなされた。「ソースコード解析システムおよび方法」と題した特許文献５は、応用ソフトウェアに伴うデータベースを生成することを提案している。閲覧ソフトはデータベースの内容へアクセスする。次に、モジュール間通信、データベースや外部ファイルに対する呼び出し、および応用プログラム上の変数の使用などの関連情報が表示される。恐らく、操作者はその表示から脆弱性を特定できる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】米国特許仮出願    Ｎｏ．６０／８５３，３４９
【特許文献２】米国特許出願公報  Ｎｏ．２００６／０２５３８４１
【特許文献３】米国特許出願公報  Ｎｏ．２００５／００１５７５２
【特許文献４】米国特許出願公報  Ｎｏ．２００４／０２５５２７７
【特許文献５】米国特許出願公報  Ｎｏ．２００３／００５６１９２
【発明の概要】
【０００８】
本発明の１側面では、自動ツールが応用プログラムレベルの脆弱性に対し応用プログラムのソースコードを分析する。このツールはソフトウェア開発過程を継ぎ目なく統合しているため、脆弱性はソフトウェア開発過程の早い時点で発見される。欠陥部分を除くときも、生産後に比べてはるかに低コストとなる。このツールの動作は静的解析に基づいているが、例えば難読化されたコードを扱うなど、種々の技術を利用している。
【０００９】
本発明の実施形態によれば、コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、コンピュータプログラムの命令を内蔵する記憶装置と、入出力装置と、記憶装置にアクセスし命令を読む演算処理装置と、からなり、命令は、演算処理装置に対し、分析対象のソースコードを入出力装置経由で受け取るようにさせ、ここにソースコードはコード要素と文からなり、文の少なくとも一部は変数を参照し、変数は要素変数を有するデータ構造からなるシステムを提供する。
演算処理装置は、ソースコードのオブジェクト指向モデルを、夫々の識別子を要素変数に割り当てることにより生成するように動作することができる。
演算処理装置は、モデルを使用し、ノードから構成される制御フロー図を生成し、制御フロー図からデータフロー図を導出し、制御フロー図より制御依存図を導出し、制御フロー図、データフロー図及び制御依存図を分析し、夫々の識別子を使用して既定の要素変数に対する参照を同定することにより、セキュリティ脆弱性を有するソースコードの部位を同定し、ここに既定の要素変数の要素名は、もう一つの要素変数の要素名と同じであり、セキュリティ脆弱性を報告する、ように動作することができる。
【００１０】
データ処理システムの一側面では、演算処理装置は、セキュリティ脆弱性を除去するためにソースコードを変更するように動作可能である。
【００１１】
データ処理システムの他の側面では、演算処理装置は、ソースコードの、単一アクションのみが行われる原子要素を表す、制御依存図のブロックを定義するために、制御依存図をコード切削するように動作可能である。
【００１２】
データ処理システムの又別の側面では、演算処理装置は、入力データが有効とされる前記データフロー図のデータフローノードを同定し、入力データが同定されたデータフローノードにおいて既定の仕様に従って有効とされたことを証明する、ように動作可能である。
【００１３】
データ処理システムの更なる側面では、演算処理装置がソフトウェア故障の木解析をソースコードに適用するように動作可能である。
【００１４】
データ処理システムの一つの側面では、演算処理装置は、データ評価関数が誤りとなるシナリオを同定するために、データ評価関数に対しテストケースを生成するように動作可能である。
【００１５】
本発明の実施形態によれば、コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、コンピュータプログラムの命令を内蔵する記憶装置と、入出力装置と、記憶装置にアクセスし前記命令を読む演算処理装置と、からなり、命令は、演算処理装置に対し、分析対象のソースコードを入出力装置経由で受け取るようにさせ、ここにソースコードはコード要素と文からなり、文の少なくとも一部は変数を参照するシステムを提供する。
演算処理装置は、ソースコードのオブジェクト指向モデルを生成し、ここにコード要素は夫々オブジェクトを表し、モデルを使用して、ノードから構成される制御フロー図を生成し、制御フロー図からデータフロー図を導出し、制御フロー図より制御依存図を導出し、制御フロー図、データフロー図及び制御依存図を分析し、制御依存図の第１部位を１回目に横断処理して制御依存図の処理済部分に標識を付け、その後２回目に標識の付いた部分を含む制御依存図の第２部位を、標識の付いた部分を飛ばして横断処理することにより、セキュリティ脆弱性を有するソースコードの部位を同定し、セキュリティ脆弱性を報告する、ように動作可能である。
【００１６】
本発明の実施形態によれば、コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、コンピュータプログラムの命令を内蔵する記憶装置と、入出力装置と、記憶装置にアクセスし命令を読む演算処理装置と、からなり、命令は、演算処理装置に対し、分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、ここに前記ソースコードはコード要素と文からなり、文の少なくとも一部は変数を参照するシステムを提供する。
演算処理装置は、ソースコードのオブジェクト指向モデルを生成し、ここにコード要素は夫々オブジェクトを表し、モデルを使用して、ノードから構成される制御フロー図を生成し、制御フロー図からデータフロー図を導出し、制御フロー図、データフロー図及び制御依存図を分析し、データフロー図内に、入力が受入れられた第１データフローノード、データが有効とされた第２データフローノード、およびデータが使用された第３データフローノードを同定する工程と、データフロー図から第２データフローノードを削除する工程と、その後第３データフローノードの１つと第１データフローノードの１つがデータフローエッジの１つにより繋がっていることを判定する工程とにより、第３データフローノードの１つが、未評価入力の脆弱性を有することを報告する、ように動作可能である。
【００１７】
本発明の実施形態によれば、コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、コンピュータプログラムの命令を内蔵する記憶装置と、入出力装置と、記憶装置にアクセスし命令を読む演算処理装置と、からなり、命令は、演算処理装置に対し、分析対象のソースコードを前記入出力装置経由で受け取るようにさせ、ここにソースコードはコード要素と文からなり、文の少なくとも一部は変数を参照するシステムを提供する。
演算処理装置は、モデルを使用して、ノードから構成される制御フロー図を生成し、ここに制御フロー図は、ソースコードにおける複数の関数を記述し、変数はさらにグローバル変数からなり、グローバル変数は、関数に、グローバル変数をデータ要素として有する、超グローバル変数として渡され、制御フロー図よりデータフロー図を導出し、制御フロー図より制御依存ノードを有する制御依存図を導出し、制御フロー図、データフロー図及び制御依存図を分析し、セキュリティ脆弱性を有するソースコードの部位を同定して、セキュリティ脆弱性を報告する、ように動作可能である。
【００１８】
本発明の実施形態によれば、コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、コンピュータプログラムの命令を内蔵する記憶装置と、入出力装置と、記憶装置にアクセスし命令を読む演算処理装置と、からなり、
命令は、演算処理装置に対し、分析対象のソースコードを入出力装置経由で受け取るようにさせ、ここにソースコードはコード要素と文からなり、文の少なくとも一部は変数を参照するシステムを提供する。
演算処理装置は、ソースコードのオブジェクト指向モデルを生成し、
ここに前記コード要素は夫々オブジェクトを表し、モデルを使用して、制御フロー図を生成し、制御フロー図からデータフロー図を導出し、ここにデータフロー図は、データフローノードと、データフローノードを繋ぐデータフローエッジとからなる、ように動作可能である。
演算処理装置は、第１配列と第２配列を前記データフローノードの夫々に随伴させることにより、データフロー図を導出し、ここに前記第１配列は、随伴されたデータフローノードが依存する変数に関する静的情報を有し、第２配列は、随伴されたデータフローノードに影響を与える他の変数を同定する情報を有し、他の変数はデータフローノードのその他に随伴されている、ように動作可能である。
演算処理装置は、制御フロー図を横断処理し、ノードの夫々において、情報に応じて、データフロー図の対応するデータフローノードの第２配列内に情報を確立し、データフローエッジをデータフローノードと他のデータフローノードと夫々繋ぐことにより生成し、制御フロー図より制御依存ノードを有する制御依存図を導出し、制御フロー図、データフロー図及び制御依存図を分析し、セキュリティ脆弱性を有するソースコードの部位を同定して、セキュリティ脆弱性を報告する、ように動作可能である。
【００１９】
本発明の実施形態によれば、コンピュータプログラムのセキュリティ脆弱性を検出するためのデータ処理システムであって、コンピュータプログラムの命令を内蔵する記憶装置と、入出力装置と、記憶装置にアクセスし命令を読む演算処理装置と、からなり、  命令は、演算処理装置に対し、分析対象のソースコードを入出力装置経由で受け取るようにさせ、ここにソースコードはコード要素と文からなり、文の少なくとも一部は変数を参照し、変数は要素変数からなり、要素変数は要素名を有し、ソースコードのオブジェクト指向モデルを生成させ、ここにおいてコード要素は夫々のオブジェクトによって表される、システムを提供する。
演算処理装置は、モデルを使用して、ノードから構成される制御フロー図を生成し、  ここに各ノードは制御フロー図上で位相順序を有し、ノードの一部は少なくとも１つの子ノードを有し、制御フロー図からデータフロー図を導出し、ここにデータフロー図は、データフローノードと、データフローノードを繋ぐデータフローエッジと、からなり、制御フロー図より制御依存ノードを有する制御依存図を導出するように動作可能である。
演算処理装置は、制御フロー図のノードに対し先天性値を与え、ここに先天性値は、少なくとも１つの子ノードによって平等に継承値として継承され、各ノードで継承値の合計が先天性値に等しい時はその継承値を削除し、ノードの継承値の各継承記録を維持し、ここに継承記録は各継承値の継承元を示すノードの同定番号を含み、制御フロー図の入口ノードを同定し、ノードの最初の１組のノード群を同定し、ここに最初の１組のノード群の構成ノードは継承値を持たず、夫々第１エッジを最初の１組のノード群と入口ノードとの間に確立し、ノードの第２組のノード群を同定し、ここに第２組のノード群の構成ノードは継承値を有し、継承記録において、第２組のノード群間に継承元ノードの近接位相順序を設定し、そして、第２のエッジを第２組のノード群の構成ノードと最接位相順序の継承元ノードとの間に夫々生成する、ことにより制御依存図を導出するように動作可能である。
演算処理装置は、制御フロー図、データフロー図及び制御依存図を分析し、セキュリティ脆弱性を有するソースコードの部位を同定して、セキュリティ脆弱性を報告する、
ように動作可能である。
【００２０】
本発明のその他の実施形態は、このデータ処理システムの機能を実施するための方法、コンピュータ・ソフトウェア製品を提供する。
【図面の簡単な説明】
【００２１】
本発明をより良く理解できるように、発明の詳細な説明に対して、以下の図を参照して読まれる実施形態を提供する。図の要素は参照番号を与えられている。
【００２２】
【図１】本発明の開示された実施形態に基づく、コンピュータ・プログラムのコードを処理するシステムのブロック図である。
【００２３】
【図２】本発明の開示された実施形態に基づく、図１に示されたソースコード分析エンジンの詳細なブロック図である。
【００２４】
【図３】本発明の開示された実施形態に基づく、図１に示されたソースコード分析エンジンを使用するソースコード分析の側面を示す複合図である。
【００２５】
【図４】本発明の開示された実施形態に基づく、単一ソースコード文を表わす制御フロー図である。
【００２６】
【図５】本発明の開示された実施形態に基づく、呼出知覚の単一メソッド制御フロー図を生成する方法のフローチャートである。
【００２７】
【図６】本発明の開示された実施形態に基づく、呼出知覚の単一メソッドの制御フロー図の典型的事例である。
【００２８】
【図７】本発明の開示された実施形態に基づき生成されたデータフロー図である。
【００２９】
【図８】本発明の開示された実施形態に基づく、データフロー図を生成する方法のフローチャートである。
【００３０】
【図９】本発明の開示された実施形態に基づく、図８に示された方法によるデータフロー図の生成を示す図である。
【００３１】
【図１０】本発明の開示された実施形態に基づく、データフロー図を生成する工程を示す図である。
【００３２】
【図１１】本発明の開示された実施形態に基づく、制御依存図を生成するために使用される制御フロー図のノードのポテンシャルを設定する方法のフローチャートである。
【００３３】
【図１２】本発明の開示された実施形態に基づく、図１１の方法の更なる詳細を示すフローチャートである。
【００３４】
【図１３】本発明の開示された実施形態に基づく、図１１と図１２を参照して開示された方法による制御依存図の生成を示す複合図である。
【００３５】
【図１４】本発明の開示された実施形態に基づく、制御フロー図内のスタブ交換を示す図である。
【００３６】
【図１５】本発明の開示された実施形態に基づく、囲い込み計算を説明する一連の制御依存図である。
【００３７】
【図１６】本発明の開示された実施形態に基づく、コンピュータプログラムの未評価入力の可能性を検証する方法のフローチャートである。
【００３８】
【図１７】本発明の開示された実施形態に基づく、未評価入力の脆弱性を判定するためのデータフロー図の処理を示す図である。
【００３９】
【図１８】本発明の開示された実施形態に基づく、典型的な独自のデータ検証関数の処理を示す図である。
【発明を実施するための形態】
【００４０】
以下の文では、多くの特定の詳細説明が、本発明の完全な理解のために提供される。しかし、本発明がこれらの特定の詳細内容無しで実現できることは、当業者には明らかである。また、公知の回路、制御論理および従来技術の計算式や工程についてのコンピュータプログラム命令の詳細などは、不必要に本発明を不明瞭にしないため示していない。
【００４１】
本発明の開示された実施例としてのソフトウェア・プログラミングコードはコンピュータ読み込み可能媒体のような永久記録媒体で通常維持される。クライアント/サーバ環境ではそのようなソフトウェア・プログラミングコードはクライアントあるいはサーバに保存される。ソフトウェア・プログラミングコードはデータ処理システムで使用される、ディスケット、ハードドライブ、またはＣＤ−ＲＯＭなどのさまざまの公知のメディアのどれかで実体化される。コードは、そのようなメディアに入れて配布されるか、ネットワークの上のあるコンピュータシステムの記憶装置か記憶装置からネットワークを介して他のコンピュータシステムに他のユーザに使用されるため流通されうる。
用語の定義
【００４２】
「脆弱性」とは、実行時に、外部入力が不適切又は不望の動作を引き起こすことを許す可能性のあるプログラム・ソースコードの一部分を指す。脆弱性の例としては、バッファ溢れ、競合状態、特権増大がある。
【００４３】
「制御フロー」とはプログラム命令の論理的な実行順序を表す。それは論理的に開始点から始まり、種々のループや制御移動文(分岐)を横断処理し、プログラムの端か終了点で終わる。
【００４４】
「制御フロー図」(CFG)とは、プログラムの実行時に、プログラムで横断処理される経路の図的表現である。図の各ノードは基本ブロック、即ちジャンプやジャンプ先のない一直線の１つのコードを表す。ジャンプ先からブロックが始まり、他へのジャンプでブロックが終わる。制御フローにおけるジャンプを表すのに有向エッジが使用される。
【００４５】
「データフロー」は、変数およびデータ要素、即ち何らかの外部記憶装置上のプログラム記憶装置に動的または静的に保存されるデータ、が記憶装置から読み出されるか、または書き込みされる、プログラム内のプロセスを示す。データフローはプロセスを含む。そのプロセスでは、変数あるいは、データの入力または出力が名前と内容で定義され、プログラム実行で使用されそして/あるいは、変更される。データフローは「データフロー図」として図的に表現される。
システム概要
【００４６】
今から図を使用する。最初に図１を参照するが、これは本発明の開示された実施形態にもとづく、コンピュータ・プログラムコードを処理するためのシステム１０のブロック図である。システム１０は典型的には、汎用か組込型コンピュータ１２であり、通常の記憶装置と入出力装置が備えられ、以下に説明される機能を実行する適切なソフトウェアでプログラムされる。したがって、システム１０の一部が多くの別々の機能ブロックを含むよう示されるが、これらのブロックは必ず別々の物理的実体というわけではない。むしろ演算処理装置にアクセス可能な記憶装置に保存される、異なった演算業務かデータオブジェクトを表す。これらの業務は単一の演算処理装置または複数の演算処理装置で動くソフトウェア上で実行される。ソフトウェアはＣＤ−ＲＯＭか非揮発性記憶装置などの形のあるメディアで、またはデータ網の上の記憶装置から取り込んで提供される。または、代わりに、さらに、システム１０はディジタル信号演算処理装置か配線論理で構成される。システム１０は操作者がグラフィカル・ユーザ・インターフェースでシステムと対話するのを可能にするため、ディスプレイ１４を含んでもよい。
【００４７】
システム１０は応用プログラム・ソースコード１６を受ける。それは、実行コードに変換される予定である。典型的には変換はコンパイルで行われ、オブジェクトコードが生成され、オブジェクトコードはライブラリコードとリンクされる。しかし、本発明の原理は中間表現が採用されているソフトウェア開発システム、またはソースコード・インタプリタを使用する開発環境に適用可能である。
【００４８】
システム１０はソースコード分析ソフト１８（ＳＣＡ）を含む。これは、応用プログラムレベル脆弱性を検出するため、自動的にソースコード１６をスキャンするモジュールである。ソースコード分析ソフト１８は独立して変換されうる、複数の異なった層から構成される。それぞれの層は隣接している層だけと結合され、結合されない層が多数残される。一般に、ある層の変更は、変更された層から入力を受け取る次の層にだけ影響する。１つの層は、以下詳細に議論する各種タイプのセキュリティ脆弱性を検出する１組の問い合わせを保持する、セキュリティ関連の層２０である。他の層全体でセキュリティ関連の層２０によって利用される、ＳＣＡエンジン２２を形成する。モジュール構造は高い柔軟性を提供する。例えば、可能であれば、ＳＣＡエンジン２２に接する別のモジュールとセキュリティ関連層２０を交換する。ＳＣＡエンジン２２を形成する層は、文析される応用プログラムに関連する種々の機能を果たす、例えば信頼性の評価、性能、および、仕様や規格にたいする適合度など。
【００４９】
次に図２を参照する。図２は開示された本発明の実施形態による、ＳＣＡエンジン２２（図１）のブロック図である。ＳＣＡエンジン２２は以下の層および要素で構成され、それらは後ほどさらに詳しく説明される。
【００５０】
層２４（分類モジュール２６および逆コンパイラ２８を含む）
【００５１】
層３０（パーサ３２）
【００５２】
層３４（ＡＳＴモジュール３６）
【００５３】
層３８（ＤＯＭビルダ４０、浅いＤＯＭソルバ４２および深いＤＯＭソルバ４４を含む）
【００５４】
層４６（ＣＦＧモジュール４８）
【００５５】
層５０（ＤＦＤモジュール５２）
【００５６】
層５４（ＣＤＧモジュール５６）
【００５７】
層５８（ＣＤＧ＋ＤＦＧモジュール６０）
【００５８】
層６２（オブジェクトデータベース６４）
【００５９】
層６６（ＳＦＴＡエンジン６８）
【００６０】
層７０（ユニット試験エンジン７２）
ソースコード解析プログラム―分類
【００６１】
ソースコード１６はＳＣＡエンジン２２の主要入力である。ソースコード１６は分類モジュール２６に渡される。ＳＣＡエンジン２２の現行版はＪａｖａ（登録商標）、Ｃ＃、．ＮＥＴ、およびサーバ側スクリプト言語ＪＳＰ（Ｊａｖａサーバページ）言語、およびＡＳＰＸ（アクティブサーバ・ページフレームワーク）で書かれたソースコードをスキャンできる。しかし、ここに開示される発明の原理はこれら特定の言語に制限されないことに注意するべきである。ＳＣＡエンジン２２が他のコンピュータ言語を処理出来るようにするコンバータが当業者により生成されてもよい。分類モジュール２６は、どの言語がソースコード１６に適用されるかを決定する。ソースコード１６が異常であるか、ＳＣＡエンジン２２が対応しない言語を渡された場合、分類モジュール２６は誤りを報告する。
【００６２】
ＳＣＡエンジン２２は公知の逆コンパイルの技術を使用して、ソースコードを中間表現に変える環境で開発されたプログラムをスキャンできる。例えば、．ＮＥＴ  ＴＭフレームワークとＪａｖａプラットホームの両方は、ソースコードを、機械コードではなく中間言語に変えことにより動作する。ＳＣＡエンジン２２がソースコード１６を中間言語で受け取ったことを認識すると、逆コンパイラ２８が呼び出される。それは、中間コードをＳＣＡエンジン２２で解析できる高水準の言語に変える。米国特許  Ｎｏ．５，８８１，２９０、５，５８６，３３０、５，５８６，３２８、および７，２１０，１３３で教えられるような、公知の技術を使用することで逆コンパイラ２８と分類モジュール２６の要素を構成できる。適切な逆コンパイラである「Ｒｅｆｌｅｃｔｏｒ  ｆｏｒ  ．ＮＥＴ」はインターネットを通してＬｕｔｚ  Ｒｏｅｄｅｒから利用可能である。
【００６３】
コード難読化のようなプログラミング手法は従来のコード分析プログラムに混乱をもたらす。しかし、ＳＣＡエンジン２２はコード論理の評価を指向しているため、コード難読化によって破壊されない。そのうえ、ＳＣＡエンジン２２は、リバースエンジニアリングされたプログラムコードで生成される、しばしば不鮮明な識別子にもトラブルを起こさない。
【００６４】
．ＮＥＴのような新しいプログラム言語は、イベント駆動プログラムをサポートする。そのようなプログラムの呼び出し図は、実行時まで関数呼び出しの順番を延期されるので、しばしば不十分に定義される。ＳＣＡエンジン２２は、ＡＳＰＸとＪＳＰコードで起こるウェブイベントを含む、様々なイベントを上げる順番に関する仮定を全くしない。そのようなイベントは適切なメタループとセレクトケース・スイッチの導入でそれぞれＣ＃とＪａｖａコードに変換される。分類モジュール２６と逆コンパイラ２８が最初の層、層２４を形成する。
構文解析
【００６５】
図２をさらに参照する。分類された、必要に応じて逆コンパイルされたソースコードは層３０の中でパーサ３２に処理される。それが個々のトークンに分解される。トークンは次に、層３４の中に渡されて特定の言語の文法に基づき処理され、ＡＳＴモジュール３６内の抽象構文木（ＡＳＴ）になる。このステップは公知である。例えば、インターネットでａｎｔｌｒ．ｏｒｇから利用可能なツールであるＡＮＴＬＲは、ＡＳＴモジュール３６としての使用に適する。
ＤＯＭビルダ
【００６６】
層３８のＤＯＭビルダ４０は、抽象構文木の各コード要素を適合するオブジェクトで表す、文書オブジエクトモデル（ＤＯＭ）を生成する。
ＤＯＭビルダ４０は、２つの主要モジュールから構成される。浅いＤＯＭソルバ４２（ＡＳＴ２ＤＯＭ）は、言語依存の抽象構文木を受けて、ほぼ言語中立の文書オブジェクトモデルを返す。浅いＤＯＭソルバ４２の出力は「浅い」言語であり、離れたオブジェクト間の論理的接続はまだ確立されていない。深いＤＯＭソルバ４４はその言語の関連仕様に基づきこれらを接続し、完全に言語中立である文書オブジェクトモデルを作成する。含意は、文書オブジェクトモデルを利用するその後の層が言語を意識する必要がないということである。したがって、新しい言語をサポートするためには、せいぜい層２４、３０、３４、３８だけが変更の要がある。層３８を引き継ぐ層は、ソースコード言語を関知しない。
【００６７】
深いＤＯＭソルバ４４の動作は、プログラムリスト１を閲覧することで理解できる。
ソースコードの分析には、符号「ｉ」が同じ変数を示すか、または同じ符号を共有する２つの異なった変数を示すか、を判定する必要がある。２つの行が同じブロックにあるなら、「ｉ」の２つの符号が１つの変数を示す。しかしながら、行が２つの異なったブロックにあるなら、変数の見え方、宣言された位置、内包するクラスの継承した順位により、判定は変わる。浅いＤＯＭソルバ４２は変数を認識する。それらの間の接続は、ＤＯＭビルダ４０によって参照された各変数が「インスタンスＩＤ」という名前のデータ要素を割り当てられる、深いＤＯＭソルバ４４によって確立される。浅いＤＯＭソルバ４２は、たとえ同じ変数を参照していても、参照された各変数に要素「インスタンスＩＤ」用の異なった値を割り当てる。したがって、プログラムリスト１では、「ｉ」に対する２つの参照の結果は、たとえ両方が同じ変数を参照してしても要素「インスタンスＩＤ」の違う値を受けとる。深いＤＯＭソルバ４４では、同じ変数への全ての参照は同じ値が要素「インスタンスＩＤ」に割り当てられる。メソッドは、同様のメカニズムを持っているが、要素「インスタンスＩＤ」にかわって、メソッド宣言、および呼出しに対し「定義ＩＤ」という要素が割り当てられる。
実施形態１
【００６８】
図３を参照する。図３は、本発明の実施形態に基づく、ＳＣＡエンジン２２（図２）を使用したソースコード分析の側面を示す複合図である。典型的ソースコード７６を処理して抽象構文木７８を形成している。抽象構文木７８の２番目の行の「ＮＡＭＥＳＰＡＣＥＮＯＤＥ」というノード８０には、「ＱＵＡＬＩＤＥＮＴ」（  ＱＵＡＬｉｆｉｅｄ  ＩＤＥＮＴｉｆｉｅｒ）という子ノード８２がある。ノード８２には、ソースコード７６の最初の行の識別子８４に対応する「ＣｈｅｃｋｍａｒｘＮａｍｅｓｐａｃｅ」の値がある。これは名前空間の名前であるが、抽象構文木７８に関する限り、それは、識別子を表す文字列に過ぎない。識別子８４が名前空間を特定するという知識は、ＤＯＭビルダ４０（図２）の浅いＤＯＭソルバ４２によって利用される。この知識は文書オブジェクトモデルにおいて獲得され、その一部はＤＯＭ断片８６として図示されている。本実施形態では、ＤＯＭオブジェクト８８「ＮａｍｅｓｐａｃｅＤｅｃｌ」が作成される、そして、データ要素「Ｎａｍｅ」は、値「ＣｈｅｃｋｍａｒｘＮａｍｅｓｐａｃｅ」で初期化される。いくつかの要素がＤＯＭオブジェクト８８の下流に示されている。
【００６９】
再度、図２を参照して、以下の事項が深いＤＯＭソルバ４４で処理される。これらは公知の技術であり、ここでは簡略化のため検討はしない。
【００７０】
型の決定。
【００７１】
継承の決定。
【００７２】
変数の決定。
【００７３】
メソッドの過負荷の決定。
【００７４】
メソッドの超越の決定。
【００７５】
過負荷の決定。
【００７６】
多態性の決定
【００７７】
データ要素の決定（公的／私的／保護対象）。
【００７８】
コンストラクタの決定。
【００７９】
「Ｔｈｉｓ」の決定。
【００８０】
チェーン化。
【００８１】
ベース呼び出し。
【００８２】
さらに、「要素変数インスタンス」として知られる手続が実行される。要素変数はＣ＋＋クラスのようなデータ構造内のフィールドである。通常、要素変数は異なった関数あるいはメソッド内で使われるが、それらの関数あるいはメソッドの外側で定義される。ＤＯＭビルダ４０では、各要素変数はユニークなＩＤ番号を受け取る。したがって、似た要素名を持ち、似たデータ型の親を持つ異なる要素変数（例えば、要素変数ａ．ｘ、ｂ．ｘ中の要素名「．ｘ」）は、お互いと区別されて、異なった変数であるとみなされる。従来の総合的開発環境、たとえばＶｉｓｕａｌ  Ｓｔｕｄｉｏ（登録商標）は、ある変数にたいする全ての参照を見つける機能を持っている。プログラムリスト２を参照し、変数「ｊ」（１３行目）の「要素変数インスタンス」を呼び出すと、９行目の変数ｊの宣言と１３行目の割当という２つの参照箇所が発見される。今度は、１４行目の変数「ａ．ｘ」に対する参照を考える。宣言（３行目）と割当（１４行目）という２つの参照箇所を見つける可能性がある。しかしながら、Ｖｉｓｕａｌ  Ｓｔｕｄｉｏは要素変数ｂ．ｘ（１５行目）の割当という追加の参照箇所を返す。この不望の結果はＶｉｓｕａｌ  Ｓｔｕｄｉｏがａ．ｘやｂ．ｘなどの名前の共通部分を持っている要素変数を区別しないことに起因する。しかしＤＯＭビルダ４０は、それらを区別できる。深いＤＯＭソルバ４４は要素変数ａ．ｘとｂ．ｘの「インスタンスＩＤ」に異価を割り当てる。要素「定義ＩＤ」と要素「インスタンスＩＤ」は共に要素変数が区別されることを許容する。
制御フロー図
【００８３】
制御フロー図は、ＣＦＧモジュール４８を使用し、層４６に生成される（図２）。ＳＣＡエンジン２２により生成された制御フロー図の各ノードは、単一の文を表す。さらにほとんどの場合、単一の文が複数の表現を含むとき、各表現は其々のノードによって表わされる。図４は制御フロー図９０の本発明に従った単一ソースコード文、「ｆｏｒ」の文である。制御フロー図９０は文の各要素が複数のノードに作り込まれる様子を示している。
【００８４】
ＣＦＧモジュール４８は、最初に単一メソッドのモジュラー制御フロー図を演算する。他のメソッドの呼出しには手をつけず、複雑な文は表現の論理を保持しつつ、複数の原子表現に分割される。このステージの効率はＯ（ｎ）である。ここにｎはコード内のサブ表現の数である。例えば制御フロー図９０では呼出し「Ｗｒｉｔｅ（）」はさらに分析されない。
【００８５】
ＣＦＧモジュール４８の操作の次の段階は、制御フロー図９０を呼出知覚の単一メソッド制御フロー図に変形することである。複数のメソッドを統合するためには、呼出されたメソッド用の保管場所が必要である。スタブが用意される。ソースコードが有れば最終的にスタブを置き換える。さらに実務的には、呼出しメソッドが呼出しの準備を行い、戻りの後に「消去作業」を行う。同様に呼出されたメソッドは最初に準備を行い、呼出しの終了後消去作業を行わなければならない。
【００８６】
次に図５を参照する。図５は本発明に基づく、呼出知覚の単一メソッド制御フロー図の生成方法のフローチャートである。最初のステップ９２では、単一メソッド制御フロー図が図４で述べたとおり準備される。
【００８７】
次に、ステップ９４で、制御フロー図のステップ９２で記述された呼出しメソッドが、呼出されたメソッドに送るパラメータを初期化する。パラメータには呼出しの間操作される「ｔｈｉｓ」オブジェクトおよびグローバル変数を含む。グローバル変数の運搬のための箱が準備されることが好ましい。
【００８８】
次にステップ９６において、呼び出されたメソッドはそのパラメータを暫定変数に複写する。これらは「ｐｒｏｌｏｇ」  という名前のセクションに配置される。
【００８９】
次にステップ９８に進む。暫定スタブが制御フロー図の中に保管場所として生成される。呼出されたメソッドのソースコードが無いときは、呼出されたメソッドにより送られたパラメータの使用について想定をしなければならない。ステップ９８で生成されるスタブには主要な２つのタイプがある。第１のタイプでは、呼出されたメソッドはそのパラメータを使用するが、それら変数の更新はしないと想定する。第２のタイプではパラメータは「ｔｈｉｓ」オブジェクトに影響を及ぼすと仮定する。各スタブの使用は、メソッド名、パラメータ名、返還値の数値や使用といった幾つかの検索容易性に基づいている。変換する関数名が「ｓｅｔ＊」，「ａｄｄ＊」または「ａｐｐｅｎｄ＊」で始まる場合は第２のタイプが使用される。ここで「＊」はワイルドカード操作子である。第１のスタブはこれ以外に使用される。      
【００９０】
ステップ９８のつぎにステップ１００が実行される。呼出されたメソッドは、典型的な「参考」パラメータである、変更するパラメータを（「出パラメータ」）、「ｅｐｉｌｏｇ」という名称の暫定変数に複写する。
【００９１】
次に最後のステップ１０２で呼出しメソッドは、暫定変数内の新データにより「出」パラメータを更新する。単一メソッドの制御フロー図の結果は、「ｐｒｏｌｏｇ」と「ｅｐｉｌｏｇ」に装飾され、呼び出されたメソッドに対するスタブを有している。
実施形態２
【００９２】
図６を参照する。図６は本発明に基づく典型的な呼出知覚の単一メソッド制御フロー図１０４である。制御フロー図１０４は「ｐｒｏｌｏｇ」と「ｅｐｉｌｏｇ」に対応するノード１０６，１０８をそれぞれ有する。この事例ではｆｕｎｃ２（）に対するソースコードが無いため、呼出される関数  ｆｕｎｃ２（）のスタブ１１０が含まれる。
データフロー図
【００９３】
再度、図２を参照する。データフロー図がＤＦＧモジュール５２を使用し層５０に生成される。次に図７を参照する。図７は、本発明に基づくデータフロー図１１２である。データフロー図は単一メソッド内のデータフローを記述している。変数にある値が割り当てられる都度、影響を与えるオブジェクトと割り当てが行われた位置が記録される。結果的に、データフローノードは特定の位置の変数であり、連結は依存性を表すことを示す図が生成される。図では処理が下流に行われる。このように特定の位置で演算された後方に流れる囲い込みは、全ての影響する変数を取り戻す。各ノードからはそのノードに影響を与えるノードに矢印が向けられている。例えば、ノード１１４では、変数ｃに割当てられた値はノード１１６における変数ａの割当てに影響されている。  
【００９４】
図８を参照する。図８は本発明に基づくデータフロー図を生成する方法のフローチャートである。各ステップは明確化のため直線的な順序で示されている。しかしこれらステップは、並列に、非同期で、また異なった順序で実行されうることは明らかである。
【００９５】
最初のステップ１１８でメソッドが選択され、上記図５で述べたように、そのメソッドに対する制御フロー図が生成される。データフロー図は制御フロー図に基づく。固有の識別子が少なくとも複製制御フロー図における各ノードに割り当てられる
【００９６】
つぎにステップ１２０において、最初のステップ１１８において準備された制御フロー図の各ノードが複製される。複製されたノードは適正なエッジを確立することにより、制御フロー図の生成に使用される。元の制御フロー図は通常ＣＳＡエンジンにより他の目的に使用される（図２）。もちろん、応用ソフトによっては制御フロー図の複製は不必要であり、その場合は複製されず、元の制御フロー図が使用される。ノードの複製は、ノードがデータオブジェクトである電算機演算業務として典型的に実行され、それは必要に応じて操作者を補助するため表示される。
【００９７】
次にステップ１２２において複製ノードから一つのノードが選択される。このステップではデータに関係しないノードは無視され、おそらく廃棄される。
【００９８】
次にステップ１２４において２つの配列が選択され、現在選択されている複製ノードを随伴する。これら配列は其々「このブロックが依存する変数」、「位置を変更する変数」と命名される。前者は現在のノードが依存する変数に関する静的情報を、後者は現在の複製ノードに影響を与えることが現在知られている変数に関する動的情報を、それぞれ含む。下記の記述から判るように、動的情報はデータフロー図の横断処理の中で生成される。
【００９９】
次にステップ１２６において、配列は初期化される。配列「このブロックが依存する変数」は、現在の複製ノードに保存された情報により初期化される。この配列は一度記入されると、変わることはない。例えば、文ａ＝ｂに対応する複製ノードが、複製ノードにたいする配列「このブロックが依存する変数」の１つの要素を数値「ｂ」で初期化する。ステップ１２６は説明的に「自己状態生成」と呼ばれることもある。配列「位置を変更する変数」が初期化される。配列「位置を変更する変数」は現在のノードに関係するデータにより初期化される。現在のノードに影響を与えるデータを有するノードとのリンクは後のステージで起こる。上記の例において、文ａ＝ｂは配列「位置を変更する変数」がキー「ａ」、数値「１」で初期化されるという結果を生む。
【０１００】
次にステップ１２８に進み、追加の複製ノードが制御フロー図において処理される必要があるか決定される。ステップ１２８の判定が肯定の場合はステップ１２２に戻り次の複製ノードを選択する。
【０１０１】
ステップ１２８の判定が否定の場合、ノード毎の処理が始まる。この処理は元々の制御フロー図における幅優先探索とほぼ同じである。厳密な意味では、幅優先探索は階層木構造に適用される。制御フロー図は完全には階層化していない可能性があるため、検索は当初親ノードについて解決し、親ノードから先は幅優先探索される。次にステップ１３０に進み、１つの複製ノードが選択される。
【０１０２】
次にステップ１３２において、現在の複製ノードに影響を及ぼす可能性のある全ての変数情報を包含することにより、配列「位置を変更する変数」を現在の複製ノード用に更新する試みがなされる。これは配列「値による」よりむしろ配列「参照による」を更新関数に渡すことにより行われる。このことは電算機資源の節約につながる。このステップの効率性はＯ（１）である。場合によっては、この処理を行うのに十分な情報が現時点で存在しないことがあり、その場合当該複製ノードはステップ１３２終了後、次世代のノードのために再度遡って取り扱わなければならない。再取扱のノードは標識がつけられる。標識付きノードは「深さ優先探索法」の順番で再度取り扱われる。
【０１０３】
次に決定ステップ１３４に進み、現在の複製ノードにたいする配列がステップ１３２で正しく更新されたか否かを判定する。決定ステップ１３４の判定が否定の場合は、下記の決定ステップ１３６に進む。
【０１０４】
決定ステップ１３４の判定が肯定の場合は、ステップ１３８に進む。当該ノードは評価済みとして分類される。関連するエッジは、全てのノードが評価された後に現在のノードと、現在のノードが依存する、他の複製ノードとの間で確立される。
【０１０５】
ステップ１３８終了後、決定ステップ１３４の判定が否定である場合は、決定ステップ１３６にすすむ。そこでは、追加の複製ノードを取り扱う、または再度取り扱う必要があるか否か判定される。決定ステップ１３６の判定が肯定の場合、ステップ１３０に戻る。
【０１０６】
決定ステップ１３６の判定が肯定の場合、最終ステップ１４０に進む。関連するエッジは上記ステップ１３８の議論で述べたとおり今やノード間で生成される。これはまず第１に配列「このブロックが依存する変数」を参照して行われ、次に配列「位置を変更する変数」に基づいてエッジを追加する。これでデータフロー図は完成し、処理は終了する。
実施形態３
【０１０７】
図９は、本発明の開示された実施形態に基づき、図８を参照しながら記述された方式によるデータフロー図の生成を示す図である。図９の上側部分に示されたとおり、データフロー図はソースコード１４２の一部から生成される。
【０１０８】
制御フロー図１４４と複製制御フロー図１４６が準備され、後に割り当てされる固有の識別子（１，２，３，４）が準備される。複製制御フロー図１４６の下側部分では、各ノードがそれぞれの変数テーブル、即ち列１４８の「本ブロックが依存する変数」という配列を含むテーブルと、複製制御フロー図１４６の各ノードのランクによって分岐している一組のテーブル１５０を伴うことが示されている。例えばノード１５２は固有の識別子「１」が割り当てられており、テーブル１５４，１５６を伴っている。ここでそれぞれのノードは単一ソースコード文に対応していることが想起される。テーブル１５４の目的は、ノード１５２に対応するソースコード１４２の文が依存するこれら変数を識別することである。
【０１０９】
同様にノード１５８はテーブル１６０，１６２を伴い、ノード１５９はテーブル１６４，１６６を伴い、ノード１６８はテーブル１７０，１７２を伴う。
【０１１０】
複製制御フロー図１４６の最上部から始め、下流に進み、各変数が最後に変化したノードが確定され、実データフロー図が生成される。
【０１１１】
テーブルの組１５０では、各関連変数はその関連するノードへの指示子を伴っている。例えば制御フロー図１４４のノード１７４に対応するノード１５８は、文「Ｂ＝Ａ」に対応している。ノード１５８は識別子「２」を有する。この識別子は、ノード１５８において変化した変数Ｂと共に、テーブル１６２において見出すことが出来る。
【０１１２】
変数ＡとＢは共にノード１５８に関連している。ノード１５８はテーブル１６０に示されたとおり、変数Ａにのみ依存している。テーブル１６２では変数Ａはテーブル１６２の上段の行に入力され、最後に変化したノード１５２に対応して「１」とコード化されている。下段の行では、変数Ｂが最後に変化したのはノード１５８なので、「２」とコード化されている。変数Ｃはソースコード文「Ｂ＝Ａ」では記述されていないので、ノード１５８には関係しないと見なされている。変数Ｃはテーブル１６０，１６２では入力されない。
【０１１３】
図１０は本発明の開示された実施形態に基づいて、データフロー図を生成する工程を図示したものである。この工程は図９から続いている。複製制御フロー図１４６を下流に行く。
【０１１４】
変数Ａは部分データフロー図１７６に示すようにノード１５２において変化する。
【０１１５】
変数Ｂはノード１５８において変化する。ノード１５８はノード１５２において変化した変数Ａに依存する。このことは部分データフロー図１７８の生成およびテーブル１６０，１６２への入力で表示されている。
【０１１６】
変数Ａは再びノード１５９で変化する。ノード１５９はテーブル１６４に示されるとおり、最後にノード１５８にアクセスした変数Ａに依存する。これを反映した新しい部分データフロー図１８２が生成される。
【０１１７】
変数Ｃはノード１６８で変化する。ノード１６８はテーブル１７２に示されるように、ノード１５８において前に変化した変数Ｂに依存する。これで完全なデータフロー図１８４が生成される。
【０１１８】
最終のデータフロー図を生成するにあたり、各ノードはデフォルトにより一度評価される。さらにテーブル１５０の組が追加的に生成されたという事実のため、各ノードは、変数が出現するソースコードのネストレベルにおいて、依存する変数について一度だけ評価する必要がある。例えば、もし文が「ｆｏｒ」文内部にネストされていたらそれは次に「ｉｆ」文に起こり、文に対応するノードは最大３回解かれることとなる。効率はＯ（ｎ＊ｍ）である。ここにｎはノードの数で、ｍは最深のソースコードのネストレベルである。
メタコンストラクタ
【０１１９】
従来は、Ｃ＋＋のようなオブジェクト指向言語は、クラスコンストラクタが実行される以前のデータ要素の初期化は許されていなかった。「．ＮＥＴ」のようなより新しい言語ではデータ要素の早期、即ち宣言時の初期化が許されている。従って、旧言語を使用する場合、データフロー図の生成のためには、関連する割り当て作業や初期化を行うメタコンストラクタを生成することが役に立つ。早期の初期化を確実にするためには、クラスコンストラクタは定常の関数を実行する前にメタコンストラクタを呼び出すように記述されなければならない。
【０１２０】
プログラムリスト３にて、その点を説明するためのソースコード例を示す。変数「ｉ」と「ｊ」は宣言時に初期化されるのであって、コンストラクタにて初期化されない。メタコンストラクタを加えれば、変数が初期化されないというあらゆる問題を避けることができ、データフロー図をより正確に作ることができる。プログラムリスト３のコードにメタコンストラクタを加えたものをプログラムリスト４に示す。
制御依存図
【０１２１】
制御依存図はＳＣＡエンジン２２（図２）によって開発されたソフトウェア技術において周知の図である。データフロー図に相似して、制御依存図（ＣＤＧ）は文相互間の依存性を示し、しかしながら依存性とはデータ依存ではなく、むしろ制御に依存する。それぞれ文Ａは、文Ａを実行すべきか制御する従前の文Ｂに繋がっている。制御依存図では、ノードまたはバーチクルは実行可能な文を表し、エッジは直接制御依存性を表す。制御依存図の生成は電算機のネックとなる問題点であり、本発明の側面により緩和される。  
【０１２２】
再度、図２を参照する。制御依存図は層５４にＣＤＧモジュールを使用して生成される。ここで制御依存図は上記ＣＦＧモジュール４８により生成される制御フロー図から導かれる。
【０１２３】
制御依存図の生成は内容に関してよりは、むしろ形状に関する洞察、即ち制御フロー図の位相空間論から導かれる。制御フロー図の各ノードはソースコードの一行に対応するものと見做される。しかし、今最も興味があるのは制御フロー図の構造である。
【０１２４】
各ノードはここでは「ポテンシャル」と呼ばれ、数値を有し、下位のノードに継承する属性を与えられる。ポテンシャルは数量で、ノード間の互いの制御的影響を反映している。制御フロー図を通じてポテンシャルの継承を追跡することにより、制御依存情報を抽出することが可能となり、それにより正確な制御依存図の生成が可能となる。図の一般的な位相空間や個々のノードの位相順序だけがこの工程では重要である。
【０１２５】
ポテンシャルの継承の結果、継承の経路と出発点の記録が保存されている場合、ノードは先天性および継承したポテンシャルの多くの組合せを有することが出来、其々の構成要素は別々に扱われることが明らかとなる。ノード間のポテンシャルの継承に関し、幾つかの法則が適用できる。
【０１２６】
第１法則。各ノードは初期状態では数値「１．０」を有するポテンシャルを与えられる。これは「先天性」ポテンシャルと呼ばれる。
【０１２７】
第２法則。ノードは保有する全てのポテンシャルを子ノードに継承する。ポテンシャルの数値は直接の子ノード間で均等に配分される。親ノードから子ノードに継承されたポテンシャルは「継承」ポテンシャルと呼ばれる。例えば、制御フロー図１８６において、ノード１は２つの子ノード、ノード２とノード１５を有する。各子ノードはノード１よりポテンシャルの配分０．５を受け取る。ノード２は先天性ポテンシャル１．０と継承ポテンシャル０．５を有する。
【０１２８】
第３法則。子ノードに対する親ノードの先天性ポテンシャルの継承および継承ポテンシャルの継承は、異なった処理として扱われる。
【０１２９】
第４法則。継承されたポテンシャルはその継承元の標識が付けられる。ノードが複数のポテンシャルを複数の継承元から継承した場合、複数のポテンシャルの子孫ノードに対する継承は個別に取り扱われ、個別に計数される。上記のノード２の例では、継承ポテンシャル０．５がノード１から継承したと標識づけされる。
【０１３０】
第５法則。ノードが継承したポテンシャルがちょうど１．０のときその継承したポテンシャルは無効となる。これはノードが子ノードを１つしか持たない場合、のような例で起こる。制御フロー図１８６において、ノード２は子ノードを子ノード４の１つしか持たない。ノード４は第１法則により先天性ポテンシャル１．０を持つ。最初の処理において、第３法則に基づき、ノード２の先天性ポテンシャルはノード４に継承される。ノード４はこのように数値１．０のポテンシャルを継承する。しかしその値は無効となる。第２の処理でノード４はノード２の継承ポテンシャル０．５を継承する。その結果ノード４は先天性ポテンシャル１．０と継承ポテンシャル０．５を有し、後者には継承元ノード１の標識が付けられる。ここに「第１の処理」「第２の処理」という言い方は二つの処理を区別するため任意に決められ、実際の処理の順序には無関係である。  
【０１３１】
第６法則。継承ポテンシャルは第５法則の目的のために、加算的である。例えばあるノードが２つの親ノードからポテンシャル０．５を継承するとする。合計は１．０となり、継承ポテンシャルは無効となる。これは実際制御フロー図１８６のノード１３でおこり、以下で記述される。
【０１３２】
制御フロー図のポテンシャルを評価するにあたり、処理は幅方向に横断的に行われる。しかし、すぐに解を与えられないノードは無視され、後で処理される。あるノードに対し一度演算処理すると、そのノードは再度処理されない。ノードが複数の親ノードを有する可能性を考慮して、横断的処理は深さ優先法で行われる。
【０１３３】
次に図１１を参照する。図１１は本発明に基づいて、制御依存図を作成する第１段階として、制御フロー図のポテンシャルを設定する方法についてのフローチャートである。
【０１３４】
工程の各ステップは典型的な順番で図示されているが、当業者の実施上の選択により
多くの異なる順序に変更することができる。
【０１３５】
最初のステップ１８８では、ソースコードが選択され、制御フロー図が上述のように準備される。ステップ１９０で  一つのノードが選択される。
【０１３６】
次にステップ１９２において、現在のノードが初期化される。先天性ポテンシャルが現在のノードに割り当てられる。本実施形態では与えられる数値は１．０である。しかしその値は、継承されたポテンシャルが先天性ポテンシャルに合計されるか否か、判定できるのであれば他の値であってもよい。
【０１３７】
次に決定ステップ１９４に進む。ここではさらに新しくノードが初期化される必要があるか判断される。答えが肯定であればステップ１９０に戻る。
【０１３８】
決定ステップ１９４の答えが否定であれば、そのノードの初期化が完成され、そのポテンシャルの評価が始まる。次にステップ１９６に進み制御フロー図の未評価のノードが選択される。
【０１３９】
次にステップ１９８に進み、全ての親ノードが評価されたか判定される。親ノードの無い根ノードの場合は、この判定は肯定となる。
【０１４０】
決定ステップ１９８の判定が肯定の場合、以下で記述するステップ２００に進む。
【０１４１】
決定ステップ１９８の判定が否定の場合、現在のノードの評価は全ての親ノードの評価が終わるまで延期される。次にステップ２０２に進む。現在のノードは再処理と標識が付けられる。そしてステップ２０４において現在のノードの未評価の親ノードが選択され、決定ステップ１９８に戻る。
【０１４２】
決定ステップ１９８の判定が肯定の場合、ステップ２００の処理が行われる。全ての継承されたポテンシャルについて、その数値および元のノード名が記録される。後に必要とされる可能性があるので、元のノードの位相順序が記録されることが望ましい。
【０１４３】
次に決定ステップ２０６に進み、現在のノードの先天性ポテンシャル値に継承ポテンシャルの組み合わせのいずれかが合算されるか否か判断される。
【０１４４】
決定ステップ２０６の判定が肯定の場合、ステップ２０８に進む。特定の継承ポテンシャルの組合せは決定ステップ１９８で準備された記録から削除される。次に決定ステップ２０６に戻り、残った継承ポテンシャルを使用してテストが繰り返される。
【０１４５】
決定ステップ２０６の判定が否定の場合、ステップ２１０に進む。現在のノードの全てのポテンシャルは子ノードへの継承のためこの後反復処理され、第２法則に従って分割される
【０１４６】
次にステップ２１２において、評価済みと標識を付けられ、再度処理されることが無いようにされる。
【０１４７】
次に決定ステップ２１４に進み、未評価のノードが残っていないか判断される。判定が肯定の場合、ステップ１９６にもどり新しいノードを選択する。
【０１４８】
決定ステップ２１４の判定が肯定の場合、最終ステップ２１６に進む。ここでは制御フロー図のノードのポテンシャルが制御依存図を作成するのに使われる。詳細は以下で述べる。
【０１４９】
制御フロー図のノードのポテンシャルが確立すると、制御依存図を作成することが出来る。以下の法則が制御依存図の作成に適用される。
【０１５０】
第７法則。ノードが先天性ポテンシャル、値１．０のみを有する場合、そのノードは入口ノードに依存する。（即ち、制御依存図２１８の「入口」ノード）
【０１５１】
第８法則。ノードが異なるノードを元とする複数の継承ポテンシャルを有する場合、対応する制御フロー図の元ノードの内、現在のノードに位相順序が最も近いノードに依存する。
【０１５２】
第９法則。ノードが単一の継承ポテンシャルを有する場合、継承ポテンシャルの継承元ノードに依存する。第９法則は第８法則の平凡なケースである。
【０１５３】
次に図１２を参照する。図１２は本発明に基づき制御依存図を作成する、図１１の詳細フローチャートである。図１１を参照して記述された方式は処理済と仮定する。以下の文はステップ２１６（図１１）の続きである。
【０１５４】
最初のステップ２２０で、制御依存図の入口ノードが確立される。
【０１５５】
つぎにステップ２２２で、制御フロー図の１つのノードが選択される。有解の親ノードへの処理手順は深さ優先順序が適している。
【０１５６】
次に決定ステップ２２４に進み、現在のノードが継承ポテンシャルを有するか判断される。
【０１５７】
決定ステップ２２４の判定が否定の場合、現在のノードは先天性ポテンシャルのみを有すると結論され、第７法則が適用される。現在のノードは直接エントリーノードに依存する。次にステップ２２６に進む。１つのエッジがエントリーノードと現在のノードとの間に確立される。次に以下に述べる決定ステップ２２８に進む。
【０１５８】
決定ステップ２２４の判定が肯定の場合、ステップ２３０に進む。ステップ２００（図１１）において、各継承ポテンシャルの継承元のノード名が記録されたことを思い出す。ステップ２２１では、継承元ノードの位相順序が比較され、継承元ノードか現在のノードに位相順序が最も近いノードが選択される。
【０１５９】
単一の継承ポテンシャルのみの場合は、第９法則が適用される。継承元のノードが選択される。そうでない場合は第８法則が適用される。位相順序が最も近いノードが複数選択された場合は、これら全てのノードが選択される。
【０１６０】
次に、ステップ２３２において、元ノードまたはステップ２３０で選択されたノードと、現在のノードとの間にエッジが確立される。    
【０１６１】
次に決定ステップ２２８にすすみ、制御フロー図の他のノードが処理されるべきか否か判断される。決定ステップ２２８の判定が肯定の場合、ステップ２２２に戻り、新たなノードを選択する。
【０１６２】
決定ステップ２２８の判定が否定の場合、最後のステップ２３４に進む。制御依存図は完成し、処理は終了する。
実施形態４
【０１６３】
次に図１３を参照する。図１３は図１１，１２を参照した手法にもとづき、本発明の実施形態による、制御依存図の作成を図示した複合図である。典型的なソースコード２３６は制御フロー図１８６に展開される。制御用の記号法では、依存図２１８上のノードは制御フロー図１８６上の同等ノードと区別するため付属記号「ｄ」により区別される。
【０１６４】
ノードのポテンシャルの割り当てを、制御フロー図１８６を参照しながら述べる。
【０１６５】
ノード１は最初に処理される。（表１、行１）
【表１】
2010507165.tif 000003
【０１６６】
ノード１は２つの子ノードを有するため（ノード２およびノード１５）、ノード１はそのポテンシャルを子ノード間で分割する。このようにステップ２ではノード２とノード１５はそれぞれポテンシャル値０．５をノード１より継承する。ノード１５は後述する。ノード２は継承ポテンシャル０．５（表１、行２）と先天性ポテンシャル１．０（表１、行３）を有する。ノード２は１つの子ノードを有する。
【０１６７】
ノード４が処理される。ノード２から継承される２つのポテンシャルは別々に処理される。ここで第５法則の議論においてノード４はノード２の先天性ポテンシャルを継承するが、値が１．０だったので削除されたことを思い出す。この処理は表１から省略される。ノード４はノード２からその前の先祖ノード１から伝わる継承ポテンシャル０．５を継承する（表１、行４）。さらにノード４は先天性ポテンシャル１．０を有する（表１、行５）。
【０１６８】
ノード４はすべての継承ポテンシャルを唯一の子ノードであるノード５に継承する（表１、行６）。ノード４は先天性ポテンシャル１．０を有する（表１、行７）。
【０１６９】
ノード５はノード７，１１の２つの子ノードを有し第２法則に従ってそのポテンシャルを配分する。ノード７から述べる。第１の処理でノード５の継承ポテンシャル（表１、行６）の５０％、値０．２５がノード７に継承される。（表１、行８）第２の処理で、ノード５の先天性ポテンシャル（表１、行７）の５０％、値０．５でノード１から継承されて来たもの、がノード７に継承される（表１、行９）。ノード７は先天性ポテンシャル１．０を有する（表１、行１０）。
【０１７０】
次にノード１３が処理される。制御フロー図１８６における処理の順番は必須ではない。ここに記述されている特殊な順序は典型である。しかし親の１つ、ノード１１からの必要情報はまだ決められていないことは明らかである。ノード１３は今のところ評価できず、延期される。
【０１７１】
ノード１１が処理される。処理内容はノード７と同じである。
【０１７２】
ノード１３が再度処理される。ノード１３は同一の第１継承ポテンシャルをノード７（表１、行８）とノード１１（表１、行１１）より、それぞれ値０．２５を継承する。このどちらも元々ノード１より継承したものである。簡便のため、これらは１行に一体化される（表１、行１４）。ノード１３は先天性ポテンシャル１．０を有する（表１、行１５）。さらにノード１３は同一の第２継承ポテンシャルをノード７（表１、行９）とノード１１（表１、行１２）より、それぞれ値０．５を継承する。第２継承ポテンシャルはそれらの共通の親ノード５より継承された。その合計は１．０となり、第２法則により削除される。（表１、行１６）
【０１７３】
最後にノード１５が処理される。第１の処理で親ノードの一つであるノード１の先天性ポテンシャルの５０％、値０．５（表１、行１７）を継承する。第２の処理で、もう一つの親ノード１３から、継承元を同じノード１とする継承ポテンシャル（表１、行１４）がノード１５に継承される（表１、行１８）。これらの２つの継承されたポテンシャルの合計は１．０なので、第５法則により削除される。ノード１５には先天性ポテンシャル１．０が残される。（表１、行１９）。
【０１７４】
制御依存図２１８の作成は説明された。
【０１７５】
ノード１は先天性ポテンシャル、値１．０のみを有する。これは制御依存図２１８のノード１ｄに示され、第７法則によれば、ノード「入り口」に依存する。
【０１７６】
ノード２はノード１より継承した１つの継承ポテンシャル（表１、行２）を有する。結果的にノード２ｄは第９法則により、ノード１ｄに依存する。
【０１７７】
ノード４はノード１より継承した１つの継承ポテンシャル（表１、行４）を有する。したがってノード４ｄもノード１ｄに依存する。
【０１７８】
ノード５は１つの継承ポテンシャル（表１、行６）を有する。したがってノード５ｄもノード１ｄに依存する。
【０１７９】
ノード７は、ノード１とノード５からの２つの継承ポテンシャル（表１、行８，９）を有する。第８法則が適用される。制御フロー図１８６を参照すると、ノード５は位相順序がノード１より数値が大きい。したがってノード７ｄはノード５ｄに依存する。同様に１１ｄは５ｄに依存する。
【０１８０】
ノード１３はノード１を継承元とする１つの残った継承ポテンシャル（表１、行１４）を有する。ここでノード７を継承元とする２つの継承ポテンシャル（表１、行１６）が削除されたことを特記するとノード７ｄが依存先の候補から抹消されることになる。ノード１３は、第９法則にしたがいノード１に依存する。
【０１８１】
ノード１５は先天性ポテンシャル、値１．０のみを有し（表１、行１９）、継承ポテンシャル（表１、行１７，１８）は削除された。ノード１５は、第７法則によりノード「入口」に依存する。
【０１８２】
制御フロー図１８６および制御依存図２１８を作成するにあたり、各ノードは一度しか評価されない。解を表１のようなハッシュ表に保存することにより、ｎを図のノード数として、総合効率Ｏ（ｎ）が得られる。
システム依存図
【０１８３】
データフローと制御依存をシステム全体に渡って見てゆくために、両図は繋がっている。図２を再び参照して、本工程は層５８において、「ＣＤＧ＋ＤＦＧモジュール」６０を使用して実行される。システム依存図（ＳＤＧ）はより大きな、応用プログラムも包含する制御フロー図と考えてもよい。システム依存図は制御フロー図と同じ構成要因を有するが、ＣＦＧモジュール４８がスタブを生成するかわりに、「ＣＤＧ＋ＤＦＧモジュール」６０は呼出されたメソッドの単一方式制御フロー図にエッジを加える。１つのメソッドは１回以上呼ばれるので呼出し、返戻に際しコードが付帯する。コードは多様な方法で供給される。図は説明の場合を除いて一般的には表示されない。多態性システムでは、全ての可能な経路が形成される。
【０１８４】
データフローと制御依存を応用プログラム全体に渡って見てゆくためには、単一メソッド図にリンクする必要がある。制御依存図の場合は、呼出しメソッドの呼出しノードと呼出されたメソッドの入口ノードとの間にリンクが確立する。このことは、呼出されたメソッドの全てのソースコード文は呼び出し文に制御上依存するということを意味する。
【０１８５】
データフロー図は、とくにオブジェクト指向言語を使用する場合より複雑である。以下の３つの課題に対処する必要がある：
【０１８６】
第１に、オブジェクト指向言語では、パラメータは複数のデータ要素を含み、そのデータ要素はさらに別なデータ要素を循環的に含む可能性がある。データフローを追跡するには、各データ要素、ステップを個別に取り扱う必要がある。実際には、単一のパラメータを受け取る単純関数では、データフロー図において多くのパラメータが処理されるように、データ構造の拡張が必要となることがある。
【０１８７】
第２に、オブジェクト指向言語では、現在活性化しているオブジェクトを意味する「ＴＨＩＳ」オブジェクトが存在する。「ｔｈｉｓ」オブジェクトに関する情報は、メソッド呼出しの間で処理され正確にデータフローを記述しなければならない。この課題は「ｔｈｉｓ」オブジェクトを各呼び出されたメソッドに対する第１パラメータとして取り扱うことにより解決する。
【０１８８】
第３に、このグローバル変数は、応用プログラムのどこからでもアクセスされるので、もう一つの複雑な問題を提起する。このことは序列的なオブジェクト指向プログラム作成において例外である。この問題は、全てのメソッドにパラメータとして作用する「超グローバル」変数を定義することにより、グローバル変数は「超グローバル」変数のデータ要素として登録される。「超グローバル」変数が他のパラメータと共に展開される場合、そこに含まれるグローバル変数も呼出されるメソッドに渡される。
【０１８９】
リスト５は以上３つの課題を取り扱うリストである。最初に単一のパラメータが関数  ｆｕｎｃ（）に渡されるように見える：
Public void func(myClass ins)
【０１９０】
第１ステップで、「ｔｈｉｓ」オブジェクトと「超グローバル」変数が加えられる。ここで関数は次のように表示される：
Public void func(THIS,SuperGlobal,myClass
ins) 
【０１９１】
第２ステップで、各パラメータのデータ要素が展開される。「ｔｈｉｓ」オブジェクトは１つのデータ要素（ｖａｒ３）を含み、「超グローバル」変数は１つのデータ要素（セッション「ハロー」）を含み、「ｉｎｓ」は２つのデータ要素（ｖａｒ１，ｖａｒ２）を含む。展開の後、関数は次のように表示される：
Ｐｕｂｌｉｃ  ｖｏｉｄ  ｆｕｎｃ（ＴＨＩＳ，  ＴＨＩＳ．ＶＡＲ３，  ＳｕｐｅｒＧｌｏｂａｌ，  ＳｕｐｅｒＧｌｏｂａｌ．Ｓｅｓｓｉｏｎ−Ｈｅｌｌｏ，  ｍｙＣｌａｓｓ  ｉｎｓ，  ｉｎｓ．ｖａｒ１，  ｉｎｓ．ｖａｒ２）．
【０１９２】
次に図１４を参照する。図１４は、本発明の実施形態における、ソースコード２３９による制御フロー図のスタブ交換を図示したものである。パラメータの展開後、単一メソッド制御フロー図の関連ノードがもう一つの単一メソッド制御フロー図の開始部と連結する。同様の連結が終結部でも行われ、変数を戻す。図１４では呼出し関数、ｆｕｎｃ１（）は左側のノードグローバル列２３８として表示され、呼出される関数、ｆｕｎｃ２（）は右側のノード列２４０として表示される。エッジ２４２，２４４はそれぞれ呼び出しと返却の時点でこれらの関数を繋ぐ。上記のように、これら連結の色はＣＤＧ＋ＤＥＧモジュール６０（図２）によりオペレータの便利のため割り当てられる。連結工程は繰り返され、より大きな、システム依存図のような応用プログラムにまで及ぶ図を作成することができる。
ＤＯＭ操作
【０１９３】
オブジェクト指向データベースに文書オブジェクトモデルが内包されることが好ましい。この目的のための好適なデータベースにはｄｂ４ｏ社（１９００  Ｓｏｕｔｈ  Ｎｏｒｆｏｌｋ  Ｓｔｒｅｅｔ，  Ｓｕｉｔｅ  ３５０，  Ｓａｎ  Ｍａｔｅｏ，  ＣＡ，  ９４４０３）製モデルｄｂ４ｏ、およびＶｅｒｓａｎｔ  Ｃｏｒｐｏｒａｔｉｏｎ社（２５５  Ｓｈｏｒｅｌｉｎｅ  Ｄｒｉｖｅ，  Ｓｕｉｔｅ  ４５０，  Ｒｅｄｗｏｏｄ  Ｃｉｔｙ，  ＣＡ  ９４０６５）製ＶｅｒｓａｎｔＴＭオブジェクトデータベースがある。
【０１９４】
この手法の利点は文書オブジェクトモデルの保存と回収が早いため再演算の必要性が無いことがあげられる。データベースの保存により、静的特性のソースコードの問い合わせ、即ち、ＯＱＬのような照会言語を使用することが可能になる。さらにオブジェクトデータベースの助けにより、コードの自動更新が可能となることがある。
【０１９５】
次に再度図２を参照する。層６２はオブジェクト指向データベース６４を含む。プログラムリスト６はデータベース６４を使用した保存と回収の工程を示す。プログラムリスト７は、公的データ要素が私的データ要素に変換される、文書オブジェクトモデルの取り扱い事例である。
コード図照会
【０１９６】
これまでの記述はソースコードについての生の情報の開発についてであった。その情報を処理可能な知識に変換するため、データマイニングが必要となる。この要求を満たすには２つの方法がある：
【０１９７】
第１の方法は、埋め込み式でカスタム化された関数を使用することである。このような関数はひとたび開発されると簡単に使えるが、柔軟性に欠け、特定の応用プログラムや特定の顧客の要求に適用するのが困難である。
【０１９８】
他の方法は、照会言語の使用である。この言語は柔軟で必要となる可能性のある静的、動的な知識をデータから回収することができる。しかし効果的に使用するためには使用者の記述能力が必要となる。
【０１９９】
ＳＣＡエンジン２２は特殊な組み込み関数により拡張された照会言語を使用している。これは上記２つの方式の利点の全てを有している。使用が容易で、高度な構成が可能である。熟練ユーザは特殊な必要性に対し、「ポイントとクリック」するだけで、照会方法を自作でき、最初から照会文を作成できる。
【０２００】
照会言語で開発された構文は、構成保存か意味保存の方式により、コード切削に使用可能である。コード切削は複雑さを削減し、デバッグやプログラムの理解を助ける。プログラム切削の要点は、焦点となっている場所で、変数の値に影響を与えないプログラムの文を削除することである。プログラム切削はよく知られた技術である。
実施形態５
【０２０１】
この実施形態は、プログラムリスト８のコード部分に従ってのコード切削を図示している。何が４行目の「Ｗｒｉｔｅ」文に影響を与えるかを学習することが望ましい。コードは分析されるか、構成を保存して「後方切削」される。「切削」工程は焦点となっている場所において特定の変数に影響を与える全ての構文を探し出し、焦点となっている場所から後戻りして演算される。「構成保存」型切削では、原プログラムの構成は大きく変更されない。無関係の構文は切削により単に削除される。
【０２０２】
文「ａ＋＋」（３行目）、「ａ−３」（１行目）は明らかに関連がある。切削の結果はプログラムリスト９に示す。削除されたコードは破線で表示される。しかし結果は正確にコンパイルしない。３行目では変数「ｂ」の値が設定されている。しかし変数「ｂ」は一度も宣言されていない。このプログラム部分は純粋な構成保存型切削を使用することの欠点を示している。構文は関連する表現と関連しない表現が混在する可能性があり、その場合、この処理結果はコンパイルしない。  
【０２０３】
解決法は、よく知られた「意味保存型」切削を使用することであり、そこでは意味が保存される変換しか許容されない。これは制御フロー図のブロックを切り離して、単一アクションを表す原子要素にすることにより達成される。この技術を適用することによりプログラムリスト１０のコード断片が得られる。
【０２０４】
本実施形態の照会言語は表２に示すコマンドを含む。ここにＸとＹはオブジェクトの配列である。 
【表２−１】
2010507165.tif 000004
【表２−２】
2010507165.tif 000005
【０２０５】
表２のコマンドを使用することにより、どんな型の被依存要素（データ、制御）または実行（制御フロー）でも、どの順序（「Ｂｙ」、「Ｏｎ」）でも容易に演算される。
実施形態６
【０２０６】
表２のコマンドを使用した次の問い合わせは、ブール値を真から偽に変更する応用プログラムにおける効果を明らかにしている：
Ｒｅｓｕｌｔ＝Ａｌｌ．ＩｎｆｌｕｅｎｃｅｄＢｙ  （Ａｌｌ．ＦｉｎｄＢｙＮａｍｅ（「ｎａｍｅｓｐａｃｅ１．ｃｌａｓｓ１．ｂｏｏｌｌ」））．
【０２０７】
変数Ａまたは変数Ｂにより影響され、但し両方に影響されないデータの場所全てを検索するために、次の問い合わせを使用する：
Ｒｅｓｕｌｔ＝Ａｌｌ．ＤａｔａＩｎｆｌｕｅｎｃｅｄＢｙ  （Ａ）  ／  Ａｌｌ．ＤａｔａＩｎｆｌｕｅｎｃｅｄＢｙ  （Ｂ）；
【０２０８】
オブジェクト＃３に影響を与え、オブジェクト＃５に影響される全ての場所を探すためには、問い合わせは繋いだものとなり：
Ｒｅｓｕｌｔ＝Ａｌｌ．ＩｎｆｌｕｅｎｃｉｎｇＯｎ（Ａｌｌ．ＦｉｎｄＢｙＩＤ（３））．ＩｎｆｕｅｎｃｅｄＢｙ（Ａｌｌ．ＦｉｎｄＢｙＩＤ（５））．
問い合せの供給
【０２０９】
問い合わせを行うにあたって大変な労力が費やされるのは、大きな図において特定のオブジェクトを探すことである。問い合わせ、特に表２にあるような問い合わせをするための様々な方法が用いられてきた。これらの方式は一般的には異なる型のオブジェクトを検索するものである。共通検索方法は前向き／後ろ向きの終止符を特定の位置から返す。特定の問い合わせに関わった各メソッドは、終止符の結果を読み取る。異なる色により識別されず、一つの同じノードを無限に処理することを避けるため、上記の処理が行われる。
【０２１０】
次に図１５を参照する。図１５は、典型的な制御依存図２４６，２４８，２５０であり、本発明の実施形態による「「蛙飛び」囲い込み計算」アルゴリズムを示す。
【０２１１】
図１５では、サブ図２５０で一番判りやすいが、エッジ２５２，２７２（赤）エッジ２５４，２５６（緑）がそれぞれ判りやすい表示をされ、それぞれ関数への、または、からの呼び出しまたは返戻を表している。エッジ２５８，２６０（青）が色表示されているのも同様の理由である。
【０２１２】
処理のための横断は、以下の法則により、標識を付けられるか、色を付けられる。
【０２１３】
第１０法則。図は初期は標識付けされない。
【０２１４】
第１１法則。図の無標識部分は、スタブが、関数のソースコードに繋がる部分により置換されたことを表して、標識付けされるか色付けされる可能性がある。
【０２１５】
第１２法則。図の標識付き部分はその後の横断において飛び越される可能性がある。
【０２１６】
各々の部分の境界部分だけが標識付け、色付けされれば、中間部分は標識付けされていると見做されるので、十分である。スタック法では、この境界標識は先入れ後出し操作と相互に関連する。
【０２１７】
サブ図２４６の検索操作または終了操作における最初の横断処理はノード２６２（ａ）から２６４（ｅ）に向かって行われる。ほとんどのノードは無標識である。しかし最初の横断処理においてノード２６２が選択された。ノード２６２はソースコードの幾つかの関数への入り口である。エッジ２５２は第１１法則に基づいて「赤」に塗られる。関数からの戻り発生した場合、適合部分に標識付けする準備として、「赤」がスタックの上に置かれる。
【０２１８】
サブ図２４８において、横断処理はノード２６６とノード２６８に囲まれた部分に至る。これらのノードはそれぞれ、もう一つの関数からの呼び出しと、返戻を表す。ノード２６６において、表示「青」がスタックの上に置かれる。
【０２１９】
ノード２６８を出るときに、エッジ２６０の「青」表示とノード２６８との相互関連で表示「青」がスタックから取り出される。
【０２２０】
第１関数の返戻が起こっているノード２７０の１つの枝において、エッジ２７２は「赤」に塗られる。表示「赤」はスタックから取り出される。このようにして、ノード２６２からノード２６４（ｅ）への横断処理は特別な処理なく終了した。
【０２２１】
結果的に第２の横断処理はノード２７４（ｂ）から２７６（ｆ）までとなる。エッジ２５４は、最初は第１０法則に基づいて無標識であるが、第１関数が他の場所から再び呼び出され、表示「緑」がスタック上に置かれる。この処理は上記のエッジ２５２の処理と同じであるが、エッジ２５２とエッジ２５４の表示は識別可能である。
【０２２２】
横断処理はノード２６６に至る。しかし、以前のノード２６６、エッジ２５８、ノード２７８、ノード２８０の横断処理および第２関数の呼び出しが再度確認される。この処理の部分、破線２８２で示された部分の処理は第１２法則により跳び越し処理される。
【０２２３】
図のこのような収縮は、多くの横断処理を飛び越し、またはコードの大きな部分表す可能性の有る従前に標識の付いた部分、を「蛙飛び」することを可能にする。ノード２８０，２７８とその入出エッジを含み、ノード２６６とノード２６８間の収縮は完成した。いまやノード２７４とノード２７６との間の処理をする場合、「青」のエッジで表示された部分は跳び越され、処理されない。この部分は既に囲われているので、情報は失われない。演算処理はこの「蛙飛び」処理によりコードのある部分を跳び越すことにより加速される。第２の横断処理は破線２８２に従う。
【０２２４】
ノード２７０を出て、第１関数の二度目の呼び出しからの返戻に対応して、表示「緑」がスタックから取り出され、エッジ２５６は緑に着色される。次の横断処理（不図示）がエッジ２５４，２５６に繋がる経路の場合は、ノード２８４，２８６で囲まれる部分が収縮され、この部分は破線２８２より大きい。
脆弱性問い合わせ
【０２２５】
再び図２を参照する。上述のＳＣＡエンジン２２の層はコード問い合わせの基盤を提供する。以下ではコードの脆弱性の探索のための応用プログラムについて説明する。
【０２２６】
リストに掲載されていないものも含め、以下の脆弱性およびその問題は検出可能である：未評価入力、継続的攻撃、最小特権、論理的誤謬、ＧＵＩ無しの頁、機密情報の表示、仮想ディレクトリからの入出力、データ有効性、破壊されたアクセス制御、保護メソッド、源感受型ウィザード
未評価入力
【０２２７】
未評価入力は入口点を有する応用プログラムへの攻撃者を明らかにする。ユーザからの入力の無い、入口点の無い応用プログラムは攻撃されることは少ない。入力評価はユーザからの入力が既定のルールに従っているかを評価する。しかしこの課題は開発者が時々無視しまたは、必要な要素を提供し忘れることがある。
【０２２８】
ＳＣＡエンジン２２はデータフロー図を使用し、未評価の入力サイトを発見する。この目的で、データフロー図の各ノードは３つの分類に分けられ、［１］，［２］，［３］と表示される。応用プログラムの入口点は分類［１］。この点は安全でない入力を含む可能性がある。分類［２］は、入力評価関数で入力データを除菌する。分類［３］はデータが使用される場所である。ＳＣＡエンジン２２は、分類［３］において評価を行い、受け入れ可能なデータのみ処理される。
【０２２９】
次に図１６を参照する。図１６は、本発明の実施形態に従った、コンピュータプログラムの中で未評価の入力が無いかを探す手法についてのフローチャートである。以下に示す方法では、複数のノードを除去するフロー図の囲い込みが存在する。このような囲い込みは、ある条件文の評価の必要を無くし、図の横断処理の効率を向上させる。最初のステップ２８８では、例えば図８を参照して記述されたような、データフロー図が用意される。前述の「蛙飛び」法を適用して、図の横断処理が始まる。
【０２３０】
ステップ２９０では、１つのノードが選択され上記により分類される。
【０２３１】
次に決定ステップ２９２に進み、現在のノードが入力評価関数であるか判定される。
【０２３２】
決定ステップ２９２の判定が肯定なら、ステップ２９４に進む。現在のノード及び入りエッジ、出エッジはデータフロー図から削除される。
【０２３３】
ステップ２９４終了後、または決定ステップ２９２の判定が否定なら、決定ステップ２９４に進み、データフロー図で処理すべきノードがまだあるか判定される。決定ステップ２９４の判定が否定なら、ステップ２９０に戻る。
【０２３４】
決定ステップ２９４の判定が否定なら、処理の第１段階は終了した。データフロー図には分類［１］と［３］のノードのみ残される。
【０２３５】
ステップ２９８に進み、分類［１］のノードが選択される。
【０２３６】
次にステップ３００に進み、現在のノードから離れたエッジが選択される。
【０２３７】
次に決定ステップ３０２に進み、入力が使用されるノード（分類［３］）に現在のエッジが届いているか判定する。決定ステップ３０２の判定が肯定なら、ステップ３０４に進む。現在の経路は非安全と分類される。
【０２３８】
ステップ３０４終了後、または決定ステップ３０２の判定が否定なら、決定ステップ３０６に進み、現在のノードから出ているエッジがまだあるか判定される。
【０２３９】
決定ステップ３０６の判定が肯定なら、ステップ３００に戻る。
【０２４０】
決定ステップ３０６の判定が否定なら、決定ステップ３０８に進み、データフロー図内に分類［１］のノードがまだあるか判定される。決定ステップ３０８の判定が肯定なら、ステップ２９８に戻り、新しいノードが選択される。
【０２４１】
決定ステップ３０８の判定が否定なら、データフロー図は全て評価済みである。最後のステップ３１０に進み、処理は終了する。
【０２４２】
この方法の別の実施形態では、分類［３］のノードがステップ２９８で選択され、分類［１］のノードと分類［３］のノードの繋がりが、分類［３］のノードに入るエッジの評価により決定される可能性がある。
実施形態７
【０２４３】
図１７を参照する。図１７は、本発明の実施形態に従って、データフロー図を処理し、未評価入力の脆弱性を判定することを示す。データフロー図３１２，３１４はコード３１６に対応している。分類［１］，［２］，［３］のノードが表示されている。
【０２４４】
図１６のメソッドが終了したとき、分類［２］ノード３１８が見つけられ、サブ図３１４のとおり削除される。サブ図３１２では、エッジ３２０は分類［１］ノード３２２とノード３１８を繋げる。サブ図３１４ではエッジ３２０は終了しているのが明らかである。
【０２４５】
ステップ２９８（図１６）から始まる処理が行われるとき、エッジ３２４，３２６は分類［１］ノード３２８と分類［３］のノードを繋げていることが判り、従って非安全と報告される。分類［１］ノード３２８は安全性に脆弱性を有すると判定される。表３に示すように、この技術の変形により、複数の型のウィルス注入による脆弱性を発見することが出来る。図３はノードの分類とそれに対応する注入ウィルスの型を対応させている。
【表３】
2010507165.tif 000006
連続攻撃
【０２４６】
連続攻撃は２つの段階でおこる。第１段階はサーバに危険な荷物を保存する。第２段階では、典型的には潜伏後、その荷物が実行される。影響が潜伏しているため手動により脆弱性をみつけるのは困難である。図１６および１７におけるメソッドは、保存関数を（入口点の代わりに）分類［１］に分類することに変更すれば、このような脆弱性を発見することが出来る。
【０２４７】
当業者にとって明白な変更により、未評価入力の議論であった相互入力を取り扱う代わりに、データをデータベースより直接引き取ることで、その方法は次の脆弱性を検知することが出来る：第２段階ＳＱＬ注入、連続的ＳＱＬ注入、システム間攻撃、連続サイト間スクリプト攻撃（ＸＳＳ攻撃）。
実施形態８
【０２４８】
プログラムリスト１１のコード部分を考える。そのコードはデータベースに対し、３のｉｄを持つ人物の名前を問い合わせる。そして、第２の問い合わせで入手した名前でその人物の階級を入手する。たとえ名前がデータベースに保管される以前に殺菌されていても、即ち、二重引用符で囲われていても、１つの引用名（「「Ｏ」Ｂｒｉａｎ」）はデータベースより取り出される。応用プログラムの性質により、保存データの引渡しや実行のやり方により、２度目の問い合わせはある様式の攻撃、時に「第２段階ＳＱＬ注入」と呼ばれる攻撃に晒される。
最小特権
【０２４９】
最小特権はＩＴの安全対策ではよく知られた言葉である。その考えの背景は、いかなる実体、ユーザであれ、応用プログラムであれ、サービスであれ、それが正しく働くために必要な権限のみを有し、それ以上は有しない、という考えである。考えは単純だが、その実行は手間がかかる。この困難さは、表２を参照して説明された上記照会言語を使用し、特権を特定して、その特権を特定する構成ファイルを自動生成することにより軽減される。
【０２５０】
コードをスキャンし、応用プログラムや有権限ユーザからのアクセスが不要なプログラムオブジェクトへのアクセスを拒否することにより、無権限使用をも防ぐ。
実施形態９
【０２５１】
次の文は最小特権構成ファイルへの入り込みで、保存された手順「ｘｐ．．ｃｍｄｓｈｅｌｌ」へのアクセス許可を取り消す。そのようなアクセス許可はデータベースサーバーに遠隔アクセスを許容する可能性を有し、脆弱性となる。
Ｉｆ  （！Ｃｏｄｅ．Ｅｘｅｃｕｔｅ（ＳＱＬＳｔｏｒｅｄＰｒｏｃｅｄｕｒｅ（「ｘｐ．．ｃｍｄｓｈｅｌｌ」）））
ＳＱＬＳｃｒｉｐｔ．Ａｄｄ（ＲｅｍｏｖｅＰｅｒｍｉｓｓｉｏｎｓ（「ｘｐ．．ｃｍｄｓｈｅｌｌ」）
【０２５２】
上の問い合わせは次の内容を含む.ＳＱＬ構成ファイルを作成する。
【数１】
2010507165.tif 000007
【０２５３】
これは保存された手順「ｘｐ．．ｃｍｄｓｈｅｌｌ」を削除する。
最小特権
【０２５４】
よく知られているファイルシステムＮＴＦＳ(ＮＴ  Ｆｉｌｅ  Ｓｙｓｔｅｍ)は、特定のファイルとフォルダーに定義されるのを容認する。上記照会言語を使用して、コードを質問することにより、応用プログラムでどのファイルとフォルダーにアクセスされるか、そして、どういうアクセスが必要であるかを学ぶことが出来る。それ以外は全て拒否される。ＳＣＡエンジン２２（図２）はオペレータが手動で許可を構成できるダイアログボックスを提示する。ＮＴＦＳ以外のファイルシステムにも同じアプローチが適用できる。
論理欠陥
【０２５５】
論理欠陥はある特定の応用プログラムに固有である。これらはコード化の誤りで、応用プログラムの規格に準拠していない。そのような欠点は上述の照会言語とＳＣＡエンジン２２（図２）を使用することにより検出できる。
【０２５６】
この技術は、例えば、応用プログラムで指定されたビジネス論理に違反するなど、論理的な欠陥から由来する多くの型の脆弱性を検知する。明確な事例は、パスワードや、クレジットカード番号や、社会保険番号などの秘密情報の表示である。他の例は忘れられたデバッグコード、負数の注文、および裏口などである。
実施形態１０
【０２５７】
以下の文は、管理者でもないのに、管理特権の無いユーザが、別のユーザの注文を見ることが許可されるという論理的な脆弱性を見つけるために、オープンソース書店で実行された問い合わせである。
Ｒｅｓｕｌｔ＝ＦｉｎｄＰｌａｃｅｓＷｈｅｒｅ（ＯｒｄｅｒｓＲｅｔｒｉｅｖｅｄＦｒｏｍＤＢ＆＆
ｐａｇｅＰｅｒｍｉｓｓｉｏｎ！＝Ａｄｍｉｎｉｓｔｒａｔｏｒ＆＆
ｄａｔａＮｏｔＩｎｆｌｕｅｎｃｅｄＢｙ（ｕｓｅｒＩｄ）．
ＧＵＩアクセスの無い頁
【０２５８】
インターネットからはアクセスできるが、ＧＵＩからアクセスできない頁とは、通常、「不鮮明によるセキュリティ」技術の使用であり、即ち、デザインの秘密または、セキュリティ提供上の行為に起因する。このアプローチは、応用プログラムのセキュリティ脆弱性の可能性を認め、欠点が知られておらず、したがって、攻撃者がそれを発見しないと信ずることに依拠する。この不人気なアプローチは、ある応用プログラムが隠れたセキュリティの脆弱性を有し、特定の精査の必要があることをオペレータに警告する。
実施形態１１
【０２５９】
次の問い合わせは上記のタイプの脆弱性を検知する。
ＦｉｎｄＡｌｌＰａｇｅｓ  −  ＦｉｎｄＵＩＰａｇｅＡｃｃｅｓｓＣｏｍｍａｎｄ．ＡｃｃｅｓｓｅｄＰａｇｅ
機密情報の表示
【０２６０】
パスワードやクレジットカード番号など幾つかの変数はユーザから常に引き出され、表示されない。1つの脆弱性では、ウェブページの「隠された」分野は、ブラウザの「ソースを見る」オプションを使用することで表示可能である。
実施形態１２
【０２６１】
以下の問い合わせは、秘密情報の表示を可能にする脆弱性を検知する。:
Ａｌｌ．ＦｉｎｄＳｅｎｓｉｔｉｖｅＶａｒｉａｂｌｅｓ（）．ＤａｔａＩｎｆｌｕｅｎｃｉｎｇＯｎ（Ｆｉｎｄ＿Ｏｕｔｐｕｔｓ（））．
仮想ディレクトリからの入出力
【０２６２】
仮想ディレクトリに適用された入出力操作は、データを露出する可能性がある。何故ならば、別の方法で構成されない限り、仮想ディレクトリはすべてのユーザによる読み出しを可能にする傾向があるからである。
実施形態１３
【０２６３】
以下の問い合わせはこの脆弱性を検知する。:
Ｆｉｎｄ＿Ｆｉｌｅ＿Ａｃｃｅｓｓ（）．ＮｏｔＤａｔａＩｎｆｌｕｅｎｃｅｄＢｙ（ＡｂｓｏｌｕｔｅＰａｔｈ．
データ合法化関数
【０２６４】
データ合法化関数はよく知られた技術である。その有用性にもかかわらず、あるプログラマは独占的に入力承認関数を開発する可能性がある。ＳＣＡエンジン２２（図２）はよく知られている、ソフトウェア故障の木解析（ＳＦＴＡ）を使用する。ＳＦＴＡは例えば、つぎのドキュメントで議論されている。Ａ  Ｓｏｆｔｗａｒｅ  Ｆａｕｌｔ  Ｔｒｅｅ  Ａｐｐｒｏａｃｈ  ｔｏ  Ｒｅｑｕｉｒｅｍｅｎｔｓ  Ａｎａｌｙｓｉｓ  ｏｆ  ａｎ  Ｉｎｔｒｕｓｉｏｎ  Ｄｅｔｅｃｔｉｏｎ  Ｓｙｓｔｅｍ、Ｇｕｙ  Ｈｅｌｍｅｒ  ｅｔ  ａｌ．  （２００１），
インターネット出版。
【０２６５】
再び図２を参照して、層６６のＳＦＴＡエンジン６８は、コードで見つかる可能性のあるデータ承認関数の能力を評価する。
【０２６６】
図１８を参照する。図１８は本発明の実施形態に基づいた、典型的な独自のデータ承認関数の処理を図式的に示す。これは層６６（図２）に起こる。ソースコード３３０として表示された関数は、文字「アポストロフィ」のストリングｓでの発生を代替することを目的とする。ソースコード３３０は１つの「ｆｏｒ」ループ、１つの「ｉｆ」ブロック、および割り当て文を含む。
【０２６７】
ソースコードを実行する前にストリングｓがＮ番目の位置に引用符を含むと仮定する。引用符がソースコード３３０の「ｆｏｒ」ループの完成後も残るか否か決定するのが望ましい。コードを通じて3つの可能な経路があるのを確認することから始める:
【０２６８】
１．プログラムは「ｆｏｒ」ループには入らない。
【０２６９】
２．プログラムは「ｆｏｒ」ループには入るが、「ｉｆ」文はある理由で決して「真」とは評価しない。
【０２７０】
３．プログラムは「ｆｏｒ」ループにも「ｉｆ」ブロックにも入るが、割り当てられる表現は引用符を適所に残す。
【０２７１】
これらの可能性はサブ図３３２に示されている。３番目の可能性は、サブ図３３２のブロック３３４によって示されるように、不可能であり、ＳＣＡエンジン２２の目的のため更に考慮する必要は無い。
【０２７２】
最初の可能な経路に対応している、ブロック３３６に示されていたオプションを考慮する。「ｆｏｒ」ループは「ｉｆ」ブロック即ち、「ストリングの長さが２未満であれば」を実行しない。「ｓ」が引用符だけを含む単一文字ストリングであれば、この関数は「誤」となる。
【０２７３】
２番目の可能な経路はブロック３３８で表わされる。プログラムは「ｆｏｒ」ループに入ったが、「ｉｆ」文はストリングがＮ番目の位置に引用符を含んでいても「虚偽」を戻す。これは「ｉ」が「Ｎ」に決して達しない場合にだけ起こり、即ち以下の式で起こる。
言い換えれば、引用符が長さで1文字を超えるストリングの端にあると、関数は「誤」となる。
【数２】
2010507165.tif 000008
【０２７４】
全工程は合成グラフ３４０に示される。そこでは、２つの欠陥３４２、３４４が円で囲われている。
自動ユニット試験
【０２７５】
再び図２を参照して、例えば図１７のデータ承認関数を、層７０のユニット試験エンジン７２に挿入することで、自動的に試験して、データ合法化が失敗するシナリオが特定される。従来のテスト発生プログラムを使用し、被評価関数はテスト応用プログラムに埋め込まれ、テストケースが生成する。テスト応用プログラムが実行されるとき、出力は評価エンジンに提供され、結果はセキュリティの脆弱性を示すことができる。
壊れたアクセス制御
【０２７６】
この脆弱性では、認証されたユーザの処理可能事項に関する制限は適切に実行されない。例えば、攻撃者は、他の使用者口座へのアクセス、機密のファイルの閲覧、無権限の関数の使用といった脆弱性を利用できる。そのような脆弱性の場所を見つける際に、上記の照会言語を使用し、ある評価基準の規則遵守が必要であるとき、例えばユーザ承認の時、にだけ呼ばれるページを特定するが、ユーザがその頁を使用中は検査しないように、問い合わせを設計することが出来る。
実施形態１４
【０２７７】
この例では、「 /アドミン」という名の頁は変数「ＩｓＡｄｍｉｎ」が「１」のときのみ呼び出される。しかし、ページ自体はその状態をチェックしない。そして、明白にその頁を呼ぶと、アクセス制御は破壊される。プログラムリスト１２で示される処理にある問い合わせが、その脆弱性を検出する。
保護手段の自動発見
【０２７８】
前記の問い合わせのいくつかは、ユーザが、応用プログラムの何らかの情報、例えば、入力を殺菌するのにどの関数が使用されるか、主要な暗号情報はどこに保存されるか、を提供するのを必要とする。自動的にこれらの質問の答えを見つけるのにいわゆる「問い合わせのお助け」を使用できる。例えば、データ・アクセス層（ＤＡＬ）の方法論を明らかにする質問は、ユーザがＤＡＬ方法論を定義する必要なく、ＳＱＬ注入脆弱性の識別において役に立つ。
細部最適化問題
【０２７９】
ＳＣＡエンジン２２（図２）は、ソースに敏感なウィザードを使用して問い合わせを生成する脆弱性発見プロセスを補助する。基本情報に加えて、ＳＣＡエンジン２２の内蔵の問い合わせには、問い合わせが実行されるべきか否かを決定する条件を具備している。このウィザードはソースコードに敏感なウィザードで、そのため、特定のソースコードに対し条件が満たされているかを判定するため、関連した質問をする。例えば、応用プログラムがデータベースにアクセスしない場合、すべてのデータベースに関連した質問を削除する。
【０２８０】
本発明は上記で特に示され、説明されたことに限定されないことは、当業者によって理解される。むしろ、本発明の範囲は、上記の説明を読めば当業者が想到できる、従来技術に無い、上記で説明された様々な特徴の変化形や修正形のみならず、組み合わせとサブ組み合わせ含む。
プログラムリスト  
【０２８１】
プログラムリスト１
【数１Ｐ】
2010507165.tif 000009
【０２８２】
プログラムリスト２
【数２Ｐ】
2010507165.tif 000010
【０２８３】
プログラムリスト３
【数３Ｐ】
2010507165.tif 000011
【０２８４】
プログラムリスト４
【数４Ｐ】
2010507165.tif 000012
【０２８５】
プログラムリスト５
【数５Ｐ】
2010507165.tif 000013
【０２８６】
プログラムリスト６
【数６Ｐ】
2010507165.tif 000014
【０２８７】
プログラムリスト７
【数７Ｐ】
2010507165.tif 000015
【０２８８】
プログラムリスト８
【数８Ｐ】
2010507165.tif 000016
【０２８９】
プログラムリスト９
【数９Ｐ】
2010507165.tif 000017
【０２９０】
プログラムリスト１０
【数１０Ｐ】
2010507165.tif 000018
【０２９１】
プログラムリスト１１
【数１１Ｐ】
2010507165.tif 000019
【０２９２】
プログラムリスト１２
【数１２Ｐ】
2010507165.tif 000020
【符号の説明】
【０２９３】
１０  システム        １２  コンピュータ  
１４  ディスプレイ    １６  ソースコード
１８  ソースコード分析ソフト  
２０  セキュリティ関連層  ２２  ＳＣＡエンジン
【図１】
2010507165.tif 000021
【図２】
2010507165.tif 000022
【図３】
2010507165.tif 000023
【図４】
2010507165.tif 000024
【図５】
2010507165.tif 000025
【図６】
2010507165.tif 000026
【図７】
2010507165.tif 000027
【図８】
2010507165.tif 000028
【図９】
2010507165.tif 000029
【図１０】
2010507165.tif 000030
【図１１】
2010507165.tif 000031
【図１２】
2010507165.tif 000032
【図１３】
2010507165.tif 000033
【図１４】
2010507165.tif 000034
【図１５】
2010507165.tif 000035
【図１６】
2010507165.tif 000036
【図１７】
2010507165.tif 000037
【図１８】
2010507165.tif 000038
【国際調査報告】
2010507165.tif 000039