(57)【特許請求の範囲】
【請求項１】
コンピュータによるソフトウェアコード分析の方法であって、
前記コードの流れ図を生成するため、ソフトウェアソースコードの本体をコンピュータにより自動的に正規化するステップと、
ここにおいて前記流れ図は前記ソフトウェアコード内の命令を示すタグのシークエンスを含み；
前記流れ図の前記タグのシークエンス内の複数のサブシークエンスの１つのグループを識別するため、前記流れ図にシークエンスマイニング手法を適用するステップと、
ここにおいて前記グループ内の前記サブシークエンスは互いに類似しており；
前記識別されたサブシークエンスの１つのグループに対し、１つの共通基準パターンを決定するステップと；
前記共通基準パターンから閾値を超えて偏移する、前記グループ内の１つのサブシークエンスをプロセッサにより発見するステップと；そして
前記閾値を超えて偏移するサブシークエンスを前記ソフトウェアソースコード内の潜在的脆弱性として報告するステップと；
を有し、
ここにおいて前記サブシークエンス内の前記タグは、前記シークエンス内と同じ順序を有し、しかし前記サブシークエンス内の隣接するタグは前記シークエンス内では必ずしも隣接しない、
ことを特徴とするソフトウェアコード分析の方法。
【請求項２】
前記ソフトウェアソースコードの本体を正規化するステップは、前記コードのドキュメントオブジェクトモデル（ＤＯＭ）を生成するステップを有する、ことを特徴とする請求項１に記載の方法。
【請求項３】
前記シークエンスマイニング手法を適用するステップは、ユーザ設定の半径より大きくない最大差異を有する、命令のサブシークエンスの１つの推計学的グループを識別するステップを有する、ことを特徴とする請求項１に記載の方法。
【請求項４】
前記コードを正規化するステップは、前記コード内で所定のタイプのエンティティのネームを発見するステップと、そして前記コードに出現する前記ネームを前記タイプのインジケータと置き換えるステップを有する、ことを特徴とする請求項１に記載の方法。
【請求項５】
ネームが前記タイプのインジケータと置き換えられる前記エンティティは、変数及び定数からなるエンティティのグループから選択される、ことを特徴とする請求項４に記載の方法。
【請求項６】
前記コードはオブジェクト指向言語で書かれ、そしてネームが前記タイプの前記インジケータと置き換えられる前記エンティティは、クラスとメンバーからなるエンティティのグループから選択される、ことを特徴とする請求項４に記載の方法。
【請求項７】
前記コードを基準化するステップは、前記コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの前記制御ブロックは前記コードのラインを有し、そして、前記コードのラインを、前記制御ブロックの前記タイプに対し事前定義されたフォーマットの、前記コードのラインに対応する一連のタグと置き換えるステップを有する、ことを特徴とする請求項１に記載の方法。
【請求項８】
前記シークエンスマイニング手法を適用するステップは、ＧＳＰ、ＳＰＡＤＥまたはＰｒｅｆｉｘＳｐａｎを適用するステップを有する、
ことを特徴とする請求項１に記載の方法。
【請求項９】
前記サブシークエンスにおける偏移は前記ソフトウェアコード内の欠落したオペレーションを含む、ことを特徴とする請求項１−７のいずれかに記載の方法。
【請求項１０】
前記サブシークエンスにおける偏移は、要注意オペレーションを実行する許可のチェック不履行を含む、ことを特徴とする請求項１−７のいずれかに記載の方法。
【請求項１１】
前記サブシークエンスにおける偏移は、規定の呼び出しシークエンスの順守違反を含む、ことを特徴とする請求項１−７のいずれかに記載の方法。
【請求項１２】
前記サブシークエンスにおける偏移は、前記コード内に残されたバックドアに関連する、ことを特徴とする請求項１−７のいずれかに記載の方法。
【請求項１３】
前記サブシークエンスにおける偏移は、前記コード内で実行されるビジネスロジックの誤りを含む、ことを特徴とする請求項１−７のいずれかに記載の方法。
【請求項１４】
ソフトウェアコード分析用の機器であって、
ソフトウェアソースコードの本体を記憶するように構成されたメモリと、そして
プロセッサと、を有し、
前記プロセッサは、
前記コードの流れ図を生成するため、前記ソフトウェアソースコードを自動的に正規化するステップと、ここにおいて前記流れ図は前記ソフトウェアコード内の命令を示すタグのシークエンスを含み；
前記タグのシークエンス内の複数のサブシークエンスの１つのグループを識別するため、前記ソースコードの前記流れ図にシークエンスマイニング手法を適用するステップと、ここにおいて前記グループ内の前記サブシークエンスは互いに類似しており；
前記識別されたサブシークエンスの１つのグループに対し、１つの共通基準パターンを決定するステップと；
前記共通基準パターンから閾値を超えて偏移する、前記グループ内の１つのサブシークエンスを発見するステップと；そして
前記偏移を前記ソフトウェアソースコード内の潜在的脆弱性として報告するステップと；
を実行するように構成され、
ここにおいて前記サブシークエンス内の前記タグは、前記シークエンス内と同じ順序を有し、しかし前記サブシークエンス内の隣接するタグは前記シークエンス内では必ずしも隣接しない、
ことを特徴とするソフトウェアコード分析用の機器。
【請求項１５】
前記プロセッサは、前記ソフトウェアソースコードの正規化において、前記コードのドキュメントオブジェクトモデル（ＤＯＭ）を生成するように構成される、ことを特徴とする請求項１４に記載の機器。
【請求項１６】
前記プロセッサは、前記コード内に所定のタイプのエンティティのネームを発見し、そして前記コードに出現する前記ネームを前記タイプのインジケータと置き換えるように構成される、ことを特徴とする請求項１４に記載の機器。
【請求項１７】
ネームが前記タイプのインジケータと置き換えられる前記エンティティは、変数及び定数からなるエンティティのグループから選択される、ことを特徴とする請求項１６に記載の機器。
【請求項１８】
前記コードはオブジェクト指向言語で書かれ、そしてネームが前記タイプのインジケータと置き換えられる前記エンティティは、クラスとメンバーからなるエンティティのグループから選択される、ことを特徴とする請求項１６に記載の機器。
【請求項１９】
前記プロセッサは、前記コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの前記制御ブロックは前記コードのラインを有し、そして、前記コードのラインを、前記制御ブロックの前記タイプに対し事前定義されたフォーマットの、前記コードのラインに対応する一連のタグと置き換えるステップとにより、前記コードを正規化するように構成される、ことを特徴とする請求項１４に記載の機器。
【請求項２０】
前記サブシークエンスにおける偏移は前記ソフトウェアコード内の欠落オペレーションを含む、ことを特徴とする請求項１４−１９のいずれかに記載の機器。
【請求項２１】
前記サブシークエンスにおける偏移は、要注意オペレーションを実行する許可のチェック不履行を含む、ことを特徴とする請求項１４−１９のいずれかに記載の機器。
【請求項２２】
前記サブシークエンスにおける偏移は、規定の呼び出しシークエンスの順守違反を含む、ことを特徴とする請求項１４−１９のいずれかに記載の機器。
【請求項２３】
前記サブシークエンスにおける偏移は、前記コード内に残されたバックドアに関連する、ことを特徴とする請求項１４−１９のいずれかに記載の機器。
【請求項２４】
前記サブシークエンスにおける偏移は、前記コード内で実行されるビジネスロジックの誤りを含む、ことを特徴とする請求項１４−１９のいずれかに記載の機器。
【請求項２５】
プログラム命令が記憶されるコンピュータ読み取り可能媒体であって、
前記命令はコンピュータに読み取られた時に、コンピュータに対し、
ソフトウェアコードの流れ図を生成するため、ソフトウェアソースコードの本体を正規化するステップと、ここにおいて前記流れ図は前記ソフトウェアコード内の命令を示すタグのシークエンスを含み；
前記タグのシークエンス内の複数のサブシークエンスの１つのグループを識別するため、前記ソースコードの前記流れ図にシークエンスマイニング手法を適用するステップと、ここにおいて前記グループ内の前記サブシークエンスは互いに類似しており；
前記識別されたサブシークエンスの１つのグループに対し、１つの共通基準パターンを決定するステップと、
前記共通基準パターンから閾値を超えて偏移する、前記グループ内の１つのサブシークエンスを発見するステップと；そして
前記偏移を前記ソフトウェアソースコード内の潜在的脆弱性として報告するステップと；
を実行するようにさせ、
ここにおいて前記サブシークエンス内の前記タグは、前記シークエンス内と同じ順序を有し、しかし前記サブシークエンス内の隣接するタグは前記シークエンス内では必ずしも隣接しない、
ことを特徴とするコンピュータ読み取り可能媒体。
【請求項２６】
前記命令は前記コンピュータに対し、前記ソフトウェアソースコードを正規化するステップにおいて、前記コードのドキュメントオブジェクトモデル（ＤＯＭ）を生成するようにさせる、ことを特徴とする請求項２５に記載のコンピュータ読み取り可能媒体。
【請求項２７】
前記コードを基準化するステップは、前記コード内に所定のタイプのエンティティのネームを発見するステップと、そして前記コードに出現する前記ネームを前記タイプのインジケータと置き換えるステップを有する、ことを特徴とする請求項２５に記載のコンピュータ読み取り可能媒体。
【請求項２８】
ネームが前記タイプのインジケータと置き換えられる前記エンティティは、変数及び定数からなるエンティティのグループから選択される、ことを特徴とする請求項２７に記載のコンピュータ読み取り可能媒体。
【請求項２９】
前記コードはオブジェクト指向言語で書かれ、そしてネームが前記タイプのインジケータと置き換えられた前記エンティティは、クラスとメンバーからなるエンティティのグループから選択される、ことを特徴とする請求項２７に記載のコンピュータ読み取り可能媒体。
【請求項３０】
前記コードを基準化するステップは、前記コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの前記制御ブロックは前記コードのラインを有し、そして、前記コードのラインを、前記制御ブロックの前記タイプに対し事前定義されたフォーマットの、前記コードのラインに対応する一連のタグと置き換えるステップを有する、ことを特徴とする請求項２５に記載のコンピュータ読み取り可能媒体。
【請求項３１】
前記サブシークエンスにおける偏移は前記ソフトウェアコード内の欠落オペレーションを含む、ことを特徴とする請求項２５−３０のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項３２】
前記サブシークエンスにおける偏移は、要注意オペレーションを実行する許可のチェック不履行を含む、ことを特徴とする請求項２５−３０のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項３３】
前記サブシークエンスにおける偏移は、規定の呼び出しシークエンスの順守怠慢を含む、ことを特徴とする請求項２５−３０のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項３４】
前記サブシークエンスにおける偏移は、前記コード内に残されたバックドアに関連する、ことを特徴とする請求項２５−３０のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項３５】
前記サブシークエンスにおける偏移は、前記コード内で実行されるビジネスロジックの誤りを含む、ことを特徴とする請求項２５−３０のいずれかに記載のコンピュータ読み取り可能媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的にコンピュータソフトウェアに関し、特にコンピュータソフトウェアにおけるセキュリティ侵害の自動検知に関するものである。
【背景技術】
【０００２】
（関連出願の参照）
本出願は２０１０年８月２４日に出願された米国暫定出願６１／３７６，２６０（特許文献１）の恩恵を要求し、それはここに参照として採り入れられる。
【０００３】
アプリケーションレベルのソフトウェアコードはセキュリティが脆弱な傾向がある。コードの各区画は、実行されると外部入力を許容し、不適切又は不望の行動を引き起こし、それはデータの機密性やシステムの適切なオペレーションを損なう。脆弱性の例としては、バッファオーバーフロー、競合状態、特権エスカレーションを含む。これらの脆弱性はプログラマーにより意図的に、又は不適切なプログラミング作業に起因して偶然に、導入される。
【０００４】
ソフトウェア脆弱性の検知方法は既存技術で公知である。例えばここに参照として採り入れられる特許文献２はアプリケーションレベルの脆弱性に対し自動的にソースコードを分析するツールを記載している。そのツールのオペレーションは統計分析に基づくが、しかし他の種々の技術、例えば難読化コードの取り扱い方法も利用している。
【０００５】
シークエンスマイニングは構造化データマイニングの一種であり、値がシークエンスに存在するデータ事例の中から統計的に関連性のあるパターンを発見することに関している。それはシンボルのストリング及びアイテム（例えばワード、フレーズ、タグ又はイベント）の規則正しいシークエンスの両方に適用可能である。
【０００６】
様々なシークエンスマイニングのアルゴリズムが既存技術で知られている。例えば良く使用されるＧＳＰアルゴリズムは非特許文献１に記載され、それはここに参照として採り入れられる。またＳＰＡＤＥとして知られる他のアルゴリズムは非特許文献２に記載され、それはここに参照として採り入れられる。さらに他の１つの検査プログラムはＰｒｅｆｉｘＳｐａｎであり、それは非特許文献３に記載され、それはここに参照として採り入れられる。更なるアルゴリズムは前述の特許文献１に記載されている。       
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】米国暫定出願６１／３７６，２６０
【特許文献２】米国特許出願公報２０１０／００８３２４０
【非特許文献】
【０００８】
【非特許文献１】Ｓｒｉｋａｎｄ氏及びＡｇｒａｗａｌ氏共著  「シークエンシャルパターンのマイニング：一般化とパフォーマンス向上」ＥＤＢＴ‘９６第５回データベース拡張に関する国際会議会報：データベース技術の進歩（シュプリンガー出版、１９９６）３−１７頁
【非特許文献２】Ｚａｋｉ氏著「ＳＰＡＤＥ：頻発シークエンスのマイニングのための効率的アルゴリズム」マシンラーニング４２（２００１）、３１−６０頁
【非特許文献３】Ｐｅｉ氏他著「パターン成長によるシークエンシャルパターンのマイニング：ＰｒｅｆｉｘＳｐａｎアプローチ」ＩＥＥＥ知識及びデータエンジニアリングに関する報告書  １６：１０（２００４）１４２４−１４４０頁
【発明の概要】
【０００９】
以下に記載される本発明の実施形態はシークエンスマイニング技術をソフトウェアソースコード内の脆弱性を示すパターンを発見するために適用する。
従って本発明の１実施形態によれば、ソフトウェアコード分析の方法であって、共通パターンにより特徴付けられる命令シークエンスのグループを識別するために、ソフトウェアソースコードの本体をコンピュータにより自動的に処理するステップと；共通パターンの基準からの偏移を含むグループ内のシークエンスを発見するステップと；そして偏移をソフトウェアソースコード内の潜在的脆弱性として報告するステップと；を有することを特徴とするソフトウェアコード分析の方法が提供される。
【００１０】
開示された実施形態ではソフトウェアソースコードの本体を処理するステップは、コードのドキュメントオブジェクトモデル（ＤＯＭ）を生成するステップと、そしてＤＯＭをシークエンスの識別に適用するステップを有する。
ある実施形態では、ソフトウェアソースコードの本体を処理するステップは、コードを正規化するステップと、そして正規化されたコード内でシークエンスを識別するステップを有する。典型的にコードを正規化するステップは、コード内に所定のタイプのエンティティのネームを発見するステップと、そしてコードに出現するネームをタイプのインジケータと置き換えるステップを有する。ネームがタイプのインジケータと置き換えられたエンティティは、変数及び／又は定数からなってよい。さらにあるいは、コードがオブジェクト指向言語で書かれている場合、ネームが置き換えられた前記エンティティは、クラス及び／又はメンバーからなる。
【００１１】
またさらにあるいは、コードを正規化するステップは、コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの制御ブロックはコードのラインを有し、そして、コードのラインを、制御ブロックのタイプに対し事前定義されたフォーマットの、コードのラインに対応する一連のタグと置き換えるステップを有する。
開示された実施形態では、ソフトウェアコードの本体を処理するステップは、コードを一連のタグに変換するステップと、そしてシークエンスマイニングアルゴリズムを適用して一連のタグ内に出現するグループ内のシークエンスを識別するステップを有する。
【００１２】
一般的に、シークエンスのグループは、基準と、基準からのシークエンスのそれぞれの距離の分布により特徴付けられる推計学的なグループであり、ここにおいて偏移を含むシークエンスを発見するステップは、基準からのそれぞれの距離が事前定義された閾値を超える１つ以上のシークエンスを発見するステップを有する。シークエンス内の偏移は例えば、ソフトウェアコード内の欠落したオペレーション、要注意オペレーションを実行する許可のチェック不履行、規定の呼び出しシークエンスの順守違反、コード内に残されたバックドア、又はコード内で実行されるビジネスロジックの誤りを含む。  
【００１３】
本発明の１実施形態によれば、ソフトウェアソースコードの本体を記憶するように構成されたメモリと、そして共通パターンにより特徴付けられる命令シークエンスのグループを識別するために、ソフトウェアソースコードを自動的に処理し、共通パターンの基準からの偏移を含むグループ内のシークエンスを発見し、そして偏移をソフトウェアソースコード内の潜在的脆弱性として報告するように構成されるプロセッサと、を有することを特徴とするソフトウェアコード分析用の機器器がさらに提供される。
【００１４】
本発明の１実施形態によればさらに、コンピュータソフトウェア製品であって、プログラム命令が記憶されるコンピュータ読み取り可能媒体を有し、その命令はコンピュータに読み取られた時に、コンピュータに対し、共通パターンにより特徴付けられる命令シークエンスのグループを識別するために、ソフトウェアソースコードの本体を処理し、共通パターンの基準からの偏移を含むグループ内のシークエンスを発見し、そしてその偏移をそのソフトウェアソースコード内の潜在的脆弱性として報告するようにさせる、  ことを特徴とするコンピュータソフトウェア製品がさらに提供される。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施形態による、ソースコード分析のシステムを概略示すブロック図である。
【図２】本発明の実施形態による、ソースコード分析の方法を概略示す流れ図である。
【図３】本発明の実施形態による、制御ステートメントをタグのシークエンスに変換する方法を概略示すブロック図である。
【図４】本発明の実施形態による、コードセグメントをタグのシークエンスに変換する方法を概略示すテーブルである。
【図５】本発明の実施形態による、コードセグメントを正規化されたメンバーネームを持つタグのシークエンスに変換する方法を概略示すテーブルである。
【発明を実施するための形態】
【００１６】
上記の特許文献２で記載されるような従来技術で公知のソフトウェア分析ツールでは、ユーザがセキュリティ侵害を便利に探索し識別できるような方法で、ソフトウェアコードの構造と流れを抽出し、分析する。しかしこれらのツールは、ユーザが何を探すか知っている、即ち、構造と流れの問題のあるパターンが事前に定義可能であり、そしてその後に問題のあるパターンがコード構造内で探索可能であることを前提としている。
【００１７】
以下で記述される本発明の実施形態は、コード内の潜在的に問題のあるパターンを、経験的定義を必要とせず、さらにそのパターンに関する知識すらなくても、自動的に発見することにより、この限界を克服する。開示される方法は、既存技術で公知のシークエンスマイニングツールを使用するが、しかしそれはコンピュータソフトウェアの分析にはいまだかつて使用されたことが無い。一般的には、シークエンスマイニングは、限定されたアルファベット又はコンステレーションから取り出され、そして一定のフォーマットに編成されたシンボル又はタグのシークエンスに対し最も効果を発揮する。従って以下に開示される実施形態では、シークエンスマイニングが適用される以前にソフトウェアコードは正規化されている−事前設定された形式の、対応するタグのシークエンスに変換されている。本特許出願及び請求項においては、「タグ」とはテキスト形式のラベルを意味する。
【００１８】
以下に記載される実施形態では、コンピュータはシークエンスマイニングを使用して自動的にソフトウェアソースコードの本体を処理し、それぞれの共通パターンにより特徴付けられる１つ以上の命令シークエンスのグループを識別する。パターンは事前に定義される必要はなく、むしろコード（又は具体的には、対応するタグシークエンス）の統計的特性に基づいて識別される。このシークエンスマイニングにより識別されたシークエンスグループは一般的に推計学的グループであり、それはそのグループ内のシークエンスは統計的に類似しているが同一ではないことを意味する。このようなグループは、通常、グループ内の平均的パターンに相当する１つの基準、及びそれぞれのシークエンスの基準からの距離の分布により特徴付けられる。ここで「距離」とは一般的にレーベンシュタイン距離のような編集距離を意味し、それは所定のシークエンス内のタグと基準の間の（挿入、削除及び置き換えのような）相違の数を示す。
【００１９】
可能性のある脆弱性を識別するため、コンピュータは基準から有意に偏移したグループ内シークエンス、即ち基準からの距離が一定の閾値（ユーザにより設定されてもよい）を超えるシークエンスを発見する。これらの偏移は場合によっては、要注意オペレーションの実行前の適切な許可チェックの不履行；規定された呼び出しシークエンスの順守違反；プログラマーがコード内に留置したバックドア；又はコード内に提供されたビジネスロジックの誤り；などの脆弱性を示す。コンピュータはグループの基準からの偏移をソフトウェアソースコード内の潜在的脆弱性として報告する。
【００２０】
本発明のある実施形態では、正規化プロセスは、コード内のシークエンス間のあるタイプの相違を「滑らかにする」ステップ、即ちコード内に存在する同じタイプの用語又は構造の多くの変化形を１つの共通の用語又は構造に置き換えるステップを含む。このプロセスはコードを一般化し、それにより類似のシークエンスがさらにほぼ同一となり、シークエンスマイニングにより識別可能になる。一般化のレベルは、脆弱性を示唆する可能性のある相違を隠すことなく、意味のあるシークエンスグループの発見を促進するように選択される。本願の発明者は、例えば、変数、定数、クラス及び／又はメンバーなどの所定のタイプのエンティティのネームを発見し、そしてコード内に現れているそのネームをそのタイプの１つのインジケータと置き換えることにより、効果的な正規化が実行可能であることを発見した。さらにあるいは、制御ブロック内のコードのラインが、その制御ブロックのタイプに対し事前定義された１つのフォーマットの一連のタグに置き換えられてもよい。
【００２１】
ここに記載される実施形態は、説明のため、ある特定の正規化技術を参照しているが、他の適用可能な正規化技術も本特許出願を読んだ当業者には自明であり、本発明の範囲内であると見做されるべきである。正規化技術およびシークエンスマッピングアルゴリズムの適切な選択は分析対象のコードの性質及び関係する脆弱性に依存し、その選択は本発明の開示に基づいて、それぞれのケースの当業者が決定可能である。
【００２２】
（システムと方法の記述）
本発明の１実施形態による、ソースコード分析のシステム２０及び方法を概略示す図１及び図２を参照する。図１はシステムのブロック図であり、一方図２は方法の主要ステップを示す流れ図である。システム２０の構成要素は上記の特許文献２で記載されるソースコード分析システムのそれと類似しており、それに本特許出願で記載されるシークエンスマイニング関連の特性が追加されている。簡略化のため、ここではこれらの追加された特性についてのみ記載する。
【００２３】
システム２０はプロセッサ２２を有し、それは一般的に汎用または特殊用途のコンピュータ内に配置され、以下に記載される機能を実行するためソフトウェアでプログラムされる。ソフトウェアはプロセッサ２２に電子形態で、例えばネットワーク経由でダウンロードされてもよい。さらにあるいは、磁気、光学又は電子メモリのような接触可能な非一過性コンピュータ読み取り可能媒体の上に提供され及び／又は記憶されてもよい。またさらにあるいは、プロセッサ２２の機能の少なくとも幾つかは適切なプログラム可能ロジック回路により実行されてもよい。
【００２４】
プロセッサ２２はソースコード２３の本体を分析のために受け取る。プロセッサはコード分析及び正規化モジュール２４（通常ソフトウェアモジュールとして実現される）を起動し、シークエンスマイニングの準備としてコードを事前処理する。モジュール２４はコード分析ステップ４０において、ドキュメントオブジェクトモデル（ＤＯＭ）及びコードの流れ図を獲得する。流れ図はデータ流れ図（ＤＦＧ）、制御流れ図（ＣＦＧ）及び制御依存図（ＣＤＧ）を含んでもよい。ＤＯＭおよびこれらの図の派生物は、例えば特許文献２に記載されている。プロセッサ２２は以降のデータへのアクセスを容易にするため、通常はデータベースの形態でメモリ２６内に分析結果を記憶する。
【００２５】
下記の付属ＡのリストＩは、単純な関数のソースコードリストを示し、それは本発明の１実施形態によるＤＯＭ構築とその後の正規化を示すのに使用される。結果として得られるＤＯＭが付属ＡのリストＩＩに示される。残りのリストは以下に記述するようにＤＯＭの正規化における後続の段階を示す。
【００２６】
モジュール２４は正規化ステップ４２でソースコードを正規化する。正規化はコード自体又はＤＯＭ（又は両方）に適用されてよい。そして単純化と完全性のためこれら全ての正規化の形式はここではコードの正規化と呼ばれる。「正規化されたコード」とはソースコード自体又はＤＯＭを含むソースコード派生物の正規化された形式を言う。あるいは、流れ図の要素もシークエンスマイニング用に正規化されてもよい。
【００２７】
シークエンスマイニングモジュール２８は、シークエンスマイニングステップ４４において、正規化されたコードをスキャンし推計学的シークエンスパターンを発見する。モジュール２８は従来技術で公知のいかなる適合するシークエンスマイニングアルゴリズム又はアルゴリズムの組合せを使用してもよい。このようなアルゴリズムの例には、ＳＰＡＭ，ＬＡＰＩＮ，ＣｌｏＳｐａｎおよびＢＩＤＥのほか、上記（背景技術）の項で述べたＧＳＰ，ＳＰＡＤＥ及びＰｒｅｆｉｘＳｐａｎを含む。（これらアルゴリズムの多くを実行するＪａｖａ（登録商標）コードがＳＰＭＦウェブサイトｗｗｗ．ｐｈｉｌｉｐｐｅ−ｆｏｕｒｎｉｅｒ−ｖｉｇｅｒ．ｃｏｍ／ｓｐｍｆ．からダウンロード可能である。）一般的にステップ４４においてモジュール２８はステップ４０とステップ４２で生成された正規化されたＤＯＭを処理する。さらにあるいは、モジュール２８はソースコード及び／又は１つ以上の流れ図を処理してもよい。
【００２８】
シークエンスマイニングモジュール２８は共通のパターンで特徴付けられる命令シークエンスグループを識別する。システム２０のユーザは一般的にモジュールが発見すべきグループの半径、即ち１つの所与のグループ内のメンバー間の最大距離（適切な距離尺度を使用して）を設定する。このようなそれぞれのグループの中で、モジュール２８は、グループの共通パターンの基準から所定の閾値、これも同様にユーザにより設定されてもよいが、を超えて偏移している１つ以上のシークエンスを発見してもよい。下記の付属Ｂはここで使用可能なシークエンスマイニング技術のさらなる詳細と事例を示す。
【００２９】
モジュール２８は、報告ステップ４６において、これらの偏移をデータディスプレイなどの出力デバイス３０経由で報告する。レポートは、脆弱性を理解し補修するという仕事をシステム２０のユーザに任せて、単にソースコード内で潜在的脆弱性が疑われるコードセグメントの識別からなってもよい。さらにあるいは、モジュール２８は、偏移シークエンス内の特定の瑕疵を指摘するため、偏移パターンをさらに分析してもよい。
【００３０】
（実施の詳細と事例）
正規化ステップ４２はコードに対する多くの異なるオペレーションを通常含む。例えば、コードのネーム、値、アサインメント及び条件は以下のように正規化されてもよい：
・ローカル変数名はそれらのタイプに置き換えられる。
・定数は一般的にタイプ情報付きのＣＯＮＳＴとラベル付けされる。
・アサインメントは関数呼び出しから除外される。
・メソッド呼び出しは、アサインメント、条件、及び他の制御コマンドから除外される。（例えば、図５のシークエンス７２の「Ｒｅｃｔ＝Ｉｔｅｍ．ＧｅｔＢｏｕｎｄｓ（）：Ｒｅｃｔ」参照）
・関係演算子は正規化される。例えば：  
【数１】
0005844809.tif 000002
付属ＡのリストＩＩＩは上記の最初の２つの正規化オペレーション適用後のリストＩＩのＤＯＭを示す。
【００３１】
正規化処理の他の部分として、コード内の制御ステートメントが１つのフォーマットに作り直され、それにより各制御ブロックが一貫したフォーマットのタグシークエンスとして表現される。例えばつぎの形の「ｉｆ」ステートメント：  
【数２】
0005844809.tif 000003
は次のフォーマットのタグシークエンスとして作り直される：
【数３】
0005844809.tif 000004
（図５のシークエンス７２のタグシークエンス「ＩＦ．．ＥＬＳＥ．．ＥＮＤ−ＩＦ」で示されるように）。
【００３２】
もう１つの事例として、図３は本発明の１実施形態による、「ｆｏｒ」制御ステートメント４８をタグ５２のシークエンス５０に変換する方法を概略示すブロック図である。図の例においてステートメント４８：
【数４】
0005844809.tif 000005
は対応するタグシークエンス５０として作り直される：
【数５】
0005844809.tif 000006
【００３３】
図４は本発明の１実施形態による、コードセグメント６０をタグシークエンス６２に変換する方法を概略示すテーブルである。図の矢印は、コードのラインと正規化後にそれらを置き換えるタグとの間の対応関係を示す。詳細には、コードセグメント６０は「ｗｈｉｌｅ（＜ｃｏｎｄ＞）＜ｂｏｄｙ＞」という一般形の「ｗｈｉｌｅ」ループ６４を有する。ループ６４は以下のフォームのタグのサブシークエンス６６に作り直される：
【数６】
0005844809.tif 000007
シークエンス６２はまた「ｉｆ」ステートメントの正規化及び前述のネームと定数のタイプへの変換を示している。例えば、セグメント６０の変数表現「ｉｎｔ  ｄ＝０」はシークエンス６２のタグ「ｉｎｔ＝ＺＥＲＯ」に変換される。
【００３４】
図に示される事例は実際のソースコードの正規化を示すが、実務的にはこれらの正規化技術は通常、ソースコードから生成されるＤＯＭに適用される。制御ブロックをタグシークエンスに変換することは、当初のＤＯＭの階層構造を平坦にする効果が有る。リストＩＶはリストＩＩ，ＩＩＩのＤＯＭの制御ステートメントにこの種の平坦化を適用する効果を示す。
【００３５】
図５は本発明の１実施形態による、コードセグメント７０を正規化されたクラスとメンバーネームを有するタグシークエンス７２に変換する方法を概略示すテーブルである。この種の正規化は特にオブジェクト指向プログラミング言語で書かれたコードの正規化に適用可能である。このリストはたまたま「ｉｆ」ステートメントの平坦化を示している。  
【００３６】
クラスネームに対する正規化ルールは以下を含む（この内幾つかは図５に示される）：
・グローバルに定義された（パブリック）クラスはネームで使用される。（例えば、シークエンス７２の「Ｉｔｅｍ．Ｇｅｔｂｏｕｎｄ．．．」）
・パブリック及び保護内部クラスはネームで使用される。プライベート内部クラスのネームは通常タグ「ＣＬＡＳＳ」と「ＭＥＭＢＥＲ」により置換される。
・メソッド−ローカルクラスのネームはタグ「ＣＬＡＳＳ」と「ＭＥＭＢＥＲ」により置換される。
・プライベート内部クラスのメンバーは（それらの可視性に関わらず）対応する外部クラスのメンバーとして取り扱われる。
【００３７】
メンバーネームに対する正規化ルールは以下を含む（この内幾つかは図５に示される）：
・パブリックメンバーネームはそれぞれのタイプ情報に付随するネームにより置換される。（例えば、示されるようにタグ「Ｒｅｃｔ＝Ｉｔｅｍ．ＧｅｔＢｏｕｎｄｓ（）：Ｒｅｃｔ」により）
・保護メンバーネームはそれぞれのタイプ情報に付随するネームにより置換されてもよい。
・プライベートメンバーのネームはそれぞれのタイプ情報が付随したタグ「ＣＬＡＳＳ」と「ＭＥＭＢＥＲ」により置換される。
・所与のネームが多相性の場合は、全ての後継に亘って一般化するため基本タイプが使用されてもよい。
【００３８】
一度上記の正規化ステップがソフトウェアソースコード由来のＤＯＭに実行されると、ＤＯＭは当初の階層的機能的構造に替わってタグシークエンスに実質的に平坦化される。付属ＡのリストＶはこの種の完全に平坦化されたＤＯＭを示す。
【００３９】
本願の発明者は、正規化されたＤＯＭに対するシークエンスマイニングが以下の事例を含む（しかしそれに限定されないが）種々のコード脆弱性を検知するのに有効であることを発見した：
・オペレーションの喪失（例えばキャッチブロックのロギング）
キャッチブロック（通常Ｊａｖａ（登録商標）における例外処理に使用される）は通常一定のロギングオペレーションを含む。開発者は時々ロギングオペレーションの使用を忘れる。シークエンスマイニングはタグの正常なシークエンス「Ｔｒｙ−＞ＳｅｎｓｉｔｉｖｅＯｐｅｒａｔｉｏｎ−＞Ｃａｔｃｈ−＞Ｌｏｇ」を識別し、従ってこのルールを破るコード内のシークエンスを発見してもよい。
【００４０】
・条件テストを必要とする関数（例えば、ユーザ認証）
多くの場合、要注意オペレーションはユーザが認証された又は特定の許可を与えられた後にのみ呼び出されるべきである。シークエンスマイニングは正常なシークエンス「ＩｆＵｓｅｒｓＡｕｔｈｅｎｔｉｃａｔｅｄ−＞ＤｏＳｅｎｓｉｔｉｖｅＯｐｅｒａｔｉｏｎ」を識別し、そしてそれによってユーザ許可の事前チェック無く「要注意オペレーション」が呼び出されたシークエンスを発見する。
【００４１】
・共通呼び出しシークエンス（時々破られる）
ウェブサイトのクロスサイトスクリプティング脆弱性は、悪意のクライアント側スクリプトを他のユーザが閲覧するウェブページに注入することを許す。この問題を軽減するためヘルパー関数（．ＮＥＴ環境におけるＨＴＭＬＥｎｃｏｄｅのような）を呼び出し、１人のユーザにより入力されたストリングをそのユーザに応答する前に「修正」することが一般的である。シークエンスマイニングはヘルパー関数を正しい順番で呼び出す正確なパターンを学習し、そしてこの順番からの偏移を識別するように使用可能である。
【００４２】
・バックドア
プログラマーは多くの場合ユーザ許可がチェックされる場所にコード内バックドアを設置する。例えばステートメント：「Ｉｆ（ＵｓｅｒＩｓＡｄｍｉｎｉｓｔｒａｔｏｒ  ｏｒ  Ｕｓｅｒｎａｍｅ＝‘ＭａｔｙＳＩＭＡＮ’）はプログラマーＭａｔｙ  Ｓｉｍａｎ用のバックドアを作るのに使用可能である。シークエンスマイニングは、正確な許可シークエンスを学習し、そしてコード内にバックドアが残された場合に発生する偏移を識別するために使用可能である。
【００４３】
・ビジネスロジックの喪失
ビジネスプロセスは多くの場合、パラメータに対しアクションを起こす前に、そのパラメータが適切な領域にあるかの認証を必要とする。例えば、顧客にある商品をある価格で購入したことに対し請求を起こす前に、商品の価格と数量が正の値であることが認証されなくてはならない（そうでなければ顧客は請求されるのではなくクレジットを与えられてしまうからである）。シークエンスマイニングは、パラメータ認証関数を含む正常な販売オペレーションのパターンを学習し、そしてその後適切な認証が呼び出されなかったケースを識別する。
【００４４】
上記の実施形態は事例として引用され、そして本発明は上記で特に図示され記載されたものに限定されない。むしろ本発明の範囲は、上記の記載を読んだ当業者が想起するであろう、既存技術に開示されない、ここに記載された種々の特徴の組合せ及びサブ組合せの両方及び変化形や変更を含む。
【００４５】
（付属Ａ−サンプルコードリスト）
（リストＩ−生のソースコード）
【数７】
0005844809.tif 000008
【００４６】
（リストＩＩ−ＤＯＭに変換されたコード）
【数８】
0005844809.tif 000009
0005844809.tif 000010
【００４７】
（リストＩＩＩ−変数名がタイプに変換される）
【数９】
0005844809.tif 000011
0005844809.tif 000012
【００４８】
（リストＩＶ−制御ステートメントの平坦化）
【数１０】
0005844809.tif 000013
0005844809.tif 000014
0005844809.tif 000015
【００４９】
（リストＶ−ＤＯＭツリーが配列に平坦化される）
【数１１】
0005844809.tif 000016
0005844809.tif 000017
【００５０】
（付属Ｂ−シークエンスマイニングの詳細と実施例）
ソフトウェアコードから得られたタグシークエンスのシークエンスマイニングの準備として、システム２０のオペレータは３つの「定数」（パラメータ値）を定義する：
Ａ．「サポート」値−「共通」シークエンスとして見做されるための最小出現回数。
Ｂ．「最小長さ」―受容可能な最短シークエンス（これがないと、多くの単一アイテムのシークエンスが「共通」と見做される。）
Ｃ．「コンフィデンス」−（Ｘ−＞Ｙ）のコンフィデンスとは：我々がサブシークエンスＸに出会う場合に、Ｙに出会う確立である。例えば、我々がストリング「ａｂｃｄｅｆｇ」に出会うと、それに「ｈｉｊ」が続く可能性が高い−従ってコンフィデンスが高い（例えば５０％）。
以下の事例では我々はサポートレベル「６０」、最小長さ「３」そしてコンフィデンス「５０％」と設定する。
【００５１】
コードの本体が以下のテーブルに示されるシークエンスを含むとする：コードシークエンス「ｆ１（）；ｆ２（）；ｆ３（）；」はコード内に８０回現れ；シークエンス「ｆ１（）；ｆ４（）；ｆ２（）；ｆ３（）；」は２０回現れ；以下同様：
【表１】
0005844809.tif 000018
これらのシークエンスを処理するため、シークエンスマイニングモジュール２８は最初にそれぞれの（サブ）シークエンスが出現する回数を発見する。モジュールは単一アイテムシークエンスから始めてもよい：
【表２】
0005844809.tif 000019
【００５２】
アプリオリ法則によれば、ある１つのシークエンスはそのサブシークエンスより多い回数出現することはできない。（例えば、Ｆ５（）を含むあるシークエンスは、Ｆ５（）自体より多い回数出現できない。）従って、モジュール２８は我々の定義したサポートレベル（６０）を満たない全てのサブシークエンスを除外することができ、以下が残る：
【表３】
0005844809.tif 000020
【００５３】
ここでモジュール２８は、上記のアイテムに基づいて可能な全ての２アイテムシークエンスを組み立てる。ここでは：
Ａ．順番は重要である。
Ｂ．２つのアイテムは隣接する必要はない。
【表４】
0005844809.tif 000021
回数「ゼロ」を除外すると以下が得られる：
【表５】
0005844809.tif 000022
【００５４】
我々は最小長さを「３」と定義したが上記の表はまだ長さ「２」なので、モジュール２８はシークエンス構築ステップを再び繰り返して以下の表を得る：
【表６】
0005844809.tif 000023
従って、サポートレベルと最小長さの基準を満たす唯一の共通シークエンスはｆ１（），ｆ２（），ｆ３（）である。
【００５５】
最初の表に戻って、モジュール２８は事前設定のコンフィデンスより低い共通シークエンスｆ１（），ｆ２（），ｆ３（）のインスタンスを取り除く：
【表７】
0005844809.tif 000024
シークエンス（ｆ１−ｆ２−ｆ３）の１００回の出現の内、２０％が最初の２つのアイテムの間にｆ４を含み、一方８０％は含まない。従ってシークエンス（ｆ１−ｆ４−ｆ２−ｆ３）は共通シークエンスを含むが、我々が設定したコンフィデンスレベルを満たさない。結果としてモジュール２８は、この後者のシークエンスをソフトウェアコード内の脆弱性を示唆する可能性がある偏移として識別する。
【図１】
0005844809.tif 000025
【図２】
0005844809.tif 000026
【図３】
0005844809.tif 000027
【図４】
0005844809.tif 000028
【図５】
0005844809.tif 000029