(57)【特許請求の範囲】
【請求項１】
プロセス内のデータに対してタグを設定し、前記プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡方法において、
共有ライブラリに含まれる関数内のデータ受け渡しの仕様をシグネチャとして定義し、
プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略し、
前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、その戻りアドレスと引数の値とを履歴情報として保存し、タグの伝播の少なくとも一部を省略する第１の状態に移行し、
前記第１の状態で前記シグネチャに定義されていない関数のアドレスへの関数が呼び出された場合、その戻りアドレスを履歴情報として保存し、タグの伝播を省略しない第２の状態に移行し、
関数呼び出しからのリターンの際に、戻り先が最新の履歴情報に含まれる戻りアドレスと一致する場合は最新の履歴情報を取り除き、かつ前記第１の状態である場合はタグの伝播の少なくとも一部を省略する動的データフロー追跡方法。
【請求項２】
前記関数の呼び出しの際に、一括してタグを伝播する請求項１の動的データフロー追跡方法。
【請求項３】
前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合に限り、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する請求項１または請求項２に記載の動的データフロー追跡方法。
【請求項４】
前記シグネチャに定義されている関数から前記シグネチャに定義されていない関数へのコールバックが生じ、かつ前記シグネチャに定義されている関数に渡されたデータが前記コールバックに応じて受け渡されうるか否かの情報を前記シグネチャに定義しておき、
前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合、または前記タグが既定値でなく、かつコールバックに応じてデータ受け渡しがなされない場合に、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する請求項１又は請求項２に記載の動的データフロー追跡方法。
【請求項５】
プロセス内部のデータに対してタグを設定し、プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡動作をコンピュータに実行させるためのプログラムであって、
共有ライブラリに含まれる関数内のデータ受け渡しの仕様をシグネチャとして定義し、
プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略し、
前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、その戻りアドレスと引数の値とを履歴情報として保存し、タグの伝播の少なくとも一部を省略する第１の状態に移行し、
前記第１の状態で前記シグネチャに定義されていない関数のアドレスへの関数が呼び出された場合、その戻りアドレスを履歴情報として保存し、タグの伝播を省略しない第２の状態に移行し、
関数呼び出しからのリターンの際に、戻り先が最新の履歴情報に含まれる戻りアドレスと一致する場合は最新の履歴情報を取り除き、かつ前記第１の状態である場合はタグの伝播の少なくとも一部を省略する動的データフロー追跡プログラム。
【請求項６】
前記関数の呼び出しの際に、一括してタグを伝播する請求項５に記載の動的データフロー追跡プログラム。
【請求項７】
前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合に限り、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する請求項５又は請求項６に記載の動的データフロー追跡プログラム。
【請求項８】
前記シグネチャに定義されている関数から前記シグネチャに定義されていない関数へのコールバックが生じ、かつ前記シグネチャに定義されている関数に渡されたデータが前記コールバックに応じて受け渡されうるか否かの情報を前記シグネチャに定義しておき、
前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合、または前記タグが既定値でなく、かつコールバックに応じてデータ受け渡しがなされない場合に、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する請求項５又は請求項６に記載の動的データフロー追跡プログラム。
【請求項９】
プロセス内のデータに対してタグを設定し、前記プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡装置において、
共有ライブラリに含まれる関数内のデータ受け渡しの仕様が定義されたシグネチャを格納する格納手段と、
プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略するタグの伝播処理を追加する動的データフロー解析処理追加手段と、を備え、
前記動的データフロー解析処理追加手段は、
前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、その戻りアドレスと引数の値とを履歴情報として保存し、タグの伝播の少なくとも一部を省略する第１の状態に移行し、前記第１の状態で前記シグネチャに定義されていない関数のアドレスへの関数が呼び出された場合、その戻りアドレスを履歴情報として保存し、タグの伝播を省略しない第２の状態に移行する処理を呼び出し元のプログラムに追加し、
関数呼び出しからのリターンの際に、戻り先が最新の履歴情報に含まれる戻りアドレスと一致する場合は最新の履歴情報を取り除き、かつ前記第１の状態である場合は前記シグネチャを参照してタグの伝播の少なくとも一部を省略する処理を呼び出し先のプログラムに追加する動的データフロー追跡装置。
【請求項１０】
前記動的データフロー解析処理追加手段は、前記関数の呼び出しの際に、一括してタグを伝播する前記タグの伝播処理を前記関数呼び出しの前後に追加する請求項９の動的データフロー追跡装置。
【請求項１１】
前記動的データフロー解析処理追加手段は、前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合に限り、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する処理を前記呼び出し元のプログラムに追加する請求項９または請求項１０の動的データフロー追跡装置。
【請求項１２】
前記シグネチャは、前記シグネチャに定義されている関数から前記シグネチャに定義されていない関数へのコールバックが生じ、かつ前記シグネチャに定義されている関数に渡されたデータが前記コールバックに応じて受け渡されうるか否かの情報を含み、
前記動的データフロー解析処理追加手段は、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合、または前記タグが既定値でなく、かつコールバックに応じてデータ受け渡しがなされない場合に、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する処理を前記呼び出し元のプログラムに追加する請求項９または請求項１０の動的データフロー追跡装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動的データフロー追跡装置、動的データフロー追跡方法および動的データフロー追跡プログラムに関し、特にライブラリの仕様に関する情報を用いる動的データフロー追跡装置、動的データフロー追跡方法および動的データフロー追跡プログラムに関する。
【背景技術】
【０００２】
プログラムの実行コードを実行時に一部書き換え、性能測定やバグ発見等のためのコードを埋め込む手法をバイナリインスツルメンテーションと呼ぶ。バイナリインスツルメンテーション技術を用いることにより、ユーザはプロセス内部でどのようにデータがやり取りされているかを実行時に解析することが可能となる。このデータ解析手法を動的データフロー解析と呼ぶ。【０００３】
動的データフロー解析では、実行中のプログラムのプロセスにおいて、入力されたデータにある数値を付加する。この数値を「タグ」と呼ぶ。入力されたデータとは、ファイルから読み込まれたデータやネットワーク経由で受信したデータ等を指し、タグとは、当該データがどのような経路で入力されたかを示す情報である。動的データフロー解析では、プロセス内部でタグの付加されたデータがレジスタやメモリ上でコピーされるたびに、そのデータに付加されたタグも同時に伝播する（コピーする）。これにより、入力されたデータがどのような入力に由来したか否かを判定できる。【０００４】
動的データフロー解析では、プログラムの実行コードを基本ブロック（Basic Block）と呼ばれる単位に分割し、基本ブロックに対してインスツルメンテーションを行う。インスツルメンテーションとは、プログラムの実行コードを読み込み、その実行コードに対して、ある所定の処理を加えて変更し、その変更した実行コードを実行する機能である。インスツルメンテーション機能の開示例として、非特許文献１が挙げられる。【０００５】
動的データフロー解析を情報セキュリティに適応することにより、ユーザはプログラムの脆弱性に対する攻撃や、プログラム実行時の情報漏えいを発見することができる。【０００６】
非特許文献２には、動的データフロー解析をプログラムの脆弱性に対する攻撃の発見に適用した技術が開示されている。バッファオーバーフロー攻撃に代表される、プログラムの脆弱性をついて任意のコードを実行させるタイプの攻撃は、以下の２段階のステップにより実行される。
（１）主にネットワークを通じて、外部から不正コードがそのプログラム内にロードされる。
（２）プログラムの制御が、ロードされた不正コードに移る。
非特許文献２に開示の技術では、動的データフロー解析を用いて、プロセスは信頼できない情報源（たとえば、インターネット経由のデータ受信等）から読み込んだデータに対して実行制御を移すか否かを判定し、（２）が生じたか否かを判定する。このような処理により、ユーザは、バッファオーバーフロー攻撃を発見することや、防止することができる。【０００７】
また、非特許文献３には、動的データフロー解析をスパイウェア等による情報漏えいに適用した技術が開示されている。スパイウェアによる情報漏えいは、ユーザの意図に反してプログラムが機密情報をネットワーク等の外部に送信することにより引き起こされる。非特許文献３に開示の技術では、動的データフロー解析を用いて、プロセスがＰＣ（Personal Computer）内の文書ファイル等の機密度の高い情報元から読み込んだデータを、インターネット経由等のデータ送信等の信頼できない対象に対して出力したか否かを判定することにより、情報漏えいを発見する。【０００８】
上述のように、動的データフロー解析は、情報セキュリティ上の問題を発見することが可能である。しかし、動的データフロー解析はプログラム実行時に内部データのやり取りを逐一記録していくため、プログラム実行速度が低下するという課題がある。【０００９】
この課題に対して、いくつかのプログラム実行高速化手法が提案されている。非特許文献４に開示の技術では、基本ブロックの実行開始時に、その基本ブロック内で使用されるレジスタがクリーン（機密情報に由来しない状態）であれば、メモリからレジスタへのロードを除いて、データのトレース処理を省略したコード（Fast Pathコード）を実行する。一方、その基本ブロック内で使用されるレジスタがクリーンでない場合、データのトレース処理を埋め込んだコード（Track Pathコード）を実行する手法を提案している。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】Chi-keung Luk, Robert Cohn, Robert Muth, Harish Patil, Artur Klauser, Geoff Lowney, Steven Wallace, Vijay Janapa, Reddi Kim Hazelwood, Pin: Building customized program analysis tools with dynamic instrumentation,  In Programming Language Design and Implementation, Chicago, IL, June 2005.
【非特許文献２】James Newsome, Dawn Song, Dynamic Taint Analysis for Automatic Detection, Analysis, and Signature Generation of Exploits on Commodity Software, NDSS 2005.
【非特許文献３】Neil Vachharajani, Matthew J. Bridges, Jonathan Chang, Ram Rangan, Guilherme Ottoni, Jason A. Blome, George A. Reis, Manish Vachharajani, and David I. August, RIFLE: An Architectural Framework for User-Centric Information-Flow Security, ACM/IEEE International Symposium on Microarchitecture (MICRO'04) 2004.
【非特許文献４】Feng Qin, Cheng Wang, Zhenmin Li, Ho-seop Kim, Yuanyuan Zhou, and Youfeng Wu, LIFT: A Low-Overhead Practical Information Flow Tracking System for Detecting Security Attacks, ACM/IEEE International Symposium on Microarchitecture (MICRO'06), 2006.
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、クライアントマシンで実行されるアプリケーションでは、多くのＤＬＬ（Dynamic Link Library）等の共有ライブラリがプログラムにリンクされている。このため、動的データフロー解析では、このようなプログラムを解析する場合、プログラムにリンクされた共有ライブラリ内のデータ授受を逐一追跡する必要があり、実行速度の低下が特に問題となる。【００１２】
本発明は、このような問題点を解決するためになされたものであり、複数の共有ライブラリをリンクしたプログラムに対する動的データフロー解析を高速化することができるデータフロー追跡方法、データフロー追跡プログラム、およびデータフロー追跡装置を提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明にかかる動的データフロー追跡方法の一態様は、プロセス内のデータに対してタグを設定し、前記プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡方法において、共有ライブラリに含まれる関数内のデータ受け渡しの仕様をシグネチャとして定義し、プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略するものである。
【発明の効果】
【００１４】
本発明により、複数の共有ライブラリをリンクしたプログラムに対する動的データフロー解析を高速化することができる動的データフロー追跡方法、動的データフロー追跡プログラム、動的データフロー追跡装置を提供することができる。
【図面の簡単な説明】
【００１５】
上述した目的、およびその他の目的、特徴および利点は、以下に述べる好適な実施の形態、およびそれに付随する以下の図面によってさらに明らかになる。【００１６】
【図１】実施の形態１にかかる動的データフロー解析装置のブロック図である。
【図２】実施の形態１にかかる動的データフロー解析装置のブロック図である。
【図３】実施の形態１にかかる基本ブロックへのコード埋め込みを表す概念図である。
【図４】実施の形態１にかかるＡＰＩシグネチャの図である。
【図５】実施の形態１にかかるＡＰＩアドレスマップの図である。
【図６】実施の形態１にかかる共有ライブラリアドレスリストの図である。
【図７】実施の形態１にかかる基本ブロックへのコード埋め込み処理を示すフローチャートである。
【図８Ａ】実施の形態１にかかる共有ライブラリの関数呼び出しコードの例である。
【図８Ｂ】実施の形態１にかかる実行コードの図である。
【図９】実施の形態１にかかるＡＰＩ追跡コードの埋め込まれた実行コードの図である。
【図１０】実施の形態２にかかる動的データフロー解析装置のブロック図である。
【図１１】実施の形態２にかかる基本ブロックの図である。
【図１２】実施の形態２にかかる基本ブロック生成のフローチャートである。
【図１３】実施の形態２にかかるフル追跡コード生成処理のフローチャートである。
【図１４】実施の形態２にかかる関数コール埋め込み処理が行われた実行コードの図である。
【図１５】実施の形態２にかかるリターン処理埋め込み処理が行われた実行コードの図である。
【図１６】実施の形態２にかかるＡＰＩ内追跡コード生成処理のフローチャートである。
【図１７】実施の形態３にかかる動的データフロー解析装置のブロック図である。
【図１８】実施の形態３にかかる保守的関数コール処理埋め込み処理のフローチャートである。
【図１９】実施の形態３にかかる保守的関数コール処理埋め込み処理が行われた実行コードの図である。
【図２０】実施の形態４にかかる保守的関数コール処理埋め込み処理のフローチャートである。
【発明を実施するための形態】
【００１７】
実施の形態１
以下、図面を参照して本発明の実施の形態について説明する。
まず、図１を参照して、本発明の実施の形態１にかかる動的データフロー解析装置の概要について説明する。本発明の実施の形態１にかかる動的データフロー解析装置１００は、動的データフロー解析処理追加部１０７と、格納部１０８とを備える構成である。本実施の形態にかかる動的データフロー解析装置は、プロセス内のデータに対して、そのデータの入手経路を示すタグを設定し、プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡するものである。
【００１８】
格納部１０８は、共有ライブラリに含まれる関数（ユーザーコード）内のデータ受け渡しの仕様が定義されたシグネチャを格納する。動的データフロー解析処理追加部１０７は、プログラムからの、シグネチャ（以下、ＡＰＩ（Application Program Interface）シグネチャともいう）で定義された関数への呼び出しの際に、シグネチャを参照することにより、関数内でのタグの伝播の少なくとも一部を省略させ、好ましくはタグを一括して伝播させる。ここで、本実施の形態にかかる動的データフロー解析処理追加部１０７は、関数の呼び出しの際に、タグの伝播処理を関数呼び出しの前後又は呼び出し先の関数に追加する。なお、本実施の形態においては、タグを一括して伝播する例について説明するが、タグの伝播の少なくとも一部を省略することで、タグの伝搬処理に応じて生ずる処理を低減し、高速化することができる。
【００１９】
次に図２を用いて、本発明の実施の形態１にかかる動的データフロー解析装置の構成の詳細について説明する。図１に示す動的データフロー解析装置１００は、具体的には、図２に示す動的データフロー解析装置１００のように記載することができる。この動的データフロー解析装置１００は、プログラム制御により動作するコンピュータ、例えば中央処理装置（ＣＰＵ：Central Processing Unit、図２中では図示を省略する）が実行するソフトウェアとして構成することができる。この動的データフロー解析装置１００は、オペレーティングシステム１０１と、インスツルメンテーション部１０２と、アプリケーションプログラム１０３と、共有ライブラリ解析部１０４と、動的データフロー解析処理追加部１０７と、ＡＰＩ知識格納部１０８とを備える。図１における動的データフロー解析処理追加部１０７は、図２における動的データフロー解析処理追加部１０７に対応する。また、図１における格納部１０８は、図２におけるＡＰＩ知識格納部１０８に対応する。
【００２０】
オペレーティングシステム１０１は、コンピュータにおいて、ハードウェアを抽象化したインターフェイスをアプリケーションソフトウェアに提供するソフトウェアであり、基本ソフトウェアの一種である。
【００２１】
インスツルメンテーション部１０２は、アプリケーションプログラム１０３の実行コードを読み込み、基本ブロックに分割する。また、インスツルメンテーション部１０２は、動的データフロー解析処理追加部１０７を用いて、基本ブロックに動的データフロー解析処理を追加する変更を行い、変更された基本ブロックをインスツルメンテーション部１０２内のデータキャッシュに格納する。
【００２２】
アプリケーションプログラム１０３は、ＰＣ上で実行される任意のプログラムである。共有ライブラリ解析部１０４は、インスツルメンテーション部１０２がロードした実行コードと、実行コードにリンクされた共有ライブラリの情報とを入力として受け付ける。共有ライブラリ解析部１０４は、前記入力と、ＡＰＩ知識格納部１０８内の情報とを基に、ＡＰＩアドレスマップ１０５と共有ライブラリアドレスリスト１０６とを出力する。
【００２３】
動的データフロー解析処理追加部１０７は、データ追跡コード埋め込み部１０７１と、ＡＰＩデータ追跡コード埋め込み部１０７２とを備える。動的データフロー解析処理追加部１０７は、インスツルメンテーション部１０２から基本ブロックを入力として受け付ける。また、動的データフロー解析処理追加部１０７は、ＡＰＩアドレスマップ１０５と、共有ライブラリアドレスリスト１０６と、ＡＰＩ知識格納部１０８内の情報とを基に、基本ブロックにデータの入出力の依存関係を検出するためのコードを生成して、基本ブロックにそのコードを埋め込む。その後、動的データフロー解析処理追加部１０７は、生成した基本ブロックをインスツルメンテーション部１０２に出力する。
【００２４】
ＡＰＩ知識格納部１０８は、ＡＰＩシグネチャに関する情報を格納する。ここで、ＡＰＩシグネチャとは、プログラムから呼び出される共有ライブラリの関数のＡＰＩに関する情報を示す。このＡＰＩシグネチャは、どのＡＰＩ関数が、引数と戻り値の間で、どのようなデータフロー（データの受け渡し）を起こしうるかを規定した情報である。ＡＰＩシグネチャは、モジュール名や関数名のようにＡＰＩ関数を識別する情報と、そのＡＰＩ関数の呼び出しがどのようなデータフロー（データの受け渡し）を引き起こすかを定義した情報とを備える。また、ＡＰＩ関数とは、ＡＰＩシグネチャに定義された関数を示す。本実施の形態では、共有ライブラリに含まれる関数がすべてＡＰＩシグネチャに定義されているものとする。つまり、本実施の形態では、共有ライブラリの全ての関数がＡＰＩ関数となる。
【００２５】
なお、動的データフロー解析装置１００は、ＣＰＵにコンピュータプログラムを実行させることにより実現するソフトウェアとして説明するが、ハードウェアとして実現してもよい。また、ＣＰＵが実行するコンピュータプログラムは、記録媒体に記録して提供することも可能であり、また、インターネットその他の通信媒体を介して伝送することにより提供することも可能である。また、記憶媒体には、例えば、フレキシブルディスク、ハードディスク、磁気ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＤＶＤ、ＲＯＭカートリッジ、バッテリバックアップ付きＲＡＭメモリカートリッジ、フラッシュメモリカートリッジ、不揮発性ＲＡＭカートリッジ等が含まれる。また、通信媒体には、電話回線等の有線通信媒体、マイクロ波回線等の無線通信媒体等が含まれる。
【００２６】
次に図３を用いて、主にインスツルメンテーション部１０２によって行われる、インスツルメンテーション処理の概要を説明する。
【００２７】
一般にコンピュータ上でプログラムが実行されている場合、ローダはそのプログラムの実行コードと、そのプログラムがリンクしている共有ライブラリの実行コードとを読み込む。そして、ローダは、プログラムの実行開始位置に制御を移し、メモリ上に読み込まれたプログラムコードそのものの実行を開始する。
【００２８】
これに対し、インスツルメンテーション部１０２は以下の処理を行う。インスツルメンテーション部１０２は、プログラムの実行コードと共有ライブラリの実行コードとが読み込まれた際に、共有ライブラリ解析部１０４を呼び出す。共有ライブラリ解析部１０４の処理は後述する。共有ライブラリ解析部１０４の処理の後、インスツルメンテーション部１０２は、実行コードをメモリ上に読み込む。インスツルメンテーション部１０２は、その実行コードの実行開始位置から、実行コードのあるまとまりである基本ブロック１０３１を取り出す。その後、インスツルメンテーション部１０２は、動的データフロー解析処理追加部１０７を呼び出し、基本ブロック１０３１に対して動的データフロー解析処理追加部１０７で定義された処理を実施させる。
【００２９】
動的データフロー解析処理追加部１０７は、基本ブロック１０３１に対して動的データフロー解析処理を埋め込み、その生成した基本ブロック１０３１をインスツルメンテーション部１０２に移す。インスツルメンテーション部１０２は、生成された基本ブロック１０３１に制御を移し、その基本ブロック１０３１の実行を行う。また、インスツルメンテーション部１０２は、生成された基本ブロック１０３１をコードキャッシュ１０２１に格納する。
【００３０】
以後のプログラム実行において、同じ基本ブロック１０３１を実行する必要が生じた場合、コードキャッシュ１０２１に格納された変換済みの基本ブロック１０３１に制御を移す。このように変換済みの基本ブロック１０３１をキャッシュすることによって、処理時間のかかるコード埋め込み処理は、原則として最初の１回しか生じないようにする。また、コードキャッシュ１０２１に格納された基本ブロック１０３１から、コードキャッシュ１０２１に格納された別の基本ブロック１０３１に直接分岐する場合は、一旦インスツルメンテーション部１０２に制御を移すことなく、呼び出し先のコードキャッシュ１０２１中の基本ブロック１０３１に直接分岐するように、呼び出し元となるコードキャッシュ１０２１中の基本ブロック１０３１を書き換えるなど、公知の様々な高速化手段を適用することによって、アプリケーションの実行速度の低下を抑えることができる。
【００３１】
インスツルメンテーション部１０２は、上述の基本ブロック変換処理を全ての基本ブロック１０３１に対して行う。
【００３２】
次に図４を用いて、ＡＰＩ知識格納部１０８に格納されたＡＰＩシグネチャについて説明する。図４記載のＡＰＩシグネチャには、共有ライブラリであるkernel32.dllというＤＬＬに実装されているGetProcAddressとMultiByteToWideCharという関数と、その関数のデータフローに関する情報とが定義されている。
【００３３】
図４におけるGetProcAddressは、ＡＰＩ関数の引数間および引数と戻り値の間でデータフローを引き起こさないため、ＡＰＩシグネチャにデータフローに関する情報は定義されていない。一方、MultiByteToWideCharは、第３引数と第５引数の間でデータフローが引き起こされるので、データフローに関する情報が定義されている。このデータフローに関する情報は、MultiByteToWideCharの第５引数がＮＵＬＬではなく、かつ、戻り値が０でない場合は、第３引数に渡されたバッファの内容（先頭から、戻り値の数値分の長さの領域）が、第５引数に渡されたバッファの内容（先頭から、戻り値に２をかけた数値分の長さの領域）にコピーされることを表す。
【００３４】
続いて、共有ライブラリ解析部１０４の処理について説明する。共有ライブラリ解析部１０４は、インスツルメンテーション部１０２がアプリケーションプログラム１０３の基本ブロックや、それにリンクしている共有ライブラリ（ＤＬＬ）をメモリ上にロードした際に呼び出される。共有ライブラリ解析部１０４は、ロードされた基本ブロックや共有ライブラリが呼び出しているＡＰＩ関数を列挙し、ＡＰＩ知識格納部１０８に定義されているＡＰＩとその開始アドレス、すなわちＡＰＩ関数の関数名とその開始アドレスとの対応表を作成する。この対応表をＡＰＩアドレスマップ１０５と呼ぶ。
【００３５】
ＡＰＩアドレスマップ１０５は、実行対象とするアプリケーションプログラム１０３から直接あるいは他のＡＰＩ関数を介して間接的に呼び出されているＡＰＩ関数のうち、ＡＰＩ知識格納部１０８で定義されているＡＰＩ関数の名前と開始アドレスの対が保存される（図５）。
【００３６】
共有ライブラリ解析部１０４は、ＡＰＩアドレスマップ１０５の生成に加え、ロードされた全ての共有ライブラリの開始アドレスと終了アドレスとの対の集合である共有ライブラリアドレスリスト１０６も生成する（図６）。
【００３７】
次に、動的データフロー解析処理追加部１０７によるデータフロー解析処理追加処理について図７を用いて説明する。図７は、動的データフロー解析処理追加手段１０７が基本ブロック１０３１に対してコード埋め込み処理を行う際の動作を示すフローチャートである。
【００３８】
動的データフロー解析処理追加部１０７は、インスツルメンテーション部１０２が読み込んだ基本ブロック１０３１の開始アドレスが共有ライブラリアドレスリスト１０６に格納されているいずれかの組の、開始アドレスと終了アドレスの間に含まれるか否かを判定する（Ｓ７０１）。含まれている場合（Ｓ７０１：Ｙｅｓ）、動的データフロー解析処理追加部１０７は、共有ライブラリ内での処理と認識し、当該基本ブロック１０３１にコード埋め込み処理を行わず、処理を終了する。
【００３９】
一方、含まれない場（Ｓ７０１：Ｎｏ）合、動的データフロー解析処理追加部１０７は、基本ブロックの最初のインストラクションを取り出す。動的データフロー解析処理追加部１０７は、取り出したインストラクションがデータ移動命令である場合（Ｓ７０２：Ｙｅｓ）、データの移動元から移動先にタグを伝播するためのコードを埋め込む（Ｓ７０３）。この処理は、非特許文献２などで公知な手法であるため、詳細は割愛する。データ移動命令とは、レジスタ同士のコピー・加減算や、メモリからレジスタへのロード、あるいは、レジスタからメモリへのストア、スタックへのプッシュ・ポップ等を指す。
【００４０】
基本ブロックから取り出したインストラクションがデータ移動命令でない場合（Ｓ７０２：Ｎｏ）、動的データフロー解析処理追加部１０７は、そのインストラクションがcall命令（関数呼び出し命令）か否かを判定する（Ｓ７０４）。call命令である場合（Ｓ７０４：Ｙｅｓ）、動的データフロー解析処理追加部１０７は、ＡＰＩデータ追跡コードの埋め込み処理を実施する（Ｓ７０５）。
【００４１】
ＡＰＩデータ追跡コード埋め込み処理（Ｓ７０５）では、call命令の呼び出し先アドレスの実行時の値が、ＡＰＩアドレスマップ（図５）に定義されている値か否かを判定する。定義されている場合、動的データフロー解析処理追加部１０７は、スレッドローカル領域に、そのＡＰＩ関数の識別子と、call命令の直前の引数の値（この値は、スタックに保存されている。) を一時保存するコードを埋め込む。また、動的データフロー解析処理追加部１０７は、ＡＰＩ関数が呼び出された場合、call命令の後に、スレッドローカル領域に保存されたデータ（call命令の直前で保存した引数の値とＡＰＩシグネチャの情報）に基づいてタグの伝播を実施するコードを埋め込む。このＡＰＩデータ追跡コード埋め込み処理（Ｓ７０５）により埋め込まれたコードの詳細を図８Ａ、図８Ｂ、図９を用いて説明する。
【００４２】
図８Ａは、共有ライブラリの関数であるMultiByteToWideCharの呼び出しの例である。この共有ライブラリの関数呼び出しは、x86アーキテクチャ上で実行される場合、図８Ｂのような実行コードとなる。図９の実行コードは、図８Ｂの実行コードに対して、動的データフロー解析処理追加部１０７がＡＰＩ追跡コードを埋め込んだ場合の例である。なお、理解の容易化のため、図９では、埋め込んだＡＰＩ追跡コードは{ } で囲んだＣ言語の形式で記述している。
【００４３】
ＡＰＩ追跡コードでは、call命令の直前でcall命令のアドレスの内容を検査し、ＡＰＩアドレスマップ（図５）に定義されているアドレスか否かを判定する。本実施の形態では、call命令のパラメータは間接アドレス[0041A2090]であるため、call命令の直前でアドレス"0041A2090"の内容を検査し、ＡＰＩアドレスマップ（図５）に定義されているアドレスか否かを判定する（Ｓ９０１）。
【００４４】
call命令のアドレスがＡＰＩアドレスマップに定義されていた場合、スレッドローカル領域に、ＡＰＩ関数が呼び出されたことを記録する（Ｓ９０２）。また、呼び出された関数に対応するＡＰＩシグネチャ（図４）に基づいて、ＡＰＩシグネチャに現れるデータフローの内容をスレッドローカル領域に保存する（Ｓ９０３）。本実施の形態では、call命令のアドレスがMultiByteToWideCharのアドレス"0x7C809BF8"と等しい場合、スレッドローカル領域にMultiByteToWideCharが呼び出されたことを記録する（Ｓ９０２）。また、スレッドローカル領域のＴＬＳという配列にMultiByteToWideCharに渡された第３引数と第５引数を保存する（Ｓ９０３）。
【００４５】
call命令（Ｓ９０４）の後、スレッドローカル領域に保存されたデータを基に、ＡＰＩ関数を呼び出したか否かを判定する（Ｓ９０５）。呼び出されていた場合、呼び出されたＡＰＩ関数のＡＰＩシグネチャに基づいて、スレッドローカル領域に保存された引数の値とＡＰＩ関数の戻り値（x86の場合はeaxレジスタに保存されている）を参照し（Ｓ９０６）、タグの伝播を行う（Ｓ９０７）。ここで、get_tag(x)は、アドレスxに対応するタグを読む関数であり、set_tag(x,t)は、アドレスxに対応するタグの値をtに変更する関数を表す。
【００４６】
本実施の形態では、スレッドローカル領域に保存されたデータがMultiByteToWideCharを呼び出したことを示す場合（Ｓ９０５）、スレッドローカル領域に保存されたＴＬＳ[１]，ＴＬＳ［２］を参照する（Ｓ９０６）。その後、参照したデータであるＴＬＳ[１]，ＴＬＳ［２］を基に、タグの伝播処理を行う（Ｓ９０７）。
【００４７】
図９に示した例では、動的データフロー解析処理追加部１０７はcall命令の前後にＡＰＩデータ追跡コードをインラインで埋め込んだが、追跡処理を関数にまとめて、当該関数を呼び出すようにしてもよい。追跡処理を関数にまとめることにより、関数呼び出しのオーバーヘッドがかかるものの、コード全体のコードサイズは小さくなる。
【００４８】
また、図９に示した実行コード例は、Ｓ９０１における判定を線形探索で示したが、これに限られるものではない。例えば、ハッシュなどの検索部を用いて判定することにより、処理の高速化が図れる。
【００４９】
動的データフロー解析処理追加部１０７は、上記の処理（Ｓ７０２〜Ｓ７０５）を基本ブロックに含まれる全てのインストラクションについて実施する（Ｓ７０６）。
【００５０】
上記の一連の処理により、呼び出されたＡＰＩ関数の内部では、逐一タグの伝播処理をすることなく、関数呼び出しの直後にＡＰＩシグネチャに則って、タグ伝播処理を行う。このように、本実施の形態においては、タグの伝播処理を逐次行わずに、一気に行う（一括してタグの伝播を行う）ことにより、ＡＰＩ関数内部では、タグの伝播処理を行わないため、動的データフロー解析の実行速度を高速化することができる。
【００５１】
本実施の形態は、対象とする共有ライブラリが比較的小さく、共有ライブラリに実装されている全ての関数に対して、ＡＰＩシグネチャを定義することができ、かつ、その共有ライブラリに実装されている関数からユーザ記載のコードへのコールバックが仕様上存在しない場合に特に有効である。
【００５２】
実施の形態２
本発明の実施の形態２は、基本ブロックに２通りのコードの埋め込みを行い、実行時に実行コードを切り替えることを特徴とする。本実施の形態にかかる動的データフロー解析装置の構成を図１０に示す。本発明の実施の形態２にかかる動的データフロー解析装置１００において、動的データフロー解析処理追加部１０７は、ＡＰＩ内部判定処理埋め込み部１０７３と、リターン処理埋め込み部１０７４と、関数コール処理埋め込み部１０７５と、データ追跡コード埋め込み部１０７６と、ＡＰＩスタック１０７７とを備える。この構成における動的データフロー解析装置１００の動作について、第１の実施の形態と異なる部分を説明する。
【００５３】
ここで、上述の実施の形態１においては、共有ライブラリ内の関数の全てがＡＰＩシグネチャに定義されているものとしたが、本実施の形態においては、共有ライブラリ内の関数の一部がＡＰＩシグネチャに定義されているものとする。つまり、本実施の形態においては、共有ライブラリ内の関数のうち、ＡＰＩシグネチャに定義されている一部の関数のみがＡＰＩ関数となる。また、ユーザコードとは、ＡＰＩ関数以外のプログラム、すなわちＡＰＩシグネチャに定義されていない関数等のプログラムを指す。
【００５４】
ＡＰＩスタック１０７７はプログラム実行時にスレッドローカル領域に作られる。ＡＰＩスタック１０７７は、呼び出された関数の履歴をスタックのデータ形式で保存する。ＡＰＩスタック１０７７は、ＡＰＩ関数の識別子か、ユーザコードを表す識別子を保持する。ＡＰＩスタック１０７７は、初期状態においてユーザコードであることを表す識別子が一つ保存されている。
【００５５】
本発明の実施の形態２では、インスツルメンテーション部１０２は、基本ブロックに２通りのコードの埋め込みを行う。プログラム実行時には、２種類のコードを適宜切り替えて実行する。実行コードの切り替えは、ＡＰＩスタック１０７７の先頭に保存されたレコードの識別子が、ユーザコードを表すものか否かを基に行う。ユーザコードを表す場合に実行される基本ブロックをフル追跡コード、ＡＰＩ関数の識別子を表す場合に実行されるコードをＡＰＩ内追跡コードと呼ぶ。
【００５６】
図１１に、本実施の形態によって、生成される基本ブロックとその処理の流れの例とを示す。図１１に記載の「ＡＰＩ内部判定処理」は、ＡＰＩスタック１０７７の先頭に保存されたレコードの識別子を調べる命令である。また、「ＡＰＩ内部判定処理」直後の条件分岐命令は、「ＡＰＩ内部判定処理」の結果がユーザコードである場合に真となる分岐を表す。
【００５７】
次に、図１２を用い、本実施の形態における基本ブロックの生成処理を説明する。本実施の形態での基本ブロックの生成では、最初にＡＰＩ内部判定処理を基本ブロックの先頭に埋め込む（Ｓ１２０１）。続いて、ＡＰＩ内追跡コードを生成する処理を実施し（Ｓ１２０２）、最後にフル追跡コードを生成する処理を行う（Ｓ１２０３）。
【００５８】
次に図１３を用いて、フル追跡コードを生成する処理を説明する。動的データフロー解析処理追加部１０７は、実施の形態１と同様に、基本ブロックからインストラクションを取り出し、命令の種類を判定する。命令種別がデータ移動命令である場合（Ｓ１３０１：Ｙｅｓ）、データ追跡コード埋め込み部１０７６は、データ追跡コード埋め込み処理（Ｓ１３０３）を実行する。命令種別がcall命令である場合（Ｓ１３０４：Ｙｅｓ）、関数コール処理埋め込み部１０７５は、関数コール処理埋め込み処理（Ｓ１３０５）を実行する。命令種別がret命令である場合（Ｓ１３０６：Ｙｅｓ）、リターン処理埋め込み部１０７４は、リターン処理埋め込み処理（Ｓ１３０７）を実行する。データ追跡コード埋め込み処理（Ｓ１３０３）は、第１の実施の形態と同様の処理である。以下に、関数コール処理埋め込み処理（Ｓ１３０５）とリターン処理埋め込み処理（Ｓ１３０７）の詳細を示す。
【００５９】
関数コール処理埋め込み処理は、実施の形態１のＡＰＩデータ追跡コード埋め込み処理（図７）と異なり、以下の処理を行う。
【００６０】
ＡＰＩスタック１０７７の先頭にユーザコードを表す識別子が保存されている場合、call命令の呼び出し先アドレスの実行時の値がＡＰＩアドレスマップ（図４）に定義されている値か否かを判定する。定義されている場合、ＡＰＩスタック１０７７にＡＰＩ関数の識別子と、call命令の次のアドレス（戻りアドレス）と、call命令の直前の引数の値（スタックに保存されている)とから成るレコードをプッシュするコードを埋め込む。
【００６１】
ＡＰＩスタック１０７７の先頭にＡＰＩ関数を表す識別子が保存されている場合、call命令の呼び出し先アドレスの実行時の値が、共有ライブラリアドレスリストに保存されているアドレス領域内に含まれるか否かを判定する。前記アドレス領域内に含まれない場合、すなわち、ユーザコードと判定される場合に、ＡＰＩスタック１０７７にユーザコードであることを表す識別子と、call命令の次のアドレス（戻りアドレス）とから成るレコードをプッシュするコードを埋め込む。
【００６２】
ＡＰＩスタック１０７７の先頭に格納された識別子の値にかかわらず、関数コール処理埋め込み部１０７５は、call命令の後にコードの埋め込みを行わない。
【００６３】
続いて、リターン処理埋め込み処理において追加されるコードについて説明を行う。最初に、ＡＰＩスタック１０７７の先頭にあるレコードを検査し、レコードに保存されているアドレス（戻りアドレス）が、アプリケーションプロセスのスタックの先頭に保存されているリターン命令の戻り先と一致している場合、ＡＰＩスタック１０７７からレコードをポップする。
【００６４】
ポップしたレコードに保存されている識別子が、ＡＰＩ関数を表す識別子である場合、レコードに保存された引数の値と、その識別子で特定されるＡＰＩシグネチャのデータフロー情報とに基づいて、タグの伝播を行う。
【００６５】
動的データフロー解析処理追加部１０７は、以上の処理（Ｓ１３０１〜Ｓ１３０７）を、基本ブロックに含まれる全てのインストラクションに対して実施する（Ｓ１３０８）。
【００６６】
次に、図１４を用いて、より詳細な関数コール埋め込み処理の説明を行う。図１４に示すコードは、図８Ｂに示される実行コードに対して、関数コール埋め込み処理を実施した後の実行コードの例である。
【００６７】
関数コール埋め込み処理では、ＡＰＩスタック１０７７の先頭にユーザコードを表す識別子が保存されている場合（Ｓ１４０１）、call命令の呼び出し先のアドレスがＡＰＩアドレスマップ１０５に含まれているか否かを判定する。含まれている場合、そのＡＰＩ関数の識別子と、call命令の次のアドレスと、call命令で表される関数呼び出しの引数（スタックに保存されている）とを、ＡＰＩスタック１０７７に保存する（Ｓ１４０２）。
【００６８】
一方、ＡＰＩスタック１０７７の先頭にＡＰＩ関数を表す識別子が保存されている場合（Ｓ１４０３）、call命令の呼び出し先が共有ライブラリのアドレス空間内か否かを判定する。含まれない場合、ユーザコードへのコールバックとみなして、ユーザコードを表す識別子と、call命令の次のアドレスとを、ＡＰＩスタック１０７７に保存する（Ｓ１４０４）。図１４の例では、"is_dll"という関数を呼び出し、"is_dll"関数内で共有ライブラリアドレスリスト１０６を参照することにより、call命令の呼び出し先が共有ライブラリのアドレス空間内に含まれるか否かを判定する。本実施の形態では、共有ライブラリアドレスリスト１０６は、ＡＰＩ関数にかかるアドレスを保持するものとする。
【００６９】
図１５を用いて、リターン処理埋め込み処理について具体的に説明する。図１５に示すコードは、呼び出し先の関数の実行コードに対して、リターン処理埋め込み処理を実施した後の実行コードの例である。
【００７０】
図１５の例では、リターン命令ret（Ｓ１５０４）の直前に、ＡＰＩスタック１０７７に保存されている戻りアドレスを参照し、それがret命令の戻り先（スタックポインタespに保存されている）と同じか否かを判定する（Ｓ１５０１）。同じと判定された場合、ＡＰＩスタック１０７７からレコードをポップする（Ｓ１５０２）。さらに、そのレコードに保存された識別子がＡＰＩ関数を表すものであった場合、そのＡＰＩ関数のＡＰＩシグネチャに定義されたデータフロー情報に基づくタグの伝播処理を実施の形態１の場合と同様に行う（Ｓ１５０３）。
【００７１】
図１６は、ＡＰＩ内追跡コードを生成する動作を表すフローチャートである。図１３のフル追跡コードを生成する動作と比較すると、データ移動命令の場合に何も実行しない点が異なる。つまり、ＡＰＩ内追跡コードでは、データ追跡コード埋め込みの処理（Ｓ１３０３）が行われない。従って、ＡＰＩ内追跡コードでは、データ移動命令時にタグの伝播処理が埋め込まれない。なお、他の処理（Ｓ１６０１〜Ｓ１６０８）は、フル追跡コード生成時と同じ動作となる。
【００７２】
上記一連の処理により、ＡＰＩ内追跡コード内では、逐一タグの伝播処理が行われない。よって、本実施の形態では、ＡＰＩシグネチャに定義された関数内でのタグ伝播処理が省略でき、動的データフロー解析の実行速度が高速化される。
【００７３】
また、本実施の形態は、ＡＰＩスタック１０７７を用いて、ＡＰＩシグネチャに定義された関数（ＡＰＩ関数）が呼び出し中かを判定している。そのため、共有ライブラリ内の関数のうち、一部のみがＡＰＩシグネチャに定義されている場合、定義されている関数の実行時には、ＡＰＩ内追跡コードが実行される。一方、定義されていない関数の実行時には、フル追跡コードが実行され、データ追跡コード埋め込み処理（Ｓ１３０３）により追加されたコードによりタグの伝播処理が行われる。従って、共有ライブラリに実装されている一部の関数に対してのみＡＰＩシグネチャが定義されている場合でも正しく動作する。また、ＡＰＩスタックにはユーザコード実行中か否かを表す識別子が含まれるため、そのＡＰＩがユーザコードへのコールバックを持つ場合でも、正しく動作する。しかし、その代償として、実施の形態１よりも処理が複雑なため、実施の形態１より実行速度が低下する。
【００７４】
なお、本実施の形態では、コールバック関数へデータの受け渡しをする共有ライブラリの関数を、ＡＰＩシグネチャに定義することはできない。もしそのような関数を定義すると、その関数内部ではタグの伝播処理が行われないため、当該関数からコールバックへのデータフローが追跡されなくなってしまう。
【００７５】
実施の形態３
本発明の実施の形態３は、図１７に示すように実施の形態２の関数コール処理埋め込み部１０７５の変わりに、保守的関数コール処理埋め込み部１０７８を有する。保守的関数コール処理埋め込み部１０７８は、保守的関数コール処理の埋め込みを行う。次に、本実施の形態にかかる第２の実施の形態と異なる部分の動的データフロー解析装置１００の動作について説明する。
【００７６】
図１８は、保守的関数コール処理埋め込み部１０７８が保守的関数コール処理を埋め込む動作を表すフローチャートである。保守的関数コール処理埋め込み処理は、図１８のＳ１８０３の処理が実施の形態２と異なる。つまり、タグの伝播元となっている引数のタグが既定値、つまり初期値（クリーン）であるか否かを判定し、その判定結果に基づいて処理を変更している点が異なる。他の処理（Ｓ１８０１、Ｓ１８０２、Ｓ１８０４〜Ｓ１８０６）は実施の形態２と同様の動作となる。
【００７７】
本実施の形態では、call先のアドレスがＡＰＩアドレスマップ１０５に存在する関数の場合であっても、その関数のＡＰＩシグネチャを参照し、タグ伝播元となっている引数のタグが既定値（クリーン）かどうかを判定する（Ｓ１８０３）。既定値と判定された場合、ＡＰＩスタックに当該ＡＰＩ関数の識別子と、戻りアドレスと、引数とをＡＰＩスタック１０７７にプッシュする（Ｓ１８０４）。
【００７８】
図１９が示す実行コードは、図８Ｂの実行コードに対して、保守的関数コール処理埋め込み部１０７８が保守的関数コール処理を埋め込んだ場合の例である。図４に示すＡＰＩシグネチャにおいて、MultiByteToWideCharという関数のタグの伝播元は、arg2(３番目の引数)のみと定義されている。そのため、arg2のアドレス (esp-2*4)に対応するタグを取得し、その値が既定値である場合（Ｓ１９０１、図１９では「０」）、ＡＰＩスタック１０７７にレコードをプッシュしている。
【００７９】
上記一連の処理により、ＡＰＩ関数に対して、追跡すべきデータ、つまり既定値以外のタグを持つデータが渡された場合、ＡＰＩスタックへのレコードのプッシュは行わない。ＡＰＩ内部判定処理では、ＡＰＩ関数内部での処理と判定されず、フル追跡コードが実行される。そのため、ＡＰＩ関数内部でもタグの伝播が逐次行わる。これにより、当該ＡＰＩ関数内でコールバックが生じ、かつそのコールバック先の関数にデータを受け渡しても、タグの伝播が実行される。ただし、本実施の形態は、前述の実施の形態２よりもＡＰＩ内追跡コードが実行される頻度が下がるため、実行速度はやや低下する。
【００８０】
実施の形態４
本発明の実施の形態４は、ＡＰＩシグネチャに、コールバックによるデータの受け渡しが生じるか否かを示すフラグを追加するものである。この構成における動的データフロー解析装置１００の動作について、第３の実施の形態と異なる部分を図２０のフローチャートを用いて説明する。
【００８１】
本実施の形態では、ＡＰＩシグネチャは、コールバックによるデータの受け渡しが生じうるか否かを示すフラグを保持する。保守的関数コール処理埋め込み処理では、このフラグを参照し（Ｓ２００７）、フラグが存在する場合、タグがクリーンでなくても、コールバックによるデータの受け渡しが生じないとみなす。この場合に、ＡＰＩスタックにＡＰＩ関数の識別子と、戻りアドレスと、引数とをプッシュする。他の処理（Ｓ２００１〜Ｓ２００６）は実施の形態３と同様の動作となる。
【００８２】
上記の一連の処理により、実施の形態３に比べて、ＡＰＩ内追跡コードの実行される頻度が多くなる。そのため、処理速度の向上が図れる。
【００８３】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【００８４】
この出願は、２００９年５月２０日に出願された日本特許出願特願２００９−１２２３４５を基礎とする優先権を主張し、その開示の全てをここに取り込む。
以下、参考形態の例を付記する。
１．  プロセス内のデータに対してタグを設定し、前記プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡方法において、
共有ライブラリに含まれる関数内のデータ受け渡しの仕様をシグネチャとして定義し、
プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略する動的データフロー追跡方法。
２．  前記関数の呼び出しの際に、一括してタグを伝播する１．の動的データフロー追跡方法。
３．  実行中のコードである実行コードが前記共有ライブラリに含まれるか否かを判定し、この判定結果に基づき前記タグの伝播の少なくとも一部を省略する１．または２．に記載の動的データフロー追跡方法。
４．  メモリ上における、前記共有ライブラリのアドレス情報と前記実行コードのアドレス情報とを比較することにより、前記実行コードが前記共有ライブラリに含まれるか否かを判定する３．に記載の動的データフロー追跡方法。
５．  前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、その戻りアドレスと引数の値とを履歴情報として保存し、タグの伝播の少なくとも一部を省略する第１の状態に移行し、
前記第１の状態で前記シグネチャに定義されていない関数のアドレスへの関数が呼び出された場合、その戻りアドレスを履歴情報として保存し、タグの伝播を省略しない第２の状態に移行し、
関数呼び出しからのリターンの際に、戻り先が最新の履歴情報に含まれる戻りアドレスと一致する場合は最新の履歴情報を取り除き、かつ前記第１の状態である場合はタグの伝播の少なくとも一部を省略する１．または２．に記載の動的データフロー追跡方法。
６．  前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合に限り、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する５．に記載の動的データフロー追跡方法。
７．  前記シグネチャに定義されている関数から前記シグネチャに定義されていない関数へのコールバックが生じ、かつ前記シグネチャに定義されている関数に渡されたデータが前記コールバックに応じて受け渡されうるか否かの情報を前記シグネチャに定義しておき、
前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合、または前記タグが既定値でなく、かつコールバックに応じてデータ受け渡しがなされない場合に、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する５．に記載の動的データフロー追跡方法。
８．  プロセス内部のデータに対してタグを設定し、プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡動作をコンピュータに実行させるためのプログラムであって、
共有ライブラリに含まれる関数内のデータ受け渡しの仕様をシグネチャとして定義し、
プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略する動的データフロー追跡プログラム。
９．  前記関数の呼び出しの際に、一括してタグを伝播する８．に記載の動的データフロー追跡プログラム。
１０．  実行中のコードである実行コードが前記共有ライブラリに含まれるか否かを判定し、この判定結果に基づき前記タグの伝播の少なくとも一部を省略する８．または９．に記載の動的データフロー追跡プログラム。
１１．  メモリ上における、前記共有ライブラリのアドレス情報と前記実行コードのアドレス情報とを比較することにより、前記実行コードが前記共有ライブラリに含まれるか否かを判定する１０．に記載の動的データフロー追跡プログラム。
１２．  前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、その戻りアドレスと引数の値とを履歴情報として保存し、タグの伝播の少なくとも一部を省略する第１の状態に移行し、
前記第１の状態で前記シグネチャに定義されていない関数のアドレスへの関数が呼び出された場合、その戻りアドレスを履歴情報として保存し、タグの伝播を省略しない第２の状態に移行し、
関数呼び出しからのリターンの際に、戻り先が最新の履歴情報に含まれる戻りアドレスと一致する場合は最新の履歴情報を取り除き、かつ前記第１の状態である場合はタグの伝播の少なくとも一部を省略する８．または９．に記載の動的データフロー追跡プログラム。
１３．  前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合に限り、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する１２．に記載の動的データフロー追跡プログラム。
１４．  前記シグネチャに定義されている関数から前記シグネチャに定義されていない関数へのコールバックが生じ、かつ前記シグネチャに定義されている関数に渡されたデータが前記コールバックに応じて受け渡されうるか否かの情報を前記シグネチャに定義しておき、
前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合、または前記タグが既定値でなく、かつコールバックに応じてデータ受け渡しがなされない場合に、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する１２．に記載の動的データフロー追跡プログラム。
１５．  プロセス内のデータに対してタグを設定し、前記プロセス内のデータの受け渡しに応じてタグを伝播させることにより、動的にデータフローを追跡する動的データフロー追跡装置において、
共有ライブラリに含まれる関数内のデータ受け渡しの仕様が定義されたシグネチャを格納する格納手段と、
プログラムからの前記シグネチャで定義された関数への呼び出しの際に、前記シグネチャを参照することにより、前記関数内でのタグの伝播の少なくとも一部を省略するタグの伝播処理を追加する動的データフロー解析処理追加手段とを備えた動的データフロー追跡装置。
１６．  前記動的データフロー解析処理追加手段は、前記関数の呼び出しの際に、一括してタグを伝播する前記タグの伝播処理を前記関数呼び出しの前後に追加する１５．の動的データフロー追跡装置。
１７．  前記動的データフロー解析処理追加手段は、実行中のコードである実行コードが前記共有ライブラリに含まれるか否かを判定し、この判定結果に基づき前記タグの伝播の少なくとも一部を省略する１５．または１６．に記載の動的データフロー追跡装置。
１８．  前記動的データフロー解析処理追加手段は、メモリ上における、前記共有ライブラリのアドレス情報と前記実行コードのアドレス情報とを比較することにより、前記実行コードが前記共有ライブラリに含まれるか否かを判定する１７．に記載の動的データフロー追跡装置。
１９．  前記動的データフロー解析処理追加手段は、
前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、その戻りアドレスと引数の値とを履歴情報として保存し、タグの伝播の少なくとも一部を省略する第１の状態に移行し、前記第１の状態で前記シグネチャに定義されていない関数のアドレスへの関数が呼び出された場合、その戻りアドレスを履歴情報として保存し、タグの伝播を省略しない第２の状態に移行する処理を呼び出し元のプログラムに追加し、
関数呼び出しからのリターンの際に、戻り先が最新の履歴情報に含まれる戻りアドレスと一致する場合は最新の履歴情報を取り除き、かつ前記第１の状態である場合は前記シグネチャを参照してタグの伝播の少なくとも一部を省略する処理を呼び出し先のプログラムに追加する１５．または１６．に記載の動的データフロー追跡装置。
２０．  前記動的データフロー解析処理追加手段は、前記シグネチャに定義されていない関数から前記シグネチャに定義されている関数が呼び出された際に、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合に限り、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する処理を前記呼び出し元のプログラムに追加する１９．の動的データフロー追跡装置。
２１．  前記シグネチャ情報は、前記シグネチャに定義されている関数から前記シグネチャに定義されていない関数へのコールバックが生じ、かつ前記シグネチャに定義されている関数に渡されたデータが前記コールバックに応じて受け渡されうるか否かの情報を含み、
前記動的データフロー解析処理追加手段は、前記シグネチャに示される、タグの伝播元となっているデータのタグが既定値である場合、または前記タグが既定値でなく、かつコールバックに応じてデータ受け渡しがなされない場合に、その戻りアドレスと引数の値とを履歴情報として保存し、前記第１の状態に移行する処理を前記呼び出し元のプログラムに追加する１９．の動的データフロー追跡装置。
【図１】
0005459313.tif 000002
【図２】
0005459313.tif 000003
【図３】
0005459313.tif 000004
【図４】
0005459313.tif 000005
【図５】
0005459313.tif 000006
【図６】
0005459313.tif 000007
【図７】
0005459313.tif 000008
【図８Ａ】
0005459313.tif 000009
【図８Ｂ】
0005459313.tif 000010
【図９】
0005459313.tif 000011
【図１０】
0005459313.tif 000012
【図１１】
0005459313.tif 000013
【図１２】
0005459313.tif 000014
【図１３】
0005459313.tif 000015
【図１４】
0005459313.tif 000016
【図１５】
0005459313.tif 000017
【図１６】
0005459313.tif 000018
【図１７】
0005459313.tif 000019
【図１８】
0005459313.tif 000020
【図１９】
0005459313.tif 000021
【図２０】
0005459313.tif 000022