JP7075011B2 - 情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム - Google Patents

情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム Download PDF

Info

Publication number
JP7075011B2
JP7075011B2 JP2018135851A JP2018135851A JP7075011B2 JP 7075011 B2 JP7075011 B2 JP 7075011B2 JP 2018135851 A JP2018135851 A JP 2018135851A JP 2018135851 A JP2018135851 A JP 2018135851A JP 7075011 B2 JP7075011 B2 JP 7075011B2
Authority
JP
Japan
Prior art keywords
instruction
patch
instruction type
sequence
type
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2018135851A
Other languages
English (en)
Other versions
JP2020013385A (ja
Inventor
佳宏 安田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2018135851A priority Critical patent/JP7075011B2/ja
Publication of JP2020013385A publication Critical patent/JP2020013385A/ja
Application granted granted Critical
Publication of JP7075011B2 publication Critical patent/JP7075011B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Description

本発明は、情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラムに関する。
オープンソースソフトウェア(OSS:Open Source Software)の商用システムへの適用が近年盛んになっている。OSSを利用したシステムを構築する場合、システムの管理者は、例えばOSSのソースコードをビルドして実行形式のソフトウェアを生成し、そのソフトウェアをシステムに導入する。
OSSの脆弱性が見つかると、システムの管理者は、OSS修正用のパッチプログラム(以下、修正パッチと呼ぶ)を取得して、OSSを修正する。システムには、様々な修正パッチが適用される。そこで、システムを安全に運用するために、システムの管理者は、システムへの各種修正パッチの適用の有無を管理することとなる。OSSは、パッケージ管理ツールによって脆弱性管理ができるディストリビューションと異なり、脆弱性管理ツールが十分に整備されていない。そのためシステムの管理者は、提供元が公開している修正パッチ情報を収集し、独自に脆弱性の修正パッチ適用の有無を管理する。
OSSをシステムへ導入する際には、ソフトウェアの開発支援技術を利用することができる。ソフトウェアの開発支援に関する技術としては、例えば、複数のソフトウェア部品を結合する作業において、当該複数のソフトウェア間で公開、参照される関数の取り扱いの整合性を保つために人が行う作業量を低減するソフトウェア開発支援システムがある。
またパッチ適用を可視化する技術もある。例えばカスタマイズした基準ソースコードに対して、その基準ソースコードのバージョン変更による変更箇所を反映する場合に、変更すべき確度に基づいて修正候補箇所を提示するソフトウェア開発支援方法がある。
特開2004-362048号公報 特開2017-045354号公報
OSSのソースコードをビルドして利用しているシステムでは、脆弱性に対処するための修正パッチの適用状況の調査に時間がかかるという問題がある。その要因の1つは、OSSの変数名や関数名を変更して運用する場合があることである。
例えば、修正パッチにおいて、変数名や関数名を含む行の削除や追加が行われる場合、変数名や関数名でソースコード内を検索すれば、修正パッチの適用により修正される行を容易に見つけ出すことができる。しかし、OSSの修正パッチを適用する際に、プログラム側の命名規則にしたがってOSSの修正パッチの変数名や関数名を書き換えて適用していると、ソースコードに対する変数名や関数名での検索では、修正パッチの適用箇所を抽出することができない。この場合、管理者は、ソースコードを詳細に確認して、パッチの適用の有無を判断することとなり、調査に時間がかかってしまう。
1つの側面では、本件は、パッチの適用の有無を判定できるようにすることを目的とする。
1つの案では、以下に示す記憶部と処理部とを有する情報処理装置が適用される。
記憶部は、一部の命令列を修正命令列に変更するパッチの適用対象であるソースファイルを記憶する。処理部は、修正命令列を含むパッチファイルに基づいて、修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成する。次に処理部は、ソースファイル内の各命令の命令種別を示すソース命令種別情報を生成する。さらに処理部は、パッチ命令種別情報とソース命令種別情報とに基づいて、ソースファイルから、修正命令列と命令種別の並びが一致する種別一致命令列を抽出する。そして処理部は、種別一致命令列と修正命令列との、変数名と関数名とを除外した記述内容に基づいて、ソースファイルにパッチが適用されているか否かを判定する。
1態様によれば、パッチの適用の有無が判定可能となる。
第1の実施の形態に係るパッチ適用確認方法の一例を示す図である。 第2の実施の形態のパッチ適用確認システムの一例を示す図である。 コンピュータのハードウェアの一例を示す図である。 修正パッチ適用可視化機能の一例を示すブロック図である。 修正パッチの一例を示す図である。 ソースファイルの一例を示す図である。 固定キーワード辞書の一例を示す図である。 修正パッチに対する命令種別判定の一例を示す図である。 配列を用いた修正パッチの命令種別判定処理の一例を示す図である。 ソースファイルに対する命令種別判定の一例を示す図である。 配列を用いたソースファイルの命令種別判定処理の一例を示す図である。 パッチ導入箇所推定処理の一例を示す図である。 マッチング処理の一例を示す図である。 配列を用いたマッチング処理の一例を示す図である。 マッチング結果の一例を示す図である。 可変キーワードの対応関係の保存例を示す図である。 類似度算出処理の一例を示す図である。 パッチ適用情報の一例を示す図である。 結果表示画面の一例を示す図である。 修正パッチ適用可視化処理の手順の一例を示すフローチャートである。 命令種別判定処理の手順の一例を示すフローチャートである。 命令種別情報取得処理の手順の詳細を示すフローチャートの前半である。 命令種別情報取得処理の手順の詳細を示すフローチャートの後半である。 パッチ導入箇所推定処理の手順の一例を示すフローチャートである。 マッチング処理の手順の一例を示すフローチャートである。 類似度算出処理の手順の一例を示すフローチャートである。 結果出力処理の手順の一例を示すフローチャートである。
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
まず第1の実施の形態について説明する。
図1は、第1の実施の形態に係るパッチ適用確認方法の一例を示す図である。図1の例では、情報処理装置10を用いてパッチ適用確認方法を実施している。情報処理装置10は、記憶部11と処理部12とを有する。記憶部11は、例えば情報処理装置10が有するメモリ、またはストレージ装置である。処理部12は、例えば情報処理装置10が有するプロセッサ、または演算回路である。情報処理装置10は、例えばパッチ適用確認方法の処理手順を記述したパッチ適用確認プログラムを処理部12に実行させることで、パッチ適用確認方法を実施することができる。
記憶部11は、一部の命令列を修正命令列1aに変更するパッチの適用対象であるソースファイル2を記憶する。
処理部12は、修正命令列1aを含むパッチファイル1に基づいて、修正命令列1a内の各命令の命令種別を示すパッチ命令種別情報3を生成する。例えばパッチファイル1には、ソースファイル2のどの命令を削除して、どのような命令を追加するのかが定義されている。処理部12は、パッチファイル1を解析することで、パッチ適用後に、ソースファイル2内のパッチにより修正された部分が、どのような命令列になるのかを判断し、その命令列を修正命令列1aとする。また処理部12は、ソースファイル2内の各命令の命令種別を示すソース命令種別情報4を生成する。命令種別には、変数型を定義する「宣言」や、処理の実施条件を定義する「条件」や、変数または配列の要素に値を設定する「代入」などがある。
次に処理部12は、パッチ命令種別情報3とソース命令種別情報4とに基づいて、ソースファイル2内の、修正命令列1aと命令種別の並びが一致する種別一致命令列2aの位置(命令種別一致箇所)を判定する。命令種別一致箇所は、例えばソースファイル2内のソースコードの行の範囲(何行目から何行目までか)で示される。そして処理部12は、ソースファイル2から、命令種別一致箇所に記述された種別一致命令列2aを抽出する。
処理部12は、種別一致命令列2aと修正命令列1aとの、変数名と関数名とを除外した記述内容に基づいて、ソースファイル2にパッチが適用されているか否かを判定する。例えば処理部12は、変数名と関数名とを除外した種別一致命令列2aの記述内容と、変数名と関数名とを除外した修正命令列1aの記述内容との類似度を算出する。そして処理部12は、算出した類似度に基づいて、ソースファイル2にパッチが適用されているか否かを判定する。
類似度算出では、例えば処理部12は、種別一致命令列2aと修正命令列1aとのそれぞれの命令行に先頭から順に行番号を付与する。そして処理部12は、同じ行番号の行同士の記述の同一性を判定し、一致すると判定した行の割合を類似度とする。
行同士の同一性の判定では、例えば処理部12は、比較対象の行内の単語同士を、行の先頭から順に比較する。その際、処理部12は、例えば少なくとも単語の種別が同一であれば、単語が一致すると判定する。また処理部12は、単語の種別だけでなく、単語の文字または記号が完全に同一の場合に、単語が一致すると判定してもよい。さらに処理部12は、種別が同一であれば一致と判定する方法と、文字または記号が完全に同一であれば一致と判定する方法とのうち、採用する判定方法を、単語の種別に応じて決定してもよい。例えば処理部12は、単語の種別が変数型の場合、種別が同一であれば、単語が一致すると判定し、単語の種別は算術演算子などの演算子の場合、文字または記号が完全に同一であれば、単語が一致すると判定する。
単語の種別の判定には、キーワード辞書を用いることができる。例えば記憶部11は、行間の同一性の判定において比較対象とする単語のリストを含むキーワード辞書を記憶する。処理部12は、種別一致命令列2aの第1の行内のキーワード辞書に含まれる単語と、修正命令列1aにおける、第1の行と同じ行番号の第2の行内のキーワード辞書に含まれる単語とを比較することで、同じ行番号の行同士の同一性を判定する。
類似度に基づくパッチ適用の有無の判定では、処理部12は、類似度が100%であれば、ソースファイル2にパッチが適用済みであると判定する。また処理部12は、類似度が予め設定された閾値以上であれば、ソースファイル2にパッチが適用されている可能性が高いと判定する。さらに処理部12は、類似度が閾値未満であれば、ソースファイル2に対してパッチが未適用であると判定する。
このようにして、変数名や関数名のように、変更の自由度が高く、システムの管理者が自由に変更できる単語を除外して、パッチの適用の有無を判断できる。すなわち処理部12が、修正命令列1aと命令種別の並びが同じ種別一致命令列2aをソースファイル2から抽出することで、パッチの適用により修正される可能性の高い部分を適切に抽出できる。そして、パッチ適用で修正される可能性が高い部分である種別一致命令列2aと修正命令列1aとを比較して、パッチの適用の有無を判定することで、変数名や関数名を除外しても、高精度に判定することができる。
また処理部12は、変数型の型の定義の変更のように、同一種別内で単語を変更してもプログラム上の処理のアルゴリズムに変更がないような単語については、種別が同一であれば一致すると判定することができる。これにより、パッチ適用の有無の判定精度が向上する。例えば図1の例では、修正命令列1aの1行目の先頭の単語は、変数型の単語「short」である。それに対して、種別一致命令列2aの1行目の先頭の単語は、変数型の単語「int」である。単語「short」と単語「int」は、変数型のうちの整数型と呼ばれる型の指定であり、変数に格納する値のサイズが異なるのみである。このような変数型の変更は、情報処理装置10の使用者が独自に行っている可能性がある。そのため処理部12は、変数型の単語については、種別が変数型で同一であれば、文字または記号が同一でなくても、類似度の算出時の比較においては、一致すると判定してもよい。これにより、ソースファイル2に対して変数型の変更の改変が加えられている場合でも、パッチの適用の有無を正しく判断できるようになる。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、OSSを利用しているコンピュータにおける修正パッチの適用状況を可視化するものである。
図2は、第2の実施の形態のパッチ適用確認システムの一例を示す図である。OSSを利用しているコンピュータ100は、ネットワーク20を介してサーバ200に接続されている。サーバ200は、修正パッチを配布するコンピュータである。
コンピュータ100は、OSSコミュニティがサーバ200を用いて公開している修正パッチとソースファイルとの類似度に基づいて、ソースファイルへの修正パッチの適用の有無を判断する。
例えばコンピュータ100に導入しているOSSの脆弱性が、サーバ200で配布されている修正パッチで修正できる場合、コンピュータ100の管理者は、その修正パッチがコンピュータ100に適用済みか否かを調査することとなる。このとき管理者は、パッチ適用確認プログラムをコンピュータ100で実行することで、コンピュータ100に修正パッチの適用状況を可視化させる。管理者は、例えば可視化された修正パッチの適用状況を参考にして、ソースコードの内容を確認し、修正パッチが正しく適用されているか否かを調査する。
図3は、コンピュータのハードウェアの一例を示す図である。コンピュータ100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してメモリ102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU(Central Processing Unit)、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)である。プロセッサ101がプログラムを実行することで実現する機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
メモリ102は、コンピュータ100の主記憶装置として使用される。メモリ102には、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、プロセッサ101による処理に利用する各種データが格納される。メモリ102としては、例えばRAM(Random Access Memory)などの揮発性の半導体記憶装置が使用される。
バス109に接続されている周辺機器としては、ストレージ装置103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
ストレージ装置103は、内蔵した記録媒体に対して、電気的または磁気的にデータの書き込みおよび読み出しを行う。ストレージ装置103は、コンピュータの補助記憶装置として使用される。ストレージ装置103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、ストレージ装置103としては、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)を使用することができる。
グラフィック処理装置104には、モニタ21が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ21の画面に表示させる。モニタ21としては、有機EL(Electro Luminescence)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード22とマウス23とが接続されている。入力インタフェース105は、キーボード22やマウス23から送られてくる信号をプロセッサ101に送信する。なお、マウス23は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク24に記録されたデータの読み取りを行う。光ディスク24は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク24には、DVD(Digital Versatile Disc)、DVD-RAM、CD-ROM(Compact Disc Read Only Memory)、CD-R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、コンピュータ100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置25やメモリリーダライタ26を接続することができる。メモリ装置25は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ26は、メモリカード27へのデータの書き込み、またはメモリカード27からのデータの読み出しを行う装置である。メモリカード27は、カード型の記録媒体である。
ネットワークインタフェース108は、ネットワーク20に接続されている。ネットワークインタフェース108は、ネットワーク20を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
コンピュータ100は、以上のようなハードウェア構成によって、第2の実施の形態の処理機能を実現することができる。なおサーバ200も、図3に示したコンピュータ100と同様のハードウェアにより実現することができる。また第1の実施の形態に示した情報処理装置10も、図3に示したコンピュータ100と同様のハードウェアにより実現することができる。
コンピュータ100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。コンピュータ100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ100に実行させるプログラムをストレージ装置103に格納しておくことができる。プロセッサ101は、ストレージ装置103内のプログラムの少なくとも一部をメモリ102にロードし、プログラムを実行する。またコンピュータ100に実行させるプログラムを、光ディスク24、メモリ装置25、メモリカード27などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、ストレージ装置103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
コンピュータ100は、修正パッチの適用の有無を可視化するための修正パッチ適用可視化機能を有する。
図4は、修正パッチ適用可視化機能の一例を示すブロック図である。コンピュータ100は、導入されているOSSの修正パッチを、サーバ200が有するリポジトリ210から取得し、取得した修正パッチの適用の有無を可視化することができる。修正パッチの適用の有無を可視化するために、コンピュータ100は、図4に示す各要素を有する。すなわちコンピュータ100は、ソースファイル記憶部110、固定キーワード辞書記憶部120、類似度閾値記憶部130、ソースコード取得部141、命令種別判定部142、命令種別記憶部143、パッチ導入箇所推定部144、パッチ導入推定箇所記憶部145、マッチング処理部146、マッチング結果記憶部147、類似度算出部148、類似度記憶部149、結果出力部150、およびパッチ適用情報記憶部151を有する。
ソースファイル記憶部110は、OSSのソースコードが記述されたソースファイルを記憶する。ソースファイルは、修正パッチ適用可視化処理の開始前に、予めソースファイル記憶部110に格納される。なおソースファイルに記述されているOSSのソースコードは、変数名や関数名が変更されている場合がある。
固定キーワード辞書記憶部120は、固定キーワード辞書を記憶する。固定キーワード辞書は、ソースコードに含まれる単語を固定キーワードと可変キーワードとに分類する場合における、固定キーワードに該当する単語を示す情報である。固定キーワードは、例えば算術演算子のように、変更してしまうと、ソースファイルで示されるプログラムの処理内容が変わってしまう単語である。命令の終端を示す「;」のように、プログラミング言語の仕様上、他の文字に置き換えることが許容されない文字も、固定キーワードである。可変キーワードは、例えば変数名や関数名のように、変更してもソースファイルで示されるプログラムの処理内容が変わらない単語である。
また固定キーワード辞書には、各単語の種別(変数型、条件演算子など)が示されている。固定キーワード辞書は、修正パッチ適用可視化処理の開始前に、予め固定キーワード辞書記憶部120に格納される。
類似度閾値記憶部130は、修正パッチ導入推定箇所について、部分一致とするか不一致とするかを判定するための類似度の閾値を記憶する。類似度の閾値は、例えば「50%」である。類似度の閾値は、修正パッチ適用可視化処理の開始前に、予め類似度閾値記憶部130に格納される。
ソースコード取得部141は、適用対象の修正パッチを示すパッチファイルに記述された修正用ソースコードと、その修正パッチを適用するOSSのソースコードとを取得する。例えばソースコード取得部141は、ネットワーク20を介して、サーバ200内のリポジトリ210から、修正パッチの修正用ソースコードを取得する。またソースコード取得部141は、ソースファイル記憶部110内のソースファイルから、修正パッチを適用するOSSのソースコードを取得する。
命令種別判定部142は、固定キーワード辞書に示された単語の種別に基づいて、修正パッチの修正用ソースコードと、OSSのソースファイル内のソースコードとのそれぞれについて、行ごとの命令種別を判定する。命令種別判定部142は、命令種別の判定結果を、命令種別記憶部143に格納する。
命令種別記憶部143は、修正パッチの修正用ソースコードとOSSのソースコードとの行ごとの命令種別を記憶する。
パッチ導入箇所推定部144は、修正パッチのソースコードとOSSのソースコードとの行ごとの命令種別に基づいて、OSSのソースコード内のパッチ導入推定箇所を特定する。パッチ導入推定箇所は、OSSのソースコードのうち、修正パッチに基づいて修正されている可能性がある部分である。パッチ導入箇所推定部144は、パッチ導入推定箇所を示す情報を、パッチ導入推定箇所記憶部145に格納する。
パッチ導入推定箇所記憶部145は、パッチ導入推定箇所を示す情報を記憶する。
マッチング処理部146は、固定キーワード辞書を参照し、パッチ導入推定箇所の各行の固定キーワードを、修正パッチの修正用ソースコードの各行の固定キーワードと比較し、行ごとの一致・不一致を判断する。マッチング処理部146は、一致・不一致の判断結果(マッチング結果)を、マッチング結果記憶部147に格納する。
マッチング結果記憶部147は、マッチング結果を記憶する。
類似度算出部148は、マッチング結果に基づいて、パッチ導入推定箇所と修正パッチとの類似度を算出する。そして類似度算出部148は、算出した類似度に基づいて、類似度のランク分けを行う。例えば類似度算出部148は、パッチ導入推定箇所の類似度が100%一致の場合、そのパッチ導入推定箇所について完全一致と判定する。また類似度算出部148は、類似度閾値記憶部130に格納されている類似度の閾値に基づいて、パッチ導入推定箇所の類似度が閾値以上の場合、そのパッチ導入推定箇所について類似度高(部分一致)と判定する。また類似度算出部148は、パッチ導入推定箇所の類似度が閾値未満の場合、そのパッチ導入推定箇所について不一致と判定する。類似度算出部148は、算出した類似度と、類似度のランクとを、類似度記憶部149に格納する。
類似度記憶部149は、パッチ導入推定箇所の類似度と、類似度のランクとを記憶する。
結果出力部150は、類似度記憶部149に格納されたパッチ導入推定箇所の類似度に基づいて、OSSのソースファイルごとに、そのソースファイルへの修正パッチの適用状況を示すパッチ適用情報を生成する。さらに結果出力部150は、パッチ導入推定箇所のソースコードと修正パッチの修正用ソースコードとの比較情報を生成してもよい。そして結果出力部150は、パッチ適用情報またはソースコードの比較情報を、パッチ適用情報記憶部151に格納する。また結果出力部150は、パッチ適用情報またはソースコードの比較情報を、モニタ21に表示させることもできる。
なお、図4に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、図4に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
次にサーバ200のリポジトリ210に格納される修正パッチについて具体的に説明する。
図5は、修正パッチの一例を示す図である。リポジトリ210には、複数の修正パッチ211,212,・・・が格納されている。修正パッチ211,212,・・・には、OSSのソースファイルの修正内容を示す修正用ソースコードが記述されている。修正パッチ211,212,・・・において、先頭の文字が「+」の行は、その行の「+」に続く文字列を、ソースファイルに追加することを示している。また、修正パッチ211,212,・・・において、先頭の文字が「-」の行は、その行の「-」に続く文字列に対応する行を、ソースファイルから削除することを示している。
次にソースファイル記憶部110に格納されるソースファイルについて具体的に説明する。
図6は、ソースファイルの一例を示す図である。ソースファイル記憶部110には、複数のソースファイル111,112,・・・が格納されている。各ソースファイル111,112,・・・に記述されているソースコードは、一般に配布されているオリジナルのソースファイルに対して、変数名や関数名の書き換えが行われている可能性がある。例えばソースファイル111の「int」は、オリジナルのソースファイルにおける「short」から書き換えられたものである。
このように、ソースファイル111,112,・・・内のソースコードの書き換えが行われている場合がある。この場合、各ソースファイル111,112,・・・への適用の有無を判定する際に、変数名や関数名を含む検索キーによる修正箇所の検索を行っても、修正箇所を適切に検出することができない。そこでコンピュータ100では、ソースコードから変数名や関数名を抽出し、変数名または関数名以外の記述を解析して、修正パッチの適用の有無を判断する。例えばコンピュータ100は、修正パッチの適用の有無の判断には、固定キーワード辞書を用いる。
次に、固定キーワード辞書記憶部120に格納された固定キーワード辞書について、具体的に説明する。
図7は、固定キーワード辞書の一例を示す図である。固定キーワード辞書121は、例えば表形式のデータ構造となっている。固定キーワード辞書121の各行の第0列には、ソースコードに用いられる単語(記号を含む)の種別(単語種別)が設定されている。例えば「変数型」、「算術演算子」、「関係演算子」、「条件演算子」、「記号・引用符」、「その他」などの単語種別がある。固定キーワード辞書121の各行の第2列以降の各列には、その行に設定された単語種別に該当する単語が設定されている。
単語種別「変数型」は、変数の型(文字型、整数型、浮動小数点型など)を示す単語であり、例えば「int」、「short」などの型名を示す単語が該当する。
単語種別「算術演算子」は、算術演算を示す単語であり、例えば「+」、「-」、「*」、「/」、「%」などの記号が該当する。
単語種別「関係演算子」は、2つの対象の関係を判定するための単語であり、例えば「=」、「>」、「<」、「≠」、「==」、「!=」などの記号が該当する。
単語種別「条件演算子」は、処理の分岐条件を定義するのに用いる単語であり、例えば「if」、「while」、「for」などの単語が該当する。
単語種別「記号・引用符」は、続く文字が記号または引用符であることを示す単語であり、例えば「“」、「¥」、「’」などの記号が該当する。
単語種別「その他」は、上記の単語種別以外の固定キーワードであり、例えば「(」、「)」などの記号が該当する。
固定キーワード辞書121は、ソースコードの各行の命令種別の判定や、各単語が固定キーワードか可変キーワードかの判定に用いられる。命令種別の判定は、適用の有無の確認対象の修正パッチと、その修正パッチの適用対象のソースファイルとのそれぞれに対して行われる。
図8は、修正パッチに対する命令種別判定の一例を示す図である。ソースコード取得部141がリポジトリ210から、適用の有無の確認対象の修正パッチ211を取得し、取得した修正パッチ211を命令種別判定部142に送信する。すると命令種別判定部142が、修正パッチ211内のソースコードについて、1行ごとの命令種別を判定する。
例えば命令種別判定部142は、種別判別のために、種別判別に不要な修正パッチ211内の記載を削除する編集を行う。例えば命令種別判定部142は、以下の編集処理を行う。
(編集#1)命令種別判定部142は、行頭が「-」の行を削除する。これにより、行の削除の命令の行が、修正パッチ211,212,・・・から削除され、該当行に関する命令種別の判定は行われなくなる。
(編集#2)命令種別判定部142は、行頭が「+」の行の先頭の「+」の文字を削除する。
命令種別判定部142は、編集後の修正パッチ211aに含まれるソースコードの各行について、固定キーワード辞書121に基づいて、以下のような基準で命令種別の判定を行う。修正パッチ211aの各行の先頭に示されている数字は、命令種別判定対象の行の行番号であり、説明のために付与したものである。
(判定#1)命令種別判定部142は、空白行、#等のコメント行は、命令種別の判定を行わずに処理をスキップする。
(判定#2)命令種別判定部142は、固定キーワード辞書121に登録されている単語種別(変数型、算術演算子など)を参照し、行頭の単語が「変数型」に登録されている単語と一致した場合は、該当行の命令種別を「宣言」と判定する。
(判定#3)命令種別判定部142は、固定キーワード辞書121に登録されている単語種別(変数型、算術演算子など)を参照し、行頭の単語が「条件演算子」に登録されている単語と一致した場合は、該当行の命令種別を「条件」と判定する。
(判定#4)命令種別判定部142は、行頭の単語が「変数型」と「条件演算子」とのいずれかに登録されている単語と一致せず、かつ行内に「=」が出現した場合は、該当行の命令種別を「代入」と判定する。
(判定#5)命令種別判定部142は、判定#1~#4のいずれにも該当しない行の命令種別を、「その他」と判定する。
これにより、修正パッチ211aに対応する命令種別情報31が生成される。命令種別判定部142は、生成した命令種別情報31を、命令種別記憶部143に格納する。例えば命令種別判定部142は、命令種別記憶部143内に設けられたパッチ意味用配列143aの要素として、各行の命令種別を格納する。
図9は、配列を用いた修正パッチの命令種別判定処理の一例を示す図である。例えば命令種別判定部142は、作業用配列「tmp_mean_extract[]」を定義する。作業用配列のインデックスの値は、判定対象の行の単語の順番を示す番号である。単語の順番を示す番号は、行の先頭から順に、各単語に、0から昇順の番号が割り当てられているものとする。
例えば命令種別判定部142は、修正パッチ211aの最初の行の命令種別を判定する際、判定対象の行内の各単語を、作業用配列に格納する。例えば「short ans = -1;」の命令種別を判定する場合、「short」、「ans」、「=」、「-1」、「;」の各単語が、作業用配列に格納される。なお、作業用配列は、判定対象の行が更新されるごとに初期化される。
命令種別判定部142は、作業用配列に格納した単語について、判定#1~#5のどの判定条件を満たすのかを判断する。例えば命令種別判定部142は、固定キーワード辞書121を参照し、判定対象の行の先頭の単語「short」の単語種別が「変数型」であることを認識する。その結果、命令種別判定部142は、判定対象の行が判定#2の条件を満たしていると判断する。なお、判定対象の行内には「=」が出現しているが、判定#4では先頭の単語が「変数型」と「条件演算子」とのいずれでもないことが条件となっているため、判定#4は満たしていない。そこで命令種別判定部142は、この行の命令種別を「宣言」と判定する。
命令種別判定部142は、判定結果をパッチ意味用配列143a「patch_mean_extract[]」に格納する。パッチ意味用配列143aのインデックスの値は、編集後の修正パッチ211a内での判定対象の行の行番号である。行番号は、先頭行から順に、空白またはコメント行以外の各行に、0から昇順の番号が割り当てられているものとする。例えば修正パッチ211a内の先頭の行(行番号「0」)の命令種別は、インデックス値「0」の要素としてパッチ意味用配列143aに格納される。
同様に、修正パッチ211の適用の有無の判定対象のソースファイルに対しても、命令種別の判定が行われる。
図10は、ソースファイルに対する命令種別判定の一例を示す図である。命令種別判定部142は、ソースファイル記憶部110から判定対象のソースファイル111を取得し、ソースファイル111内のソースコードについて、1行ごとに命令種別を判定する。なおソースファイル111の各行の先頭に示されている数字は、命令種別判定対象の行の行番号であり、説明のために付与したものである。
例えば命令種別判定部142は、修正パッチに対する命令種別判定と同様に、判定#1~#5を行い、ソースファイル111に対応する命令種別情報32を生成する。そして命令種別判定部142は、生成した命令種別情報32を命令種別記憶部143に格納する。例えば命令種別判定部142は、命令種別記憶部143内に設けられたソース意味用配列143bの要素として、各行の命令種別を格納する。
図11は、配列を用いたソースファイルの命令種別判定処理の一例を示す図である。例えば命令種別判定部142は、ソースファイル111の最初の行の命令種別を判定する際、判定対象の行内の各単語を、作業用配列に格納する。例えば「int res = -1;」の命令種別を判定する場合、「int」、「res」、「=」、「-1」、「;」の各単語が、作業用配列に格納される。
命令種別判定部142は、作業用配列に格納した単語について、判定#1~#5のどの判定条件を満たすのかを判断する。例えば命令種別判定部142は、固定キーワード辞書121を参照し、判定対象の行の先頭の単語「int」の単語種別が「変数型」であることを認識する。その結果、命令種別判定部142は、判定対象の行が判定#2の条件を満たしていると判断する。そこで命令種別判定部142は、この行の命令種別を「宣言」と判定する。
命令種別判定部142は、判定結果をソース意味用配列143b「source_mean_extract[]」に格納する。ソース意味用配列143bのインデックスの値は、ソースファイル111内での判定対象の行の行番号である。行番号は、先頭行から順に、空白またはコメント行以外の各行に、0から昇順の番号が割り当てられているものとする。例えばソースファイル111内の「int res = -1;」の行が20行目(行番号「19」)の場合、この行の命令種別は、インデックス値「19」の要素としてソース意味用配列143bに格納される。
修正パッチ211aとソースファイル111との命令種別判定が完了すると、命令種別情報31,32に基づいて、パッチ導入箇所推定部144が、修正パッチ適用によるソースファイル111内の修正対象の箇所を推定する。
図12は、パッチ導入箇所推定処理の一例を示す図である。パッチ導入箇所推定部144は、修正パッチ211aの命令種別情報31とソースファイル111の命令種別情報32とを比較する。そしてパッチ導入箇所推定部144は、ソースファイル111の命令種別情報32の中から、修正パッチ211aの命令種別情報31の命令種別群と一致する命令種別群を抽出する。図12の例では、修正パッチ211aの命令種別情報31には、「宣言」、「宣言」、「条件」、「代入」、「条件」、「代入」、「その他」、「その他」という並びで命令種別が示されている。パッチ導入箇所推定部144は、同じ命令種別の並びを、ソースファイル111の命令種別情報32の中から抽出する。この場合、複数の箇所から抽出される場合もある。
パッチ導入箇所推定部144は、抽出した命令種別群に対応するソースファイル111内の部分を、パッチ導入推定箇所111a,111bとして特定する。そして、パッチ導入箇所推定部144は、パッチ導入推定箇所111a,111bを示す情報(パッチ導入推定箇所情報145a)を、パッチ導入推定箇所記憶部145に格納する。パッチ導入推定箇所情報145aには、例えば、パッチ導入推定箇所を有するソースファイルのファイル名と、パッチ導入推定箇所の行番号とが示される。
パッチ導入推定箇所111a,111bが特定されると、次にマッチング処理部146により、マッチング処理が行われる。
図13は、マッチング処理の一例を示す図である。マッチング処理部146は、固定キーワード辞書記憶部120内の固定キーワード辞書121を参照し、パッチ導入推定箇所111aと修正パッチ211aとに含まれる単語を、可変キーワードと固定キーワードとに分類する。すなわちマッチング処理部146は、固定キーワード辞書121に示されている単語を固定キーワードと判断し、それ以外の単語を可変キーワードと判断する。
そしてマッチング処理部146は、パッチ導入推定箇所111aと修正パッチ211aとの同一行番号の行同士の、固定キーワードの一致率を計算する。
図13の例では、1行目は「一致」、2行目は「不一致」、3行目は「一致」となる。
以下、図14~図16を参照して、マッチング処理を具体的に説明する。例えばマッチング処理部146は、パッチ導入推定箇所111aと修正パッチ211aとのソースコードを単語ごとに分割し、配列に格納する。そしてマッチング処理部146は、配列を用いてマッチング処理を行う。
図14は、配列を用いたマッチング処理の一例を示す図である。パッチ導入推定箇所111a内の単語は、ソースマッチ用配列「source_comp[][]」に格納される。ソースマッチ用配列は2次元配列であり、1つ目のインデックスにはパッチ導入推定箇所111a内の行の行番号が設定され、2つ目のインデックスには行内の単語の順番を示す番号が設定される。ソースマッチ用配列には、1つ目のインデックスに示される行の、2つ目のインデックスに示される順番の単語が、それらのインデックス値に対応する要素として設定される。
修正パッチ211a内の単語は、パッチマッチ用配列「patch_comp[][]」に格納される。パッチマッチ用配列は2次元配列であり、1つ目のインデックスには修正パッチ211a内の行の行番号が設定され、2つ目のインデックスには行内の単語の順番を示す番号が設定される。パッチマッチ用配列には、1つ目のインデックスに示される行の、2つ目のインデックスに示される順番の単語が、それらのインデックス値に対応する要素として設定される。
そしてマッチング処理部146は、パッチ導入推定箇所111aと修正パッチ211aとの行ごとの比較を行う際、ソースマッチ用配列とパッチマッチ用配列との、同じインデックス値に設定されている単語同士を比較する。マッチング処理部146は、同一行番号の行内の単語同士の比較により、その行の一致・不一致を判定し、判定結果を結果格納用配列「result_comp[][]」に格納する。結果格納用配列は2次元配列であり、1つ目のインデックスには判定対象の行の行番号が設定され、2つ目のインデックスには行内の単語の順番を示す番号が設定される。図14の例では、比較対象の行の先頭の単語に対応付けて、比較結果が格納されている。すなわち結果格納用配列には、1つ目のインデックスに示される行の判定結果が、2つ目のインデックス値「0」の要素として設定される。
図15は、マッチング結果の一例を示す図である。例えばパッチ導入推定箇所111aの1行目は、「int res = -1;」である。この行には、固定キーワードが3単語(「int」、「=」、「;」)含まれている。また可変キーワードが2単語(「res」、「-1」)含まれている。
また修正パッチ211aの1行目は「short ans = -1;」である。この行には、固定キーワードが3単語(「short」、「=」、「;」)含まれている。また可変キーワードが2単語(「ans」、「-1」)含まれている。
1行目の行同士を比較すると、パッチ導入推定箇所111aの固定キーワード「int」が、修正パッチ211aの固定キーワード「short」に対応する。「int」と「short」とは、固定キーワード辞書121において、いずれも「変数型」であることが示されている。マッチング処理部146は、このように単語種別が「変数型」の固定キーワード同士は、一致すると判定する。またマッチング処理部146は、単語種別が「変数型」以外の場合、単語の1以上の文字または記号がすべて同じ場合、単語が一致すると判定する。パッチ導入推定箇所111aの1行目と修正パッチ211aの1行目との残りの固定キーワード「=」、「;」はいずれも記号が一致している。その結果、マッチング処理部146は、1行目の固定キーワードの一致率を100%とする。
パッチ導入推定箇所111aの2行目は、「int c = res + 1;」である。この行には、固定キーワードが4単語(「int」、「=」、「+」、「;」)含まれている。また可変キーワードが3単語(「c」、「res」、「1」)含まれている。
また修正パッチ211aの2行目は「short x;」である。この行には、固定キーワードが2単語(「short」、「;」)含まれている。また可変キーワードが1単語(「x」)含まれている。
2行目の行同士を比較すると、パッチ導入推定箇所111aの固定キーワード「int」が、修正パッチ211aの固定キーワード「short」に対応する。「int」と「short」とは、固定キーワード辞書121において、いずれも「変数型」であるため、マッチング処理部146は固定キーワードが一致すると判定する。パッチ導入推定箇所111aの2行目の固定キーワード「=」(3番目の単語)は追加された単語であり、修正パッチ211aの2行目には対応する固定キーワードが存在しない。そのためマッチング処理部146は、固定キーワード「=」については不一致と判定する。パッチ導入推定箇所111aの2行目の固定キーワード「;」は7番目の単語であり、修正パッチ211aには7番目の単語は存在しない。そのためマッチング処理部146は、固定キーワード「;」については不一致と判定する。その結果、マッチング処理部146は、2行目の固定キーワードの一致率を33%(1/3)とする。なお一致率は、例えば判定対象の2つ行のうちの固定キーワードを多く含む行の固定キーワード数で、一致した固定キーワード数を除算することにより求められる。
マッチング処理部146は、行単位での比較結果をマッチング結果記憶部147内の結果格納用配列147aに格納する。
なおマッチング処理部146は、マッチング処理では、可変キーワードの変換前と変換後との対応関係を、メモリ102などに記憶しておくことができる。記憶した対応関係は、以後の可変キーワードの特定に利用することができる。
図16は、可変キーワードの対応関係の保存例を示す図である。図16の例では、パッチ導入推定箇所111aにおける「res」、「-1」、「*s」それぞれと、修正パッチ211aの「ans」、「-1」、「*z」それぞれとの対応関係が、メモリ102に保存される。マッチング処理部146は、例えば保存された対応関係を用いて、改変された可変キーワードを容易に検出することができる。例えばマッチング処理部146は、可変キーワードとして記憶した単語については、固定キーワード辞書121と照合するまでもなく、可変キーワードと判断する。
また改変された可変キーワードを記憶しておくことで、例えば修正パッチの適用状況を表示する際に、結果出力部150が、保存された可変キーワードに基づいて、改変された可変キーワードを強調表示することもできる。
マッチング処理が完了すると、類似度算出部148により、パッチ導入推定箇所111aと修正パッチ211aとの類似度が算出される。
図17は、類似度算出処理の一例を示す図である。類似度算出部148は、パッチ導入推定箇所111aと修正パッチ211aとの行単位での比較結果に基づいて、一致する行の割合(一致率)を、類似度として計算する。図17の例では、8行のうちの7行で一致しており、類似度は87.5%である。
次に類似度算出部148は、類似度のランク分けを行う。例えば類似度算出部148は、類似度が100%であれば一致と判定する。また類似度算出部148は、類似度が100%未満で、類似度閾値記憶部130に格納されている類似度閾値131以上であれば、類似度高と判定する。類似度高は、部分一致(partial match)と呼ぶこともある。さらに類似度算出部148は、類似度閾値131未満であれば、不一致と判定する。図17の例では、類似度閾値131は50%である。そして類似度算出部148は、算出した類似度とランクとを示す類似度情報149aを、類似度記憶部149に格納する。
類似度算出後、結果出力部150が、パッチ適用情報記憶部151内のパッチ適用情報に、パッチ適用判定結果を出力する。
図18は、パッチ適用情報の一例を示す図である。パッチ適用情報151aには、ソースファイルのファイル名が示された列の各行に、その行に対応する修正パッチのソースファイルへの適用状況が示されている。図18の例では、ソースファイル内のパッチ導入推定箇所の類似度が100%の場合(完全一致)、二重丸が設定される。またソースファイル内のパッチ導入推定箇所の類似度が100%未満でかつ閾値以上の場合(類似度高)、丸印が設定される。さらにソースファイル内のパッチ導入推定箇所の類似度が閾値未満の場合(不一致)、ばつ印が設定される。なお、1つのソースファイルについて、パッチ導入推定箇所が複数検出された場合、パッチ導入推定箇所ごとの適用状況がパッチ適用情報151aに設定される。
類似度に基づくランク分けにより、完全一致の場合と類似度高の場合とは、修正パッチ適用済みであると推定できる。またランク分けにより不一致とされた場合、修正パッチ未適用であると推定できる。なお修正パッチの適用対象外のソースファイルに対しては、パッチ適用の判定が行われておらず、空欄「-」となっている。
また結果出力部150は、ユーザからの指示に従って、パッチ適用情報151aをモニタ21に表示する。結果出力部150は、ソースファイルと修正パッチとを指定した表示指示を受け付けると、パッチ導入推定箇所と修正パッチとの比較結果を含む結果表示画面をモニタ21に表示することもできる。
図19は、結果表示画面の一例を示す図である。結果表示画面41には、修正パッチ導入推定箇所ごとの、算出した類似度(87.5%)と、類似度のランク(partial match)が示されている。また結果表示画面41には、修正パッチ導入推定箇所ごとに、修正パッチ導入推定箇所のソースコードと修正パッチのソースコードとが対比して表示されている。
以下、修正パッチ適用可視化処理の手順について、詳細に説明する。
図20は、修正パッチ適用可視化処理の手順の一例を示すフローチャートである。以下、図20に示す処理をステップ番号に沿って説明する。
[ステップS101]命令種別判定部142は、命令種別判定処理を行う。命令種別判定処理では、修正パッチのソースコードとOSSのソースファイル内のソースコードとの行ごとの命令種別が判定される。命令種別判定処理の詳細は後述する(図21参照)。
[ステップS102]命令種別判定部142は、パッチ導入箇所推定処理を行う。パッチ導入箇所推定処理では、ソースファイル内のソースコードの中から、パッチ適用により修正された可能性がある箇所(1以上の連続の行)が検出される。パッチ導入箇所推定処理の詳細は後述する(図24参照)。
[ステップS103]命令種別判定部142は、修正パッチ導入推定箇所が少なくとも1つ抽出できたか否かを判断する。命令種別判定部142は、修正パッチ導入推定箇所が抽出できた場合、処理をステップS104に進める。また命令種別判定部142は、修正パッチ導入推定箇所が抽出できなかった場合、処理をステップS106に進める。
[ステップS104]マッチング処理部146は、マッチング処理を行う。マッチング処理では、修正パッチ導入推定箇所と修正パッチとのソースコードについて、行ごとに比較され、一致・不一致が判定される。マッチング処理の詳細は後述する(図25参照)。
[ステップS105]類似度算出部148は、類似度算出処理を行う。類似度算出処理では、マッチング処理の結果に基づいて、修正パッチ導入推定箇所と修正パッチとの類似度が算出される。類似度算出処理の詳細は後述する(図26参照)。
[ステップS106]結果出力部150は、結果出力処理を行う。結果出力処理では、ソースファイルに対して修正パッチが適用されているか否かを示す情報の格納、または表示が行われる。結果出力処理の詳細は後述する(図27参照)。
次に、図20に示す各ステップの処理の詳細を説明する。
図21は、命令種別判定処理の手順の一例を示すフローチャートである。以下、図21に示す処理をステップ番号に沿って説明する。
[ステップS111]命令種別判定部142は、修正パッチとOSSのソースファイルとを取得する。例えばソースコード取得部141が、サーバ200内のリポジトリ210から修正パッチを取得すると共に、ソースファイル記憶部110からOSSのソースファイルを取得する。そして、命令種別判定部142は、ソースコード取得部141から修正パッチとソースファイルとを取得する。
[ステップS112]命令種別判定部142は、固定キーワード辞書記憶部120から固定キーワード辞書121を取得する。
[ステップS113]命令種別判定部142は、修正パッチとOSSのソースファイルとのそれぞれについて、命令種別情報取得処理を行う。命令情報取得処理の詳細は、図22、図23を参照して説明する。
図22は、命令種別情報取得処理の手順の詳細を示すフローチャートの前半である。以下、図22に示す処理をステップ番号に沿って説明する。
[ステップS121]命令種別判定部142は、配列のインデックスの値を示す変数iに初期値「0」を設定する。
[ステップS122]命令種別判定部142は、修正パッチまたはソースファイル内に未選択の行があるか否かを判断する。命令種別判定部142は、未選択の行がある場合、処理をステップS123に進める。また命令種別判定部142は、すべての行が選択済みの場合、命令種別情報取得処理を終了する。
[ステップS123]命令種別判定部142は、修正パッチまたはソースファイルの先頭から順に、未選択の次の行を選択する。
[ステップS124]命令種別判定部142は、選択した行から単語を抽出し、作業用配列に格納する。
[ステップS125]命令種別判定部142は、選択した行の先頭に「-」があるか否かを判断する。例えば命令種別判定部142は、作業用配列の最初の要素に「-」の単語が格納されていれば、先頭に「-」があると判断する。命令種別判定部142は、先頭に「-」がある場合、処理をステップS126に進める。また命令種別判定部142は、先頭に「-」がないと判断した場合、処理をステップS127に進める。
なお先頭に「-」が設定された行を含むのは修正パッチのみである。そのためソースファイルに対する命令種別情報取得処理を行う場合、ステップS125,S126の処理をスキップしてもよい。
[ステップS126]命令種別判定部142は、修正パッチの選択された行を削除する。命令種別判定部142は、その後、処理をステップS123に進める。
[ステップS127]命令種別判定部142は、選択した行が空白行またはコメント行であるか否かを判断する。例えば命令種別判定部142は、「#」で始まる行をコメント行と判断する。命令種別判定部142は、空白行またはコメント行の場合、処理をステップS123に進める。また命令種別判定部142は、空白行およびコメント行のいずれでもなければ、処理をステップS128に進める。
[ステップS128]命令種別判定部142は、選択した行の先頭に「+」が単体で存在するか否かを判断する。命令種別判定部142は、先頭に「+」が単体で存在する場合、処理をステップS129に進める。また命令種別判定部142は、先頭に「+」が単体で存在しない場合、処理をステップS131(図23参照)に進める。
なお先頭に「+」が単独で設定された行を含むのは修正パッチのみである。そのためソースファイルに対する命令種別情報取得処理を行う場合、ステップS128,S129の処理をスキップしてもよい。
[ステップS129]命令種別判定部142は、修正パッチの選択された行から、先頭の「+」を削除する。その後、命令種別判定部142は、処理をステップS131(図23参照)に進める。
図23は、命令種別情報取得処理の手順の詳細を示すフローチャートの後半である。以下、図23に示す処理をステップ番号に沿って説明する。
[ステップS131]命令種別判定部142は、選択した行の先頭に、固定キーワード辞書121において「変数型」とされている単語があるか否かを判断する。行の先頭の単語が「int」や「short」などの変数型を指定する単語の場合、その行は、変数型を宣言する命令文であると考えられる。命令種別判定部142は、先頭の単語が変数型の場合、処理をステップS132に進める。また命令種別判定部142は、先頭の単語が変数型でなければ、処理をステップS133に進める。
[ステップS132]命令種別判定部142は、ソース意味用配列143bまたはパッチ意味用配列143aのi番目の要素に、「宣言」を格納する。例えば命令種別判定部142は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列143bの要素に「宣言」を格納する。また命令種別判定部142は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列143aの要素に「宣言」を格納する。その後、命令種別判定部142は、処理をステップS138に進める。
[ステップS133]命令種別判定部142は、選択した行の先頭に、固定キーワード辞書121において「条件演算子」とされている単語があるか否かを判断する。行の先頭の単語が「if」、「while」などの条件演算子の場合、その行は、処理の条件を定義する命令文であると考えられる。命令種別判定部142は、先頭の単語が条件演算子の場合、処理をステップS134に進める。また命令種別判定部142は、先頭の単語が条件演算子でなければ、処理をステップS135に進める。
[ステップS134]命令種別判定部142は、ソース意味用配列143bまたはパッチ意味用配列143aのi番目の要素に、「条件」を格納する。例えば命令種別判定部142は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列143bの要素に「条件」を格納する。また命令種別判定部142は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列143aの要素に「条件」を格納する。その後、命令種別判定部142は、処理をステップS138に進める。
[ステップS135]命令種別判定部142は、選択した行の中に、「=」が単体で存在するか否かを判断する。行の中に「=」が単体である場合、その行は、変数への値の代入を指示する命令文であると考えられる。命令種別判定部142は、「=」が単体で存在する場合、処理をステップS136に進める。また命令種別判定部142は、単体の「=」が存在しない場合、処理をステップS137に進める。
[ステップS136]命令種別判定部142は、ソース意味用配列143bまたはパッチ意味用配列143aのi番目の要素に、「代入」を格納する。例えば命令種別判定部142は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列143bの要素に「代入」を格納する。また命令種別判定部142は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列143aの要素に「代入」を格納する。その後、命令種別判定部142は、処理をステップS138に進める。
[ステップS137]命令種別判定部142は、ソース意味用配列143bまたはパッチ意味用配列143aのi番目の要素に、「その他」を格納する。例えば命令種別判定部142は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列143bの要素に「その他」を格納する。また命令種別判定部142は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列143aの要素に「その他」を格納する。
[ステップS138]命令種別判定部142は、変数iの値を1だけインクリメントする。その後、命令種別判定部142は、処理をステップS122(図22参照)に進める。
このように、命令種別判定部142は、図22、図23に示すような命令種別情報取得処理を、修正パッチとソースファイルとのそれぞれのすべての行に対して実行することで、各行の命令種別を示す情報(命令種別情報)を取得する。そしてパッチ導入箇所推定部144により、命令種別情報に基づいてパッチ導入箇所推定処理が行われる。
図24は、パッチ導入箇所推定処理の手順の一例を示すフローチャートである。以下、図24に示す処理をステップ番号に沿って説明する。
[ステップS141]パッチ導入箇所推定部144は、修正パッチの修正用ソースコードとOSSのソースコードとの行単位の命令種別情報を取得する。
[ステップS142]パッチ導入箇所推定部144は、修正パッチの修正用ソースコードの命令種別情報とOSSのソースコードの命令種別情報とを比較する。パッチ導入箇所推定部144は、修正パッチの修正用ソースコードの命令種別情報に示される命令種別と、命令種別の並びが一致する部分(ブロック)を、OSSのソースコードの命令種別情報から検索する。
[ステップS143]パッチ導入箇所推定部144は、一致するブロックがあるか否かを判断する。パッチ導入箇所推定部144は、一致するブロックが検出できた場合、処理をステップS144に進める。またパッチ導入箇所推定部144は、一致するブロックが検出できなければ、パッチ導入箇所推定処理を終了する。
[ステップS144]パッチ導入箇所推定部144は、OSSのソースコード内の一致するすべてのブロックを示す情報を、パッチ導入推定箇所としてすべて抽出する。パッチ導入推定箇所には、例えばブロックに含まれる1以上の連続する行のOSSのソースコード内での位置が示される。パッチ導入箇所推定部144は、その後、パッチ導入箇所指定処理を終了する。
パッチ導入箇所推定処理により1以上のパッチ導入推定箇所が特定できた場合、パッチ導入推定箇所と修正パッチとのマッチング処理が行われる。
図25は、マッチング処理の手順の一例を示すフローチャートである。以下、図25に示す処理をステップ番号に沿って説明する。
[ステップS151]マッチング処理部146は、修正パッチの修正用ソースコードを取得する。またマッチング処理部146は、OSSのソースコード内のパッチ導入推定箇所を取得する。例えばマッチング処理部146は、パッチ導入推定箇所情報145a(図12参照)に基づいて、ソースファイル内のパッチ導入推定箇所を認識し、該当箇所に示される1以上の行を取得する。
[ステップS152]マッチング処理部146は、固定キーワード辞書記憶部120から固定キーワード辞書121を取得する。
[ステップS153]マッチング処理部146は、ソースマッチ用配列とパッチマッチ用配列とに単語を格納する。
[ステップS154]マッチング処理部146は、ソースマッチ用配列とパッチマッチ用配列とに基づいて、パッチ導入推定箇所と修正パッチの修正用ソースコードを行単位で比較し、一致・不一致を判断する。例えばマッチング処理部146は、比較対象の2つの行のうちの一方の行の固定キーワードと、その固定キーワードと同じ位置(先頭からの単語の順番)にある他方の行の単語とを比較する。そしてマッチング処理部146は、一方の行の固定キーワードと同じ種別および文字の固定キーワードが、他の行の同じ位置にある場合、それらの固定キーワードが一致していると判断する。なおマッチング処理部146は、一方の行の固定キーワードの種別が「変数型」の場合、「変数型」の固定キーワードが他の行の同じ位置にある場合、それらの固定キーワードが一致していると判断する。
[ステップS155]マッチング処理部146は、固定キーワードの一致または不一致を示す情報を、結果格納用配列147a(図15参照)に格納する。
[ステップS156]マッチング処理部146は、固定キーワードが一致すると判定した行の可変キーワードの対応関係を、メモリ102に保存する。
マッチング処理が完了すると、類似度算出部148が類似度算出処理を行う。
図26は、類似度算出処理の手順の一例を示すフローチャートである。以下、図26に示す処理をステップ番号に沿って説明する。
[ステップS161]類似度算出部148は、マッチング結果を取得する。例えば類似度算出部148は、結果格納用配列147aに格納された情報を読み取る。
[ステップS162]類似度算出部148は、類似度閾値記憶部130から類似度閾値131(図17参照)を取得する。
[ステップS163]類似度算出部148は、パッチ導入推定箇所と修正パッチとの一致度を算出する。例えば類似度算出部148は、結果格納用配列147aに設定された一致・不一致の判断結果すべてのうちの、一致と判断された割合(一致率)を、類似度として算出する。この際、類似度算出部148は、類似度のランク分けをすることもできる。例えば類似度算出部148は、類似度が100%であれば、類似度のランクを「一致」とする。また類似度算出部148は、類似度が100%未満、類似度閾値以上であれば、類似度のランクを「類似度高(または部分一致:partial match)」とする。また類似度算出部148は、類似度が類似度閾値未満であれば、類似度のランクを「不一致」とする。
[ステップS164]類似度算出部148は、類似度を示す類似度情報149a(図17参照)を出力する。
類似度が算出されると、結果出力部150により、結果出力処理が行われる。
図27は、結果出力処理の手順の一例を示すフローチャートである。以下、図27に示す処理をステップ番号に沿って説明する。
[ステップS171]結果出力部150は、類似度情報とパッチ導入推定箇所情報とを取得する。また結果出力部150は、ソースコード取得部141から、取得した修正パッチのパッチ名と、取得したソースファイルのファイル名とを取得する。
[ステップS172]結果出力部150は、パッチ適用情報記憶部151から、パッチ適用情報151aを取得する。
[ステップS173]結果出力部150は、類似度情報とパッチ導入推定箇所情報に基づいて、パッチ適用情報151aを更新する。例えば結果出力部150は、パッチ名とソースファイル名との組に対応付けて、類似度情報とパッチ導入推定箇所情報とを、パッチ適用情報151aに格納する。また結果出力部150は、パッチ適用情報151aをモニタ21に表示することもできる。
このようにして、OSSのソースファイルの変数名や関数名が変更されていても、ソースファイルに対する修正パッチの適用の有無を適切に判断し、判断結果を可視化することができる。
[その他の実施の形態]
第2の実施の形態では、OSSに修正パッチを適用する場合を想定しているが、第2の実施の形態に示したパッチ適用確認方法は、OSS以外のソフトウェアにも適用可能である。
また第2の実施の形態では、マッチング処理部146は、種別が変数型の単語については、比較される2つの単語が共に変数型であれば一致と判定しているが、変数型の単語について、文字または記号が同一の場合に一致と判定するようにしてもよい。例えば比較対象の単語が、変数型のうちの文字型を指定する「char」と整数型を指定する「int」との場合、マッチング処理部146は、これらの単語の種別は同じ変数型であるが、文字が異なるため不一致と判定する。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。
1 パッチファイル
1a 修正命令列
2 ソースファイル
2a 種別一致命令列
10 情報処理装置
11 記憶部
12 処理部

Claims (7)

  1. 一部の命令列を修正命令列に変更するパッチの適用対象であるソースファイルを記憶する記憶部と、
    前記修正命令列を含むパッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、前記ソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、前記パッチ命令種別情報と前記ソース命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する処理部と、
    を有する情報処理装置。
  2. 前記処理部は、変数名と関数名とを除外した前記種別一致命令列の記述内容と、変数名と関数名とを除外した前記修正命令列の記述内容との類似度を算出し、前記類似度に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、
    請求項1記載の情報処理装置。
  3. 前記処理部は、前記種別一致命令列と前記修正命令列とのそれぞれの命令行に先頭から順に行番号を付与し、同じ行番号の行同士の記述の同一性を判定し、一致すると判定した行の割合を前記類似度とする、
    請求項2記載の情報処理装置。
  4. 前記記憶部は、行間の同一性の判定において比較対象とする単語のリストを含むキーワード辞書をさらに記憶し、
    前記処理部は、前記種別一致命令列の第1の行内の前記キーワード辞書に含まれる単語と、前記修正命令列における、前記第1の行と同じ行番号の第2の行内の前記キーワード辞書に含まれる単語との比較結果に基づいて、同じ行番号の行同士の同一性を判定する、
    請求項3記載の情報処理装置。
  5. 一部の命令列を修正命令列に変更するパッチ用の、前記修正命令列を含むパッチファイルを配布するサーバと、
    前記パッチの適用対象であるソースファイルを記憶する記憶部と、前記サーバから前記パッチファイルを取得し、前記パッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、前記ソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、前記ソース命令種別情報と前記パッチ命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、処理部と、を有する情報処理装置と、
    を有するパッチ適用確認システム。
  6. コンピュータが、
    一部の命令列を修正命令列に変更するパッチ用の、前記修正命令列を含むパッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、
    前記パッチの適用対象であるソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、
    前記パッチ命令種別情報と前記ソース命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、
    前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、
    パッチ適用確認方法。
  7. コンピュータに、
    一部の命令列を修正命令列に変更するパッチ用の、前記修正命令列を含むパッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、
    前記パッチの適用対象であるソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、
    前記パッチ命令種別情報と前記ソース命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、
    前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、
    処理を実行させるパッチ適用確認プログラム。
JP2018135851A 2018-07-19 2018-07-19 情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム Active JP7075011B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2018135851A JP7075011B2 (ja) 2018-07-19 2018-07-19 情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2018135851A JP7075011B2 (ja) 2018-07-19 2018-07-19 情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム

Publications (2)

Publication Number Publication Date
JP2020013385A JP2020013385A (ja) 2020-01-23
JP7075011B2 true JP7075011B2 (ja) 2022-05-25

Family

ID=69169884

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018135851A Active JP7075011B2 (ja) 2018-07-19 2018-07-19 情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム

Country Status (1)

Country Link
JP (1) JP7075011B2 (ja)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010086072A (ja) 2008-09-29 2010-04-15 Toshiba Corp コンピュータシステムおよび修正パッチ確認/適用方法
WO2017061270A1 (ja) 2015-10-09 2017-04-13 日本電信電話株式会社 脆弱性発見装置、脆弱性発見方法、および、脆弱性発見プログラム

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010086072A (ja) 2008-09-29 2010-04-15 Toshiba Corp コンピュータシステムおよび修正パッチ確認/適用方法
WO2017061270A1 (ja) 2015-10-09 2017-04-13 日本電信電話株式会社 脆弱性発見装置、脆弱性発見方法、および、脆弱性発見プログラム

Also Published As

Publication number Publication date
JP2020013385A (ja) 2020-01-23

Similar Documents

Publication Publication Date Title
US10540350B2 (en) Source code search engine
US10585780B2 (en) Enhancing software development using bug data
US10169347B2 (en) Layer identification and dependency analysis for management of images
US8181171B2 (en) Method and apparatus for analyzing large scale program and generation of code from degenerated program dependence graph
WO2011119940A1 (en) Detection of global metamorphic malware variants using control and data flow analysis
RU2716553C1 (ru) Устройство создания сигнатуры, способ создания сигнатуры, носитель записи, в котором записана программа создания сигнатуры, и система определения программного обеспечения
CN113760891A (zh) 一种数据表的生成方法、装置、设备和存储介质
Thung et al. Recommending code changes for automatic backporting of Linux device drivers
US20170140010A1 (en) Automatically Determining a Recommended Set of Actions from Operational Data
Levin et al. Towards software analytics: Modeling maintenance activities
US20210064697A1 (en) List-based entity name detection
US20140324411A1 (en) Translation validation
EP3818437B1 (en) Binary software composition analysis
US11922230B2 (en) Natural language processing of API specifications for automatic artifact generation
CN117493169A (zh) 一种Java依赖库版本间API行为不兼容性检测方法、装置、设备及介质
JP7075011B2 (ja) 情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラム
US9817659B2 (en) Artifact normalization
JP6447111B2 (ja) 共通化情報提供プログラム、共通化情報提供方法、および共通化情報提供装置
US11461672B2 (en) Plug-and-ingest framework for question answering systems
Asaduzzaman et al. LHDiff: tracking source code lines to support software maintenance activities
KR102382017B1 (ko) 악성코드 진화관계를 분석하는 장치 및 방법
EP4310670A1 (en) Information processing program, information processing method, and information processing device
JP2001312419A (ja) ソフトウェア重複度評価装置およびソフトウェア重複度評価プログラムを記録した記録媒体
Robati Shirzad WasmWalker: Path-based Code Representations for Improved WebAssembly Program Analysis
Singh et al. A Novel Composite Approach for Software Clone Detection

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20210408

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20210413

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20210413

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20220309

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20220412

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20220425

R150 Certificate of patent or registration of utility model

Ref document number: 7075011

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150