特許第5844809号(P5844809)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ チェックマークス リミテッドの特許一覧

特許5844809プログラミングルール違反に対するソースコードマイニング
<>
  • 特許5844809-プログラミングルール違反に対するソースコードマイニング 図000025
  • 特許5844809-プログラミングルール違反に対するソースコードマイニング 図000026
  • 特許5844809-プログラミングルール違反に対するソースコードマイニング 図000027
  • 特許5844809-プログラミングルール違反に対するソースコードマイニング 図000028
  • 特許5844809-プログラミングルール違反に対するソースコードマイニング 図000029
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】5844809
(24)【登録日】2015年11月27日
(45)【発行日】2016年1月20日
(54)【発明の名称】プログラミングルール違反に対するソースコードマイニング
(51)【国際特許分類】
   G06F 21/57 20130101AFI20151224BHJP
   G06F 9/44 20060101ALI20151224BHJP
【FI】
   G06F21/57 370
   G06F9/06 620K
【請求項の数】35
【全頁数】28
(21)【出願番号】特願2013-525394(P2013-525394)
(86)(22)【出願日】2011年8月22日
(65)【公表番号】特表2013-536522(P2013-536522A)
(43)【公表日】2013年9月19日
(86)【国際出願番号】IB2011053671
(87)【国際公開番号】WO2012025865
(87)【国際公開日】20120301
【審査請求日】2014年6月20日
(31)【優先権主張番号】61/376,260
(32)【優先日】2010年8月24日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】509102018
【氏名又は名称】チェックマークス リミテッド
(74)【代理人】
【識別番号】100086461
【弁理士】
【氏名又は名称】齋藤 和則
(72)【発明者】
【氏名】サイマン、マティ
【審査官】 宮司 卓佳
(56)【参考文献】
【文献】 特表2010−507165(JP,A)
【文献】 山田吾郎他,シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための欠陥検出手法,情報処理学会研究報告 コンピュータセキュリティ(CSEC),日本,2009年 6月15日,Vol.2009-CSEC-45,p.1-p.8
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/00−21/88
G06F 9/44
(57)【特許請求の範囲】
【請求項1】
コンピュータによるソフトウェアコード分析の方法であって、
前記コードの流れ図を生成するため、ソフトウェアソースコードの本体をコンピュータにより自動的に正規化するステップと、
ここにおいて前記流れ図は前記ソフトウェアコード内の命令を示すタグのシークエンスを含み;
前記流れ図の前記タグのシークエンス内の複数のサブシークエンスの1つのグループを識別するため、前記流れ図にシークエンスマイニング手法を適用するステップと、
ここにおいて前記グループ内の前記サブシークエンスは互いに類似しており;
前記識別されたサブシークエンスの1つのグループに対し、1つの共通基準パターンを決定するステップと;
前記共通基準パターンから閾値を超えて偏移する、前記グループ内の1つのサブシークエンスをプロセッサにより発見するステップと;そして
前記閾値を超えて偏移するサブシークエンスを前記ソフトウェアソースコード内の潜在的脆弱性として報告するステップと;
を有し、
ここにおいて前記サブシークエンス内の前記タグは、前記シークエンス内と同じ順序を有し、しかし前記サブシークエンス内の隣接するタグは前記シークエンス内では必ずしも隣接しない、
ことを特徴とするソフトウェアコード分析の方法。
【請求項2】
前記ソフトウェアソースコードの本体を正規化するステップは、前記コードのドキュメントオブジェクトモデル(DOM)を生成するステップを有する、ことを特徴とする請求項1に記載の方法。
【請求項3】
前記シークエンスマイニング手法を適用するステップは、ユーザ設定の半径より大きくない最大差異を有する、命令のサブシークエンスの1つの推計学的グループを識別するステップを有する、ことを特徴とする請求項1に記載の方法。
【請求項4】
前記コードを正規化するステップは、前記コード内で所定のタイプのエンティティのネームを発見するステップと、そして前記コードに出現する前記ネームを前記タイプのインジケータと置き換えるステップを有する、ことを特徴とする請求項1に記載の方法。
【請求項5】
ネームが前記タイプのインジケータと置き換えられる前記エンティティは、変数及び定数からなるエンティティのグループから選択される、ことを特徴とする請求項4に記載の方法。
【請求項6】
前記コードはオブジェクト指向言語で書かれ、そしてネームが前記タイプの前記インジケータと置き換えられる前記エンティティは、クラスとメンバーからなるエンティティのグループから選択される、ことを特徴とする請求項4に記載の方法。
【請求項7】
前記コードを基準化するステップは、前記コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの前記制御ブロックは前記コードのラインを有し、そして、前記コードのラインを、前記制御ブロックの前記タイプに対し事前定義されたフォーマットの、前記コードのラインに対応する一連のタグと置き換えるステップを有する、ことを特徴とする請求項1に記載の方法。
【請求項8】
前記シークエンスマイニング手法を適用するステップは、GSP、SPADEまたはPrefixSpanを適用するステップを有する、
ことを特徴とする請求項1に記載の方法。
【請求項9】
前記サブシークエンスにおける偏移は前記ソフトウェアコード内の欠落したオペレーションを含む、ことを特徴とする請求項1−7のいずれかに記載の方法。
【請求項10】
前記サブシークエンスにおける偏移は、要注意オペレーションを実行する許可のチェック不履行を含む、ことを特徴とする請求項1−7のいずれかに記載の方法。
【請求項11】
前記サブシークエンスにおける偏移は、規定の呼び出しシークエンスの順守違反を含む、ことを特徴とする請求項1−7のいずれかに記載の方法。
【請求項12】
前記サブシークエンスにおける偏移は、前記コード内に残されたバックドアに関連する、ことを特徴とする請求項1−7のいずれかに記載の方法。
【請求項13】
前記サブシークエンスにおける偏移は、前記コード内で実行されるビジネスロジックの誤りを含む、ことを特徴とする請求項1−7のいずれかに記載の方法。
【請求項14】
ソフトウェアコード分析用の機器であって、
ソフトウェアソースコードの本体を記憶するように構成されたメモリと、そして
プロセッサと、を有し、
前記プロセッサは、
前記コードの流れ図を生成するため、前記ソフトウェアソースコードを自動的に正規化するステップと、ここにおいて前記流れ図は前記ソフトウェアコード内の命令を示すタグのシークエンスを含み;
前記タグのシークエンス内の複数のサブシークエンスの1つのグループを識別するため、前記ソースコードの前記流れ図にシークエンスマイニング手法を適用するステップと、ここにおいて前記グループ内の前記サブシークエンスは互いに類似しており;
前記識別されたサブシークエンスの1つのグループに対し、1つの共通基準パターンを決定するステップと;
前記共通基準パターンから閾値を超えて偏移する、前記グループ内の1つのサブシークエンスを発見するステップと;そして
前記偏移を前記ソフトウェアソースコード内の潜在的脆弱性として報告するステップと;
を実行するように構成され、
ここにおいて前記サブシークエンス内の前記タグは、前記シークエンス内と同じ順序を有し、しかし前記サブシークエンス内の隣接するタグは前記シークエンス内では必ずしも隣接しない、
ことを特徴とするソフトウェアコード分析用の機器。
【請求項15】
前記プロセッサは、前記ソフトウェアソースコードの正規化において、前記コードのドキュメントオブジェクトモデル(DOM)を生成するように構成される、ことを特徴とする請求項14に記載の機器。
【請求項16】
前記プロセッサは、前記コード内に所定のタイプのエンティティのネームを発見し、そして前記コードに出現する前記ネームを前記タイプのインジケータと置き換えるように構成される、ことを特徴とする請求項14に記載の機器。
【請求項17】
ネームが前記タイプのインジケータと置き換えられる前記エンティティは、変数及び定数からなるエンティティのグループから選択される、ことを特徴とする請求項16に記載の機器。
【請求項18】
前記コードはオブジェクト指向言語で書かれ、そしてネームが前記タイプのインジケータと置き換えられる前記エンティティは、クラスとメンバーからなるエンティティのグループから選択される、ことを特徴とする請求項16に記載の機器。
【請求項19】
前記プロセッサは、前記コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの前記制御ブロックは前記コードのラインを有し、そして、前記コードのラインを、前記制御ブロックの前記タイプに対し事前定義されたフォーマットの、前記コードのラインに対応する一連のタグと置き換えるステップとにより、前記コードを正規化するように構成される、ことを特徴とする請求項14に記載の機器。
【請求項20】
前記サブシークエンスにおける偏移は前記ソフトウェアコード内の欠落オペレーションを含む、ことを特徴とする請求項14−19のいずれかに記載の機器。
【請求項21】
前記サブシークエンスにおける偏移は、要注意オペレーションを実行する許可のチェック不履行を含む、ことを特徴とする請求項14−19のいずれかに記載の機器。
【請求項22】
前記サブシークエンスにおける偏移は、規定の呼び出しシークエンスの順守違反を含む、ことを特徴とする請求項14−19のいずれかに記載の機器。
【請求項23】
前記サブシークエンスにおける偏移は、前記コード内に残されたバックドアに関連する、ことを特徴とする請求項14−19のいずれかに記載の機器。
【請求項24】
前記サブシークエンスにおける偏移は、前記コード内で実行されるビジネスロジックの誤りを含む、ことを特徴とする請求項14−19のいずれかに記載の機器。
【請求項25】
プログラム命令が記憶されるコンピュータ読み取り可能媒体であって、
前記命令はコンピュータに読み取られた時に、コンピュータに対し、
ソフトウェアコードの流れ図を生成するため、ソフトウェアソースコードの本体を正規化するステップと、ここにおいて前記流れ図は前記ソフトウェアコード内の命令を示すタグのシークエンスを含み;
前記タグのシークエンス内の複数のサブシークエンスの1つのグループを識別するため、前記ソースコードの前記流れ図にシークエンスマイニング手法を適用するステップと、ここにおいて前記グループ内の前記サブシークエンスは互いに類似しており;
前記識別されたサブシークエンスの1つのグループに対し、1つの共通基準パターンを決定するステップと、
前記共通基準パターンから閾値を超えて偏移する、前記グループ内の1つのサブシークエンスを発見するステップと;そして
前記偏移を前記ソフトウェアソースコード内の潜在的脆弱性として報告するステップと;
を実行するようにさせ、
ここにおいて前記サブシークエンス内の前記タグは、前記シークエンス内と同じ順序を有し、しかし前記サブシークエンス内の隣接するタグは前記シークエンス内では必ずしも隣接しない、
ことを特徴とするコンピュータ読み取り可能媒体。
【請求項26】
前記命令は前記コンピュータに対し、前記ソフトウェアソースコードを正規化するステップにおいて、前記コードのドキュメントオブジェクトモデル(DOM)を生成するようにさせる、ことを特徴とする請求項25に記載のコンピュータ読み取り可能媒体。
【請求項27】
前記コードを基準化するステップは、前記コード内に所定のタイプのエンティティのネームを発見するステップと、そして前記コードに出現する前記ネームを前記タイプのインジケータと置き換えるステップを有する、ことを特徴とする請求項25に記載のコンピュータ読み取り可能媒体。
【請求項28】
ネームが前記タイプのインジケータと置き換えられる前記エンティティは、変数及び定数からなるエンティティのグループから選択される、ことを特徴とする請求項27に記載のコンピュータ読み取り可能媒体。
【請求項29】
前記コードはオブジェクト指向言語で書かれ、そしてネームが前記タイプのインジケータと置き換えられた前記エンティティは、クラスとメンバーからなるエンティティのグループから選択される、ことを特徴とする請求項27に記載のコンピュータ読み取り可能媒体。
【請求項30】
前記コードを基準化するステップは、前記コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの前記制御ブロックは前記コードのラインを有し、そして、前記コードのラインを、前記制御ブロックの前記タイプに対し事前定義されたフォーマットの、前記コードのラインに対応する一連のタグと置き換えるステップを有する、ことを特徴とする請求項25に記載のコンピュータ読み取り可能媒体。
【請求項31】
前記サブシークエンスにおける偏移は前記ソフトウェアコード内の欠落オペレーションを含む、ことを特徴とする請求項25−30のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項32】
前記サブシークエンスにおける偏移は、要注意オペレーションを実行する許可のチェック不履行を含む、ことを特徴とする請求項25−30のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項33】
前記サブシークエンスにおける偏移は、規定の呼び出しシークエンスの順守怠慢を含む、ことを特徴とする請求項25−30のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項34】
前記サブシークエンスにおける偏移は、前記コード内に残されたバックドアに関連する、ことを特徴とする請求項25−30のいずれかに記載のコンピュータ読み取り可能媒体。
【請求項35】
前記サブシークエンスにおける偏移は、前記コード内で実行されるビジネスロジックの誤りを含む、ことを特徴とする請求項25−30のいずれかに記載のコンピュータ読み取り可能媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、一般的にコンピュータソフトウェアに関し、特にコンピュータソフトウェアにおけるセキュリティ侵害の自動検知に関するものである。
【背景技術】
【0002】
(関連出願の参照)
本出願は2010年8月24日に出願された米国暫定出願61/376,260(特許文献1)の恩恵を要求し、それはここに参照として採り入れられる。
【0003】
アプリケーションレベルのソフトウェアコードはセキュリティが脆弱な傾向がある。コードの各区画は、実行されると外部入力を許容し、不適切又は不望の行動を引き起こし、それはデータの機密性やシステムの適切なオペレーションを損なう。脆弱性の例としては、バッファオーバーフロー、競合状態、特権エスカレーションを含む。これらの脆弱性はログラマーにより意図的に、又は不適切なプログラミング作業に起因して偶然に、導入される。
【0004】
ソフトウェア脆弱性の検知方法は既存技術で公知である。例えばここに参照として採り入れられる特許文献2はアプリケーションレベルの脆弱性に対し自動的にソースコードを分析するツールを記載している。そのツールのオペレーションは統計分析に基づくが、しかし他の種々の技術、例えば難読化コードの取り扱い方法も利用している。
【0005】
シークエンスマイニングは構造化データマイニングの一種であり、値がシークエンスに存在するデータ事例の中から統計的に関連性のあるパターンを発見することに関している。それはシンボルのストリング及びアイテム例えばワード、フレーズ、タグ又はイベント)の規則正しいシークエンスの両方に適用可能である。
【0006】
様々なシークエンスマイニングのアルゴリズムが既存技術で知られている。例えば良く使用されるGSPアルゴリズムは非特許文献1に記載され、それはここに参照として採り入れられる。またSPADEとして知られる他のアルゴリズムは非特許文献2に記載され、それはここに参照として採り入れられる。さらに他の1つの検査プログラムはPrefixSpanであり、それは非特許文献3に記載され、それはここに参照として採り入れられる。更なるアルゴリズムは前述の特許文献1に記載されている。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】米国暫定出願61/376,260
【特許文献2】米国特許出願公報2010/0083240
【非特許文献】
【0008】
【非特許文献1】Srikand氏及びAgrawal氏共著 「シークエンシャルパターンのマイニング:一般化とパフォーマンス向上」EDBT‘96第5回データベース拡張に関する国際会議会報:データベース技術の進歩(シュプリンガー出版、1996)3−17頁
【非特許文献2】Zaki氏著「SPADE:頻発シークエンスのマイニングのための効率的アルゴリズム」マシンラーニング42(2001)、31−60頁
【非特許文献3】Pei氏他著「パターン成長によるシークエンシャルパターンのマイニング:PrefixSpanアプローチ」IEEE知識及びデータエンジニアリングに関する報告書 16:10(2004)1424−1440頁
【発明の概要】
【0009】
以下に記載される本発明の実施形態はシークエンスマイニング技術をソフトウェアソースコード内の脆弱性を示すパターンを発見するために適用する。
従って本発明の1実施形態によれば、ソフトウェアコード分析の方法であって、共通パターンにより特徴付けられる命令シークエンスのグループを識別するために、ソフトウェアソースコードの本体をコンピュータにより自動的に処理するステップと;共通パターンの基準からの偏移を含むグループ内のシークエンスを発見するステップと;そして偏移をソフトウェアソースコード内の潜在的脆弱性として報告するステップと;を有することを特徴とするソフトウェアコード分析の方法が提供される。
【0010】
開示された実施形態ではソフトウェアソースコードの本体を処理するステップは、コードのドキュメントオブジェクトモデル(DOM)を生成するステップと、そしてDOMをシークエンスの識別に適用するステップを有する。
ある実施形態では、ソフトウェアソースコードの本体を処理するステップは、コードを正規化するステップと、そして正規化されたコード内でシークエンスを識別するステップを有する。典型的にコードを正規化するステップは、コード内に所定のタイプのエンティティのネームを発見するステップと、そしてコードに出現するネームをタイプのインジケータと置き換えるステップを有する。ネームがタイプのインジケータと置き換えられたエンティティは、変数及び/又は定数からなってよい。さらにあるいは、コードがオブジェクト指向言語で書かれている場合、ネームが置き換えられた前記エンティティは、クラス及び/又はメンバーからなる。
【0011】
またさらにあるいは、コードを正規化するステップは、コード内に所定のタイプの制御ブロックを発見するステップと、ここにそれぞれの制御ブロックはコードのラインを有し、そして、コードのラインを、制御ブロックのタイプに対し事前定義されたフォーマットの、コードのラインに対応する一連のタグと置き換えるステップを有する。
開示された実施形態では、ソフトウェアコードの本体を処理するステップは、コードを一連のタグに変換するステップと、そしてシークエンスマイニングアルゴリズムを適用して一連のタグ内に出現するグループ内のシークエンスを識別するステップを有する。
【0012】
一般的に、シークエンスのグループは、基準と、基準からのシークエンスのそれぞれの距離の分布により特徴付けられる推計学的なグループであり、ここにおいて偏移を含むシークエンスを発見するステップは、基準からのそれぞれの距離が事前定義された閾値を超える1つ以上のシークエンスを発見するステップを有する。シークエンス内の偏移は例えば、ソフトウェアコード内の欠落したオペレーション、要注意オペレーションを実行する許可のチェック不履行、規定の呼び出しシークエンスの順守違反、コード内に残されたバックドア、又はコード内で実行されるビジネスロジックの誤りを含む。
【0013】
本発明の1実施形態によれば、ソフトウェアソースコードの本体を記憶するように構成されたメモリと、そして共通パターンにより特徴付けられる命令シークエンスのグループを識別するために、ソフトウェアソースコードを自動的に処理し、共通パターンの基準からの偏移を含むグループ内のシークエンスを発見し、そして偏移をソフトウェアソースコード内の潜在的脆弱性として報告するように構成されるプロセッサと、を有することを特徴とするソフトウェアコード分析用の機器器がさらに提供される。
【0014】
本発明の1実施形態によればさらに、コンピュータソフトウェア製品であって、プログラム命令が記憶されるコンピュータ読み取り可能媒体を有し、その命令はコンピュータに読み取られた時に、コンピュータに対し、共通パターンにより特徴付けられる命令シークエンスのグループを識別するために、ソフトウェアソースコードの本体を処理し、共通パターンの基準からの偏移を含むグループ内のシークエンスを発見し、そしてその偏移をそのソフトウェアソースコード内の潜在的脆弱性として報告するようにさせる、 ことを特徴とするコンピュータソフトウェア製品がさらに提供される。
【図面の簡単な説明】
【0015】
図1】本発明の実施形態による、ソースコード分析のシステムを概略示すブロック図である。
図2】本発明の実施形態による、ソースコード分析の方法を概略示す流れ図である。
図3】本発明の実施形態による、制御ステートメントをタグのシークエンスに変換する方法を概略示すブロック図である。
図4】本発明の実施形態による、コードセグメントをタグのシークエンスに変換する方法を概略示すテーブルである。
図5】本発明の実施形態による、コードセグメントを正規化されたメンバーネームを持つタグのシークエンスに変換する方法を概略示すテーブルである。
【発明を実施するための形態】
【0016】
上記の特許文献で記載されるような従来技術で公知のソフトウェア分析ツールでは、ユーザがセキュリティ侵害を便利に探索し識別できるような方法で、ソフトウェアコードの構造と流れを抽出し、分析する。しかしこれらのツールは、ユーザが何を探すか知っている、即ち、構造と流れの問題のあるパターンが事前に定義可能であり、そしてその後に問題のあるパターンがコード構造内で探索可能であることを前提としている
【0017】
以下で記述される本発明の実施形態は、コード内の潜在的に問題のあるパターンを、経験的定義を必要とせず、さらにそのパターンに関する知識すらなくても、自動的に発見することにより、この限界を克服する。開示される方法は、既存技術で公知のシークエンスマイニングツールを使用するが、しかしそれはコンピュータソフトウェアの分析にはいまだかつて使用されたことが無い。一般的には、シークエンスマイニングは、限定されたアルファベット又はコンステレーションから取り出され、そして一定のフォーマットに編成されたシンボル又はタグのシークエンスに対し最も効果を発揮する。従って以下に開示される実施形態では、シークエンスマイニングが適用される以前にソフトウェアコードは正規化されている−事前設定された形式の、対応するタグのシークエンスに変換されている。本特許出願及び請求項においては、「タグ」とはテキスト形式のラベルを意味する。
【0018】
以下に記載される実施形態では、コンピュータはシークエンスマイニングを使用して自動的にソフトウェアソースコードの本体を処理し、それぞれの共通パターンにより特徴付けられる1つ以上の命令シークエンスのグループを識別する。パターンは事前に定義される必要はなく、むしろコード(又は具体的には、対応するタグシークエンス)の統計的特性に基づいて識別される。このシークエンスマイニングにより識別されたシークエンスグループは一般的に推計学的グループであり、それはそのグループ内のシークエンスは統計的に類似しているが同一ではないことを意味する。このようなグループは、通常、グループ内の平均的パターンに相当する1つの基準、及びそれぞれのシークエンスの基準からの距離の分布により特徴付けられる。ここで「距離」とは一般的にレーベンシュタイン距離のような編集距離を意味し、それは所定のシークエンス内のタグと基準の間の(挿入、削除及び置き換えのような)相違の数を示す。
【0019】
可能性のある脆弱性を識別するため、コンピュータは基準から有意に偏移したグループ内シークエンス、即ち基準からの距離が一定の閾値(ユーザにより設定されてもよい)を超えるシークエンスを発見する。これらの偏移は場合によっては、要注意オペレーションの実行前の適切な許可チェックの不履行;規定された呼び出しシークエンスの順守違反;プログラマーがコード内に留置したバックドア;又はコード内に提供されたビジネスロジックの誤り;などの脆弱性を示す。コンピュータはグループの基準からの偏移をソフトウェアソースコード内の潜在的脆弱性として報告する。
【0020】
本発明のある実施形態では、正規化プロセスは、コード内のシークエンス間のあるタイプの相違を「滑らかにする」ステップ、即ちコード内に存在する同じタイプの用語又は構造の多くの変化形を1つの共通の用語又は構造に置き換えるステップを含む。このプロセスはコードを一般化し、それにより類似のシークエンスがさらにほぼ同一となり、シークエンスマイニングにより識別可能になる。一般化のレベルは、脆弱性を示唆する可能性のある相違を隠すことなく、意味のあるシークエンスグループの発見を促進するように選択される。本願の発明者は、例えば、変数、定数、クラス及び/又はメンバーなどの所定のタイプのエンティティのネームを発見し、そしてコード内に現れているそのネームをそのタイプの1つのインジケータと置き換えることにより、効果的な正規化が実行可能であることを発見した。さらにあるいは、制御ブロック内のコードのラインが、その制御ブロックのタイプに対し事前定義された1つのフォーマットの一連のタグに置き換えられてもよい。
【0021】
ここに記載される実施形態は、説明のため、ある特定の正規化技術を参照しているが、他の適用可能な正規化技術も本特許出願を読んだ当業者には自明であり、本発明の範囲内であると見做されるべきである。正規化技術およびシークエンスマッピングアルゴリズムの適切な選択は分析対象のコードの性質及び関係する脆弱性に依存し、その選択は本発明の開示に基づいて、それぞれのケースの当業者が決定可能である。
【0022】
(システムと方法の記述)
本発明の1実施形態による、ソースコード分析のシステム20及び方法を概略示す図1及び図2を参照する。図1はシステムのブロック図であり、一方図2は方法の主要ステップを示す流れ図である。システム20の構成要素は上記の特許文献2で記載されるソースコード分析システムのそれと類似しており、それに本特許出願で記載されるシークエンスマイニング関連の特性が追加されている。簡略化のため、ここではこれらの追加された特性についてのみ記載する。
【0023】
システム20はプロセッサ22を有し、それは一般的に汎用または特殊用途のコンピュータ内に配置され、以下に記載される機能を実行するためソフトウェアでプログラムされる。ソフトウェアはプロセッサ22に電子形態で、例えばネットワーク経由でダウンロードされてもよい。さらにあるいは、磁気、光学又は電子メモリのような接触可能な非一過性コンピュータ読み取り可能媒体の上に提供され及び/又は記憶されてもよい。またさらにあるいは、プロセッサ22の機能の少なくとも幾つかは適切なプログラム可能ロジック回路により実行されてもよい。
【0024】
プロセッサ22はソースコード23の本体を分析のために受け取る。プロセッサはコード分析及び正規化モジュール24(通常ソフトウェアモジュールとして実現される)を起動し、シークエンスマイニングの準備としてコードを事前処理する。モジュール24はコード分析ステップ40において、ドキュメントオブジェクトモデル(DOM)及びコードの流れ図を獲得する。流れ図はデータ流れ図(DFG)、制御流れ図(CFG)及び制御依存図(CDG)を含んでもよい。DOMおよびこれらの図の派生物は、例えば特許文献2に記載されている。プロセッサ22は以降のデータへのアクセスを容易にするため、通常データベースの形態でメモリ26内に分析結果を記憶する。
【0025】
下記の付属AのリストIは、単純な関数のソースコードリストを示し、それは本発明の1実施形態によるDOM構築とその後の正規化を示すのに使用される。結果として得られるDOMが付属AのリストIIに示される。残りのリストは以下に記述するようにDOMの正規化における後続の段階を示す。
【0026】
モジュール24は正規化ステップ42でソースコードを正規化する。正規化はコード自体又はDOM(又は両方)に適用されてよい。そして単純化と完全性のためこれら全ての正規化の形式はここではコードの正規化と呼ばれる。「正規化されたコード」とはソースコード自体又はDOMを含むソースコード派生物の正規化された形式を言う。あるいは、流れ図の要素もシークエンスマイニング用に正規化されてもよい。
【0027】
シークエンスマイニングモジュール28は、シークエンスマイニングステップ44において、正規化されたコードをスキャンし推計学的シークエンスパターンを発見する。モジュール28は従来技術で公知のいかなる適合するシークエンスマイニングアルゴリズム又はアルゴリズムの組合せを使用してもよい。このようなアルゴリズムの例には、SPAM,LAPIN,CloSpanおよびBIDEのほか、上記(背景技術)の項で述べたGSP,SPADE及びPrefixSpanを含む。(これらアルゴリズムの多くを実行するJava(登録商標)コードがSPMFウェブサイトwww.philippe−fournier−viger.com/spmf.からダウンロード可能である。)一般的にステップ44においてモジュール28はステップ40とステップ42で生成された正規化されたDOMを処理する。さらにあるいは、モジュール28はソースコード及び/又は1つ以上の流れ図を処理してもよい。
【0028】
シークエンスマイニングモジュール28は共通のパターンで特徴付けられる命令シークエンスグループを識別する。システム20のユーザは一般的にモジュールが発見すべきグループの半径、即ち1つの所与のグループ内のメンバー間の最大距離(適切な距離尺度を使用して)を設定する。このようなそれぞれのグループの中で、モジュール28は、グループの共通パターンの基準から所定の閾値、これも同様にユーザにより設定されてもよいが、を超えて偏移している1つ以上のシークエンスを発見してもよい。下記の付属Bはここで使用可能なシークエンスマイニング技術のさらなる詳細と事例を示す。
【0029】
モジュール28は、報告ステップ46において、これらの偏移をデータディスプレイなどの出力デバイス30経由で報告する。レポートは、脆弱性を理解し補修するという事をシステム20のユーザに任せて、単にソースコード内で潜在的脆弱性が疑われるコードセグメントの識別からなってもよい。さらにあるいは、モジュール28は、偏移シークエンス内の特定の瑕疵を指摘するため、偏移パターンをさらに分析してもよい。
【0030】
(実施の詳細と事例)
正規化ステップ42はコードに対する多くの異なるオペレーションを通常含む。例えば、コードのネーム、値、アサインメント及び条件は以下のように正規化されてもよい
・ローカル変数名はそれらのタイプに置き換えられる。
・定数は一般的にタイプ情報付きのCONSTとラベル付けされる。
アサインメントは関数呼び出しから除外される。
・メソッド呼び出しは、アサインメント、条件、及び他の制御コマンドから除外される。(例えば、図5のシークエンス72の「Rect=Item.GetBounds():Rect」参照)
・関係演算子は正規化される。例えば:
【数1】
付属AのリストIIIは上記の最初の2つの正規化オペレーション適用後のリストIIのDOMを示す。
【0031】
正規化処理の他の部分として、コード内の制御ステートメントが1つのフォーマットに作り直され、それにより各制御ブロックが一貫したフォーマットのタグシークエンスとして表現される。例えばつぎの形の「if」ステートメント:
【数2】
は次のフォーマットのタグシークエンスとして作り直される:
【数3】
図5のシークエンス72のタグシークエンス「IF..ELSE..END−IF」で示されるように)。
【0032】
もう1つの事例として、図3は本発明の1実施形態による、「for」制御ステートメント48をタグ52のシークエンス50に変換する方法を概略示すブロック図である。図の例においてステートメント48:
【数4】
は対応するタグシークエンス50として作り直される:
【数5】
【0033】
図4は本発明の1実施形態による、コードセグメント60をタグシークエンス62に変換する方法を概略示すテーブルである。図の矢印は、コードのラインと正規化後にそれらを置き換えるタグとの間の対応関係を示す。詳細には、コードセグメント60は「while(<cond>)<body>」という一般形の「while」ループ64を有する。ループ64は以下のフォームのタグのサブシークエンス66に作り直される:
【数6】
シークエンス62はまた「if」ステートメントの正規化及び前述のネームと定数のタイプへの変換を示している。例えば、セグメント60の変数表現「int d=0」はシークエンス62のタグ「int=ZERO」に変換される。
【0034】
図に示される事例は実際のソースコードの正規化を示すが、実務的にはこれらの正規化技術は通常、ソースコードから生成されるDOMに適用される。制御ブロックをタグシークエンスに変換することは、当初のDOMの階層構造を平坦にする効果が有る。リストIVはリストII,IIIのDOMの制御ステートメントにこの種の平坦化を適用する効果を示す。
【0035】
図5は本発明の1実施形態による、コードセグメント70を正規化されたクラスとメンバーネームを有するタグシークエンス72に変換する方法を概略示すテーブルである。この種の正規化は特にオブジェクト指向プログラミング言語で書かれたコードの正規化に適用可能である。このリストはたまたま「if」ステートメントの平坦化を示している。
【0036】
クラスネームに対する正規化ルールは以下を含む(この内幾つかは図5に示される):
・グローバルに定義された(パブリック)クラスはネームで使用される。(例えば、シークエンス72の「Item.Getbound...」)
・パブリック及び保護内部クラスはネームで使用される。プライベート内部クラスのネームは通常タグ「CLASS」と「MEMBER」により置換される。
・メソッド−ローカルクラスのネームはタグ「CLASS」と「MEMBER」により置換される。
・プライベート内部クラスのメンバーは(それらの可視性に関わらず)対応する外部クラスのメンバーとして取り扱われる。
【0037】
メンバーネームに対する正規化ルールは以下を含む(この内幾つかは図5に示される):
・パブリックメンバーネームはそれぞれのタイプ情報に付随するネームにより置換される。(例えば、示されるようにタグ「Rect=Item.GetBounds():Rect」により)
・保護メンバーネームはそれぞれのタイプ情報に付随するネームにより置換されてもよい。
・プライベートメンバーのネームはそれぞれのタイプ情報が付随したタグ「CLASS」と「MEMBER」により置換される。
・所与のネームが多相性の場合は、全ての後継に亘って一般化するため基本タイプが使用されてもよい。
【0038】
一度上記の正規化ステップがソフトウェアソースコード由来のDOMに実行されると、DOMは当初の階層的機能的構造に替わってタグシークエンスに実質的に平坦化される。付属AのリストVはこの種の完全に平坦化されたDOMを示す。
【0039】
本願の発明者は、正規化されたDOMに対するシークエンスマイニングが以下の事例を含む(しかしそれに限定されないが)種々のコード脆弱性を検知するのに有効であることを発見した:
・オペレーションの喪失(例えばキャッチブロックのロギング)
キャッチブロック(通常Java(登録商標)における例外処理に使用される)は通常一定のロギングオペレーションを含む。開発者は時々ロギングオペレーションの使用を忘れる。シークエンスマイニングはタグの正常なシークエンス「Try−>SensitiveOperation−>Catch−>Log」を識別し、従ってこのルールを破るコード内のシークエンスを発見してもよい
【0040】
・条件テストを必要とする関数(例えば、ユーザ認証)
多くの場合、要注意オペレーションはユーザが認証された又は特定の許可を与えられた後にのみ呼び出されるべきである。シークエンスマイニングは正常なシークエンス「IfUsersAuthenticated−>DoSensitiveOperation」を識別し、そしてそれによってユーザ許可の事前チェック無く「要注意オペレーション」が呼び出されたシークエンスを発見する。
【0041】
・共通呼び出しシークエンス(時々破られる)
ウェブサイトのクロスサイトスクリプティング脆弱性は、悪意のクライアント側スクリプトを他のユーザが閲覧するウェブページに注入することを許す。この問題を軽減するためヘルパー関数(.NET環境におけるHTMLEncodeのような)を呼び出し、1人のユーザにより入力されたストリングをそのユーザに応答する前に「修正」することが一般的である。シークエンスマイニングはヘルパー関数を正しい順番で呼び出す正確なパターンを学習し、そしてこの順番からの偏移を識別するように使用可能である
【0042】
・バックドア
プログラマーは多くの場合ユーザ許可がチェックされる場所にコード内バックドアを設置する。例えばステートメント:「If(UsersAdministrator or Username=‘MatySIMAN’)はプログラマーMaty Siman用のバックドアを作るのに使用可能である。シークエンスマイニングは、正確な許可シークエンスを学習し、そしてコード内にバックドアが残された場合に発生する偏移を識別するために使用可能である。
【0043】
・ビジネスロジックの喪失
ビジネスプロセスは多くの場合、パラメータに対しアクションを起こす前に、そのパラメータが適切な領域にあるかの認証を必要とする。例えば、顧客にある商品をある価格で購入したことに対し請求を起こす前に、商品の価格と数量が正の値であることが認証されなくてはならない(そうでなければ顧客は請求されるのではなくクレジットを与えられてしまうからである)。シークエンスマイニングは、パラメータ認証関数を含む正常な販売オペレーションのパターンを学習し、そしてその後適切な認証が呼び出されなかったケースを識別する。
【0044】
上記の実施形態は事例として引用され、そして本発明は上記で特に図示され記載されたものに限定されない。むしろ本発明の範囲は、上記の記載を読んだ当業者が想起するであろう、既存技術に開示されない、ここに記載された種々の特徴の組合せ及びサブ組合せの両方及び変化形や変更を含む。
【0045】
(付属A−サンプルコードリスト)
(リストI−生のソースコード)
【数7】
【0046】
(リストII−DOMに変換されたコード)
【数8】
【0047】
(リストIII−変数名がタイプに変換される)
【数9】
【0048】
(リストIV−制御ステートメントの平坦化)
【数10】
【0049】
(リストV−DOMツリーが配列に平坦化される)
【数11】
【0050】
(付属B−シークエンスマイニングの詳細と実施例)
ソフトウェアコードから得られたタグシークエンスのシークエンスマイニングの準備として、システム20のオペレータは3つの「定数」(パラメータ値)を定義する:
A.「サポート」値−「共通」シークエンスとして見做されるための最小出現回数。
B.「最小長さ」―受容可能な最短シークエンス(これがないと、多くの単一アイテムのシークエンスが「共通」と見做される。)
C.「コンフィデンス」−(X−>Y)のコンフィデンスとは:我々がサブシークエンスXに出会う場合に、Yに出会う確立である。例えば、我々がストリング「abcdefg」に出会うと、それに「hij」が続く可能性が高い−従ってコンフィデンスが高い(例えば50%)。
以下の事例では我々はサポートレベル「60」、最小長さ「3」そしてコンフィデンス「50%」と設定する。
【0051】
コードの本体が以下のテーブルに示されるシークエンスを含むとする:コードシークエンス「f1();f2();f3();」はコード内に80回現れ;シークエンス「f1();f4();f2();f3();」は20回現れ;以下同様:
【表1】
これらのシークエンスを処理するため、シークエンスマイニングモジュール28は最初にそれぞれの(サブ)シークエンスが出現する回数を発見する。モジュールは単一アイテムシークエンスから始めてもよい
【表2】
【0052】
アプリオリ法則によれば、ある1つのシークエンスはそのサブシークエンスより多い回数出現することはできない。(例えば、F5()を含むあるシークエンスは、F5()自体より多い回数出現できない。)従って、モジュール28は我々の定義したサポートレベル(60)を満たない全てのサブシークエンスを除外することができ、以下が残る:
【表3】
【0053】
ここでモジュール28は、上記のアイテムに基づいて可能な全ての2アイテムシークエンスを組み立てる。ここでは:
A.順番は重要である。
B.2つのアイテムは隣接する必要はない。
【表4】
回数「ゼロ」を除外すると以下が得られる:
【表5】
【0054】
我々は最小長さを「3」と定義したが上記の表はまだ長さ「2」なので、モジュール28はシークエンス構築ステップを再び繰り返して以下の表を得る:
【表6】
従って、サポートレベルと最小長さの基準を満たす唯一の共通シークエンスはf1(),f2(),f3()である。
【0055】
最初の表に戻って、モジュール28は事前設定のコンフィデンスより低い共通シークエンスf1(),f2(),f3()のインスタンスを取り除く:
【表7】
シークエンス(f1−f2−f3)の100回の出現の内、20%が最初の2つのアイテムの間にf4を含み、一方80%は含まない。従ってシークエンス(f1−f4−f2−f3)は共通シークエンスを含むが、我々が設定したコンフィデンスレベルを満たさない。結果としてモジュール28は、この後者のシークエンスをソフトウェアコード内の脆弱性を示唆する可能性がある偏移として識別する。
図1
図2
図3
図4
図5