(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-09-12
(54)【発明の名称】スコープおよびオフセットを使用する脆弱性トラッキング
(51)【国際特許分類】
G06F 21/57 20130101AFI20240905BHJP
【FI】
G06F21/57 370
【審査請求】有
【予備審査請求】未請求
(21)【出願番号】P 2024516450
(86)(22)【出願日】2022-09-16
(85)【翻訳文提出日】2024-03-12
(86)【国際出願番号】 US2022043858
(87)【国際公開番号】W WO2023049046
(87)【国際公開日】2023-03-30
(32)【優先日】2021-09-22
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2022-09-09
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
(71)【出願人】
【識別番号】523290621
【氏名又は名称】ギットラブ インコーポレイテッド
(74)【代理人】
【識別番号】110001243
【氏名又は名称】弁理士法人谷・阿部特許事務所
(72)【発明者】
【氏名】ジェームズ ジョンソン
(72)【発明者】
【氏名】ジュリアン トーミ
(72)【発明者】
【氏名】ルーカス チャールズ
(57)【要約】
ソースコードは、ソースコード管理システムを通じて管理され、1つまたは複数の静的アプリケーションセキュリティテストスキャナが、ソースコードの脆弱性をチェックする。スキャナは、脆弱性トラッカーによって処理される脆弱性レポートを生成する。脆弱性トラッカーは、ソースコードから識別された脆弱性のスコープを計算し、かつ、スコープおよびオフセットフィンガープリント(例えば、周囲のスコープに基づいて脆弱性を一意に識別するハッシュ)を生成する。フィンガープリントは、重複除去および脆弱性トラッキングに使用される。脆弱性トラッカーは、対応するフィンガープリントを有する重複除去された脆弱性のセットを含む改良された脆弱性レポートを生成し得る。改良された脆弱性レポートおよび関連するデータは、脆弱性管理における使用のために脆弱性データベースに記憶され得る。
【特許請求の範囲】
【請求項1】
ソフトウェアプロジェクトの脆弱性を分析する方法であって、
ソースコードを受信することと、
前記ソースコードから構文解析木を生成することと、
前記構文解析木を使用してソースコードブロックのスコープを抽出することと、
1つまたは複数のコードスキャナから、前記ソースコードに関連する脆弱性レポートを受信することであって、前記脆弱性レポートは前記ソースコード内の脆弱性を識別する、脆弱性レポートを受信することと、
前記脆弱性レポートにおいて識別された前記脆弱性を対応するスコープにマッチングして、スコープされた脆弱性のセットを生成することと、
前記スコープされた脆弱性の少なくとも一部のフィンガープリントを生成することと、
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することと、
前記重複を除去されたスコープされた脆弱性を使用して、改良された脆弱性レポートを生成することと、を含む、方法。
【請求項2】
前記構文解析木は、複数のノードを含み、前記複数のノードは、少なくとも1つの親ノードおよび子ノードを含み、前記親ノードは、前記子ノードにスコープを提供するスコープを表し、かつ、前記子ノードは、前記親ノードによって提供される前記スコープを伴わずには存在し得ない、請求項1に記載の方法。
【請求項3】
前記親ノードは、外部クラスを表し、かつ、前記子ノードは、前記外部クラス内にネストされた内部クラスを表す、請求項2に記載の方法。
【請求項4】
前記親ノードは、クラスを表し、かつ、前記子ノードは、前記クラス内にネストされた関数を表す、請求項2に記載の方法。
【請求項5】
前記構文解析木を使用してソースコードブロックのスコープを抽出することは、
子を有さないエンド子ノードから親を有さないルート親ノードへ前記構文解析木を走査することと、
前記複数のノードそれぞれのスコープを対応するノードの識別子でラベル付けすることと、を含む、請求項2に記載の方法。
【請求項6】
ソースコードのスコープを抽出することは、
深度優先(DF)前順走査を実施することと、前記構文解析木における前記複数のノードのそれぞれを走査することと、を含む、請求項2に記載の方法。
【請求項7】
脆弱性についての前記フィンガープリントは、前記脆弱性のスコープおよび前記脆弱性のオフセットを使用して生成され、前記オフセットは、前記スコープの開始行から前記脆弱性の行番号を減算することによって計算される、請求項1に記載の方法。
【請求項8】
前記脆弱性についての前記フィンガープリントを生成することは、前記スコープおよびオフセットを使用してハッシュを計算することを含む、請求項7に記載の方法。
【請求項9】
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することは、
2つの脆弱性についての2つのハッシュを比較して、前記2つの脆弱性が、(1)同じスコープ内に位置するか、(2)同じ脆弱性のタイプまたは分類を有するか、(3)それらの親スコープが開始する行番号に対して同じオフセットを有するかを決定することと、
2つの脆弱性の2つのハッシュが一致するとの決定に応答して、前記2つの脆弱性のうちの1つをスコープ脆弱性のセットから削除することと、を含む、請求項8に記載の方法。
【請求項10】
前記フィンガープリントは、前記脆弱性の分類子を使用してさらに生成される、請求項7に記載の方法。
【請求項11】
命令がエンコードされた非一時的なコンピュータ可読記憶媒体を有するコンピュータプログラム製品であって、前記命令がプロセッサによって実行されると、前記プロセッサに、
ソースコードを受信することと、
前記ソースコードから構文解析木を生成することと、
前記構文解析木を使用してソースコードブロックのスコープを抽出することと、
1つまたは複数のコードスキャナから、前記ソースコードに関連する脆弱性レポートを受信することであって、前記脆弱性レポートは前記ソースコード内において脆弱性を識別する、脆弱性レポートを受信することと、
前記脆弱性レポートにおいて識別された前記脆弱性を対応するスコープにマッチングして、スコープされた脆弱性のセットを生成することと、
前記スコープされた脆弱性の少なくとも一部のフィンガープリントを生成することと、
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することと、
前記重複を除去されたスコープされた脆弱性を使用して、改良された脆弱性レポートを生成することと、を行わせる、コンピュータプログラム製品。
【請求項12】
前記構文解析木は、複数のノードを含み、前記複数のノードは、少なくとも1つの親ノードおよび子ノードを含み、前記親ノードは、前記子ノードにスコープを提供するスコープを表し、かつ、前記子ノードは、前記親ノードによって提供される前記スコープを伴わずには存在し得ない、請求項11に記載のコンピュータプログラム製品。
【請求項13】
前記親ノードは、外部クラスを表し、かつ、前記子ノードは、前記外部クラス内にネストされた内部クラスを表す、請求項12に記載のコンピュータプログラム製品。
【請求項14】
前記親ノードは、クラスを表し、かつ、前記子ノードは、前記クラス内にネストされた関数を表す、請求項12に記載のコンピュータプログラム製品。
【請求項15】
前記構文解析木を使用してソースコードブロックのスコープを抽出することは、
子を有さないエンド子ノードから親を有さないルート親ノードへ前記構文解析木を走査することと、
前記複数のノードそれぞれのスコープを対応するノードの識別子でラベル付けすることと、を含む、請求項12に記載のコンピュータプログラム製品。
【請求項16】
ソースコードのスコープを抽出することは、
深度優先(DF)前順走査を実施することと、前記構文解析木における前記複数のノードのそれぞれを走査することと、を含む、請求項12に記載のコンピュータプログラム製品。
【請求項17】
脆弱性についての前記フィンガープリントは、前記脆弱性のスコープおよび前記脆弱性のオフセットを使用して生成され、前記オフセットは、前記スコープの開始行から前記脆弱性の行番号を減算することによって計算される、請求項11に記載のコンピュータプログラム製品。
【請求項18】
前記脆弱性についての前記フィンガープリントを生成することは、前記スコープおよびオフセットを使用してハッシュを計算することを含む、請求項17に記載のコンピュータプログラム製品。
【請求項19】
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することは、
2つの脆弱性についての2つのハッシュを比較して、前記2つの脆弱性が、(1)同じスコープ内に位置するか、(2)同じ脆弱性のタイプまたは分類を有するか、(3)それらの親スコープが開始する行番号に対して同じオフセットを有するかを決定することと、
2つの脆弱性の2つのハッシュが一致するとの決定に応答して、前記2つの脆弱性のうちの1つをスコープ脆弱性のセットから削除することと、を含む、請求項18に記載のコンピュータプログラム製品。
【請求項20】
前記フィンガープリントは、前記脆弱性の分類子を使用してさらに生成される、請求項17に記載のコンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【0001】
[0002]記載される主題は、一般に、ソフトウェアの脆弱性を検出すること、特に、検出された脆弱性のスコープおよびオフセットフィンガープリントを使用して重複レポートを低減する脆弱性トラッキングのアプローチに関する。
【背景技術】
【0002】
関連出願の相互参照
[0001]本願は、2021年9月22日に出願された米国仮出願第63/247,019号、および、2022年9月9日に出願された米国特許出願第17/941,935号の利益を主張し、これらは参照により組み込まれる。
【0003】
[0003]多くのエンティティは、(Gitのような)ソースコード管理(SCM)システムを使用してソフトウェアプロジェクトを管理する。コードが記述され、かつ、修正されるにつれて、セキュリティの脆弱性が必然的に発生する。セキュリティの脆弱性は、攻撃者が、システムの制御権を取得したり、意図しないまたは望ましくない方法でシステムを動作させたりすることを可能にするソフトウェアの欠陥である。結果的に、エンティティは、ソフトウェア開発プロセスのできるだけ早いうちにセキュリティの脆弱性を検出するために、変更されたコードを監視する自動化されたセキュリティテストプロセスを適用することがよくある。
【0004】
[0004]自動化されたセキュリティテストプロセスの一例は、ソフトウェアプロジェクトのソースコードの脆弱性を自動的に検出可能な静的アプリケーションセキュリティテスト(SAST)ツールである。SASTツールは、典型的には、言語および問題に特化される。例えば、幾つかのSASTツールは、ソースコード内の秘密(例えば、ハードコード化されたパスワード)を検出することが可能であり、他のツールは、潜在的に安全でないフローなどを検出することにフォーカスされる。したがって、エンティティは、ソフトウェアの全体的な攻撃面を低減するために、複数のSASTツールを組み合わせて使用し得る。
【0005】
[0005]SASTツールのそれぞれは、ソースコードを分析し、かつ、検出された脆弱性を、さらなる分析(例えば、ヒューマンセキュリティアナリストによる)のためにレポートする。多くのケースにおいて、ソースコードにおいて1回よりも多く出現したり、複数のSASTツールによって検出されたり、またはその両方のため、同じ脆弱性が複数回レポートされることがある。結果的に、セキュリティアナリストは、潜在的な重複を選別して、それらが同じであることを確認するためにかなりの時間を費やさなければならない。さらに、コードが変更されると、同じ脆弱性がソースコード内の新しい場所に移動されたり、ソースコードが実質的な変更なしに再フォーマットされたりし得るため、セキュリティアナリストは、所与のレポートされた脆弱性が新規のものであるか、以前に発見されたものと重複するものかを判断することが困難になる。
【発明の概要】
【0006】
[0006]上記および他の課題は、重複する脆弱性を自動的に識別およびトラッキングすることが可能な脆弱性トラッキングプロセスによって対処され得る。特に、開示のプロセスは、識別された脆弱性を取り巻くコードについての情報を含むスコープおよびオフセットフィンガープリントに基づいて脆弱性を識別する。これは、開発サイクル中にコード内の異なる位置に移動されて識別された脆弱性の重複レポートおよびトラッキングのインスタンスを低減し得、これにより、セキュリティアナリストが考慮するノイズの量を低減し得る。
【0007】
[0007]一実施形態において、ソフトウェアプロジェクト内の脆弱性を識別および重複除去(deduplicating)するための方法は、ソースコードを受信し、ソースコードから解析木を生成することを含む。ソースコードブロックのスコープは、構文解析木を使用して抽出される。方法はまた、1つまたは複数のコードスキャナからソースコードに関連する脆弱性レポートを受信することを含む。脆弱性レポートは、ソースコードにおける脆弱性を識別する。脆弱性レポートにおいて識別された脆弱性は、対応するスコープに一致し、フィンガープリントは、スコープされた脆弱性の少なくとも幾つかから生成される。方法は、フィンガープリントを使用してスコープされた脆弱性の重複を除去し、重複を除去されたスコープされた脆弱性を使用して、改良された(refined)脆弱性レポートを生成することをさらに含む。
【図面の簡単な説明】
【0008】
【
図1】[0008]
図1は、一実施形態による、ソフトウェアプロジェクトのコードを管理するのに適したネットワーク化コンピューティング環境のブロック図である。
【
図2】[0009]
図2は、一実施形態による、
図1に示される脆弱性トラッカーのブロック図である。
【
図3】[0010]
図3は、一実施形態による、コードのセグメントの例示的な構文解析木を示す図である。
【
図4】[0011]
図4は、一実施形態による、ソフトウェアプロジェクト内の脆弱性を識別および重複除去するための方法のフローチャートである。
【
図5】[0012]
図5は、一実施形態による、
図1のネットワーク化コンピューティング環境での使用に適した例示的なコンピュータを示すブロック図である。
【発明を実施するための形態】
【0009】
[0013]図面および以下の記載は、例示のみを目的として特定の実施形態を説明する。当業者は、以下の記載から、記載された原理から逸脱することなく、構造および方法の代替実施形態を採用し得ることを容易に認識するであろう。類似または同様の機能を示すために、実行可能な限り、類似または同様の参照番号が、図において使用される。要素が共通の番号を共有し、その後に別の文字が続く場合、これは要素が類似または同一であることを示す。文脈がそうでないことを示さない限り、番号単独への参照は、一般に、そのような要素の何れか1つまたは何れかの組み合わせを指す。
【0010】
例示的なシステム
[0014]
図1は、ソフトウェアプロジェクトのコードを管理するのに適したネットワーク化コンピューティング環境100の一実施形態を示す。図示される実施形態において、ネットワーク化コンピューティング環境は、ソースコードリポジトリ110、1つまたは複数のクライアントデバイス120、1つまたは複数のコードスキャナ130、および、脆弱性トラッカー140を含み、これらは全てネットワーク170を介して接続される。他の実施形態において、ネットワーク化コンピューティング環境100は、異なる要素または追加の要素を含む。加えて、機能は、記載される方法とは異なる方法で、要素間に分散されてもよい。例えば、コードスキャナ130および脆弱性トラッカー140は、異なるエンティティとして示されるが、幾つかの実施形態において、対応する機能は、単一のコンピューティングシステム(例えば、サーバ)によって提供される。
【0011】
[0015]ソースコードリポジトリ110は、1つまたは複数のソフトウェアプロジェクトのコードを記憶する1つまたは複数のコンピュータ可読記憶媒体を含む。一実施形態において、ソースコードリポジトリ110は、SCMシステムのコードを記憶する。SCMシステムは、ソフトウェアプロジェクトのコードの複数のバージョンを記憶して、更新を後退復帰(rolled back)すること、および、開発者がコードの履歴ステータスなどを確認することなどを可能にし得る。
【0012】
[0016]クライアントデバイス120は、ソフトウェアエンジニアがコードを編集し、かつ、コードリポジトリ110に更新をコミット(commit)し得るコンピューティングデバイスである。例えば、クライアントデバイス120は、エンジニアがソースコードリポジトリ110からコードの一部をダウンロードし、開発環境において改訂およびテストを行い、改訂されたコードをソースコードリポジトリ110にアップロードするデスクトップワークステーションであり得る。複数のエンジニアはそれぞれ、対応するクライアントデバイス120を使用して、コードを改訂し、それらの改訂を任意の所与の時点においてソースコードリポジトリ110にコミットし得る。ほぼ同時に異なるエンジニアによってコードに対して行われた更新間の競合を管理するために、既知の適切な技術が使用され得る。
【0013】
[0017]コードスキャナ130は、継続的に、定期的に(例えば、毎時、毎日など)、または、オンデマンドで、ソースコードリポジトリ内のコードをスキャンして、脆弱性を識別する。一実施形態において、コードスキャナ130は、SASTツールのセットを含む。SASTツールのそれぞれは、コード(または、SASTが使用を意図する言語のコードの一部)をスキャンして、脆弱性を識別する。SASTツールは、識別された脆弱性に関する情報を含む脆弱性レポートを生成する。SASTツールは、コード(またはコードの特定の部分)をスキャンした後に識別された全ての脆弱性を含むレポートを生成し得る。代替的に、SASTツールは、識別された脆弱性それぞれについての個別のレポートを生成し得る(例えば、それを識別した直後に)。
【0014】
[0018]脆弱性トラッカー140は、コードスキャナによって生成されたレポートを取り込み、かつ、それらを処理して、同じ脆弱性が1回よりも多く識別された重複を除去する。一実施形態において、脆弱性トラッカー140は、脆弱性のスコープおよびオフセットからフィンガープリントを生成することによって重複を識別する。
【0015】
[0019]スコープは、変数、関数、クラス、構造体、タイプといったエンティティの定義/宣言を含むステートメントおよび式(expression)を含む(ネストされ得る)ソースコードブロックである。スコープは、これらのエンティティの可視性をプログラムの一部に制限する。一実施形態において、スコープタグは、スコープ要素で構成されるスコープを一意に識別し、スコープ要素は、スコープについて関連するパッケージ、モジュール、名前空間、タイプ、クラス、関数定義といった概念を指す。スコープタグには、その対応するソースコードトークンがラベル付けされる。
【0016】
[0020]例えば、以下のコード断片を検討する。
module Widget
class CustomWidget
def run(user_supplied_arg)
exec(“echo #{user_supplied_arg}”)
end
end
end
【0017】
[0021]コード断片には、(1)custom_widget.rb、(2)custom_widget.rb>Widget、(3)custom_widget.rb>Widget>CustomWidget、(4)custom_widget.rb>Widget>CustomWidget>runの4つのスコープ/スコープタグが含まれる。なお、これは、ソースコードを含むファイルを別のスコープとして扱う。記号「>」は、スコープ要素を区切る区切り文字として本明細書において使用される。しかしながら、あらゆる好ましい区切り文字が使用されてもよい。
【0018】
[0022]オフセットは、スコープ内のコードの特定のピース(例えば、脆弱性として識別された行)の位置を示す。一実施形態において、オフセットは、スコープの開始から、識別される特定のコードピースまでのコードの行数を示す数として記述される。
【0019】
[0023]フィンガープリントを使用してコード内の重複した脆弱性を識別するためのプロセスの様々な実施形態は、
図2を参照して、以下により詳細に記載される。
【0020】
[0024]ネットワーク170は、ネットワーク化コンピューティング環境100の他の要素が通信する通信チャネルを提供する。ネットワーク170は、有線または無線通信システムを使用する、ローカルエリアおよびワイドエリアネットワークのあらゆる組み合わせを含むことが可能である。一実施形態において、ネットワーク170は、標準規格の通信技術および/またはプロトコルを使用する。例えば、ネットワーク170は、イーサネット(登録商標)、802.11、マイクロ波アクセスの世界的な相互運用(WiMAX、登録商標)、3G、4G、5G、符号分割多重アクセス(CDMA)、デジタル加入者線(DSL)などといった技術を使用する通信リンクを含むことが可能である。ネットワーク170を介して通信するために使用されるネットワークプロトコルの例は、マルチプロトコルラベルスイッチング(MPLS)、伝送制御プロトコル/インターネットプロトコル(TCP/IP)、ハイパーテキストトランスポートプロトコル(HTTP)、シンプルメールトランスファープロトコル(SMTP)、および、ファイルトランスファープロトコル(FTP)を含む。ネットワーク170上で交換されるデータは、ハイパーテキストマークアップ言語(HTML)または、拡張可能マークアップ言語(XML)といった、あらゆる適切なフォーマットを使用して表され得る。幾つかの実施形態において、ネットワーク170の通信リンクの幾つかまたは全部は、あらゆる適切な技術を使用して暗号化されてもよい。
【0021】
[0025]
図2は、脆弱性トラッカー140の一実施形態を示す。図示される実施形態において、脆弱性トラッカー140は、構文解析モジュール210、スコープ抽出モジュール220、スコープマッチングモジュール230、フィンガープリントモジュール240、重複除去モジュール250、および、脆弱性データベース260を含む。他の実施形態において、ネットワーク化コンピューティング環境100は、異なる要素または追加の要素を含む。加えて、機能は、記載される方法とは異なる方法で要素間に分散されてもよい。
【0022】
[0026]構文解析モジュール210は、ソースコードを構文解析して構文解析木を取得する。構文解析木は、ソースコードの構造的/階層的な表現である。例えば、構文解析木は、ライブラリ、クラス、関数、呼び出しなどを、それらの間の関係と共に示すことが可能である。一実施形態において、脆弱性トラッキング方法論は、あらゆる特定のプログラミング言語から独立しているため、ソースコードから構文解析木を生成することが可能なあらゆる構文解析ツールが使用され得る。
【0023】
[0027]構文解析は、ソースコードから構文解析木を導出するプロセスである。以下のコード断片は、4つの関数と4つの呼び出しを有する3つのクラスを含むサンプルプログラムexample.rbを示す。
class OuterClass
class InnerClassA
def function_A
puts “...”
end
def function_A
puts “...”
end
class InnerClassB
def function_A
puts “...”
end
def function_B
puts “...”
end
end
end
【0024】
[0028]構文解析は、ソースコードの構文要素を理解して構文木または構文解析木と呼ばれるコードの階層表現を構築することが可能である。
図3は、構文解析によって生成され得る構文解析木の単純化された図を示す。簡単にするために、スコープラベルのファイル名部分は以下の記載において省略される。構文解析木構造は、親子ノードの関係を通じてスコーピングをキャプチャする。親ノードは、スコープ要素を表す場合、その子にスコープを提供する。逆に、子ノードのスコープは、その親ノードによって提供されるスコープを伴わずには存在し得ない。例えば、子スコープOuterClass>InnerClassB>function_Aは、親スコープOuterClass>InnerClassBを伴わずには存在し得ない。
図3はまた、構文解析によって提供されるノード(図中の< >で囲まれた)のノードタイプを示す。例えば、OuterClassは、タイプ<class>のノードであり、ソースコードに出現するクラス宣言を参照するノードである。
【0025】
[0029]
図2に参照を戻すと、スコープ抽出モジュール220は、構文解析木を分析してソースコード内に存在するスコープ(ソースファイル内に存在する変数および/または関数の可視性をケージ(cage)するソースコードブロック)を識別する。一実施形態において、構文解析木内の各ノードはスコープに対応し、スコープは、木をルートノード(例えば、コードを含むファイル名)へ逆に走査し、かつ、構文解析された各ノードの識別子をラベルに追加することによってラベル付けされる。
【0026】
[0030]例えば、
図3のexample.rbコード断片およびその対応する構文解析木に戻ると、スコープ抽出モジュール220は、以下のラベルを有する7つのスコープを識別し、ここで、A>Bは、スコープ要素Bがスコープ要素A内にネストされていることを示す。
(a)example.rb>OuterClass[0]
(b)example.rb>OuterClass[0]>InnerClassA[0]
(c)example.rb>OuterClass[0]>InnerClassA[0]>function_A[0]
(d)example.rb>OuterClass[0]>InnerClassA[0]>function_A[1](cの重複)
(e)example.rb>OuterClass[0]>InnerClassB[0]
(f)example.rb>OuterClass[0]>InnerClassB[0]>function_A[0]
(g)example.rb>OuterClass[0]>InnerClassB[0]>function_B[0]
【0027】
[0031]特に、InnerClassA[0]には、2つのfunction_Aが存在し、最初のものはインデックス番号[0]を有するノード3であり、2番目のものはインデックス番号[1]を有するノード5である。ノード3のスコープ(上記の項目(c)に対応)は、ノード5のスコープ(上記の項目(d)に対応)と同じである。したがって、重複するものは除去されてよい。
【0028】
[0032]スコープ計算は、深度優先(DF)前順走査(pre-order traversal)によって行われ得る。前順走査は、子スコープを計算する前に親スコープの計算を可能にし、それらの相互依存性のために効率的な順序である。例えば、上記のスコープ(e)OuterClass[0]>InnerClassB[0](ノード7のスコープに対応)は、上記のスコープ(f)OuterClass[0]>InnerClassB[0]>function_A[0](ノード8のスコープに対応)を計算するために必要である。
図3の各ノードに関連付けられた数字は、スコープ抽出モジュール220が構文解析木内の各ノードを訪問し得る順序を示す。
【0029】
[0033]一実施形態において、スコープ抽出モジュール220は、(識別されたスコープ要素に基づいて計算される)タグのスタック、および、生成されている全てのタグをキャプチャするタグのセットに依拠する。走査アルゴリズムは、ノードタイプに関わらずに木を降りる(下る)。スコーピングに関して関連するノードタイプについて、スコープ抽出モジュール220は、タグを作成して下る。スコープ抽出器がスコープに対応するノードに遭遇するたびに、新しいスコープタグが生成される。スコーピングに関係しない幾つかのノードタイプはスキップされ得る。
【0030】
[0034]Example.rbの例では、走査ステップ1において、スコープ抽出モジュール220は、クラス宣言を表すため、スコープに関して関連するタイプ<class>のノードに遭遇する。したがって、それは、OuterClassについての対応するスコープタグを生成し、スコープタグをスコープタグのセットに追加し、スコープ抽出モジュール220が次に分析しようとする子ノードにアクセス可能であるように、スコープタグをタグスタックにプッシュする。走査ステップ3において、スコープ抽出器は、<funcdef>(関数定義ノード)に遭遇する。スコープ抽出モジュール220は、スタックから最後に生成されたタグアイテムを読み取る(peek)ことによってタグを生成する(OuterClass>InnnerClassA )。この情報は、新しいタグアイテム(OuterClass>InnerClassA>function_A)を生成するために使用される。なお、スコープ抽出モジュール220がノードの処理を完了すると、対応するタグアイテムがスタックから取り出される(popped)。例えば、スコープ抽出モジュール220は、走査ステップ3および4で完了すると、走査ステップ5において、OuterClass>InnerClassAがスタック上の最後のタグアイテムとなるように、スタックからOuterClass>InnerClassA>function_Aを取り出す。
【0031】
[0035]幾つかの言語においては、メソッド/クラスを複数回定義することが許容される。例えば、
図3の構文解析木によって表されるコードにおいて、関数_Aは、InnerClassA内において2回定義され、スコープ要素の連結がタグの固有性を保証しないように、両方ともOuterClass>InnerClassA>function_Aに変換される。一実施形態において、スコープ抽出モジュール220は、スコープ要素にナンバリングスキームを適用して、スコープ要素がスコープ内においてどの程度の頻度で遭遇したかを追跡する内部カウンタを維持することによって、固有のタグの生成を可能にする。
図3のケースにおいて、カウンタは、括弧内に囲まれた数字によって示される。したがって、スコープナンバリングスキームに起因して、スコープ抽出モジュール220は、InnerClassAにおいて2回出現するfunction_Aに対して同じスコープタグを使用する代わりに、OuterClass[0]>InnerClassA[0]>function_A[0]、および、OuterClass[0]>InnerClassA[0]>function_A[1]の両方の出現に対して個別のスコープタグを生成する。
【0032】
[0036]スコープ抽出モジュール220によって生成されたスコープタグは、スコープ境界、すなわち、所与のスコープの開始および終了のソース位置をキャプチャするソース座標を含み得る。例えば、スコープに対応するコードのブロックが開始および終了する行番号は、スコープ境界を定義するために使用され得る。
【0033】
[0037]以下の例は、サンプルプログラムcustom_widgets.rbからの抜粋を示す。
1: module Widget
2: class CustomWidget
3: def foo(arg)
/ / ...
10: end
/ / ...
20: def run(user_supplied_arg)
/ / ...
30: end
31:
32: end
33: end
【0034】
[0038]スコープ抽出モジュール220は、スコープタグと、ソースコード内のスコープの開始行および終了行によって示されるスコープ境界とを含むスコープテーブルを生成する。以下のスコープテーブルの例(表1)は、上記のコード断片に含まれるスコープの開始行および終了行だけでなく、スコープタグの詳細も示す。
【0035】
【0036】
[0039]例えば、表1において、スコープタグcustom_widget.rb[0]>Widget[0]>CustomWidget[0]>run[0]で実行される関数のスコープは、20行目から開始し、30行目で終了する。
【0037】
[0040]
図2を再び参照すると、スコープマッチングモジュール230は、1つまたは複数のSASTスキャナから受信した脆弱性レポートに含まれる脆弱性をスコープする。脆弱性レポートは、行番号によって脆弱性の場所を識別し得る。スコープマッチングモジュール230は、脆弱性の行番号と共にスコープ境界を使用して、それを含む/包むスコープを識別する。
【0038】
[0041]例えば、scope.start_lineおよびscope.end_lineがそれぞれソースコードファイル内のスコープの開始行および終了行(スコープ境界)を示すと仮定すると、スコープマッチングモジュール230は、そのソースコードライン(行)によって位置が識別される、レポートされた脆弱性を包含する最も狭いスコープを識別し得る。一実施形態において、スコープマッチングモジュールは、最も狭いスコープ、すなわち、以下のパラメータ(smatch)が最小化されるスコープを識別する。
smatch=((line-scope.start_line)+(scope.end_line-line))
scope.start_line<=line<=scope.end_line
【0039】
[0042]実行例であるcustom_widgets.rbを使用して、SASTツールがソースコードの25行目の脆弱性をレポートした場合、スコープマッチングモジュール230は、スコープ抽出モジュール220によって生成されたスコープテーブルに基づいて、マッチングスコープを決定する。以下の表2は、表1と同様であるが、各スコープのsmatch値も含む。
【0040】
【0041】
[0044]25行目はこのスコープの範囲内(20行目から30行目)であり、かつ、10のsmatch値は全てのスコープにわたって最も低いsmatch値であるため、マッチングスコープは、custom_widget.rb[0]>Widget[0]>CustomWidget[0]>run[0]である。なお、Custom_widget.rb[0]>Widget[0]>CustomWidget[0]>foo[0]は、制約scope.start_line<=line<=scope.end_lineを満たさないため、考慮されない。
【0042】
[0045]フィンガープリントモジュール240は、マッチングスコープを使用して、識別された脆弱性のフィンガープリントを生成する。フィンガープリントはまた、対応する脆弱性の種類またはカテゴリに基づいてもよい。フィンガープリントモジュール240は、脆弱性についてのスコープマッチングモジュール230によって識別されたスコープの名前、脆弱性のオフセット、または脆弱性分類子のうちの1つまたは複数を使用して、脆弱性についてのフィンガープリントを生成し得る。脆弱性分類子は、SASTから受信したレポートに含まれる脆弱性のカテゴリまたはタイプであり得る。一実施形態において、フィンガープリントモジュール240は、スコープ、オフセット、および、脆弱性分類子のうちの1つまたは複数からハッシュ値を計算することによって、フィンガープリントを生成する。例えば、スコープ名、オフセット値、および、脆弱性分類子は、ハッシュ関数への入力として提供されるテキスト文字列(場合によっては、部分間の区切り文字を伴う)に連結され得る。異なる分析器にわたってハッシュを比較可能にするために、CWE、CVE、または、OWASPカテゴリが使用され得る。
【0043】
[0046]Custom_widgets.rbの例に戻ると、SASTツールが25行目のクラス/タイプCWE-22の脆弱性をレポートした場合、フィンガープリントモジュール240は、次のハッシュを計算し得る。custom_widget.rb[0]>ウィジェット[0]>CustomWidget[0]>実行[0]>5>CWE-22、ここで、5は、それを囲むスコープ(line-scope.start_line)の開始行から脆弱性発見の行を減算することによって計算される相対的なスコープオフセットであり、CWE-22は脆弱性カテゴリである。
【0044】
[0047]重複除去モジュール250は、脆弱性のフィンガープリントに基づいて、どの脆弱性が同一であるかを識別し、かつ、重複を除去して、改良された脆弱性のセットをもたらす。この改良された脆弱性のセットは、改良されたレポートとして(例えば、脆弱性データベース260に)記憶されることが可能である。改良されたレポートは、重複除去に起因して占有するストレージを低減する。また、データアナリストが、重複する脆弱性の計算に費やす時間を大幅に短縮することが可能であるため、データアナリストがレポートをレビューし、かつ、識別された脆弱性に対処することがより効率的になる。
【0045】
[0048]一実施形態において、脆弱性の重複除去は、生成されたハッシュに基づいて行われる。2つの脆弱性を同じフィンガープリントに変換することが可能な場合、それらは同一と見なされる。具体的には、2つの脆弱性のハッシュが一致する場合、(1)同じスコープ内に位置し、(2)同じ脆弱性のタイプまたは分類を有し、かつ、(3)親スコープが開始する行番号と同じオフセットを有することを示す。
【0046】
[0049]Custom_widgets.rbの実行例に戻ると、開発者が実行関数を+100ソースコード行だけシフトすると、SASTツールは、CWE22の脆弱性を125行目において+100行差でレポートするであろう。フィンガープリントハッシュは、絶対位置(例えば、行番号)ではなく、スコープおよびオフセットに基づいて生成されるため、重複除去モジュール250は、25行目および125行目から脆弱性の重複を除去することが可能である。両方の脆弱性について、フィンガープリントハッシュは同一であり、custom_widget.rb[0]>Widget[0]>CustomWidget[0]>run[0]>5>CWE-22である。
【0047】
[0050]脆弱性データベース260は、重複除去モジュール250によって生成された改良された脆弱性レポートを記憶するように構成された1つまたは複数のコンピュータ可読媒体を含む。脆弱性データベース260は、脆弱性トラッカー140の一部である単一のエンティティとして示されるが、一実施形態において、脆弱性データベースは、ネットワーク170を介してアクセスされる分散データベース内の複数のデバイスにわたって分散される。
【0048】
例示的な方法
[0051]
図4は、一実施形態による、ソフトウェアプロジェクト内の脆弱性を識別および重複除去するための方法400を示す。
図4のステップは、方法400を実行する脆弱性トラッカー140の観点から示される。しかしながら、ステップの幾つかまたは全ては、他のエンティティまたはコンポーネントによって実行されてもよい。加えて、幾つかの実施形態は、ステップを並行して実施してもよいし、ステップを異なる順序で実施してもよいし、または、異なるステップを実施してもよい。
【0049】
[0052]
図4に示される実施形態において、方法400は、脆弱性トラッカー140が、(例えば、ソースコードリポジトリ110からソースコードを読み出すことによって)ソフトウェアプロジェクトについてのソースコードを受信410することから開始する。脆弱性トラッカー140は、ソースコードから構文解析木を生成420し、かつ、構文解析木を使用してソースコードブロックのスコープを抽出430する。脆弱性トラッカー140は、(例えば、1つまたは複数のコードスキャナ130から)脆弱性レポートを受信440し、かつ、識別された脆弱性を対応するスコープにマッチング450して、スコープされた脆弱性のセットを取得する。脆弱性トラッカー140は、(例えば、スコープ名、オフセット、および、脆弱性分類子からハッシュを生成することによって)スコープされた脆弱性の少なくとも幾つかについてのフィンガープリントを生成460し、ハッシュを使用して識別された脆弱性の重複を除去470する。脆弱性トラッカー140は、重複除去された脆弱性データから改良された脆弱性レポートを生成480する(および、記憶する)。
【0050】
コンピューティングシステムアーキテクチャ
[0053]
図5は、クライアントデバイス120、コードスキャナ130、または、脆弱性トラッカー140として、あるいは、ソースコードリポジトリ110をホストするために使用するのに適した例示的なコンピュータ500のブロック図である。例示的なコンピュータ500は、チップセット504に結合された少なくとも1つのプロセッサ502を含む。チップセット504は、メモリコントローラハブ520および入力/出力(I/O)コントローラハブ522を含む。メモリ506およびグラフィックスアダプタ512は、メモリコントローラハブ520に結合され、ディスプレイ518は、グラフィックスアダプタ512に結合される。ストレージデバイス508、キーボード510、ポインティングデバイス514、および、ネットワークアダプタ516は、I/Oコントローラハブ522に結合される。コンピュータ500の他の実施形態は、異なるアーキテクチャを有する。
【0051】
[0054]
図4に示す実施形態において、ストレージデバイス508は、ハードドライブ、コンパクトディスク読み取り専用メモリ(CD-ROM)、DVD、または、ソリッドステートメモリデバイスといった非一時的なコンピュータ可読記憶媒体である。メモリ506は、プロセッサ502によって使用される命令およびデータを保持する。ポインティングデバイス514は、マウス、トラックボール、タッチスクリーン、または、他のタイプのポインティングデバイスであり、かつ、コンピュータシステム500にデータを入力するためにキーボード510(オンスクリーンキーボードでもよい)と組み合わせて使用され得る。グラフィックスアダプタ512は、ディスプレイデバイス518上に画像および他の情報を表示する。ネットワークアダプタ516は、コンピュータシステム500を、ネットワーク170のような1つまたは複数のコンピュータネットワークに結合する。
【0052】
[0055]
図1および
図2のエンティティによって使用されるコンピュータのタイプは、実施形態およびエンティティに必要とされる処理能力に応じて変化することが可能である。例えば、ソースコードリポジトリ110をホストするシステムは、記載された機能を提供するために共に動作する複数のブレードサーバを含み得、その一方で、クライアントデバイス120は、デスクトップワークステーションまたはタブレットであり得る。さらに、コンピュータ500は、キーボード510、グラフィックスアダプタ512、および、ディスプレイ518といった上記のコンポーネントの一部を欠くものとすることが可能である。
【0053】
追加的な考慮事項
[0056]上述の幾つかの部分は、アルゴリズム的なプロセスまたは動作の観点から実施形態を記載する。これらのアルゴリズム的な記載および表現は、コンピューティング技術の当業者が、その作業の内容を他の当業者に効果的に伝えるために一般的に使用される。これらの動作は、機能的、計算的または論理的に記載されるが、プロセッサまたは等価な電気回路によって実行される命令、マイクロコードなどを含むコンピュータプログラムによって実装されると理解されるべきである。さらに、一般性を損なうことなく、このような機能的動作の配置をモジュールと呼ぶことも、場合によっては利便であることが証明されている。
【0054】
[0057]本明細書において使用される場合、「一実施形態(one embodiment)」または「実施形態(an embodiment)」への言及は、その実施形態に関連して説明される特定のエレメント、特徴、構造、または、特性が少なくとも一実施形態に含まれることを意味する。本明細書の様々な箇所に現れる「一実施形態において」という語句は、必ずしも全てが同じ実施形態を指しているとは限らない。同様に、エレメントまたはコンポーネントの前の「a」または「an」の使用は、単に便宜上のために行われる。この記載は、それ以外を意味することが明らかでない限り、エレメントまたはコンポーネントのうちの1つまたは複数が存在することを意味すると理解されるべきである。
【0055】
[0058]値が「約」または「実質的に」(またはそれらの派生)として記載される場合、文脈から他の意味であることが明らかでない限り、そのような値は、正確な+/-10%と解釈されるべきである。例から、「約10」は、「9から11の範囲内」を意味すると理解されるべきである。
【0056】
[0059]本明細書において使用される場合、「備える(comprises)」、「備えている(comprising)」、「含む(includes)」、「含んでいる(including)」、「有する(has)」、「有している(having)」、または、それらのあらゆる他の変形は、非排他的な包含をカバーすることを意図している。例えば、エレメントのリストから構成されるプロセス、方法、物品、または、装置は、必ずしもそれらのエレメントのみに限定されるのではなく、そのようなプロセス、方法、物品、または、装置に明示的に記載されていない、または固有の他のエレメントを含み得る。さらに、明示的に反対の記載がない限り、「または」は、包括的な「または」を意味し、排他的な「または」を意味しない。例えば、条件AまたはBは、次の何れか1つによって満たされる。Aは真であり(または存在する)且つBは偽である(または存在しない)、Aは偽であり(または存在しない)且つBは真である(または存在する)、および、AおよびBの両方が真である(または存在する)。
【0057】
[0060]本開示を読めば、当業者は、重複するインスタンスを低減するためにスコープ値およびオフセット値を使用して脆弱性を追跡するシステムおよびプロセスのためのさらなる追加の代替の構造および機能的なデザインを理解するであろう。したがって、特定の実施形態および用途が例示および記載されているが、記載された主題は、開示された正確な構造およびコンポーネントに限定されないことを理解すべきである。保護の範囲は、発行するあらゆる請求項によってのみ制限されるべきである。
【手続補正書】
【提出日】2024-03-12
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
ソフトウェアプロジェクトの脆弱性を分析する方法であって、
ソースコードを受信することと、
前記ソースコードから構文解析木を生成することと、
前記構文解析木を使用してソースコードブロックのスコープを抽出することと、
1つまたは複数のコードスキャナから、前記ソースコードに関連する脆弱性レポートを受信することであって、前記脆弱性レポートは前記ソースコード内の脆弱性を識別する、脆弱性レポートを受信することと、
前記脆弱性レポートにおいて識別された前記脆弱性を対応するスコープにマッチングして、スコープされた脆弱性のセットを生成することと、
前記スコープされた脆弱性の少なくとも一部のフィンガープリントを生成することと、
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することと、
前記重複を除去されたスコープされた脆弱性を使用して、改良された脆弱性レポートを生成することと、を含む、方法。
【請求項2】
前記構文解析木は、複数のノードを含み、前記複数のノードは、少なくとも1つの親ノードおよび子ノードを含み、前記親ノードは、前記子ノードにスコープを提供するスコープを表し、かつ、前記子ノードは、前記親ノードによって提供される前記スコープを伴わずには存在し得ない、請求項1に記載の方法。
【請求項3】
前記親ノードは、外部クラスを表し、かつ、前記子ノードは、前記外部クラス内にネストされた内部クラスを表す、請求項2に記載の方法。
【請求項4】
前記親ノードは、クラスを表し、かつ、前記子ノードは、前記クラス内にネストされた関数を表す、請求項2に記載の方法。
【請求項5】
前記構文解析木を使用してソースコードブロックのスコープを抽出することは、
子を有さないエンド子ノードから親を有さないルート親ノードへ前記構文解析木を走査することと、
前記複数のノードそれぞれのスコープを対応するノードの識別子でラベル付けすることと、を含む、請求項2に記載の方法。
【請求項6】
ソースコードのスコープを抽出することは、
深度優先(DF)前順走査を実施することと、前記構文解析木における前記複数のノードのそれぞれを走査することと、を含む、請求項2に記載の方法。
【請求項7】
脆弱性についての前記フィンガープリントは、前記脆弱性のスコープおよび前記脆弱性のオフセットを使用して生成され、前記オフセットは、前記スコープの開始行から前記脆弱性の行番号を減算することによって計算される、請求項1に記載の方法。
【請求項8】
前記脆弱性についての前記フィンガープリントを生成することは、前記スコープおよびオフセットを使用してハッシュを計算することを含む、請求項7に記載の方法。
【請求項9】
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することは、
2つの脆弱性についての2つのハッシュを比較して、前記2つの脆弱性が、(1)同じスコープ内に位置するか、(2)同じ脆弱性のタイプまたは分類を有するか、(3)それらの親スコープが開始する行番号に対して同じオフセットを有するかを決定することと、
2つの脆弱性の2つのハッシュが一致するとの決定に応答して、前記2つの脆弱性のうちの1つをスコープ脆弱性のセットから削除することと、を含む、請求項8に記載の方法。
【請求項10】
前記フィンガープリントは、前記脆弱性の分類子を使用してさらに生成される、請求項7に記載の方法。
【請求項11】
エンコードされた
命令を有する非一時的なコンピュータ可読記憶媒
体であって
、プロセッサによって実行されると、前記プロセッサに、
ソースコードを受信することと、
前記ソースコードから構文解析木を生成することと、
前記構文解析木を使用してソースコードブロックのスコープを抽出することと、
1つまたは複数のコードスキャナから、前記ソースコードに関連する脆弱性レポートを受信することであって、前記脆弱性レポートは前記ソースコード内において脆弱性を識別する、脆弱性レポートを受信することと、
前記脆弱性レポートにおいて識別された前記脆弱性を対応するスコープにマッチングして、スコープされた脆弱性のセットを生成することと、
前記スコープされた脆弱性の少なくとも一部のフィンガープリントを生成することと、
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することと、
前記重複を除去されたスコープされた脆弱性を使用して、改良された脆弱性レポートを生成することと、を行わせる、
非一時的なコンピュータ可読記憶媒体。
【請求項12】
前記構文解析木は、複数のノードを含み、前記複数のノードは、少なくとも1つの親ノードおよび子ノードを含み、前記親ノードは、前記子ノードにスコープを提供するスコープを表し、かつ、前記子ノードは、前記親ノードによって提供される前記スコープを伴わずには存在し得ない、請求項11に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項13】
前記親ノードは、外部クラスを表し、かつ、前記子ノードは、前記外部クラス内にネストされた内部クラスを表す、請求項12に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項14】
前記親ノードは、クラスを表し、かつ、前記子ノードは、前記クラス内にネストされた関数を表す、請求項12に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項15】
前記構文解析木を使用してソースコードブロックのスコープを抽出することは、
子を有さないエンド子ノードから親を有さないルート親ノードへ前記構文解析木を走査することと、
前記複数のノードそれぞれのスコープを対応するノードの識別子でラベル付けすることと、を含む、請求項12に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項16】
ソースコードのスコープを抽出することは、
深度優先(DF)前順走査を実施することと、前記構文解析木における前記複数のノードのそれぞれを走査することと、を含む、請求項12に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項17】
脆弱性についての前記フィンガープリントは、前記脆弱性のスコープおよび前記脆弱性のオフセットを使用して生成され、前記オフセットは、前記スコープの開始行から前記脆弱性の行番号を減算することによって計算される、請求項11に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項18】
前記脆弱性についての前記フィンガープリントを生成することは、前記スコープおよびオフセットを使用してハッシュを計算することを含む、請求項17に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項19】
前記フィンガープリントを使用して前記スコープされた脆弱性の重複を除去することは、
2つの脆弱性についての2つのハッシュを比較して、前記2つの脆弱性が、(1)同じスコープ内に位置するか、(2)同じ脆弱性のタイプまたは分類を有するか、(3)それらの親スコープが開始する行番号に対して同じオフセットを有するかを決定することと、
2つの脆弱性の2つのハッシュが一致するとの決定に応答して、前記2つの脆弱性のうちの1つをスコープ脆弱性のセットから削除することと、を含む、請求項18に記載の
非一時的なコンピュータ可読記憶媒体。
【請求項20】
前記フィンガープリントは、前記脆弱性の分類子を使用してさらに生成される、請求項17に記載の
非一時的なコンピュータ可読記憶媒体。
【国際調査報告】