JP4951416B2 - プログラム検証方法、プログラム検証装置 - Google Patents

プログラム検証方法、プログラム検証装置 Download PDF

Info

Publication number
JP4951416B2
JP4951416B2 JP2007146936A JP2007146936A JP4951416B2 JP 4951416 B2 JP4951416 B2 JP 4951416B2 JP 2007146936 A JP2007146936 A JP 2007146936A JP 2007146936 A JP2007146936 A JP 2007146936A JP 4951416 B2 JP4951416 B2 JP 4951416B2
Authority
JP
Japan
Prior art keywords
source code
program
edge
data
verification
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.)
Expired - Fee Related
Application number
JP2007146936A
Other languages
English (en)
Other versions
JP2008299723A (ja
Inventor
昌彦 足立
英一郎 千代
博泰 西山
Original Assignee
株式会社 日立システムアンドサービス
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 株式会社 日立システムアンドサービス filed Critical 株式会社 日立システムアンドサービス
Priority to JP2007146936A priority Critical patent/JP4951416B2/ja
Publication of JP2008299723A publication Critical patent/JP2008299723A/ja
Application granted granted Critical
Publication of JP4951416B2 publication Critical patent/JP4951416B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

本発明は、コンピュータのセキュリティ、さらに詳細には、セキュリティ・リスクの問題を起こす可能性のあるコンピュータのソースコード内の脆弱性を生じさせるプログラム上の情報の流れの経路を検出するプログラム検証方法等に関する。
企業の顧客情報管理や社員情報管理など、使用者によりコンピュータ端末から入力されたデータを基に情報管理するソフトウェアにおいて、そのソフトウェアが脆弱性を有する場合、コンピュータ端末から特殊な文字列を入力することでソフトウェアに不正な命令を実行させることが可能となる場合がある。そのようなソフトウェアでは、ソフトウェアの管理下にある情報が漏洩、改竄および消去されたりする問題が生じるおそれがある。このことにより、情報の消失による直接的な損害のみならず、企業の社会責任問題による信頼の失墜を招いてしまう。典型的な脆弱性の例として、クロスサイトスクリプティングやSQLインジェクションが挙げられる。
クロスサイトスクリプティングとは、任意のユーザのローカル環境でプログラムを実行できるという脆弱性である。具体的には、Webサイトへの訪問者の入力内容がWebサイトに表示されるプログラム(例えば、インターネット掲示板など)において、入力にプログラムコードを含んだ内容を送ることで、その内容がWebサイトに掲載された場合、そのWebサイトを訪問した他のユーザにプログラムコードを含んだ情報が送られ、結果的に任意のユーザのローカル環境でプログラムを実行できるという脆弱性である。
また、SQLインジェクションとは、任意のユーザにデータベースを改竄または消去されるという脆弱性である。具体的には、データベースと連携したWebサイトにおいて、ユーザからの入力をデータベースへの命令の一部として使っている場合、ユーザからの入力によりデータベースに含まれる情報が改竄または消去されるという脆弱性である。
これらの脆弱性はいずれも、ソフトウェアの機能に関する問題というよりもむしろ、予期しない入力が与えられた場合に発生するソフトウェアの利用時に発生する問題である。このように、ソフトウェアの利用時に発生する問題の場合、ソフトウェアが利用される前の開発過程で事前に脆弱性の存在を検知、検出できることが、プログラムの品質を向上させ、将来起こりうる危険因子を排除する上で重要である。そして、このような脆弱性を無くすためには、ソフトウェアを構成するプログラム自体を、その中でやり取りされるデータの流れ(経路)に従って、脆弱性に関して検証し、脆弱性を生じさせるデータの流れ(以下、「脆弱経路」という。)が存在するか否かを確認する必要がある。
一般的に、検証の対象にしようとするプログラムのソースコード(以下、「検証対象ソースコード」と呼ぶ。)は人間が理解しやすい形(言語)で記述されている。この検証対象ソースコードを、脆弱性を検出する機能を有するプログラム(以下、「検出ソフトウェアプログラム」と呼ぶ。)により解析して脆弱性を検出する場合、当該検出ソフトウェアプログラムにとって扱いやすい形に変換する必要がある。このとき、例えば、特許文献1に示されるように、検証対象ソースコードの各セクションに対し、あらかじめ指定された特徴の明細を記述したモデルに変換する「モデル化」と呼ばれる処理を行う。
特許文献1では、すべての検証対象ソースコードに対しモデル化を行ったモデルファイルを基にデータフローの解析を行う。その解析の結果、データの流れを定めたデータフロー情報とデータの流れ以外の何らかの特徴について定めた情報を取得する。そして、取得したデータフロー情報と予め準備しておいた脆弱性を発生させ得る情報の発生点および情報の使用点を関連付けて格納したデータベースとから、それらの発生点と使用点を含んだデータフロー、すなわち脆弱経路の検出を行う。
なお、本明細書において、上記情報の「発生点」という用語は、検証対象ソースコードのセクションのことであって、そのソースコードに係るプログラムを実行した場合、情報の外部入力を受け取るセクションを指す。また、上記情報の「使用点」という用語は、検証対象ソースコードのセクションのことであって、そのソースコードに係るプログラムを実行した場合、情報を外部出力するセクションを指す。
特表2006−523898号公報
一般的に、プログラムのソースコードを解析する場合、ソースコードのソースコードサイズに比例して、解析に必要となるメモリ量は大きくなり、かつ、プログラム全体の解析時間は長くなる傾向にある。そのため、ソースコードを解析することができるソースコードサイズには上限がある。プログラムの検証対象ソースコードの解析から脆弱経路の検出を行う場合、特許文献1のように、検証対象ソースコードをすべて解析する必要があるが、検証対象ソースコードのソースコードサイズが大きいほど、必要となるメモリ量が大きくなり、かつ、解析時間が非常に多くかかってしまう。このため、実際利用されているような比較的大規模なソースコードに対しては、上記の検証対象ソースコード解析による脆弱経路の検出手法を適用することが難しい。
また、一般には、近年のプログラムの大規模化、モジュール化によって、対象となるプログラムの一部が外部からバイナリ形式で与えられるようになったため、その一部のプログラムを外部から入手できず、対象となるプログラム全体のソースコードを得られないことがある。もし、解析する検証対象ソースコードが部分的に手に入らなかった場合、従来技術ではその手に入らない不足部分を無視する、若しくは、その不足部分を何らかの仮定のもとに近似することで解析が行われる。しかし、このような方法では、プログラムの検証対象ソースコードの解析精度が低下してしまう。
上記事情を鑑みて、本発明の目的は、検証対象ソースコードを解析する際に必要となるメモリ量を縮小し、低コストでの解析を実現することと、ソースコードの不足部分を含む検証対象ソースコードの解析における解析精度を向上させることにある。
上記目的を達成するため、本発明は、検証対象ソースコードのデータフローに着目し、発生点エッジデータから順に、データフローが流れるデータパスに沿って、使用点エッジデータまでのエッジデータを抽出し、その抽出したエッジデータ以外のエッジデータを削除することで、検証対象ソースコードを簡易化する工程を備えることにより、検証対象ソースコードを縮小する手段を設けている。また、本発明は、検証対象ソースコードが一部または全部存在せず、不足の状態にある場合において、その検証対象コードをデータフローに着目して簡易的に記述したファイルを追加する工程を備えることにより、不足した検証対象ソースコードを補う手段を設けている。詳細は後記する。
本発明によれば、検証対象ソースコードを解析する際に必要となるメモリ量を縮小し、低コストでの解析を実現することができる。また、ソースコードの不足部分を含む検証対象ソースコードの解析における解析精度を向上させることができる。
以下、本発明を実施するための最良の形態(以下、「実施の形態」という。)について説明する。説明する際には、本明細書と同時に提出する図面を適宜参照する。
1.実施の形態1
実施の形態1は、プログラムの特性としての脆弱性を解析する検証対象ソースコードのデータフローに着目し、そのデータフローのうち、当該検証対象ソースコードにおいて定められる所定範囲において、データが外部から入力し、外部へ出力される箇所を定めたデータフローとなる部分とそうでない他のデータフローを区別し、当該他のデータフローを削除して、検証対象ソースコードを簡易化するものである。なお、本実施形態において、説明するソースコードは、Java(登録商標)言語で記述するものとする。また、前記所定範囲とは例えば、Java(登録商標)言語におけるクラスファイルのことを指す。以下、実施の形態1について詳細に説明する。
1.1.コンピュータの構成
図1は、本実施形態のプログラム検証方法を実行するコンピュータ(プログラム検証装置)の構成の一例を図示したものである。
コンピュータ100は、制御手段として機能するプロセッサ101と、記憶手段のうち外部記憶装置として機能するメモリ102と、プロセッサ101が直接読み込む主記憶装置として機能する記憶装置103と、本実施形態のプログラム検証方法の実行を指示する入力手段として機能するキーボード110および表示手段として機能するディスプレイ109から構成されている。
メモリ102は、本発明の特徴である検出ソフトウェアプログラム104と、本発明の特徴である簡易ソースコード105と、脆弱性データベース106および検証対象となる検証対象ソースコード107から構成されている。また、メモリ102は、脆弱性データベース106以外にも、後記する各種データベースを記憶する。
検出ソフトウェアプログラム104は、検証対象ソースコード107を解析し、解析結果108を得る。得られた解析結果108は、記憶装置103とディスプレイ109のいずれか、または両方に出力される。検出ソフトウェアプログラム104の実行はキーボード110により命令される。検出ソフトウェアプログラム104は、プロセッサ101が実行するが、このプロセッサ101は、集積回路化するなどしてハードウェアで実現することもできる。
簡易ソースコード105は、後記する簡易化プログラムにより、検証対象ソースコード107から不要部分を削除したソースコードである。また、脆弱性データベース106は、脆弱性の発生点および使用点を登録したデータベースである。詳細は、後記する。
以下、説明を簡単にするため、検出ソフトウェアプログラム104をプロセッサ101が実行することで実現される処理部を、処理の主体として説明する。
1.2.検出ソフトウェアプログラムの概要
図2は、検出ソフトウェアプログラム104においてなされるデータの入出力の概要を、ブロック図として図示したものである。検出ソフトウェアプログラム104は、検証対象となる検証対象ソースコード107を入力して解析し、脆弱性データベース106に登録されている発生点および使用点を読み出し、それらを基に検証対象ソースコード107(検証対象ソースコード107を簡略化した簡易ソースコード105)に存在する脆弱経路を検出し、検出した脆弱経路を解析結果108として、記憶装置103若しくはディスプレイ109のいずれか、または両方に出力する。
1.3.プログラム検証方法の処理手順
次に、本実施形態で実行されるプログラム検証方法の処理手順について詳細に説明する。
図3は、検出ソフトウェアプログラム104の処理手順の一例をブロック図として図示したものである。検出ソフトウェアプログラム104は、簡易化プログラム301、モデル化プログラム302、データフロー解析プログラム304、および脆弱性検出プログラム306から構成されている。
検出ソフトウェアプログラム104は検証対象ソースコード107を入力し、簡易化プログラム301において、その不要部分を削除して簡易ソースコード105を出力する工程がなされる。削除対象となる不要部分の認定については後記する。
次に、モデル化プログラム302において、簡易ソースコード105をモデル化する工程がなされる。簡易ソースコード105をモデル化したデータは、メモリ102が有するモデルデータベース303に登録される。モデル化する方法は特許文献1のものを用いることにする。
次に、データフロー解析プログラム304において、モデルデータベース303に登録されたデータに基づいて、モデル化した簡易ソースコード105についてデータフロー解析を行う工程がなされる。この解析により、モデル化した簡易ソースコード105におけるデータの流れ(経路)が定められる。この定められたデータの流れは後記するデータパスとして、メモリ102が有するデータパスデータベース305に登録される。
最後に、脆弱性検出プログラム306において、データパスデータベース305に登録されたデータパスを、脆弱性データベース106に登録された脆弱性の発生点及び使用点と照合して、脆弱性を生じさせる脆弱経路を検出する工程がなされる。検出した結果は、解析結果108として出力する。
なお、図3以下に示すブロック図およびフローチャートにおいて、実線矢印で示したものを制御のフローとし、破線矢印で示したものをデータのフローとする。図3のブロック図に基づいて、検出ソフトウェアプログラム104の各工程における動作の詳細を説明する。
1.3.1.簡易化プログラムにおける処理
簡易化プログラム301は、ソースコードのうちデータフローに着目して不要部分を削除し簡易化するプログラムである。検証対象ソースコード107について、データフローに必要となる部分(コード)のみを抽出し、抽出されなかったコードは不要部分であると認定し、その不要部分を削除することで検証対象ソースコード107の簡易化、つまり、ソースコードサイズの縮小化を実現する。
その詳細を図4のブロック図を参照しつつ説明する。図4は、簡易化プログラム301の処理手順の一例をブロック図として図示したものである。簡易化プログラム301は、構文解析プログラム400、データフロー解析プログラム401、データフロー抽出プログラム403、および不要部分削除プログラム405から構成されている。
1.3.1.1.構文解析プログラム及びデータフロー解析プログラムにおける処理
まず、検証対象ソースコード107を構文解析プログラム400により構文解析し、構文解析した検証対象コード107に対して、データフロー解析プログラム401によりデータフロー解析を行う。その解析結果として、あるデータフローを構成するエッジを取得する。エッジには、あるデータフローの開始点である開始エッジと、そのデータフローの終端点である終了エッジとがあり、開始エッジと終了エッジを関連付けたデータを「エッジデータ」と呼ぶ。例えば、検証対象ソースコード107として、図5に示すような、簡易化の対象となるJava(登録商標)言語で記述したソースコード500を採りあげる場合、構文解析プログラム400により構文解析し、データフロー解析プログラム401によりデータフロー解析したとき、その解析結果として図6に示すようなエッジ集合600(エッジデータの集まり)を得ることができる。エッジ集合600は、メモリ102が有するエッジデータベース402(図4参照)に登録される。
図6のエッジ集合600は、numフィールド601、toフィールド602、to_lineフィールド603、fromフィールド604、from_lineフィールド605、及びclassフィールド606の6つのフィールドからなるエントリで構成されている。
Numフィールド601はデータフローを構成するエッジの番号を登録する。ここで、データフローを構成するエッジとは、fromフィールド604に登録されるノード(具体的には、図5のソースコード500において記述されているコードであって、代入する変数を定めた開始エッジとして定められるもの)からtoフィールド602に登録されるノード(具体的には、図5のソースコード500において記述されているコードであって、代入される変数を定めた終了エッジとして定められるもの)への方向付きエッジである。図5のソースコード500においては6つのエッジが定められ、Numフィールド601において、順次番号が付される。
to_lineフィールド603、from_lineフィールド605は、それぞれtoフィールド602、fromフィールド604に登録されるノードが存在する行番号であり、具体的には、図5のソースコード500においてコードの左側に記した番号を指す。
classフィールド606は、toフィールド602に登録されるノードとfromフィールド604に登録されるノードのどちらか、もしくは両方が存在するクラス名である。図5のソースコード500は「Sample」というクラスファイルにおいて実行される命令が記述されるコードであるので、エッジ集合600を構成する各エッジのclassフィールド606には、「Sample」と登録される。
toフィールド602またはfromフィールド604の値は、次のようにして定める。まず、その値がローカル変数の場合、その変数名を「.(ドット)」の前に属するメソッド名で表す。例えば、図6においては、「getUserValue」、「true」等のメソッド名で表し、toフィールド602およびfromフィールド604に登録される。また、その値がインスタンス変数の場合、メソッド名の変わりに「instance」とし、手続き呼び出しの場合、「.(ドット)」の後にそのメソッド名を付けて表す。例えば、図6においては、「val」、「flag」等がインスタンス変数であり、「instance.val」、「instance.flag」等として表し、toフィールド602およびfromフィールド604に登録される。
また、図6において、toフィールド602およびfromフィールド604には、「out_of_class」という値が登録される場合がある。この「out_of_class」とは、toフィールド602およびfromフィールド604それぞれに登録され、互いに対になるノードが存在するクラス(図6でいえば「Sample」というクラスに相当)とは異なるクラスにノードが存在することを意味する。このため、out_of_classの行番号は0とし、そのときのclassフィールドはout_of_classでは無い方のノードが属するクラス名とする。
例えば、図6において、Numフィールド601におけるエッジの番号が「2」のレコードの場合、toフィールド602に登録されるノード「getUserValue」(ソースコード500(図5)の5行目の「getUserValue」に相当)に代入される値は、「Sample」というクラスとは異なるクラス(つまり、外部)から入力されるため、fromフィールド604には「out_of_class」を登録し、from_lineフィールド605には「0」という行番号を登録し、classフィールド606には、ノード「getUserValue」が属するクラスである「Sample」が登録される。また、Numフィールド601におけるエッジの番号が「6」のレコードの場合、fromフィールド604に登録されるノード「instance.val」(ソースコード500(図5)の10行目の「val」に相当)に代入された値から出力される値は、「Sample」というクラスとは異なるクラス(つまり、外部)へ出力されるため、toフィールド602には「out_of_class」を登録し、to_lineフィールド603には「0」という行番号を登録し、classフィールド606には、ノード「instance.val」が属するクラスである「Sample」が登録される。
このエッジ集合600を基に、データフロー抽出プログラム403は、(「Sample」という)クラスの外部からの入力からクラスの外部への出力まで繋がったデータフローを抽出し、抽出したデータフローを、メモリ102が有するデータフローデータベース(以下、「DFDB」と呼ぶ。)404に追加する(図4参照)。図7を参照して、抽出したデータフローをDFDB404に追加する処理について詳細に説明する。図7は、データフロー抽出プログラム403により実行される処理の一例をフローチャートとして図示したものである。
1.3.1.2.データフロー抽出プログラムにおける処理
図7の処理では、まず、処理701で処理を開始し、処理702において、図6で示したエッジ集合600の中から、classフィールド606が同一のエッジ集合を変数Sに求め、判定処理703に制御を移す。
判定処理703では変数Sが空集合か否かを判定する。変数Sが空集合である場合(判定処理703でYes)、処理すべきエッジ集合が存在しないため、制御を処理709に移し終了する。もしSが空集合で無いなら(判定処理703でNo)、制御を処理704に移す。
処理704では、変数Sのfromフィールド604が「out_of_class」となるエッジ集合を変数Cに求め、制御を処理705に移す。処理705では、まず、変数Rを空集合として定義し、制御を繰り返し処理706に移す。
繰り返し処理706は、変数Cに含まれるすべてのエッジに対し、各エッジを変数cに求め、処理707を繰り返す。処理707では、図8に示すサブルーチンgetPath()801を呼び出す。サブルーチンgetPath()801はエッジcを開始点(開始エッジ)とするエッジ集合のうち、終了エッジのtoフィールド602が「out_of_class」となるようなエッジ集合を返す。このとき、サブルーチンgetPath()801の戻り値を変数Rに結合する。
繰り返し処理706が終了すると、制御を処理708に移す。処理708では、変数RをDFDB404に追加し、制御を再び処理702に移す。この処理により、各クラスに対して各クラスの外部からの入力から外部への出力まで連結したエッジの集合が求まり、DFDB404に追加される。
図8は、図7のフローチャート内で利用したサブルーチンgetPath()801のフローチャートの一例を図示したものである。
図8の処理では、まず、処理801で処理を開始する。getPath()の第一引数nはエッジであり、第二引数pathはエッジ集合で、第三引数Xはエッジデータベース402(図4参照)のclassフィールドが等しいエッジ集合を表している。処理802では、局所変数Pを定義し、空集合で初期化し、制御を処理803に移す。処理803では、エッジ集合Xの内、fromフィールドがエッジnのtoフィールドに等しいエッジ集合を変数Eに求め、制御を繰り返し処理804に移す。
繰り返し処理804は変数Eに含まれるすべてのエッジに対し、各エッジを変数eに求め、処理805〜807を繰り返す。判定処理805では、各エッジeのtoフィールドの値が「out_of_class」であるか否かを判定する。もしエッジeのtoフィールドの値が「out_of_class」であるなら(判定処理805でYes)、処理807において、変数Pに対して第二引数であるエッジ集合pathを結合し、繰り返し処理805を続ける。もし、エッジeのtoフィールドの値が「out_of_class」でないなら(判定処理805でNo)、処理806に進み、第二引数であるエッジ集合pathにエッジeを追加し、サブルーチンgetPath()を再帰的に呼び出し、その戻り値を変数Pに結合する。すべての繰り返し処理804が終了すると、制御を処理808に移す。処理808は、求めた変数Pからなるエッジ集合を返却し、処理を終了する。
以上のデータフロー抽出プログラム403(図4)の処理により、エッジデータベース402(図4参照)に登録されたエッジとして定められたデータフローのうち、クラスの外部から入力されたデータがクラスの内部を経由し、クラスの外部へと出力されるデータフローのみをDFDB404(図4)に追加できる。図9は、データフロー抽出プログラム403(図4)の処理により得られたデータフローをソースコード900上にマッピングしたものを図示したものである。ソースコード900は、ソースコード500(図5参照)と同一のソースコードであるが、データフローをマッピングした点で異なる。なお、マッピングした様子(つまり、矢印及び、その矢印の番号2、3、5、6)を鮮明に見せるためにソースコード500に対してコードを一部省略してある。図9内の矢印の番号2、3、5、6は、図6のエッジ番号(つまり、numフィールド601のエッジ番号)に一致する。このようにマッピングされたデータフローをエッジデータとしてDFDB404(図4)に登録する。図10は、DFDB404に登録される、図9においてマッピングしたデータフローに相当するエッジデータ1000のデータ構造を図示したものである。
図10のエッジデータ1000は、numフィールド1001、toフィールド1002、to_lineフィールド1003、fromフィールド1004、from_lineフィールド1005、及びclassフィールド1006の6つのフィールドからなるエントリで構成されており、各フィールドは、図6に示したnumフィールド601、toフィールド602、to_lineフィールド603、fromフィールド604、from_lineフィールド605、及びclassフィールド606の6つの各フィールドと同一の性質を有する。DFDB404に登録されたエッジデータ1000を、エッジデータベース402に登録されたエッジ集合600(図6参照)と比較すると、numフィールド601のエッジ番号2、3、5、6のエッジがデータフロー抽出プログラム403により抽出された様子が窺える。
1.3.1.3.不要部分削除プログラムにおける処理
次に、上記で構成したDFDB404(図10)を基に、検証対象ソースコード107から不要部分を削除する、不要部分削除プログラム405の動作の詳細を説明する。図11は、不要部分削除プログラム405の処理の一例をフローチャートとして図示したものである。
図11の処理では、まず、処理1101で処理を開始し、処理1102において、検証対象ソースコード107の1クラス分を読み込み、読み込んだクラスを変数Fに格納し、検証ソースコード107に含まれるクラスのクラス名を変数Cに格納し、変数nを定義し、0で初期化し、制御を処理1103に移す。処理1103では変数Fからソースコードを1行読み込み、読み込んだソースコードの1行を変数lに格納し、変数nに1を足す。この変数nは、変数Fにおける変数lの行番号に一致する。制御を判定処理1104へ移す。
判定処理1104では、変数Cおよび変数nがそれぞれDFDB404のclassフィールド、to_lineフィールド(または、from_lineフィールド)に存在するか否かを確認する。ここで、DFDB404中のエントリは<num,to,to_line,from,from_line,class>の6つの組から構成されるものとする。なお、変数nは、ソースコードの行番号を表す変数であるので、前記エントリの3番目の引数「to_line」及び5番目の引数「from_line」に格納される値である。また、変数Cは、ソースコードの含まれるクラスのクラス名を表す変数であるので、前記エントリの6番目の引数「class」に格納される値である。変数Cおよび変数nがDFDB404に存在する場合(判定処理1104でYes)、制御を判定処理1106に移す。
判定処理1106では、変数lが変数Fの最終行であるか否かを確認する。変数lが変数Fの最終行で無い場合(判定処理1106でNo)、制御を再び処理1103に移す。変数lが変数Fの最終行であった場合(判定処理1106でYes)、制御を判定処理1107に移す。
判定処理1107では、変数Fが検証対象ソースコード107の最後のクラスであるか否かを確認する。変数Fが最後のクラスでなかった場合(処理1107でNo)、制御を再び処理1102へ移す。変数Fが最後のクラスであった場合(処理1107でYes)、検証対象ソースコード107のうち処理すべきコードが存在しないため、制御を処理1108に移し、処理を終了する。
判定処理1104で変数Cおよび変数nに対応するエッジがDFDB404に存在しない場合(判定処理1104でNo)、制御を処理1105に移す。対応するエッジが存在しない場合、その行はデータフロー解析には不要であるので、処理1105において、変数Fのクラスに存在する番号nに対応する行を不要部分として削除し、制御を判定処理1106へ移す。このフローチャートにより、検証対象ソースコード107から、不要部分を削除することができ、簡易化された簡易ソースコード105(図3参照)に変形することができる。
図12は、検証対象ソースコード107の一例である図5に示すソースコード500から不要部分を削除することにより簡易化されたソースコード1200を図示したものである。ソースコード500(図5)とソースコード1200(図12)とを比較すると、ソースコード500(図5)のうち、4行目の「count=1;」というコード、及び6行目の「flag=true;」というコードが(DFDB404(図10参照)にエッジデータ1000として登録されなかったため)不要部分であるとして削除され、2行分削除して簡易化されたソースコード1200(図12)が生成される。
以上で、簡易化プログラム301における処理の説明を終了する。簡易化プログラム301の処理の後にはモデル化プログラム302(図3参照)の処理が行われる。
1.3.2.モデル化プログラムにおける処理
次に、モデル化プログラム302の処理動作について説明する。
モデル化プログラム302は、プログラムの検証として、その特性の一つである脆弱性を検出するために、ソースコードをモデル化するプログラムである。モデル化においては、ソースコードの構文を解析し、ソースコード内の各変数、式および手続き呼び出しに対し、あらかじめ指定された特徴の明細を記述したモデルを作成する。図13および図14は、図12の簡易化されたソースコードをモデル化した結果である。
図13は、図12のソースコード1200のsetStringメソッドの内容「val = getUserValue();」(4行目)をモデル化した結果の一例を図示したものである。図13に示したように、「val = getUserValue();」といった、変数を代入するプログラムコードをモデル化するにあたり、指定された特徴として、述語(predicate)1301を指定し、その述語を「assign」に置き換えることにより明細を記述する。また、その特徴として、コードの左辺値(left value)1302を指定して「instance.val」と記述し、コードの右辺値(right value)1303を指定して「getUserValue」と記述し、行番号(line)1304を指定して4行目にあるので「4」と記述し、メソッド名(method)1305を指定して「setString」と記述し、及びクラス名(class)1306を指定して「Sample」と記述する。このように記述したモデルは、「predicate」1301、「left value」1302、「right value」1303、「line」1304、「method」1305及び「class」1306をフィールドとしたモデルデータ1300として、モデルデータベース303(図3参照)に登録される。
図14は、図12のソースコード1200のgetStringメソッドの内容「return val;」(8行目)をモデル化した結果の一例を図示したものである。図14に示したように、「return val;」といったプログラムコードをモデル化するにあたり、指定された特徴として、述語(predicate)1401を指定し、そのコードの述語「return」を「ret」という述語に置き換えることにより明細を記述する。また、その特徴として、そのコードの返却値(value)1402を指定して「instance.val」と記述し、行番号(line)1403を指定して8行目にあるので「8」と記述し、メソッド名(method)1404を指定して「getString」と記述し、クラス名(class)1405を指定して「Sample」と記述する。このように記述したモデルは、「predicate」1401、「value」1402、「line」1403、「method」1404及び「class」1405をフィールドとしたモデルデータ1400として、モデルデータベース303(図3参照)に登録される。
これらの例のように、モデル化プログラム302では、データフロー解析に必要となるソースコードをすべてモデル化する工程が実行される。また、モデル化するために必要な指定された特徴、及びこの工程で生成されたすべてのモデルはモデルデータとしてモデルデータベース303(図3参照)に登録される。モデル化に用いる明細の特徴は、例えば、キーボード110等の入力手段により指定される。なお、データフロー解析に求める精度やプログラムの設計の都合上等により、ソースコードのすべてをモデル化しても良いし、一部だけモデル化しても良い。
1.3.3.データフロー解析プログラムにおける処理
次に、データフロー解析プログラム304の処理動作について説明する。
この工程のデータフロー解析プログラム304では、図13及び図14に図示したような、モデルデータベース303に登録されたすべてのモデルに対し、データフロー解析プログラム401と同様のデータフロー解析を実行する。なお、前記モデルは既に不要部分を削除して簡易化されたものであるので、データフロー抽出プログラム403により実行される処理(図7及び図8参照)は不要である。そのため、データフロー解析プログラム304による解析の結果、図10で示すDFDB404に登録されるエッジデータ1000と同様のエッジデータ(つまり、numフィールド、toフィールド、to_lineフィールド、fromフィールド、from_lineフィールド、及びclassフィールドの6つのフィールドからなるエントリで構成されたエッジデータ)が求められる。そして、当該エッジデータの一のクラスにおいて、toフィールドの値とfromフィールドの値が等しく、その等しい値を以ってエッジデータを連結したときに生成されるエッジの集合を「データパス」と定義する。データパスが定義されたエッジの集合は、データパスデータベース305(図3)に登録される。
図15及び図16を参照して、データパスについて具体的に説明する。図15は、簡易化プログラム301(図3)による簡易化の処理、及びモデル化プログラム302(図3)によるモデル化の処理がなされた解析対象ソースコード1500の一例を図示したものである。図16は、解析対象ソースコード1500に対してデータパスをマッピングした解析対象ソースコード1600の一例を図示したものである。
この解析対象プログラムコード1500(又は1600)内に含まれるgetUserValueメソッド(6行目)およびgetTimeメソッド(5行目)が開始エッジであるとし、writeValue(8行目と9行目の2つ)が終了エッジであるとした場合、データフロー解析プログラム304により、図16に図示した、第1のデータパス(1601→1602→1603→1604)と、第2のデータパス(1605→1606→1607→1608)が抽出される。これら第1のデータパス及び第2のデータパスを表す一連のエッジの集合がデータパスデータベース305(図3)に登録される。
1.3.4.脆弱性検出プログラムにおける処理
次に、脆弱性検出プログラム306の処理動作について説明する。
脆弱性検出プログラム306では、データフロー解析プログラム304により登録されたデータパスデータベース305と、メモリ102(図1)に記憶され、予め用意していた脆弱性データベース106を参照し、データパスに対して脆弱経路の検出の処理が実行される。
図17は、脆弱性データベース106に登録されるデータ構造の一例を図示したものである。脆弱性データベース106には、1列目に「predicate」フィールド1701、2列目に「method」フィールド1702及び3列目に「class」フィールド1703から構成された脆弱性データが登録されている。脆弱性データとは、クラスごとに脆弱性の発生点とその発生点となるメソッドおよび脆弱性の使用点とその使用点となるメソッドを関連付けたデータである。
「predicate」フィールド1701には、ソースコードのある行に記述されたメソッドが発生点もしくは使用点であるかを表す述語が登録される。図17の例では、「from」が発生点であり、「to」が使用点である。
「method」フィールド1702には、ソースコードに用いられるメソッド名が登録される。図17の例では、「getUserValue」が発生点を生じさせるメソッドであり、「writeValue」が使用点を生じさせるメソッドである。
「class」フィールド1703には、「method」フィールド1702に登録されるメソッドが属するクラスが登録される。図17の例では、「Data」が、メソッド「getUserValue」及び「writeValue」が属するクラスである。
脆弱性データベース106を用いて、データパスデータベース305に登録されているデータパスの経路上に発生点と使用点が含まれているかを検査し、含まれている場合、そのパスを脆弱経路として検出し、解析結果108(図3)として出力する。図17の脆弱性データベース106を参照すると、getUserValue()メソッドが脆弱性の発生点であり、writeValue()メソッドが脆弱性の使用点となっており、図16の解析対象ソースコード1600と照合する。すると、第1のデータパス(1601→1602→1603→1604)において、発生点「getUserValue()」1601が脆弱性データベース106の「method」フィールド1702に登録された発生点「getUserValue」と一致し、かつ、使用点「WriteValue」1604が脆弱性データベース106の「method」フィールド1702に登録された使用点「writeValue」と一致するので、第1のデータパスは脆弱経路として検出され、解析結果108に出力される。一方、第2のデータパス(1605→1606→1607→1608)において、使用点「WriteValue()」1608が脆弱性データベース106の「method」フィールド1702に登録された使用点「writeValue」と一致するが、発生点「getTime()」1605が脆弱性データベース106の「method」フィールド1702に登録された発生点「getUserValue()」と一致しないため、第2のデータパスは脆弱性を発生させず、脆弱経路として検出されない。
このようにして、検証対象ソースコード107におけるプログラムの検証を終了する。
1.4.実施の形態1のまとめ
実施の形態1により、以下の効果を奏する。すなわち、本実施形態のプログラム検証方法は、検証対象コードの脆弱経路を検出するために、検証対象コードを、あらかじめ指定された特徴の明細を記述したモデルを作成する工程、モデル化された検証対象ソースコードを基にしてデータフロー解析を行う工程、及びデータフロー解析の結果として出力したデータパスと脆弱性データベースとを照合することにより、解析したデータパスのうち脆弱経路を検出する工程を含むが、検証対象ソースコードのデータフローに着目し、これらの工程を実行する前に、着目したデータフローを簡易化する工程を備えることにより、検証対象ソースコードを縮小化することができる。検証対象ソースコードを縮小化した簡易ソースコードに置き換えることにより、脆弱経路の検出に影響を与えることなく、プログラム解析の際に必要となるメモリ量が低減され、解析対象とするソースコードサイズを拡大することが可能となる。また、検証対象ソースコードの簡易化により、解析時間を短縮することができる。
2.実施の形態2
上記実施の形態1では、すべての検証対象ソースコードを簡易化しているが、検証対象ソースコードのすべてがコンピュータ100に備えられているとは限らない。近年のプログラムの大規模化、モジュール化に伴い、一般に外部ライブラリを利用したプログラムが増加しているためである。そこで、コンピュータ100の外部であらかじめ、ライブラリなどの一部のソースコードのみ簡易化し、モデル化を行い、モデルファイルを予め作成しておき、脆弱性検出の際に、そのモデルファイルをデータフロー解析の工程に入力する形態をとることができる。図18を参照して、その形態に関する説明をする。
2.1.実施の形態2の構成
図18は、本実施形態の検出ソフトウェアプログラム104の処理手順の一例をブロック図として図示したものである。基本的には図3に図示した処理手順と同様であるので、相違する点についてのみ説明する。
検出ソフトウェアプログラム104には、簡易化プログラム301(図3参照)が備えられておらず、後記するように外部にて簡易化する。従って、メモリ102に記憶されている検証対象ソースコード107は、ソースコードとして一部不足しているが元々簡易化することのないものを用いることにし、モデル化プログラム302によるモデル化の処理が行われる。
コンピュータ100の外部には、外部検証対象ソースコード1800、外部簡易化プログラム1801、外部簡易ソースコード1802、及び外部モデル化プログラム1803を備えたコンピュータ(図示せず)が存在し、コンピュータ100は、例えば、インターネット等のネットワークを介して外部モデル化プログラム1803から所定のデータを入力できるように設定されている。外部検証対象ソースコード1800は、検証対象ソースコード107と同等の性質を有するものであり、検証対象ソースコード107の不足部分を補完するソースコードを有している。外部簡易化プログラム1801は簡易化プログラム301(図3参照)と同等の機能を有するものである。外部簡易ソースコード1803は、外部検証対象ソースコード1800を外部簡易化プログラム1801により簡易化されたプログラムである。外部モデル化プログラム1803はモデル化プログラム302(図3参照)と同等の機能を有しており、外部簡易ソースコード1802をモデル化し、モデル化したデータをデータフロー解析304及びモデルデータベース303に出力する。この出力は、コンピュータ100において、キーボード110から、脆弱性検出の開始の指示が入力された場合に行われる。
データフロー解析プログラム304にモデル化されたソースコード(モデル化された検証対象ソースコード107及びモデル化された外部簡易ソースコード1802)が入力されてから解析結果108を出力するまでの処理は、実施の形態1と同様であるので説明を省略する。
2.2.実施の形態2のまとめ
実施の形態2により、以下の効果を奏する。すなわち、検証対象ソースコードが一部(または全部)存在しない場合において、ライブラリなどの外部に存在する検証対象ソースコードに対し、データフローに着目し、簡易化、そして、モデル化したコードをプログラム検証装置として機能するコンピュータに追加する工程を備えるようにした。これにより、不足した検証対象ソースコードを補完し、その部分をなんらかの仮定のもとに近似する場合に比べ、解析精度の低下を防止でき、さらには、解析精度を向上させることができる。
また、既に外部で一部または全部の検証対象ソースコードを簡易化、モデル化しているので、脆弱性の検出の処理時間全体を短縮することができる。
3.実施の形態3
上記実施の形態2では、検出対象ソフトウェアのソースコードの一部が不足している場合、図18のように簡易的に記述した簡易ソースコードを外部入力として用いた。その簡易ソースコードは、プログラム検証装置としてのコンピュータに備えられている検証対象ソースコードとは異なる構文規則を用いることも可能である。実施の形態3ではその点について詳細に説明する。
3.1.実施の形態3の構成
図19は、実施の形態3の検出ソフトウェアプログラム104の処理手順の一例をブロック図として図示したものである。基本的には図18に図示した処理手順と同様であるが、簡易ソースコード1901、簡易モデル化プログラム1902、簡易モデルデータベース1903、モデル変換データベース1904及びモデル変換プログラム1905が追加されている点で相違する。実施の形態3では、簡易モデルデータベース1903、モデル変換データベース1904及びモデル変換プログラム1905は、コンピュータ100が備えているものとする。以下、その相違する点についてのみ説明する。
簡易ソースコード1901は、外部検証対象ソースコード1800と同等の性質を有しているが、検証対象ソースコード107とは異なる構文規則で記述されており、不図示の簡易化プログラムにより簡易化したソースコードである。
簡易モデル化プログラム1902は、簡易ソースコード1901を読み込み、モデル化するプログラムであり、外部モデル化プログラム1803と同等の機能を有する。簡易ソースコード1901をモデル化したデータは簡易モデルデータベース1903に登録される。簡易ソースコード1901に対応するモデルには、Java(登録商標)言語をモデル化した際に現れる述語とは異なる述語が含まれる。
図20は、簡易ソースコード1901の一例であるソースコード2000を図示したものである。ソースコード2000は、引数で与えられたchar配列の各要素を連結しStringとして出力するconvertC2Sメソッド(3行目)を簡易化して記述している。ソースコード2000の4行目にJava(登録商標)言語にはない「<-」という演算子(以下、「受け渡し演算子」という。)がある。本来Java(登録商標)言語の言語仕様ではchar配列がStringと等価であるというデータフローが表現できず、データフローの解析を行うことができないが、この受け渡し演算子により、char配列からStringへのデータの受け渡しが記述できる。受け渡し演算子は、簡易ソースコード1901に既に記述されていても良いし、入力手段から簡易ソースコード1901を入力して異なる構文規則で記述されているとコンピュータ100が判断した場合に追加しても良い。
図21は、簡易モデル化プログラム1902により図20に示した簡易ソースコード1901のうち、受け渡し演算子「<-」を含む4行目をモデル化した結果の一例を図示したものである。図21に示したように、「String str <- c;」といった、非等価のデータを受け渡すコードをモデル化するにあたり、指定された特徴として、述語(predicate)2101を記述し、その述語を「exassign」に置き換えることにより明細を記述する。この1列目の述語2001の「exassign」がJava(登録商標)言語をモデル化した際には、存在しなかった述語である。また、その特徴として、コードの左辺値(left value)2102を指定して「convertC2S.str」と記述し、コードの右辺値(right value)2103を指定して「convertC2S.c」と記述し、行番号(line)2104を指定して4行目にあるので「4」と記述し、メソッド名(method)2105を指定して「convertC2S」と記述し、及びクラス名(class)2106を指定して「Example」と記述する。このように記述したモデルは、「predicate」2101、「left value」2102、「right value」2103、「line」2104、「method」2105及び「class」2106をフィールドとしたモデルとして、簡易モデルデータベース1903(図19参照)に登録される。
モデル変換プログラム1905は、簡易モデルデータベース1903に登録されたモデルをモデルデータベース303に合う形に変換し、モデルデータベース303に登録する。その処理動作を、図22を参照して説明する。
3.2.モデル変換プログラムにおける処理
図22は、モデル変換プログラム1905の処理の一例をフローチャートとして図示したものである。図22の処理では、まず、処理2201で処理を開始し、制御を処理2202に移す。処理2202において、簡易モデルデータベース1903に登録されたモデルの集合であるモデル集合を変数Mに求め、制御を判定処理2203に移す。
判定処理2203において、変数Mが空集合か否かを確認する。変数Mが空集合であれば(判定処理2203でYes)、処理すべきモデルが存在しないため制御を処理2208に移し終了する。変数Mが空集合で無い場合(判定処理2203でNo)、制御を処理2204に移す。処理2204において、変数Mから1つのモデルを取り出し、取り出したモデルを変数mに格納する。一方、変数mの述語と対応付けされている述語をモデル変換データベース1904から読み込み、読み込んだ述語を変数pに格納する。その後、制御を判定処理2205に移す。
図23は、モデル変換データベース1904に登録された述語の変換規則を定めたデータのデータ構造の一例を図示したものである。モデル変換データベース1904はフィールドとして、keyフィールド2301とvalueフィールド2302とを持つ。処理2204からの問合せに対し、keyフィールド2301の値とマッチングするか否かの処理を行い、マッチする場合、そのkeyフィールド2301の値(つまり、「exassign」)に対応するvalueフィールド2302の値(つまり、「assign」)を返す。その結果、変数pはvalueフィールド2302の値を持つ。もしマッチしない場合、何も返さず変数pは値を持たない。
判定処理2205において、変数pが値を持たない場合(判定処理2205でNo)、制御を処理2207に移す。処理2207において、変数mはモデルの変換処理を必要としないため、変数mをそのままモデルデータベース303に追加し、再び、制御を処理2203に移す。判定処理2205において、変数pが値を持つ場合(判定処理2205でYes)、制御を処理2206に移す。処理2206において、変数mの述語を変数pに置換したモデルをモデルデータベース303に追加し、制御を再び処理2203に移す。
結果的に、モデル集合Mのすべてのモデルmについて、述語をそのままにしたものをモデルデータベース303に追加するかモデル変換データベース1904に登録されている述語に置き換えたものpをモデルデータベース303に追加するかが決定されて制御を終了する。
例えば、ソースコード2000(図20参照)には受け渡し演算子「<-」があるので、ソースコード2000についてモデル変換プログラム1905の処理を実行すれば、変数pは値を持つことになる(判定処理2205でYes)。よって、述語を置き換えたモデルがモデルデータベース303に追加されることになり、既に説明したデータフロー解析等の処理が実行される。
3.3.実施の形態3のまとめ
実施の形態3により、以下の効果を奏する。すなわち、この処理により、Java(登録商標)言語では存在しないデータの受け渡しを表現する演算子「<-」を用いることで、元々実装のないソースコードに対するデータフローの定義を与えることが可能となり、さらに、検証対象ソースコード107とは異なる構文規則を用いたソースコード(簡易ソースコード1901)でも外部入力に用いることが可能となる。これにより、不足した検証対象ソースコードを補完し、その部分をなんらかの仮定のもとに近似する場合に比べ、実装の存在しないソースコードを簡易的に追加することができ、データフロー解析の解析精度を向上させることができる。
なお、上述した形態は本発明を実施するための最良のものであるが、かかる実施形式に限定する趣旨ではない。従って、本発明の要旨を変更しない範囲内においてその実施形式を種々変形することが可能である。
例えば、実施の形態3において、今回のモデル変換プログラム1905では、述語のみの変換であったが、これは述語のみの変換しか出来ないことを表しているわけではない。指定の変換規則をモデル変換データベース1904に登録しておくことで、述語以外の指定された特徴の明細の変換も可能である。
また、実施の形態2において、コンピュータ100の外部において、外部簡易ソースコード1802(図18参照)を外部モデル化プログラム1803によりモデル化した。しかし、外部簡易ソースコード1802をコンピュータ100が有するモデル化プログラム302に入力して、コンピュータ100の内部においてモデル化を実行するようにしても良い。
また、本実施の形態では、Java(登録商標)言語を対象ソースコードとした場合を例にとったが、特定のプログラミング言語に限らずに本発明を同様に利用できる。
さらに、以上の説明では、脆弱点および脆弱経路の検出を例にとり説明したが、脆弱性に係わらず、たとえば、プログラム信頼性向上を目的としたプログラム検証などといった、各種のプログラムの特性の検証に対しても応用可能である。この場合、脆弱性データベース106(図1参照)の代わりに、そのプログラムの特性について定めた特性情報を登録したデータベースを用いるようにする。
また、本実施の形態では、検証対象ソースコードのうち、データフロー抽出プログラム403(図4参照)により抽出されたデータフロー以外のデータフローに対応するソースコードの全部を削除することにようにした。しかし、データフローの解析精度におけるプログラムの設計上の都合等に応じて削除できるソースコードを一部のみとしても良い。
実施の形態1のプログラム検証方法を実行するコンピュータ(プログラム検証装置)の構成の一例を図示したものである。 検出ソフトウェアプログラム104においてなされるデータの入出力の概要を、ブロック図として図示したものである。 実施の形態1の検出ソフトウェアプログラム104の処理手順の一例をブロック図として図示したものである。 簡易化プログラム301の処理手順の一例をブロック図として図示したものである。 簡易化の対象となるJava(登録商標)言語で記述したソースコード500を図示したものである。 エッジデータベース402に登録されるエッジ集合600のデータ構造を図示したものである。 データフロー抽出プログラム403により実行される処理の一例をフローチャートとして図示したものである。 図7のフローチャート内で利用したサブルーチンgetPath()801のフローチャートの一例を図示したものである。 データフロー抽出プログラム403(図4)の処理により得られたデータフローをソースコード900上にマッピングしたものを図示したものである。 DFDB404に登録される、図9においてマッピングしたデータフローに相当するエッジデータ1000のデータ構造を図示したものである。 不要部分削除プログラム405の処理の一例をフローチャートとして図示したものである。 図5に示すソースコード500から不要部分を削除することにより簡易化されたソースコード1200を図示したものである。 図12のソースコード1200のsetStringメソッドの内容「val = getUserValue();」(4行目)をモデル化した結果の一例を図示したものである。 図12のソースコード1200のgetStringメソッドの内容「return val;」(8行目)をモデル化した結果の一例を図示したものである。 簡易化プログラム301(図3)による簡易化の処理、及びモデル化プログラム302(図3)によるモデル化の処理がなされた解析対象ソースコード1500の一例を図示したものである。 解析対象ソースコード1500に対してデータパスをマッピングした解析対象ソースコード1600の一例を図示したものである。 図17は、脆弱性データベース106に登録されるデータ構造の一例を図示したものである。 実施の形態2の検出ソフトウェアプログラム104の処理手順の一例をブロック図として図示したものである。 実施の形態3の検出ソフトウェアプログラム104の処理手順の一例をブロック図として図示したものである。 図20は、簡易ソースコード1901の一例であるソースコード2000を図示したものである。 簡易モデル化プログラム1902により図20に示した簡易ソースコード1901のうち、受け渡し演算子「<-」を含む4行目をモデル化した結果の一例を図示したものである。 モデル変換プログラム1905の処理の一例をフローチャートとして図示したものである。 モデル変換データベース1904に登録された述語の変換規則を定めたデータのデータ構造の一例を図示したものである。
符号の説明
104 検出ソフトウェアプログラム
105 簡易ソースコード
106 脆弱性データベース
107 検証対象ソースコード
108 解析結果
301 簡易化プログラム
302 モデル化プログラム
303 モデルデータベース
304 データフロー解析プログラム
305 データパスデータベース
306 脆弱性検出プログラム
400 構文解析プログラム
401 データフロー解析プログラム
402 エッジデータベース
403 データフロー抽出プログラム
404 データフローデータベース(DFDB)
405 不要部分削除プログラム
1800 外部検証対象ソースコード
1801 外部簡易化プログラム
1802 外部簡易ソースコード
1803 外部モデル化プログラム
1901 簡易ソースコード
1902 簡易モデル化プログラム
1903 簡易モデルデータベース
1904 モデル変換データベース
1905 モデル変換プログラム

Claims (7)

  1. 検証対象プログラムを検証するプログラム検証装置におけるプログラム検証方法において、
    前記検証対象プログラムの検証対象ソースコードのデータフローを解析し、前記データフローの開始エッジ及び終了エッジを定めたエッジデータの集合を取得するステップと、
    前記エッジデータの集合から発生点エッジデータを抽出し、
    前記発生点エッジデータは、前記検証対象ソースコードのうち、一または二以上の処理に対応するソースコードから定まる範囲の外部を前記開始エッジとするエッジデータであり、
    一のエッジデータの開始エッジが他のエッジデータの終了エッジと一致するエッジデータのデータパスに沿って、前記発生点エッジデータから順に、前記範囲の外部を前記終了エッジとする使用点エッジデータまでのエッジデータを抽出するステップと、
    前記検証対象ソースコードから、前記抽出したエッジデータ以外のエッジデータに係るソースコードの一部または全部を削除することにより簡易化して、検証用の簡易ソースコードを生成するステップと、
    を有することを特徴とするプログラム検証方法。
  2. 前記範囲は、前記検証対象ソースコードをJava(登録商標)言語で記述した場合には、クラスとして定められたものであることを特徴とする請求項1に記載のプログラム検証方法。
  3. 前記プログラム検証装置は、前記検証対象プログラム、プログラムを検証するときに着目する特性を示した特性情報、及び前記簡易ソースコードを検証用にモデル化するためにあらかじめ指定された特徴を記憶する記憶手段を有し、
    前記記憶手段から前記指定された特徴を読み出し、前記読み出した特徴に基づいて、前記簡易ソースコードを検証用にモデル化するステップと、
    前記モデル化した簡易ソースコードのデータフローを解析し、前記データフローの開始エッジ及び終了エッジを定めたエッジデータの集合を取得し、前記エッジデータの集合から、一のエッジデータの開始エッジと他のエッジデータの終了エッジとを連結したデータパスを生成するステップと、
    前記記憶手段から前記特性情報を読み出し、前記読み出した特性情報に基づいて、前記データパスにおける特性の有無を検出するステップと、
    を有することを特徴とする請求項1または請求項2に記載のプログラム検証方法。
  4. 前記プログラム検証装置が、前記検証対象プログラムの検証の指示を入力する入力手段を有し、
    前記記憶手段が、前記検証するプログラムの一部分を記憶している場合、
    前記入力手段により前記プログラムの検証の指示が入力されるとき、前記プログラム検証装置の外部からネットワークを介して、前記検証するプログラムの残りであって前記簡易化と同様の簡易化がなされたものを、外部簡易ソースコードとして生成するステップと、
    前記入力手段により前記外部簡易ソースコードを入力するステップとを有し、
    前記モデル化するステップにおいて、前記検証するプログラムの一部分に対応するソースコード及び前記外部簡易ソースコードをモデル化し、
    前記データパスを生成するステップにおいて、前記モデル化した、前記検証するプログラムの一部分に対応するソースコード及び前記外部簡易ソースコードのデータフローを解析し、前記データフローの開始エッジ及び終了エッジを定めたエッジデータの集合を取得し、前記取得したエッジデータの集合から、一のエッジデータの開始エッジと他のエッジデータの終了エッジとを連結したデータパスを生成し、
    前記特性の有無を検出するステップにおいて、前記記憶手段から前記特性情報を読み出し、前記読み出した特性情報に基づいて、前記データパスにおける特性の有無を検出する
    ことを特徴とする請求項3に記載のプログラム検証方法。
  5. 前記プログラム検証装置が、前記検証対象プログラムの検証の指示を入力する入力手段を有し、
    前記記憶手段が、前記検証するプログラムの一部分を記憶している場合、
    前記入力手段により前記プログラムの検証の指示が入力されるとき、前記プログラム検証装置の外部からネットワークを介して、前記検証するプログラムの残りであって前記簡易化と同様の簡易化がなされ、外部簡易ソースコードとして生成するステップと、
    前記プログラム検証装置の外部においてあらかじめ指定された特徴に基づいて、前記外部簡易ソースコードを外部モデル化し、前記入力手段により前記外部モデル化した外部簡易ソースコードを入力するステップとを有し、
    前記モデル化するステップにおいて、前記検証するプログラムの一部分に対応するソースコードをモデル化し、
    前記データパスを生成するステップにおいて、前記モデル化した前記検証するプログラムの一部分に対応するソースコード及び前記外部モデル化した前記外部簡易ソースコードのデータフローを解析し、前記データフローの開始エッジ及び終了エッジを定めたエッジデータの集合を取得し、前記取得したエッジデータの集合から、一のエッジデータの開始エッジと他のエッジデータの終了エッジとを連結したデータパスを生成し、
    前記特性の有無を検出するステップにおいて、前記記憶手段から前記特性情報を読み出し、前記読み出した特性情報に基づいて、前記データパスにおける特性の有無を検出する
    ことを特徴とする請求項3に記載のプログラム検証方法。
  6. 前記外部簡易ソースコードが前記検証するプログラムの検証対象ソースコードと異なる構文規則で記述されているため、前記外部簡易ソースコードを外部モデル化しても当該外部モデル化した外部簡易ソースコードのデータフローを解析することができない場合、
    前記外部簡易ソースコードにおいて、前記外部簡易ソースコードの言語仕様にはないデータの受け渡しを表現する演算子を用いてデータフローであることを示すコードを記述するステップとを有し、
    前記外部簡易ソースコードを入力するステップにおいて、前記演算子を含む外部簡易ソースコードを外部モデル化し、前記入力手段により前記外部モデル化した、前記演算子を含む外部簡易ソースコードを入力し、
    前記演算子に基づいて、前記外部モデル化した、前記演算子を含む外部簡易ソースコードをモデル変換するステップとを有し、
    前記データフローの解析を行うことを特徴とする請求項5に記載のプログラム検証方法。
  7. 請求項1から請求項6までのいずれか1項に記載されたプログラム検証方法を実行するプログラム検証装置。
JP2007146936A 2007-06-01 2007-06-01 プログラム検証方法、プログラム検証装置 Expired - Fee Related JP4951416B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007146936A JP4951416B2 (ja) 2007-06-01 2007-06-01 プログラム検証方法、プログラム検証装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007146936A JP4951416B2 (ja) 2007-06-01 2007-06-01 プログラム検証方法、プログラム検証装置

Publications (2)

Publication Number Publication Date
JP2008299723A JP2008299723A (ja) 2008-12-11
JP4951416B2 true JP4951416B2 (ja) 2012-06-13

Family

ID=40173166

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007146936A Expired - Fee Related JP4951416B2 (ja) 2007-06-01 2007-06-01 プログラム検証方法、プログラム検証装置

Country Status (1)

Country Link
JP (1) JP4951416B2 (ja)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8914890B2 (en) * 2011-01-31 2014-12-16 International Business Machines Corporation Determining the vulnerability of computer software applications to privilege-escalation attacks
US9501646B2 (en) 2012-09-26 2016-11-22 Mitsubishi Electric Corporation Program verification apparatus, program verification method, and computer readable medium
JP5941859B2 (ja) * 2013-03-05 2016-06-29 株式会社エヌ・ティ・ティ・データ 検証装置、検証方法、及びプログラム
KR101860674B1 (ko) 2017-06-20 2018-05-23 넷마블 주식회사 크래시 리포트 그룹핑 방법, 서버 및 컴퓨터 프로그램
CN109101819A (zh) * 2017-06-21 2018-12-28 中兴通讯股份有限公司 一种漏洞检测方法及终端、存储介质
KR102256894B1 (ko) * 2018-05-15 2021-06-01 넷마블 주식회사 크래시 리포트 그룹핑 방법, 서버 및 컴퓨터 프로그램
KR102158775B1 (ko) * 2018-05-15 2020-09-22 넷마블 주식회사 크래시 리포트 그룹핑 방법, 서버 및 컴퓨터 프로그램
CN111737150B (zh) * 2020-07-24 2023-09-15 江西师范大学 面向Java EE程序SQLIA漏洞的污点分析和验证方法及装置

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0687780A (ja) * 1990-09-17 1994-03-29 Uop Inc 一部還元された酸化タングステン(vi)で構成保持された触媒を使用してのフェノール類の脱水によるジアリールエーテル類の製造方法
JPH07311694A (ja) * 1994-05-16 1995-11-28 Hitachi Ltd プログラム実行パスの解析方法
JP2005346578A (ja) * 2004-06-04 2005-12-15 Ricoh Co Ltd ファイル抽出システムおよびプログラム
JP4724387B2 (ja) * 2004-06-24 2011-07-13 富士通株式会社 プログラム変換プログラム、プログラム変換装置およびプログラム変換方法
JP4693044B2 (ja) * 2005-08-18 2011-06-01 株式会社日立ソリューションズ ソースコード脆弱性検査装置

Also Published As

Publication number Publication date
JP2008299723A (ja) 2008-12-11

Similar Documents

Publication Publication Date Title
CN109426722B (zh) Sql注入缺陷检测方法、系统、设备及存储介质
Gao et al. Checking smart contracts with structural code embedding
CN110383238B (zh) 用于基于模型的软件分析的系统和方法
US10133650B1 (en) Automated API parameter resolution and validation
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
JP4951416B2 (ja) プログラム検証方法、プログラム検証装置
US10146532B2 (en) Apparatus and method for detecting code cloning of software
JP5042315B2 (ja) ソースコード内のセキュリティ脆弱性の検出
Yu et al. Automata-based symbolic string analysis for vulnerability detection
US7240279B1 (en) XML patterns language
JP5444208B2 (ja) ビジネスルールの編集およびコンパイルの、方法、コンピュータプログラム、およびシステム
US8219901B2 (en) Method and device for filtering elements of a structured document on the basis of an expression
EP2407887B1 (en) Solving hybrid constraints to validate specification requirements of a software module
RU2610241C2 (ru) Способ и система синтеза текста на основе извлеченной информации в виде rdf-графа с использованием шаблонов
CN108614707A (zh) 静态代码检查方法、装置、存储介质和计算机设备
US20130239098A1 (en) Source code conversion method and source code conversion program
US20010037492A1 (en) Method and apparatus for automatically extracting verification models
Nguyen et al. Cross-language program slicing for dynamic web applications
CN101751281A (zh) 编译器生成系统和方法
US20170300305A1 (en) Executable guidance experiences based on implicitly generated guidance models
Zhong et al. An empirical study on API parameter rules
CN113885876A (zh) 一种参数校验方法、装置、存储介质及计算机系统
Tisi et al. Coqtl: An internal DSL for model transformation in COQ
Nisbet et al. Presentations of rase knowledge mark-up
Anderson et al. Supporting analysis of SQL queries in PHP AiR

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090811

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20111116

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20111129

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120126

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: 20120214

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120312

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150316

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees