(57)【特許請求の範囲】
【請求項１】
保護対象の第１のプログラムが改ざんされたことを検知する機能を、前記第１のプログラムに付与する付与装置であって、
前記第１のプログラムのバイトコードを構成する命令列のブロックから、ランダムにブロックを抽出し、前記第１のプログラムが実行される際に、当該ランダムに抽出したブロックより前に必ず実行されるブロックを抽出する抽出部と、
前記第１のプログラムの改ざんを検知する第２のプログラムのバイトコードを構成する命令列を、ランダムに複数のブロックに分割する分割部と、
前記分割部によって分割された複数のブロックを、前記抽出部によって抽出されたブロック内のそれぞれ異なる位置に、前記第２のプログラムにおける実行順序を維持して挿入する挿入部と、
を有することを特徴とする付与装置。
【請求項２】
前記抽出部は、前記第１のプログラムに含まれる関数ごとの制御フローグラフのそれぞれから、ランダムに起点となるノードを抽出し、関数の実行開始から当該起点となるノードに至る経路上のノードである支配ノードを抽出し、
前記挿入部は、前記制御フローグラフごとに、前記分割部によって分割された複数のブロックを、前記起点となるノード及び前記支配ノードに対応するバイトコードのブロック内のそれぞれ異なる位置に挿入することを特徴とする請求項１に記載の付与装置。
【請求項３】
前記分割部は、前記第２のプログラムのバイトコードを構成する命令列のうち、あらかじめ設定された所定の条件を満たす連続する複数の命令列が同じブロックに含まれるように、分割を行うことを特徴とする請求項１又は２に記載の付与装置。
【請求項４】
前記挿入部は、前記分割部によって分割された複数のブロックを挿入する際に、例外処理の追加、又は変数保存領域の確保の少なくともいずれかを行うことを特徴とする請求項１から３のいずれか１項に記載の付与装置。
【請求項５】
保護対象の第１のプログラムが改ざんされたことを検知する機能を、前記第１のプログラムに付与する付与装置で実行される付与方法であって、
前記第１のプログラムのバイトコードを構成する命令列のブロックから、ランダムにブロックを抽出し、前記第１のプログラムが実行される際に、当該ランダムに抽出したブロックより前に必ず実行されるブロックを抽出する抽出工程と、
前記第１のプログラムの改ざんを検知する第２のプログラムのバイトコードを構成する命令列を、ランダムに複数のブロックに分割する分割工程と、
前記分割工程によって分割された複数のブロックを、前記抽出工程によって抽出されたブロック内のそれぞれ異なる位置に、前記第２のプログラムにおける実行順序を維持して挿入する挿入工程と、
を含んだことを特徴とする付与方法。
【請求項６】
コンピュータを、請求項１から４のいずれか１項に記載の付与装置として機能させるための付与プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、付与装置、付与方法及び付与プログラムに関する。
【背景技術】
【０００２】
従来、アプリケーションに、攻撃者による当該アプリケーションの改ざんを検知する自己改ざん検知機能を付与する技術が知られている。例えば、アプリケーションのバイトコードをクラス単位で暗号化しておき、実行時には復号ルーチンが必要に応じてバイトコードの復号、及び完全性検証を行う手法が知られている（例えば、非特許文献１を参照）。また、例えば、アプリケーションのソースコードに対して完全性検証を行う実行コードを多数自動挿入し、アプリケーション実行時にはそれらのコードが確率的に反応することで、攻撃者が全ての自己改ざん検知コードを無効化することを困難にする手法が知られている（例えば、非特許文献２を参照）。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】Mykola  Protsenko,  Sebastien  Kreuter  and  Tilo  Muller,  “Dynamic  Self-Protection  and  Tamperproofing  for  Android  Apps  using  Native  Code,”  in  Proceedings  of  the  International  Conference  on  Availability,  Reliability  and  Security  (ARES),  pp.  129-138,  2015.
【非特許文献２】Lannan  Luo,  Yu  Fu,  Dinghao  Wu,  Sencun  Zhu,  and  Peng  Liu  “Repackage-proofing  Android  Apps,”  in  Proceedings  of  the  International  Conference  on  Dependable  Systems  and  Networks  (DSN),  pp.  403-414,  2016.
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来の自己改ざん検知機能を付与する技術には、プログラムにおける自己改ざん検知機能の実装箇所が、攻撃者によって容易に発見されてしまう場合があるという問題があった。【０００５】
例えば、非特許文献１に記載の手法では、完全性検証処理を実装している箇所が固定位置であるため、当該箇所が容易に発見される場合があった。また、例えば、非特許文献２に記載の手法では、自己改ざん検知コードはソースコードの行単位で挿入される。このため、ソースコードがバイトコードにコンパイルされた際に、自己改ざん検知コードが挿入された複数の箇所に同じ命令列のブロックが現れることになり、シグネチャを用いたマッチングにより当該ブロックが容易に発見されてしまう場合があった。
【課題を解決するための手段】
【０００６】
本発明の付与装置は、保護対象の第１のプログラムが改ざんされたことを検知する機能を、前記第１のプログラムに付与する付与装置であって、前記第１のプログラムのバイトコードを構成する命令列のブロックから、ランダムにブロックを抽出し、前記第１のプログラムが実行される際に、当該ランダムに抽出したブロックより前に必ず実行されるブロックを抽出する抽出部と、前記第１のプログラムの改ざんを検知する第２のプログラムのバイトコードを構成する命令列を、ランダムに複数のブロックに分割する分割部と、前記分割部によって分割された複数のブロックを、前記抽出部によって抽出されたブロック内のそれぞれ異なる位置に、前記第２のプログラムにおける実行順序を維持して挿入する挿入部と、を有することを特徴とする。【０００７】
本発明の付与方法は、保護対象の第１のプログラムが改ざんされたことを検知する機能を、前記第１のプログラムに付与する付与装置で実行される付与方法であって、前記第１のプログラムのバイトコードを構成する命令列のブロックから、ランダムにブロックを抽出し、前記第１のプログラムが実行される際に、当該ランダムに抽出したブロックより前に必ず実行されるブロックを抽出する抽出工程と、前記第１のプログラムの改ざんを検知する第２のプログラムのバイトコードを構成する命令列を、ランダムに複数のブロックに分割する分割工程と、前記分割工程によって分割された複数のブロックを、前記抽出工程によって抽出されたブロック内のそれぞれ異なる位置に、前記第２のプログラムにおける実行順序を維持して挿入する挿入工程と、を含んだことを特徴とする。
【発明の効果】
【０００８】
本発明によれば、プログラムにおける自己改ざん検知機能の実装箇所が、攻撃者によって容易に発見されないようにすることができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、第１の実施形態に係る付与装置の構成の一例を示す図である。
【図２】図２は、第１の実施形態に係る自己改ざん検知コードの一例を示す図である。
【図３】図３は、第１の実施形態に係る制御フローグラフの一例を示す図である。
【図４】図４は、第１の実施形態に係る自己改ざん検知コードの分割について説明するための図である。
【図５】図５は、第１の実施形態に係る自己改ざん検知コードの挿入について説明するための図である。
【図６】図６は、第１の実施形態に係る付与装置の全体の処理の流れを示すフローチャートである。
【図７】図７は、第１の実施形態に係る付与装置の抽出処理の流れを示すフローチャートである。
【図８】図８は、第１の実施形態に係る付与装置の分割処理の流れを示すフローチャートである。
【図９】図９は、第１の実施形態に係る付与装置の挿入処理の流れを示すフローチャートである。
【図１０】図１０は、プログラムが実行されることにより付与装置が実現されるコンピュータの一例を示す図である。
【発明を実施するための形態】
【００１０】
以下に、本願に係る付与装置、付与方法及び付与プログラムの実施形態を図面に基づいて詳細に説明する。なお、本発明は、以下に説明する実施形態により限定されるものではない。
【００１１】
［本発明の背景］
まず、実施形態の詳細な説明を行う前に、本発明の背景について説明する。本発明の保護対象のプログラムであって、改ざんの標的となるプログラムとして、例えば、Ａｎｄｒｏｉｄ（登録商標）が搭載された携帯電話端末上で実行されるアプリケーションがある。Ａｎｄｒｏｉｄでは、ＯＳ（Operating  System）がオープンソースであり仕様が明確である点や、多くの解析ツールが公開されている点等から、リバースエンジニアリングを用いたアプリケーションの改ざんが容易である。
【００１２】
攻撃者は、アプリケーション配布サイト（以下、マーケットと呼ぶ。）から取得した正規のアプリケーションに改ざんを行うことで、マルウェアや海賊版アプリケーションを作成する。例えば、攻撃者はマーケットから取得した人気のアプリケーションに対して、遠隔操作を行う機能を持った悪性コードを挿入することで、見かけ上は、元の正規アプリケーションのように動作するが、その裏で攻撃者からの指示を受け悪性な活動を行うようなマルウェアを作成することが可能である。
【００１３】
このようなアプリケーションの改ざんへの対策として、アプリケーションにあらかじめ自己改ざん検知機能を付与しておく対策が有効である。自己改ざん検知とはプログラム実行中に当該プログラムが自身の完全性を検証することで、第三者による改ざんを検知する技術である。改ざんが検知された際には、プログラムの動作を停止したり、プログラムを利用するユーザに対して警告を表示したりすることで、改ざんされたプログラムがユーザの環境上で動作することを防止する。
【００１４】
一方で、このような対策は、アプリケーションの開発者が自発的に行う必要があり、自己改ざん検知機能をアプリケーションに実装する際にはアプリケーション改ざんに関する知識や、実装能力が要求される。そのため、個々の開発者のセキュリティに対する意識や実装スキルに依存して、そもそも対策が付与されていない場合や、対策の強度が弱く攻撃者によって自己改ざん検知機能自体が容易に無効化可能である場合がある。
【００１５】
このような背景を踏まえ、アプリケーションに対して堅牢な自己改ざん検知機能を全自動で付与する技術が研究されている。しかしながら、前述の通り、従来技術には、プログラムにおける自己改ざん検知機能の実装箇所が攻撃者によって容易に発見されやすい場合があるという問題があった。そこで、本発明は、このような問題を解決することを目的としている。
【００１６】
具体的に、本発明では、自己改ざん検知機能の実装箇所を発見されにくくするため、ソースコードの行単位よりもさらに細かい粒度であるバイトコードの命令単位で自己改ざん検知コードを挿入する。
【００１７】
また、本発明では、自己改ざん検知コードの挿入を自動化することによって、個々の開発者のセキュリティに対する意識や実装スキルによらない自己改ざん検知機能の付与を可能としている。
【００１８】
［第１の実施形態の構成］
まず、図１を用いて、本発明の第１の実施形態に係る付与装置の構成について説明する。図１は、第１の実施形態に係る付与装置の構成の一例を示す図である。図１に示すように、付与装置１０は、入力部１１、出力部１２、記憶部１３及び制御部１４を有する。
【００１９】
なお、第１の実施形態においては、自己改ざん検知機能が付与されるプログラムが、Ａｎｄｒｏｉｄのアプリケーションである場合の例について説明するが、本発明の保護対象のプログラムは、Ａｎｄｒｏｉｄのアプリケーションに限られず、バイトコードであるか、又はバイトコードに変換可能な任意のプログラムとすることができる。
【００２０】
入力部１１は、ユーザからのデータの入力を受け付ける。入力部１１は、例えば、マウスやキーボード等の入力装置である。出力部１２は、画面の表示等により、データを出力する。出力部１２は、例えば、ディスプレイ等の表示装置である。また、入力部１１及び出力部１２は、データの入出力のためのインタフェースであってもよい。
【００２１】
また、入力部１１は、保護対象のアプリケーション２１の入力を受け付ける。このとき、保護対象のアプリケーション２１は、バイトコードである。なお、入力部１１は、アプリケーションのソースコードの入力を受け付けてもよい。この場合、付与装置１０は、ソースコードをバイトコードに変換する機能部をさらに有する。なお、保護対象のアプリケーション２１は、第１のプログラムの一例である。
【００２２】
また、出力部１２は、保護済みのアプリケーション２２を出力する。保護済みのアプリケーション２２は、保護対象のアプリケーション２１に、自己改ざん検知機能が付与されたアプリケーションである。
【００２３】
記憶部１３は、ＨＤＤ（Hard  Disk  Drive）、ＳＳＤ（Solid  State  Drive）、光ディスク等の記憶装置である。なお、記憶部１３は、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ、ＮＶＳＲＡＭ（Non  Volatile  Static  Random  Access  Memory）等のデータを書き換え可能な半導体メモリであってもよい。記憶部１３は、付与装置１０で実行されるＯＳや各種プログラムを記憶する。さらに、記憶部１３は、プログラムの実行で用いられる各種情報を記憶する。また、記憶部１３は、自己改ざん検知コード１３１を記憶する。
【００２４】
自己改ざん検知コード１３１は、あらかじめ自己改ざん検知を行う機能が実装されたプログラムのテンプレートである。記憶部１３は、複数種類の自己改ざん検知コード１３１を記憶していてもよい。
【００２５】
また、自己改ざん検知コード１３１に実装された自己改ざん検知を行う機能は、アプリケーションの完全性を検証できるものであればよい。例えば、自己改ざん検知を行う機能は、アプリケーションに付与された自己署名の値をハードコードされた値と比較することによって改ざんを検知するものであってもよいし、実行コードのハッシュ値を取得し、あらかじめ計算しておいたハッシュ値との比較によって改ざんを検知するものであってもよい。
【００２６】
ここで、図２を用いて、自己改ざん検知コード１３１について説明する。図２は、第１の実施形態に係る自己改ざん検知コードの一例を示す図である。図２に示すように、自己改ざん検知コード１３１は、複数の行によって構成されたバイトコードである。なお、自己改ざん検知コード１３１は、第２のプログラムの一例である。
【００２７】
制御部１４は、付与装置１０全体を制御する。制御部１４は、例えば、ＣＰＵ（Central  Processing  Unit）、ＭＰＵ（Micro  Processing  Unit）等の電子回路や、ＡＳＩＣ（Application  Specific  Integrated  Circuit）、ＦＰＧＡ（Field  Programmable  Gate  Array）等の集積回路である。また、制御部１４は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、内部メモリを用いて各処理を実行する。また、制御部１４は、各種のプログラムが動作することにより各種の処理部として機能する。例えば、制御部１４は、抽出部１４１、分割部１４２及び挿入部１４３を有する。
【００２８】
抽出部１４１は、保護対象のアプリケーション２１のバイトコードを構成する命令列のブロックから、ランダムにブロックを抽出し、保護対象のアプリケーション２１が実行される際に、当該ランダムに抽出したブロックより前に必ず実行されるブロックを抽出する。
【００２９】
具体的に、まず、抽出部１４１は、保護対象のアプリケーション２１のバイトコードに含まれる関数ごとに制御フローグラフを構築する。制御フローグラフは、例えば、保護対象のアプリケーション２１のバイトコードを入力として既存のバイトコード解析フレームワークを利用することで構築することができる。
【００３０】
抽出部１４１は、保護対象のアプリケーション２１に含まれる関数ごとの制御フローグラフのそれぞれから、ランダムに起点となるノードを抽出し、関数の実行開始から起点ノードまで状態が遷移する際に必ず通過するノード、すなわち、関数の実行開始から当該起点となるノードに至る経路上のノードである支配ノードを抽出する。このとき抽出された起点となるノード及び支配ノードに対応したバイトコードの命令列のブロックが、自己改ざん検知コードの挿入候補地点である。
【００３１】
ここで、図３を用いて、制御フローグラフについて説明する。図３は、第１の実施形態に係る制御フローグラフの一例を示す図である。制御フローグラフ２００は、保護対象のアプリケーション２１に含まれる所定の関数に対応した制御フローグラフである。図３に示すように、制御フローグラフ２００は、ノード２０１〜２０７を有する。このとき、抽出部１４１は、起点ノードとして、ノード２０６を抽出する。なお、抽出部１４１は、起点ノードとして抽出するノードをランダムに決定する。
【００３２】
次に、抽出部１４１は、関数の実行開始から起点ノードまで状態が遷移する際に必ず通過するノードであるノード２０１及び２０３を支配ノードとして抽出する。ここで、保護対象のアプリケーション２１が実行される際、ノード２０６に状態が遷移する場合であれば、ノード２０１、２０３及び２０６については、ノード２０１、２０３、２０６の順で実行されることが保証されている。この場合、自己改ざん検知コードの挿入候補地点は、ノード２０１、２０３及び２０６に対応したバイトコードの命令列のブロックに含まれる。また、抽出部１４１は、保護対象のアプリケーション２１に含まれる全ての関数について、起点ノード及び支配ノードの抽出を行う。
【００３３】
分割部１４２は、保護対象のアプリケーション２１の改ざんを検知する自己改ざん検知コード１３１のバイトコードを構成する命令列を、ランダムに複数のブロックに分割する。このとき、分割部１４２は、バイトコードである自己改ざん検知コード１３１上の１命令を最小単位として分割を行うことができる。
【００３４】
また、分割部１４２は、抽出部１４１によって起点ノード及び支配ノードの抽出が行われた関数ごとに、自己改ざん検知コード１３１の分割を行う。また、分割部１４２は、分割後のブロック数や、各ブロックに含めるバイトコードの命令数を、分割対象の関数ごとにランダムに決定する。
【００３５】
ここで、図４を用いて、自己改ざん検知コード１３１の分割について説明する。図４は、第１の実施形態に係る自己改ざん検知コードの分割について説明するための図である。
なお、図４は、図２に示す自己改ざん検知コード１３１の分割の例を表している。自己改ざん検知コード１３１は、１行目〜１７行目のそれぞれが１つの命令列である。なお、自己改ざん検知コード１３１は、説明のため、実際の自己改ざん検知コードの一部を省略したものである。図４の例では、分割部１４２は、自己改ざん検知コード１３１をブロック１３２〜１３８の７個のブロックに分割する。
【００３６】
このとき、分割部１４２は、自己改ざん検知コード１３１のバイトコードを構成する命令列のうち、あらかじめ設定された所定の条件を満たす連続する複数の命令列が同じブロックに含まれるように、分割を行ってもよい。例えば、分割部１４２は、連続して実行される必要がある命令列や条件分岐に依存して実行される命令列が同じブロックに含まれるように分割する。これにより、分割部１４２による分割に起因して、自己改ざん検知コード１３１によって実行される処理の挙動が想定されていたものと異なってしまうことを防止する。
【００３７】
例えば、「invoke-virtual」で始まる命令列の次に「move-result」で始まる命令列があることを、前述の所定の条件として設定することができる。この場合、図４の例において、分割部１４２は、例えば１行目と２行目の命令列がいずれもブロック１３２に含まれるように分割を行う。なお、図４の１行目と２行目の命令列は、連続的に実行される必要がある命令列の一例である。
【００３８】
また、例えば「if-」と「return-void」の間に含まれることを前述の所定の条件として設定することができる。この場合、図４の例において、分割部１４２は、例えば１５行目から１７行目までの命令列がいずれもブロック１３８に含まれるように分割を行う。なお、図４の１行目と２行目の命令列は、条件分岐に依存して実行される命令列の一例である。
【００３９】
挿入部１４３は、分割部１４２によって分割された複数のブロックを、抽出部１４１によって抽出されたブロック内のそれぞれ異なる位置に、自己改ざん検知コード１３１における実行順序を維持して挿入する。具体的には、挿入部１４３は、制御フローグラフごとに、分割部１４２によって分割された複数のブロックを、起点となるノード及び支配ノードに対応するバイトコードのブロック内のそれぞれ異なる位置、すなわち自己改ざん検知コード１３１の挿入候補地点に挿入する。
【００４０】
挿入部１４３は、分割部１４２によって分割された複数のブロックの挿入位置を、挿入候補地点の中からランダムに決定することができる。ただし、挿入部１４３は、挿入するブロックの実行順序が、自己改ざん検知コード１３１における実行順序と同一となるように挿入する。
【００４１】
ここで、図５を用いて、自己改ざん検知コード１３１の挿入について説明する。図５は、第１の実施形態に係る自己改ざん検知コードの挿入について説明するための図である。図５の例では、まず、挿入部１４３は、例えば、ノード２０１の２箇所を挿入位置として決定する。そして、挿入部１４３は、自己改ざん検知コード１３１における実行順序に従って、２箇所のうち先に実行される箇所にブロック１３２を挿入し、後に実行される箇所にブロック１３３を挿入する。同様に、挿入部１４３は、ブロック１３４〜１３６をノード２０３の３箇所に挿入し、ブロック１３７及び１３８をノード２０６の２箇所に挿入する。
【００４２】
挿入部１４３は、分割部１４２によって分割された複数のブロックを挿入する際に、例外処理の追加、又は変数保存領域の確保の少なくともいずれかを行う。例えば、挿入部１４３は、分割後のブロックに例外を発生させるコードが含まれていた場合、ブロックを挿入するとともに、例外処理を行うコードをさらに挿入する。また、分割後のブロックで一時的な変数が利用されている場合、挿入部１４３は、元々のバイトコード内で未使用の変数保存領域を利用するか、新たに追加した変数保存領域を利用するように当該ブロックを変更する。
【００４３】
なお、記憶部１３には、複数種類の自己改ざん検知コード１３１を用意しておいてもよい。この場合、挿入部１４３は、関数ごとに異なる自己改ざん検知コード１３１を挿入することができる。
【００４４】
［第１の実施形態の処理］
図６〜９を用いて、付与装置１０の処理について説明する。まず、図６を用いて、付与装置１０の全体の処理の流れを説明する。図６は、第１の実施形態に係る付与装置の全体の処理の流れを示すフローチャートである。
【００４５】
図６に示すように、まず、抽出部１４１は、自己改ざん検知コード１３１の挿入候補地点を抽出する（ステップＳ１０）。ここで、挿入部１４３は、保護対象のアプリケーション２１のバイトコードから、自己改ざん検知コード１３１の挿入候補地点が存在し、かつ、自己改ざん検知コード１３１が未挿入である関数を選択する（ステップＳ２０）。次に、分割部１４２は、自己改ざん検知コード１３１の分割を行う（ステップＳ３０）。そして、挿入部１４３は、選択した関数に、分割部１４２によって分割された自己改ざん検知コード１３１を挿入する（ステップＳ４０）。
【００４６】
対象となる関数に、自己改ざん検知コード１３１の挿入が行われていないものが残っている場合（ステップＳ５０、Ｎｏ）、付与装置１０はステップＳ２０〜Ｓ４０の処理をさらに実行する。一方、全ての対象となる関数に、自己改ざん検知コード１３１の挿入が行われた場合（ステップＳ５０、Ｙｅｓ）、付与装置１０は処理を終了する。その後、付与装置１０は、保護済みのアプリケーション２２のバイトコードを出力することができる。
【００４７】
次に、図７を用いて、抽出部１４１による自己改ざん検知コード１３１の挿入候補地点を抽出する処理（ステップＳ１０）について詳細に説明する。図７は、第１の実施形態に係る付与装置の抽出処理の流れを示すフローチャートである。
【００４８】
図７に示すように、抽出部１４１は、まず、保護対象のアプリケーション２１のバイトコード内の全ての関数を取得する（ステップＳ１０１）。次に、抽出部１４１は、自己改ざん検知コード１３１の挿入候補地点が未抽出である関数を選択する（ステップＳ１０２）。次に、抽出部１４１は、選択した関数の制御フローグラフを構築する（ステップＳ１０３）。
【００４９】
ここで、抽出部１４１は、構築した制御フローグラフ中の全ノードから、起点ノードをランダムに選択する（ステップＳ１０４）。そして、抽出部１４１は、起点ノード及び起点ノードの支配ノードを自己改ざん検知コード１３１の挿入候補地点として抽出する（ステップＳ１０５）。
【００５０】
ここで、自己改ざん検知コード１３１の挿入候補地点の抽出が行われていない関数が残っている場合（ステップＳ１０６、Ｎｏ）、抽出部１４１はステップＳ１０２〜Ｓ１０５の処理をさらに実行する。一方、全関数から自己改ざん検知コード１３１の挿入候補地点の抽出が行われている場合、抽出部１４１は処理を終了する（ステップＳ１０６、Ｙｅｓ）。
【００５１】
次に、図８を用いて、分割部１４２による自己改ざん検知コード１３１の分割処理（ステップＳ３０）について詳細に説明する。図８は、第１の実施形態に係る付与装置の分割処理の流れを示すフローチャートである。
【００５２】
図８に示すように、分割部１４２は、まず、テンプレートとして記憶されている自己改ざん検知コード１３１を取得する（ステップＳ３０１）。次に、分割部１４２は、取得した自己改ざん検知コード１３１を複数のブロックにランダムに分割する（ステップＳ３０２）。
【００５３】
次に、図９を用いて、分割部１４２による自己改ざん検知コード１３１の挿入処理（ステップＳ４０）について詳細に説明する。図９は、第１の実施形態に係る付与装置の挿入処理の流れを示すフローチャートである。
【００５４】
図９に示すように、挿入部１４３は、まず抽出部１４１によって抽出された、自己改ざん検知コード１３１の挿入候補地点を取得する（ステップＳ４０１）。次に、挿入部１４３は、分割部１４２による分割が行われた自己改ざん検知コード１３１を取得する（ステップＳ４０２）。そして、挿入部１４３は、自己改ざん検知コード１３１の挿入候補地点に、分割後の自己改ざん検知コード１３１を挿入する（ステップＳ４０３）。
【００５５】
［第１の実施形態の効果］
抽出部１４１は、第１のプログラムのバイトコードを構成する命令列のブロックから、ランダムにブロックを抽出し、第１のプログラムが実行される際に、当該ランダムに抽出したブロックより前に必ず実行されるブロックを抽出する。また、分割部１４２は、第１のプログラムの改ざんを検知する第２のプログラムのバイトコードを構成する命令列を、ランダムに複数のブロックに分割する。また、挿入部１４３は、分割部１４２によって分割された複数のブロックを、抽出部１４１によって抽出されたブロック内のそれぞれ異なる位置に、第２のプログラムにおける実行順序を維持して挿入する。
【００５６】
抽出部１４１によって抽出されたブロックは、第１のプログラム、すなわち保護対象のプログラムが実行される際に必ず順序通りに実行されるようになっているため、第２のプログラム、すなわち自己改ざん検知コードを挿入した場合に、各ブロックを漏れなく順序通りに実行させることができる。
【００５７】
また、保護対象のプログラムに含まれる関数ごとに、自己改ざん検知コードをランダムに分割したうえで挿入しているため、保護済みプログラムから、自己改ざん検知コード全体を機械的に発見することは困難である。このため、第１の実施形態によれば、プログラムにおける自己改ざん検知機能の実装箇所が、攻撃者によって容易に発見されないようにすることが可能になる。
【００５８】
また、抽出部１４１は、第１のプログラムに含まれる関数ごとの制御フローグラフのそれぞれから、ランダムに起点となるノードを抽出し、関数の実行開始から当該起点となるノードに至る経路上のノードである支配ノードを抽出することができる。このとき、挿入部１４３は、制御フローグラフごとに、分割部１４２によって分割された複数のブロックを、起点となるノード及び支配ノードに対応するバイトコードのブロック内のそれぞれ異なる位置に挿入する。制御フローグラフは、既存のバイトコード解析フレームワークを利用することで構築することができるため、第１の実施形態によれば、自己改ざん検知コードの挿入を自動化し、開発者の知識や実装能力によらない自己改ざん検知機能の付与を可能にすることができる。
【００５９】
また、分割部１４２は、第２のプログラムのバイトコードを構成する命令列のうち、あらかじめ設定された所定の条件を満たす連続する複数の命令列が同じブロックに含まれるように、分割を行ってもよい。これにより、自己改ざん検知コードを分割することによって、保護済みのプログラムで実行される自己改ざん検知処理の挙動が、想定されていたものと異なってしまうことを防止することができる。
【００６０】
挿入部１４３は、分割部１４２によって分割された複数のブロックを挿入する際に、例外処理の追加、又は変数保存領域の確保の少なくともいずれかを行う。これにより、挿入部１４３によるブロックの挿入により、保護済みのアプリケーション２２の実行に不整合が生じることを防止することができる。
【００６１】
［システム構成等］
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示のように構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。さらに、各装置にて行われる各処理機能は、その全部又は任意の一部が、ＣＰＵ及び当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００６２】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的に行うこともでき、あるいは、手動的に行われるものとして説明した処理の全部又は一部を公知の方法で自動的に行うこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００６３】
［プログラム］
一実施形態として、付与装置１０は、パッケージソフトウェアやオンラインソフトウェアとして上記の自己改ざん検知機能の付与を実行する付与プログラムを所望のコンピュータにインストールさせることによって実装できる。例えば、上記の付与プログラムを情報処理装置に実行させることにより、情報処理装置を付与装置１０として機能させることができる。ここで言う情報処理装置には、デスクトップ型又はノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やＰＨＳ（Personal  Handyphone  System）等の移動体通信端末、さらには、ＰＤＡ（Personal  Digital  Assistant）等のスレート端末等がその範疇に含まれる。
【００６４】
また、付与装置１０は、ユーザが使用する端末装置をクライアントとし、当該クライアントに上記の自己改ざん検知機能の付与に関するサービスを提供する付与サーバ装置として実装することもできる。例えば、付与サーバ装置は、保護対象のプログラムのバイトコードを入力とし、保護済みのプログラムを出力とする付与サービスを提供するサーバ装置として実装される。この場合、付与サーバ装置は、Ｗｅｂサーバとして実装することとしてもよいし、アウトソーシングによって上記の自己改ざん検知機能の付与に関するサービスを提供するクラウドとして実装することとしてもかまわない。
【００６５】
図１０は、プログラムが実行されることにより付与装置が実現されるコンピュータの一例を示す図である。コンピュータ１０００は、例えば、メモリ１０１０、ＣＰＵ１０２０を有する。また、コンピュータ１０００は、ハードディスクドライブインタフェース１０３０、ディスクドライブインタフェース１０４０、シリアルポートインタフェース１０５０、ビデオアダプタ１０６０、ネットワークインタフェース１０７０を有する。これらの各部は、バス１０８０によって接続される。
【００６６】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、例えばディスプレイ１１３０に接続される。
【００６７】
ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、付与装置１０の各処理を規定するプログラムは、コンピュータにより実行可能なコードが記述されたプログラムモジュール１０９３として実装される。プログラムモジュール１０９３は、例えばハードディスクドライブ１０９０に記憶される。例えば、付与装置１０における機能構成と同様の処理を実行するためのプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。なお、ハードディスクドライブ１０９０は、ＳＳＤにより代替されてもよい。
【００６８】
また、上述した実施形態の処理で用いられる設定データは、プログラムデータ１０９４として、例えばメモリ１０１０やハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して実行する。
【００６９】
なお、プログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、プログラムモジュール１０９３及びプログラムデータ１０９４は、ネットワーク（ＬＡＮ（Local  Area  Network）、ＷＡＮ（Wide  Area  Network）等）を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール１０９３及びプログラムデータ１０９４は、他のコンピュータから、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【００７０】
１０  付与装置
１１  入力部
１２  出力部
１３  記憶部
１４  制御部
２１  保護対象のアプリケーション
２２  保護済みのアプリケーション
１３１  自己改ざん検知コード
１３２、１３３、１３４、１３５、１３６、１３７、１３８  ブロック
１４１  抽出部
１４２  分割部
１４３  挿入部
２００  制御フローグラフ
２０１、２０２、２０３、２０４、２０５、２０６、２０７  ノード
【図１】
0006554249.tif 000002
【図２】
0006554249.tif 000003
【図３】
0006554249.tif 000004
【図４】
0006554249.tif 000005
【図５】
0006554249.tif 000006
【図６】
0006554249.tif 000007
【図７】
0006554249.tif 000008
【図８】
0006554249.tif 000009
【図９】
0006554249.tif 000010
【図１０】
0006554249.tif 000011