以下に添付図面を参照して、本発明にかかる第1の実施形態を説明する。
(第1の実施形態)
(1)構成
まず、本実施形態にかかるセキュリティプロトコルに従ったプログラムが実行される、ターゲットシステム101について説明する。図1は、ターゲットシステム101の構成を示す図である。ターゲットシステム101は、ネットワーク102を介して外部装置103と接続されている。ターゲットシステム101は、プログラム実行装置201と、OS(Operating System)301とを備えている。
プログラム実行装置201は、命令実行部212と記憶部211を有する。
記憶部211は、データ記憶用メモリ領域を有する。データ記憶用メモリ領域は、非保護メモリ領域214と、保護メモリ領域215とを有している。非保護メモリ領域214は、アクセスに対して何等制限を設けていない非セキュアな記憶領域である。一方、保護メモリ領域215は、特定のプログラムやプロセス等からのアクセスに対してアクセス制限を設けたセキュアな記憶領域である。なお、非保護メモリ領域214と保護メモリ領域215とは、同一の記憶媒体に形成されている態様としてもよいし、個別の記憶媒体で形成される態様としてもよい。また、このような特定のプログラムやプロセスに対する排他的なアクセス制御の実現は、公知の技術を用いることが可能である。
命令実行部212は、プログラムの実行主体となるCPU(Central Processing Unit)等の制御部と、プログラム実行時に一時的にデータを記憶するためのレジスタ213を有している。命令実行部212は、入出力データをデータ記憶用メモリ領域のうち非保護メモリ領域214へのデータ読み書きを通じて行う。尚、プログラム実行装置201に入力されるデータについての書き込みとプログラム実行装置201から出力されるデータの読み出しを行うのはOS301である。しかし、非保護メモリ領域214へのアクセスは必ずしもOS301に限定せず、OS301管理下の周辺装置によるDMA(Direct Memory Access)転送等によるものも含まれる。
OS301は、ターゲットシステム101の基本ソフトウェアの実行主体となるCPU等の制御部であって、非保護メモリ領域214にアクセスを行い、入力データ(例えば、外部装置103からネットワーク102を通じて入力されたデータ)の書き込みと、出力データ(例えば、ネットワーク102を通じ外部装置103に出力するデータ)の読み出しを行う。このOS301は、データ記憶用メモリ領域のうち、非保護メモリ領域214には任意のタイミング読み書きが可能であるが、保護メモリ領域215に対してはアクセスが制限され読み書きが禁止されるものとする。このような特定のプログラムあるいはプロセスに対してアクセスを制限する排他的アクセス機構は従来から知られている技術である。
注意すべきことは、プログラム実行装置201にとってOS301は、入力データや出力データや非保護メモリ領域214に記憶されたデータに対する盗聴や改ざん(以下これらを総称して攻撃と呼ぶ)を行う可能性があることが本実施の形態における前提である。プログラム実行装置201がネットワーク102を介して外部装置103と通信を行うとき、OS301と非保護メモリ領域214とは盗聴やメッセージの改ざんがありうるという点で、ネットワーク102の延長と考えることができる。このようなシステムにおいて、プログラム実行装置201が行うデータ処理の安全性を確保するには、2種類のメモリ(非保護メモリ領域214及び保護メモリ領域215)へデータを適切に振り分けることが重要である。図1においては、OS301による盗聴や改ざんが禁止された範囲は命令実行部212と保護メモリ領域215とを含む範囲である。
尚、本実施形態では、プログラム実行装置201は命令の実行については安全であることを仮定する。これは命令及び関数呼び出しや復帰アドレス等が記憶されるメモリ領域(図示せず)を、従来知られた手法によってOS301による攻撃から保護することで実現可能であるからである。しかし、それ以外の実現手段によりこのメモリ領域を保護するようにしても差し支えなく、ターゲットシステム101の構成は図1に示した形態に限定されるものではない。
また、プログラム実行装置201における命令実行部212の制御部と、OS301とは、同一の制御部としてもよいし、それぞれの用途に特化した個別の制御部としてもよい。また、非保護メモリ領域214と、保護メモリ領域215とを同一の記憶デバイス内に設けた態様としても良いし、それぞれを個別の記憶デバイスに設けた態様としても良い。
次に、本実施形態の説明に利用するセキュリティプロトコルのシーケンスについて図2を用いて説明する。図2では、図1に示す外部装置103で動作するシステムB2101と、図1に示すプログラム実行装置201により実現されるシステムA2201とがチャレンジアンドレスポンスプロトコルにより認証を行う例が示されている。ここで、システムB2101がOSを含むシステム全体を表すのに対し、本実施形態にかかる後述の保護属性決定処理が行われる対象となるシステムA2201は、プログラム実行装置(図1の201)に限定されていることに注意されたい。以下の説明ではシステムA2201の実装における安全性に注目した説明を行い、システムB2101の内部の動作についての説明は行わない。
まずセキュリティプロトコルの実行に先立って、システムB2101はシステムA2201の公開鍵(pkA)2113を予め取得しておく。システムB2101はCA (Certificate Authority)等が発行した証明書により公開鍵(pkA)2113の完全性を別途検証するが、図では省略されている。また、システムA2201を実現させるプログラム実行装置201(のデータ格納用メモリ領域)には、自身に割り当てられた秘密鍵(skA)2213が静的に予め埋め込まれる(記憶される)。
システムB2101は、乱数生成関数2111で乱数(rB)2112を生成し、システムA2201に送信する(2401)。同様に、システムA2201は、乱数生成関数2211で乱数(rA)2212を生成し、これをシステムB2101に送信する(2402)。さらにシステムA2201は、システムAが生成した乱数(rA)2212、システムB2101から2401で送られてきた乱数(rB)、秘密鍵(skA)2213を署名生成関数2214に入力して署名(sign)2215を生成し、署名をシステムB2101に送信する(2403)。システムB2101は、システムA2201から2402で送られてきた乱数(rA)、自分で生成した乱数(rB)2112、システムA2201の公開鍵(pkA)2113、およびシステムA2201から2403で送られてきた署名(sign)を署名検証関数2114に入力し、署名検証を行う。
次に、以上のようなターゲットシステム101において動作するプログラム実行装置201を例として、プログラムで用いる関数に対して保護属性を自動で決定する情報処理装置について説明する。まず、当該情報処理装置のハードウェア構成について説明する。本実施の形態の情報処理装置は、装置全体を制御するCPU(Central Processing Unit)等の制御装置と、各種データや各種プログラムを記憶するROM(Read Only Memory)やRAM(Random Access Memory)等の記憶装置と、各種データや各種プログラムを記憶するHDD(Hard Disk Drive)やCD(Compact Disk)ドライブ装置等の外部記憶装置と、これらを接続するバスとを備えており、通常のコンピュータを利用したハードウェア構成となっている。また、情報処理装置には、情報を表示する表示装置と、ユーザの指示入力を受け付けるキーボードやマウス等の入力装置と、外部装置の通信を制御する通信I/F(interface)とが有線又は無線により各々接続される。
このようなハードウェア構成において、情報処理装置の有するCPUが記憶装置や外部記憶装置に記憶された各種プログラムを実行することにより実現される各種機能について説明する。
図3は、本実施形態にかかる情報処理装置1の構成の例を示す図である。情報処理装置1は、プログラム受付部20、関数型抽出部23、代替関数型抽出部27、部分データフロー変換部29、選択部30、判定部31、更新部32、保護属性決定部33、復元部35と、プログラム記憶部21、第1の関数型記憶部22、第2の関数型記憶部24、一時記憶部25、第1の代替関数型記憶部26、第2の代替関数型記憶部28、保護属性決定テーブル記憶部34とを有する。これらは、CPUのプログラム実行時にRAMなどの記憶装置上に生成されるものである。また、情報処理装置1は、処理のターゲット(対象)となるプログラムであるターゲットプログラム11を入力し(受け付け)、ターゲットプログラムに含まれる変数に関する保護属性決定結果12を出力する。 また、保護属性定義情報が情報処理装置1の例えばHDDなどの外部記憶装置(図示せず)に記憶されてもよい。
次に、情報処理装置1の構成の詳細を説明する。
プログラム受付部20は、情報処理装置1の外部からターゲットプログラム11を受け付ける。受け付けたターゲットプログラム11を後述するプログラム記憶部21に記憶させる。ターゲットプログラム11は、変数や、関数を用いた所定の処理の実行手順が記述された情報であり、 例えばC言語のなどの人間可読な高級言語で記述されている。
プログラム記憶部21は、ターゲットプログラム11を記憶する。また、後述する部分データフロー変換部29によりターゲットプログラム11とそのターゲットプログラムの部分データフローを対応付けて記憶しても良い。図4は、取得されるターゲットプログラムの例を示す図であり、図2のプロトコルにおいてシステムA2201が実行するターゲットプログラムを示している。図4において、2行目は(初期)保護属性 confidential が与えられた変数宣言を表す。4〜5行目では出力のためのパラメータ(変数)が与えられている。7〜11行目は作業変数の変数宣言を表す。13〜20行で処理の手順が記述される。具体的には、13行目の乱数生成関数「PhysicalRandom」で乱数「rA」が生成され、それが14行目の出力関数「Output」でOSを経由して外部に出力される。また15行目の入力関数「Input」においてOSを経由して「buf」で確保された領域に外部入力が入力され、そのサイズが「size」に記憶される。そして16行目で「buf」に保存された外部入力が変数「rB」にコピーされる。18行目では、公開鍵署名生成関数「Sign2」に入力文「rA」「rB」と署名生成のための秘密鍵「skA」が入力され、入力文に対する署名「sign」が出力される。最後に20行目の出力関数「Output」によりOS経由でデータを出力して、処理が完了する。
また、このターゲットプログラムでは多くの変数に対してフィールドの数や長さといったデータ型を省略しているが、実際はデータ型の定義並びにその一致が必要となる。しかし、保護属性とデータ型とは独立に考えることができるため、ここでは保護属性のみに注目して記載している。
ここで、2行目の変数には保護属性が付与されているが、それ以外の変数には保護属性が付与されていない。本実施の形態では、保護属性が付与されていない変数に対して、その保護属性を自動で決定する。また、図4のターゲットプログラムには現れていないが、(保護属性が付与されていない)定数も保護属性自動決定の対象である。以下では、保護属性決定対象となる変数、定数を、総称して変数と呼ぶ。
ここで、保護属性について詳細に説明する。保護属性は、情報が完全・正確であり、不慮の事故による欠落や攻撃者による改ざんがないことを意味する完全性と、権限を持つ人だけが情報にアクセスでき、権限の無い人が読み取れないことを意味する機密性の2つの性質で大きく分類される。さらにこれらは、完全性と機密性というセキュリティ要件について、それぞれメモリ領域における保護の有無と、性質保証の有無という2種類の観点で分類される。例えば、ある変数の値が機密性保護メモリ領域に現在記憶されているとしても、その値が過去に非保護メモリ領域に記憶されたことがあったり、将来非保護メモリ領域に記憶されたりするのであれば、その値が非保護メモリに記憶されたときにOS301等の外部エンティティに盗聴される恐れがあるため、その値の機密性は保証されていないことになる。このように、本実施形態に係る保護属性は、完全性と機密性のそれぞれについて、メモリ上非保護(性質も未保証)、メモリ上保護しているが性質は未保証(未確認)、メモリ上保護していてかつ性質も保証あり(確認済)を区別できるように設定されている。
本実施形態では、この保護属性を示す情報を保護属性情報という。保護属性情報は、ある変数に代入されるデータが保護されたメモリ領域に記憶されるか、または保護されないメモリ領域に記憶されるかを示す情報である。
メモリ領域の保護については、アクセス制御や暗号化・改ざん検証などの保護手段によって達成される項目が異なる。たとえば実行対象のプログラム以外からのアクセスを完全に禁止するアクセス制御機構をそなえた保護メモリ領域215は、完全性と機密性とも保護ありとなる。ただし、全てのメモリ領域について当該実行対象のプログラム以外からのアクセスが禁止されてしまっている場合、OS301が提供する入出力サービスが一切利用できない。このため、図1に示すように、入力及び出力のために完全性及び機密性の保護機構が実現されない非保護メモリ領域214が設けられている。
尚、機密性の保護がメモリアクセス時のハードウェアによる暗号機構によって行われる場合は、機密性が保護されるが、完全性は保護されないメモリ領域がありえる。また、完全性の保護についてもそれがハードウェアによるMAC(Message Authentication Code)生成・検証機構で行われれば完全性が保護されるが、機密性は保護されないメモリ領域がありえる。もちろん、両方を組み合わせればアクセス制御と同様に完全性と機密性との両方をそなえた保護機構が実現可能である。本実施の形態にかかる構成においてはこれらの保護手段のどれについても適用可能である。
以降、完全性が必要な情報が不用意に非保護メモリ領域214に記憶され対象のプログラム外からの書き換えを受けることを「情報が汚染される」と表現する。
図5は本実施形態に係る保護属性定義情報14の例を示す図である。「exposed」は、完全性も機密性も保護されていない非保護メモリ領域に記憶され、かつ完全性も機密性も保証されていない値が代入される変数を意味する保護属性である。「exposed」はOS301が値を自由に読み書きできる変数であり、「exposed」が付与された変数を介して、OSはプログラムの入出力を行うことができる。なお、以下の説明では保護された変数との違いを明確にするために保護属性「exposed」を明示しているが、既存のプログラムとの互換性を維持し、記述の煩雑さを避けるために保護属性「exposed」を省略しても差し支えない。
「fixed」は、少なくとも完全性が保護されたメモリ領域に記憶され、かつ完全性も機密性も保証(確認)されていない値が代入される変数を意味する保護属性である。「fixed」が付与された変数の値は通常機密保護されないメモリ領域に記憶されるため、この変数を介してOSがプログラムの出力を行うことができる。逆に、OS等の外部エンティティから値が参照されない場合は、変数の値を機密性が保護されたメモリに記憶しても差し支えない。
「verified」は、少なくとも完全性が保護されたメモリ領域に記憶され、かつ完全性は保証(確認)されているが機密性は保証(確認)されていない値が代入される変数を意味する保護属性である。「verified」が付与された変数の値は通常機密保護されないメモリ領域に記憶されるため、この変数を介してOSがプログラムの出力を行うことができる。逆に、OS等の外部エンティティから値が参照されない場合は、変数の値を機密性が保護されたメモリに記憶しても差し支えない。
「hidden」は、少なくとも機密性が保護されたメモリ領域に記憶され、かつ完全性も機密性も保証(確認)されていない値が代入される変数を意味する保護属性である。「hidden」が付与された変数は外部からの入力に用いられることはなく、その変数にOSが値を書き込む必要はないため、変数の値を完全性が保護されたメモリ領域に記憶しても問題ない。
「concealed」は、少なくとも機密性が保護されたメモリ領域に記憶され、かつ機密性は保証(確認)されているが完全性は保証(確認)されていない値が代入される変数を意味する保護属性である。「concealed」が付与された変数は外部からの入力に用いられることはなく、その変数にOSが値を書き込む必要はないため、変数の値を完全性が保護されたメモリ領域に記憶しても問題ない。
「confidential」は、機密性と完全性の両方が保護されたメモリ領域に記憶され、かつ機密性と完全性の両方が保証(確認)されている値が代入される変数を意味する保護属性である。
なお、図5における「完全性―保護」「機密性―保護」列の記号は、各保護属性が付与された変数の値が記憶されるメモリ領域における完全性・機密性それぞれの保護機能の有無を表している。「−」は、メモリ領域に保護機能がないことを意味しており、「+」は、メモリ領域に保護機能があることを意味しており、「+/−」はメモリ領域に保護機能があってもなくてもよいことを意味しており、「−(+)」はメモリ領域に保護機能がないが、外部エンティティから値を参照されない場合は保護機能があってもよいことをそれぞれ意味している。
また、図5における「完全性―性質」「機密性―性質」列の記号は、各保護属性が付与された変数の値の完全性・機密性それぞれの性質が保証(確認)されているかを表している。「×」は性質が未保証であることを意味しており、「○」は、性質が保証されていることを意味している。
以上、説明した6種類の保護属性のうち、本質的に重要な保護属性は「exposed
」、「verified」、「concealed」、「confidential」で
あり、「fixed」、「hidden」は補助的な保護属性となっている。
上記した保護属性は、一般的な言語における変数の型(フィールドの数や長さといったデータ型)とほぼ同じと考えてよく、同じ型の変数同士の演算は許されるが、異なる型の変数同士の演算は許されない。一方、これらを緩和するために、一般的な言語におけるデータ型ではデータ型変換(キャスト)を伴う代入が可能なことがある。すなわち、float x = (float)(int y) のように、int 型(整数型)の y の型を float 型(浮動小数点数型)に変換したものを x に代入するような操作である。保護属性においても、後述するように、一部の保護属性において保護属性変換を伴う代入が許されている。このような操作を行う場合、保護属性変換とデータ型変換を伴う代入において、保護属性変換ルールと、データ型変換ルールを共に守らなければ、代入を行うことはできない。本実施の形態では、データ型と保護属性のルールを独立してチェック可能である例を考え、以下では保護属性にのみ注目した説明を行う。
第1の関数型記憶部22は、関数型の情報である関数型情報、つまり、セキュリティ関数の関数型の情報であるセキュリティ関数型情報および非セキュリティ関数の関数型の情報である非セキュリティ関数型情報を記憶する。
関数とは、プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたものをいう。例えば、一般にサブルーチンと言われるものなどである。
具体的には、第1の関数型記憶部22は、1以上のセキュリティ関数型情報と、セキュリティ関数の識別情報とが直接的または間接的に対応付けられた第1の関数型情報を記憶する。
セキュリティ関数型情報は、セキュリティ関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶させるかを示す保護属性情報を有する。
また、非セキュリティ関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶させるかを直接的または間接的に示す保護属性情報を有する1以上の非セキュリティ関数型情報と、非セキュリティ関数の識別情報とが対応付けられた第2の関数型情報を記憶してもよい。
本実施の形態において、関数はセキュリティ関数と非セキュリティ関数に分かれている。セキュリティ関数とは、計算量的一方向性(入出力変数全体集合のある部分集合が存在して、その部分集合に属する変数の値から、部分集合に属さない変数の値を求めることが現実的な時間ではできない)の性質を有する処理を行う関数であるか、または入力変数の値の完全性の検証処理を行う関数であるか、または関数の入力変数および出力変数が(既定された)異なる保護属性をとり得る関数である。
一方、非セキュリティ関数とは、関数の入力変数と出力変数がすべて同じ保護属性のみをとることができる関数である。そして、それぞれの関数について、入出力変数がどのような保護属性を取ることができるかを規定したものが関数型である。
セキュリティ関数の関数型は、計算量的一方向性(入出力変数全体集合のある部分集合が存在して、その部分集合に属する変数の値から、部分集合に属さない変数の値を求めることが現実的な時間ではできない)の性質を有する処理を行う関数であるか、または入力変数の値の完全性の検証処理を行う関数であるか、許可された保護属性変換を行う関数であるか、に基づいて定義される。例えば、機密性について言えば、ある演算 y = f(x) について、y の値から x の値を求めることが現実的な時間ではできないという計算量的一方向性を持つならば、入力 x が機密性保証あり、出力 y が機密性保証なしという保護属性を許可することができ、これはセキュリティ関数となる。完全性についていえば、署名検証のような、入力の値に完全性があるかどうかを検証し、検証済みの値(値自体は入力と同じ)を出力する機能を持つ関数であれば、入力が完全性保証なし、出力が完全性保証ありという保護属性を許可することができ、これもセキュリティ関数である。
一方、計算量的一方向性が無ければ、例えば出力から入力を求められてしまうため、入力が機密性保証あり、出力が機密性保証なしという保護属性は許可できない。また、入力の完全性があるかどうかを検証する機能を持たない関数であれば、入力が完全性保証なし、出力が完全性保証ありという保護属性は許可できない。結果として、上記いずれの性質も持たず、入力と出力の保護属性が同じでなければならないような関数は、非セキュリティ関数となる。
この関数型で定義された保護属性によりプログラム中の変数に代入されるデータの記憶領域を制御することで、セキュリティ関数の入力変数に代入されるデータおよび出力変数に代入されるデータを適切に保護することができる。
セキュリティ関数型情報は、セキュリティ関数の変数の保護属性情報を有する。非セキュリティ関数型情報は、非セキュリティ関数の変数の保護属性情報を有する。
セキュリティ関数の例として、データ秘匿、データ完全性保証、エンティティ認証、データ認証などの情報セキュリティ機能を提供するプログラムで利用される、暗号方式をベースとした基本構成要素(暗号プリミティブ)を実現する関数が挙げられる。具体的な暗号プリミティブとしては、ハッシュ関数、一方向性関数、乱数生成関数、共通鍵暗号、MAC (Message Authentication Code)、公開鍵暗号、公開鍵署名などがある。ハッシュ関数、一方向性関数、乱数生成関数は1つのセキュリティ関数で実現されるが、共通鍵暗号および公開鍵暗号はそれぞれ3つのセキュリティ関数(鍵生成関数、暗号化関数、復号関数)で実現される。また、MACおよび公開鍵署名もそれぞれ3つの関数(鍵生成関数、MAC/署名生成関数、MAC/署名検証関数)で実現される。これらの関数は、入力変数及び出力変数の間の計算量的一方向性の性質を有する、あるいは完全性の検証を行う関数である。
図6は、セキュリティ関数毎に定義された関数型情報を示す図である。ここではセキュリティ関数として公開鍵暗号の暗号化関数と復号関数、共通鍵暗号の暗号化関数と復号関数、公開鍵署名(入力1文書、入力2文書)の署名生成関数と署名検証関数、MACのMAC生成関数とMAC検証関数、ハッシュ関数(1入力2出力、2入力1出力)、一方向性関数の一種であるKDF(Key Derivation Function、鍵導出関数)、乱数生成関数の各セキュリティプリミティブを実現する関数と、保護属性変換用のコピー関数を示した。特許請求の範囲の第1の関数は、本実施形態等のセキュリティ関数が対応し、第1の関数型情報は、本実施形態等のセキュリティ関数型情報が対応する。
セキュリティ関数には、関数の各入出力と、入出力変数がとる特定の保護属性とが対応付けられている。入出力変数は、入出力として実際に関数にとられる変数、すなわち関数に入力される値が代入される変数あるいは関数から出力される値が代入される変数である。各入力変数及び出力変数の保護属性は、セキュリティ関数が計算量的一方向性の性質を有するか、または関数が入力変数の値の完全性の検証処理を行うかに基づいて定義される。なお、関数の出力については、「func(input、 output)」のように変数の形になっている場合と、「output = func(input)」のように関数より返される値として扱われる場合との両方を含む。図6において、例えば、公開鍵暗号における暗号化関数を見てみると、セキュリティ関数名(セキュリティ関数の識別情報)はPKEncryptであり、関数は入出力として、第1変数、第2変数、第3変数の3つの入出力変数をとる。そしてそれらの意味は、第1変数が平文(暗号化されるメッセージ、入力)、第2変数が公開鍵(入力)、第3変数が暗号文(出力)となっている。そして、各行が1つの関数型を表し、公開鍵暗号における暗号化関数の関数型は多重定義記号A、Bの2種類定義されている。これは、この関数が使われる状況に応じて、いずれか一方の関数型が採用されることを意味する。このように、ひとつのセキュリティ関数に対して2つ以上の関数型が定義されることを(関数型の)多重定義と呼ぶ。この2つの関数型は以下のような考えで設計されている。
まず公開鍵については、誰でもアクセスできるように機密性がないメモリ領域に記憶され、かつ公開鍵暗号化が正しく行われるために公開鍵の完全性が保証されなければならないため、A、Bいずれの定義でも verified でなければならない。
一方、暗号化する平文は外部エンティティから盗聴されない機密性が保証されたものでなければならないが、完全性については任意であるため、Aは機密性と完全性が保証されている場合を表す confidential、Bは機密性のみが保証されている場合を表す concealed となっている。
最後に暗号文については、暗号化されているため機密性を保護する必要ない。これは暗号化関数の計算量的一方向性からわかる。すなわち、平文から暗号文を計算することは容易だが、逆に暗号文から平文を求めることは現実的な時間では困難であるため、暗号文を機密保護メモリに記憶する必要はないということである。そして暗号文の完全性については、平文の完全性がそのまま出力の暗号文の完全性に引き継がれるため、Aは完全性のみが保証される verified、Bは完全性も機密性も保証されない exposed となる。
図6におけるその他のセキュリティ関数についても説明すると、公開鍵暗号の復号関数 SKDecrypt は、暗号文と秘密鍵を入力として取り、平文を出力する。秘密鍵は完全性と機密性が保証された confidential でなければならない。また、平文は機密性が保証されていなければならず、平文の完全性は暗号文の完全性を引き継ぐため、暗号文が verified かつ平文が confidential、または暗号文が exposed かつ平文が concealed となる。
共通鍵暗号における暗号化関数 CKEncrypt は、平文と秘密鍵を入力として取り、暗号文を生成する。また、復号関数 CKDecrypt は、暗号文と秘密鍵を入力として取り、平文を生成する。CKEncrypt、CKDecrypt の関数型は、それぞれ PKEncrypt、 SKDecrypt の関数型とほぼ同様である。違いは暗号化用の鍵が公開鍵ではなく秘密鍵となるため、CKEncrypt の入力である第2変数の保護属性が verified ではなく confidential でなければならないことである。
公開鍵署名(1文書)の署名生成関数(1文書) Sign および公開鍵署名(2文書)の署名生成関数(2文書) Sign2 は、入力文(署名対象のメッセージ)1つまたは2つと秘密鍵とを入力として取り、署名を生成する。入力文は(複数ある場合は共に)完全性が保証されていなければならないが機密性は任意である。また、秘密鍵は完全性と機密性が保証されていなければならない。署名の機密性及び完全性は、入力文の機密性及び完全性をそのまま引き継ぐ。MACのMAC生成関数 MACGen は、入力文と秘密鍵を入力として取り、MACを生成する。MACGen の関数型は、Sign の関数型とほぼ同様である。違いは MAC 生成用の鍵が公開鍵ではなく秘密鍵であるため、MACGen の入力である第2変数の保護属性が verified ではなく confidential でなければならないことである。
公開鍵署名(1文書)における署名検証関数(1文書) Verify は、入力文(署名対象のメッセージ)、入力文に対する入力署名、署名検証のための公開鍵を入力として取り、検証済みの出力文、検証済みの出力署名、検証に成功したか否かを表す検証結果(補助出力)を出力する。一般的な署名検証では、検証に成功したか否かの検証結果だけが出力されるが、本実施の形態における署名検証では、出力文および出力署名の変数が用意され、署名検証が成功したときに限り出力文および出力署名の各変数に、それぞれ(検証済みの)入力文および入力署名とまったく同じ値が格納される。
関数型については、公開鍵は完全性が保証されていなければならず、かつ誰でもアクセスできるように機密性の無いメモリ領域に記憶されなければならないため、その保護属性は verified である。入力文及び入力署名は完全性保証がなく、機密性は任意である。出力文および出力署名は、出力される場合は検証が成功したということなので、完全性保証ありとなる。また、機密性は入力文および入力署名のものをそれぞれ引き継ぐ。検証結果については、入力がすべて機密性保証無しのものであればだれでも計算ができるので機密性保証なしとなり、入力のうちひとつでも機密性保証ありのものがあれば結果も機密性保証ありとなる。
このように関数型を定義することで、署名検証前の完全性のない入力文及び入力署名と、検証後の完全性が保証された(入力文及び入力署名と同じ値である)出力文および出力署名を、セキュリティの観点で分離して扱うことができるようになる。例えば、完全性が保証された値が代入された変数を入力として取るセキュリティ関数の入力に対して、署名検証により出力された検証後の変数を入力すべきところを、誤って検証前の変数(この値は署名検証関数の実行後に改ざんされているかもしれない)を入力してしまうような誤りを排除できる。
公開鍵署名(2文書)における署名検証関数(2文書) Verify2 の関数型は、入力文と出力文がそれぞれ2つずつある以外は Verify と同様である。ただし多重定義C、 Dでは、入力文1は未検証だが、入力文2がすでに検証済みである場合を定義している。 MACのMAC検証関数 MACVerify は、入力文(MAC対象メッセージ)、入力文に対するMAC、検証のための秘密鍵を入力として取り、検証済みの出力文、検証済みのMAC、検証に成功したか否かを表す検証結果(補助出力)を出力する。関数型は Verify の関数型とほぼ同様である。違いは MAC 検証用の鍵が公開鍵ではなく秘密鍵であるため、MACVerify の入力である第2変数の保護属性が verified ではなく confidential でなければならないことである。
ハッシュ関数 Hash、Hash2 は、与えられた入力からハッシュ値とよばれる値を計算する関数で、Hash は1入力、Hash2 は2入力である。関数型の完全性と機密性は以下のような考え方で決定される。完全性については、(i1)入力の全てが完全性保証ありで、出力も完全性保証あり、または(i2)入力の少なくとも1つが完全性保証なしで、出力は完全性保証なしとなる。機密性については、(c1)入力の全てが機密性保証なしで、出力も機密性保証なし、(c2)入力の少なくとも1つが機密性保証ありで、出力も機密性保証あり、または(c3)入力の少なくとも1つが機密性保証ありで、出力は機密性保証なしとなる。(c3)が定義できるのは、ハッシュ関数が計算量的一方向性を有した関数であり、出力であるハッシュ値から入力(複数入力の場合はそのすべて)を求められないという性質を持つからである。
図6における関数型定義において、1入力1出力のハッシュ関数 Hash の多重定義 A は (i2)-(c1)の組み合わせで定義されるものであり、同様に B は(i1)-(c1)、C は(i2)-(c2)、D は(i2)-(c3)、E は(i1)-(c2)、F は(i1)-(c3)の組み合わせでそれぞれ定義されるものである。2入力2出力のハッシュ関数 Hash2 の多重定義についても同様である。
鍵導出関数 KDF は、入力から2つの出力を生成する関数であり、データ長が十分長い2つ以上の鍵データを(出力よりも短い長さの)入力から生成する場合などに用いられる関数である。この関数も一方向性を有しているため、関数型の定義は前述のハッシュ関数 Hash とほぼ同様である。異なる点は出力が2つあり、2つの出力の保護属性が同じである点のみである。
乱数生成関数 PhysicalRandom 乱数を生成する関数であり、入力は取らない。完全性のみ保証された乱数、機密性のみ保証された乱数、完全性と機密性の両方が保証された乱数の3種類が出力乱数の保護属性として定義されている。なお、生成した乱数は通常必ず完全性があるが、機密性のみ保証された値と演算するための乱数を用意するために、便宜上機密性のみ保証された乱数が定義される。
最後に、保護属性変換用のコピー関数は、入力変数の値を出力変数にコピーする(代入する)関数である。この関数は、本実施例における保護属性定義にあわせて、便宜上セキュリティ関数として用意されている。「hidden」、「concealed」、「confidential」の各保護属性が付与された変数の値は、他の保護属性が付与された変数に代入することはできない。完全性についてメモリ上保護され、かつ性質が保証された値を保持する保護属性「verified」が付与された変数は、その値を保護属性「fixed」、「exposed」が付与された変数に代入することは許されるが、「fixed」、「exposed」が付与された変数の値は(完全性が保証されていないため)保護属性「verified」が付与された変数へ代入することができない。また、保護属性「fixed」が付与された変数の値は「exposed」が付与された変数に代入でき、逆もまた行うことができる。「exposed」が付与された変数の値を「fixed」が付与された変数へ代入することは、プログラムの入力である「exposed」が付与された変数の値がその後外部エンティティにより改ざんされないように、「fixed」が付与された変数にコピーして扱う、といった使い方がありうる。
セキュリティ関数の開発、即ち、関数型の定義及び実装には、一般のアプリケーションプログラムの開発より慎重に行われなければならない。図7は、セキュリティ関数とアプリケーションプログラムの開発の作業手順を示す図である。セキュリティ関数の関数型および実装は、暗号プリミティブとプログラムとのメモリ管理の両方に精通したセキュリティ専門家である専門プログラマによって開発され(501)、動作の正しさだけでなく、その保護属性についても適切な定義がなされているか否かの十分な注意が必要である。その後、セキュリティ専門家により安全性が保証されたセキュリティ関数の関数型およびセキュリティ専門家によりセキュリティ関数内部の変数に対して適切な保護属性が付与された実装を利用して、一般のプログラマによりセキュリティ関数を利用したセキュリティプロトコルが実装される(502)。
図6に示すセキュリティ関数の関数型の定義は、標準的に要求される安全性を満たすものを基準として行っているが、セキュリティ関数の関数型は、ターゲットプログラムにおいて使用する暗号アルゴリズムなどによって変化する。その場合、セキュリティ専門家によるセキュリティ関数の追加・削除や、セキュリティ関数型定義の変更が必要となる。
図7におけるセキュリティ関数の実装について、特に署名検証関数およびMAC検証関数について注意が必要である。図8は、本実施の形態における署名検証の手順および実装の一例を概念的に示す図である。前述の通り、本実施の形態における署名検証では、署名検証関数の入力文用の変数521と入力署名用の変数522にそれぞれ対応する出力文用の変数523および出力署名用の変数524が用意され、署名検証が成功したときに限り出力文および出力署名の各変数に、それぞれ(検証済みの)入力文および入力署名とまったく同じ値が代入される。この関数の実装例である図8では、まず入力文用の一時変数525と入力署名用の一時変数526を生成し、そこに入力文用の変数521と入力署名用の変数522の値をそれぞれコピーする。このとき、一時変数の値は完全性保護メモリに記憶されるため、コピー以降改ざんされることはない。そして、改ざんされないことが保証されたところで、一時変数の値について検証527を行い、検証に成功した場合のみ、出力文用の変数523と出力署名用の変数524に、入力文用の一時変数525と入力署名用の一時変数526の値をそれぞれコピーする。
この実装は、攻撃者が検証中に検証前の変数の値を書き換えることを防止する効果がある。例えば、検証527が成功したら入力文用の変数521および入力署名用の変数522の値をそれぞれ出力文用の変数523と出力署名用の変数524にそれぞれコピーするような実装としてしまうと、検証527が終わってからコピーが行われるまでの間に、攻撃者により入力文用の変数521および入力署名用の変数522の値が改ざんされてしまうかもしれない。すると、署名検証関数は、攻撃者によって改ざんされた値を検証済みの値として出力してしまうこととなる。図8のような実装を行えば、検証開始から出力変数への値のコピーまで改ざんが防止されるため、このような脆弱性を排除できる。なお、MAC検証関数も署名検証関数と同様な考え方で、検証に成功した時に限り入力と同じ値が代入された変数が出力される。
図9は、本実施の形態における非セキュリティ関数である入力関数「Input」及び出力関数「Output」の関数型を示す図である。非セキュリティ関数の関数型は、変数の保護属性が全て一致する。関数「Input」に入力される変数(入力変数)はOSによる書き込みがあるため入力変数は保護属性「exposed」が付与された変数に限定され、出力も保護属性「exposed」が付与された変数に限定される。ただし、前述したとおり、「exposed」と「fixed」は相互変換可能であるから、外部入力を「exposed」のメモリ領域で取り込み、それを改ざん保護機能のついた「fixed」のメモリ領域にコピーすることは可能である。また、関数「Output」により出力される変数(出力変数)はOSによる書き込み操作が不要なため、変数の保護属性が全て「exposed」、または全て「verified」と多重定義される。
特許請求の範囲の第2の関数は、本実施形態等の非セキュリティ関数が対応し、第2の関数型情報は、本実施形態の非セキュリティ関数型情報が対応する。
なお、関数型が定義されていない関数はすべて非セキュリティ関数とみなされ「入出力変数の保護属性がすべて同じであり、その保護属性は何でもよい」と多重定義されているとみなす。つまり、入出力変数の保護属性が、全て「confidential」、全て「concealed」、全て「verified」、全て「hidden」、全て「fixed」、全て「exposed」のいずれかでなければならないと多重定義されているとみなす。
関数型抽出部23は、第1の関数型記憶部22に記憶された第1の関数型情報とターゲットプログラムに含まれるセキュリティ関数の情報である実セキュリティ関数情報に基づいて、実セキュリティ関数情報に対応するセキュリティ関数型情報である実セキュリティ関数型情報を抽出する。
例えば、第1の関数型情報に含まれるセキュリティ関数の識別情報と実セキュリティ関数情報に含まれるセキュリティ関数の識別情報とが一致するセキュリティ関数のセキュリティ関数型情報を抽出する。
そして、抽出した第1の実関数型情報を後述する第2の関数型記憶部24および一時記憶部25に書き込む。
特許請求の範囲の第1の実関数は、本実施形態等の実セキュリティ関数が対応し、第1
の実関数型情報は、本実施形態等の実セキュリティ関数型情報が対応する。
また、第1の関数型記憶部22に記憶された第2の関数型情報とターゲットプログラムに含まれる非セキュリティ関数の情報である実非セキュリティ関す情報に基づいて、実非セキュリティ関数情報に対応する非セキュリティ関数型情報である実非セキュリティ関数型情報を第2の関数型情報から抽出し、抽出した第2の実関数型情報を後述する第2の関数型記憶部24および一時記憶部25に書き込んでもよい。
特許請求の範囲の第2の実関数は、本実施形態等の実非セキュリティ関数が対応し、第2の実関数型情報は、本実施形態等の実非セキュリティ関数型情報が対応する。
なお、ターゲットプログラム中に、第1の関数型記憶部に対応する関数型が定義されていない関数があった場合、関数型抽出部23は、その関数の関数型が「入出力変数の保護属性がすべて同じであり、その保護属性は何でもよい」と多重定義されているとみなし、相当する実非セキュリティ関数型情報を抽出(生成)してもよい。
第2の関数型記憶部24は関数型抽出部23で抽出された実関数型情報を記憶する。
実関数型情報は、関数の識別情報と、実関数の識別情報(複数回呼び出された関数を区別するための情報)とが対応付けられた情報である。
第2の関数型記憶部24に記憶されるセキュリティ関数および非セキュリティ関数の実関数毎の関数型の情報(実関数型情報)の例として、図4で示したターゲットプログラムに対する実関数毎の関数型情報を図10に示す。図10の例では、セキュリティ関数の実関数型情報である実セキュリティ関数型情報は、セキュリティ関数の識別情報であるセキュリティ関数名と実関数の識別情報である符号(詳細は後述する)から決まる実セキュリティ関数名と、多重定義記号と、変数の意味毎に多重定義記号に対応した保護属性とが対応付けられた情報となっている。また、非セキュリティ関数の実関数型情報である実非セキュリティ関数型情報は、非セキュリティ関数の識別情報である非セキュリティ関数名と実関数の識別情報である符号から決まる実非セキュリティ関数名と、多重定義記号と、変数の意味毎に多重定義記号に対応した保護属性とが対応付けられた情報となっている。
実関数型情報において、セキュリティ関数および非セキュリティ関数は呼出し毎に区別され、例えば図10における実セキュリティ関数名および実非セキュリティ関数名のように、呼び出し毎に異なる符号を用いて「#符号_関数名」と変換され記憶されている。これは関数型を実関数毎、すなわち、関数の呼出し毎に抽出し、それらを区別するためである。この例では、符号として図2で各関数に付与した番号を利用している。
この例では、セキュリティ関数の乱数生成関数「PhysicalRandom」と署名生成関数(2入力)「Sign」、非セキュリティ関数の入力関数「Input」と出力関数「Output」の実関数毎関数型が展開されており、特に出力関数「Output」は図4のターゲットプログラム中で2回呼び出されるため、それぞれの呼び出しが「#2402_Output」、「#2403_Output」と区別されている様子を示している。
一時記憶部25は、関数型抽出部23で抽出された実関数型情報を記憶する。なお、一時記憶部25は、実セキュリティ関数型情報が記憶されれば十分であるが、実非セキュリティ関数型情報も記憶されても良い。
本実施形態においては、以上のようなセキュリティ関数および非セキュリティ関数における関数型(変数の保護属性)の制限を満たすようプログラムにおける変数の保護属性を決定することで、非セキュリティ関数において異なる保護属性を持つ変数が演算されることを防ぎ、そのような演算がセキュリティ関数のみで安全に行われることを保証する。
第1の代替関数型記憶部26は、セキュリティ関数を用いた特定処理の実行手順を示す特定処理手順情報と、1以上の関数型情報とが対応付けられた代替関数型情報を記憶する。代替関数型情報に含まれる関数型情報は、特定処理手順が実行される場合に特定処理手順で実行されるセキュリティ関数の関数型情報を代替できるセキュリティ関数の情報であって、セキュリティ関数の識別情報を有する。
代替関数型抽出部27は、代替関数型情報と、実セキュリティ関数情報に基づいて、実セキュリティ関数情報に対応する代替実関数型情報を抽出する。
例えば、第1の代替関数型記憶部26に記憶されている代替関数型に対応付けられた特定処理手順情報に含まれるセキュリティ関数の識別情報と、第2の関数型記憶部24に記憶されている第2の関数型情報に含まれる実セキュリティ関数情報に含まれるセキュリティ関数の識別情報とが一致する代替関数型情報を、第1の代替関数型記憶部26から抽出する。
つまり、プログラム記憶部21に記憶されたターゲットプログラムに含まれる実セキュリティ関数毎に、特定処理手順情報と実関数型情報の組からなる代替実関数型情報(特許請求の範囲の第2の代替関数型情報に対応)を抽出し、第2の代替関数型記憶部28に記憶させる(書き込む)。
図11は、本実施の形態に係る代替関数型情報(特定処理手順情報および関数型情報と対応付けられた情報)の例を示す図である。代替関数型情報は、各行(番号)において、第1列で示される特定処理手順情報において関数の入出力の関係で定義された特定処理の実行手順がプログラム中に存在する場合に限り、第2列で示されるセキュリティ関数に関する関数型情報を、特定処理手順に含まれる当該セキュリティ関数の関数型情報の代替として利用できることを示している。この代替関数型情報は、関数毎の関数型情報(第1の関数型情報)と同様、セキュリティ関数毎に定義される。この代替関数型情報を利用することにより、関数単体のみを考慮して保護属性が定義された関数型だけではプログラム中の変数の保護属性が決定できない場合に、複数の関数の入出力関係を考慮した保護属性決定を行うことが可能となる。
特定処理手順情報は、始点セキュリティ関数名およびその関数の特定出力と、終点セキュリティ関数名およびその関数の特定入力の組が1つ以上集まったものである。本実施形態では、関数の特定入力または特定出力を関数名および関数の入出力番号を用いて、「関数名_(#入出力番号)」の形で指定している。各組は、始点セキュリティ関数の特定出力が、終点セキュリティ関数の特定入力へ入力されることを意味している。例えば図11の番号1の場合、始点セキュリティ関数の特定入力が「#PhysicalRandom(#1)」,終点セキュリティ関数の特定出力が「#Sign2(#1)」であるから、図6で定義された乱数生成関数「PhysicalRandom」の出力である第1変数(乱数)が、同じく図6で定義された署名生成関数(2文書)「Sign2」の第1変数(入力文1)として入力されるという特定処理手順を意味している。つまり,乱数生成関数の出力値(乱数)が署名生成関数の入力文1として入力されることを意味している.
代替関数型情報に対応付けられた関数型情報は、図6で示した関数型情報と同様なフォーマットで定義されるが、対になる特定処理手順がプログラム中に存在したときにのみ利用(代替)できる関数型である。例えば図11の番号1の場合は、署名生成関数(2文書)「Sign2」の関数型を(対になる特定処理手順が存在した時に限り)代替できる関数型である。通常のSign2 の関数型は、図6で示したように、第2変数の入力文2には完全性が保証されているもの(「confidential」または「verified」)しか許可されなかった。しかし図11の番号1の関数型では、第2変数の入力文2の保護属性は「concealed」または「exposed」であり、第2変数として完全性が保証されない値を入力することを許可している。
図11の番号1の代替関数型情報は、『署名生成関数(2文書)「Sign2」の第1変数が乱数生成関数「PhysicalRandom」により生成された乱数を値として持つ変数である場合に限り、「Sign2」の第2変数が完全性保証無しのものであっても署名生成を許可する』と見ることができる。
ここでこの定義の意味を説明する。セキュリティの観点では、図6の定義のように、署名をつける文書にはすべて完全性がなければならない。しかし、チャレンジアンドレスポンスプロトコルと呼ばれるプロトコルでは、一時的に利用する(無意味な)文書に対して署名をつけることで、認証を行う。つまり、文書の一部に「乱数」を挿入することで、文書が無意味なものとなり、署名付き文書が悪用されることを防いでいる。
以上のような考え方から、チャレンジアンドレスポンスプロトコルを考慮すると、署名をしてもよい文書の条件は、すべてが完全性をもつか、すべては完全性を持たないが一部に完全性のある乱数を含む、と考えることができる。外部入力は改ざんされる恐れがあるため、完全性も保証できないし、乱数であるかどうかもわからない。そこで、システムAが自分で生成した乱数が完全性のある乱数ということになる。
言い換えると、署名の入力に乱数生成関数で生成された値が入力されれば、署名生成を許可するということができる。つまり、上述のような特定処理手順(上述の例では、乱数生成関数の出力が、署名生成関数の入力に入力されること)を満たしたときに限り、入力に完全性がないものを含んでいても署名を生成するというセキュリティ関数の代替関数型情報を利用することができる。このような代替関数型情報を考慮することにより、特定処理手順を考慮した保護属性の決定が可能となる。
図11の説明に戻る。番号2の定義は、番号1の定義における署名生成関数の特定入力(Sign2(#1))と完全性保証なしでもよい入力(Sign2(#2))を入れ替えたものである。
番号3〜6の定義では、始点セキュリティ関数名および特定出力と、終点セキュリティ関数名及び特定入力の組が2つある。このように複数の組がある場合は、それらを全て満たさなければならない。
番号3の定義は、乱数生成関数「PhysicalRandom」の出力である第1変数がハッシュ関数(1入力)「Hash」の第1変数として入力され、さらに同ハッシュ関数の出力である第2変数が署名生成関数(2文書)「Sign2」の第1変数として入力されるという特定処理手順が存在するときに限り、署名生成関数(2文書)「Sign2」の第2変数が(図6の関数型では完全性保証必須でなければならないのに対し)完全性保証なしでもよいとする関数型が利用できることを定義している。番号4の定義は、番号3の定義における署名生成関数の特定入力(Sign(#1))と完全性保証なしでもよい入力(Sign(#2))を入れ替えたものである。
番号5の定義は、乱数生成関数「PhysicalRandom」の出力である第1変数がハッシュ関数(2入力)「Hash」の第1変数として入力され、さらに同ハッシュ関数の出力である第3変数が署名生成関数(1文書)「Sign」の第1変数として入力されるという特定処理手順が存在するときに限り、署名生成関数「Sign」の第1変数である入力が(図6の関数型では完全性保証必須でなければならないのに対し)完全性保証なしでもよいとする関数型が利用できることを定義している。番号6の定義は、番号5の定義におけるハッシュ関数(2入力)の特定入力(Hash2(#1))を、ハッシュ関数のもう一方の入力(Hash2(#2))に置き換えたものである。
図12は、図11で定義した特定処理手順を含むデータフローの一例を図示したものである。図12におけるカッコつきの数字は、図11の番号に対応している。また、図12における#つきの数字は、関数の入出力番号(例えば#1は、その関数における第1番目の入出力である)を表している。そして、図12において太線で描かれた部分が図11で定義された特定処理手順である。
第2の代替関数型記憶部28は、代替関数型抽出部27により抽出された代替実関数型情報を記憶する。
第2の代替関数型記憶部28に記憶される代替実関数型情報の例として、図4で示したターゲットプログラムに対する代替実関数型情報を図13に示す。この例は、図11の代替関数型情報の番号1および2が、図4のターゲットプログラム中に存在する実セキュリティ関数「#2211_PhysicalRandom」と「#2214_Sign2」に対応付けて抽出され、第2の代替関数型記憶部28に記憶されたものである。
第2の代替関数型記憶部28に記憶される代替実関数型情報は、セキュリティ関数の呼び出し毎に抽出されるため、特定処理手順情報および関数型情報中のセキュリティ関数名は、セキュリティ関数の識別情報であるセキュリティ関数名と実関数の識別情報である符号から決まる実セキュリティ関数名となっている。 しかもこのとき、第2の代替関数型記憶部28に記憶される代替実関数型情報と、第2の関数型記憶部24に記憶される実関数型情報は、同じ実セキュリティ関数に対して同じ符号を付与する。そのため、乱数生成関数「PhysicalRandom」の符号は2211、署名生成関数(2入力)「Sign2」の符号は2214と、図10の符号と同じになっている。
代替実関数型情報は、プログラムに含まれる関数の呼び出し毎に抽出されることに注意する。例えば、プログラム中に乱数生成関数「PhysicalRandom」が2回、2文書の署名生成関数「Sign2」が2回呼び出されていたとすると、図11の番号1の代替関数型情報は実セキュリティ関数の組毎に抽出されるので、乱数生成関数2つと署名生成関数2つそれぞれの組み合わせで4つ抽出される。図11の番号2の代替実関数型情報も同様に4つ抽出されるので、結果として合計8つの代替実関数型情報が抽出されることになる。
部分データフロー変換部29は、プログラム記憶部21に記憶されたターゲットプログラムを部分データフローに変換し、プログラム記憶部21に(ターゲットップログラムに加えて)記録する。
この部分データフローは、プログラムを、プログラムにおける変数とプログラム中の各処理の入出力の繋がりを表すデータフローに変換し、さらにそのデータフローを部分データフロー、すなわち含まれる変数の保護属性が同じでなければならない単位に分割したものである。
部分データフローの例を示す前に、図14に図4に示したターゲットプログラムに対するデータフローを示す。このようなデータフローは、プログラムの構文解析をすることにより得ることができる。図2と略同様であるため、図2と同様の関数及び変数に対しては同一の符号を用いている。尚、システムB2101からの入力(図2の2401)については、入力関数「Input」2401として各々表している。また、乱数生成関数2211は、関数「PhysicalRandom」2211として表し、署名生成関数2214は、関数「Sign2」2214として表している。また、システムA2201からの出力(図2の2402、2403)については、出力関数「Output」2402、2403として表している。そして、非セキュリティ関数である関数「Input」2401へは、図1に示す外部装置103から変数(入力変数)が入力され、関数「Output」2402、2403から外部装置103へ変数(出力変数)が出力される。セキュリティに関連する保護情報は、当該ターゲットプログラムにより実現されるシステムA2201に割り当てられた秘密鍵(skA)2213であり、四角のシンボルで表されている。セキュリティ関数のうち、署名検証関数2214は山形のシンボルで表され、乱数生成関数2211はひし形のシンボルで表されている。
本実施の形態においては、このデータフローを、実セキュリティ関数の入出力、実非セキュリティ関数の入出力、または終端変数を端点とする部分データフローに分割する。このように分割すると、各セキュリティ関数または非セキュリティ関数について、その入出力(変数)がすべて異なる部分データフローに含まれることになる。一方、関数以外の、代入や演算子による命令については、その命令に含まれる変数は必ず同じ部分データフローに含まれる。例えば a = b のような代入命令があった場合、a と b は同じ部分データフローに含まれる。後述する保護属性自動決定では、各部分データフローについて、同じ部分データフローに含まれる変数が同じ保護属性をとるように保護属性を決定する。例えば、図14のDF1は、端点がそれぞれ乱数生成関数「#2211_PhysicalRandom」、出力関数「#2402_Output」、署名生成関数(2文書)「#2214_Sign2」である部分データフローである。そして、各関数において、部分データフローに属するそれぞれの入出力である「#2211_PhysicalRandom(#1)」「#2402_Output(#1)」「#2214_Sign2」およびその入出力として実際に代入される変数「rA」の保護属性が同じでなければならないことを意味している。図14のDF3は、端点が署名生成関数(2文書)「#2214_Sign2」と入力関数「#2401_Input」である部分データフローであり、各関数の入出力「#2214_Sign2(#2)」、「#2401_Input(#1)」と、それぞれ実際に代入される変数「rB」、「buf」が同じ部分データフローに属している。ここで「rB」と「buf」が同じ部分データフローに属しているのは、これら2変数の間にはセキュリティ関数あるいは非セキュリティ関数による処理が挟まれていないためである。実際、図4のターゲットプログラムにおいてこれらの変数は「rB = buf」という代入の関係にあり、関数による処理は行われていない。また、図14のデータフローでもこの2変数は矢印で直接つながっており、これは間に関数演算が挟まれていないことを意味している。図14のDF5は、端点が署名生成関数(2文書)「#2214_Sign2」と、終端変数「skA」であるような部分データフロー
である。終端変数とは、どの関数にも入力されない、またはどの関数からも出力されない変数のことであり、図14では「skA」のほかに、「rsize」、「size」、「sigsize」が終端変数である。
プログラム記憶部21に記憶される部分データフローは、図14のようなグラフ表現でもよく、図15のような同じ部分データフローに属する変数によるテーブル表現でも良い。本実施の形態の説明においては、図15の部分データフロー表現を用いて説明を行う。
選択部30は、第2の代替関数型記憶部28に記憶された第2の代替関数型情報を選択して取得する。例えば、選択部30が、第2の代替関数型記憶部28に記憶された代替実関数型情報のうち、未選択のものを1つ選択取得する。選択できた場合は選択した代替実関数型情報を判定部31に送付する。選択できない場合(すべて選択したことがある、あるいは選択できるものがもともとない)は、図3には矢印は図示しないが、後述する保護属性決定部33に、保護属性の決定は失敗した旨の通知をする。
例えば第2の代替関数型記憶部28に図13の代替実関数型情報が記憶されていた場合、番号1、番号2、番号1と番号2の3通りの取得方法がありうる。
判定部31は、選択部30が選択した代替実関数型情報を受け付け、受け付けた代替実関数型情報における特定処理手順がプログラム記憶部21に記憶されたプログラム中に存在するかを判定する。具体的には、選択された特定処理手順に含まれる各始点実セキュリティ関数の特定出力と終点実セキュリティ関数の特定入力の組について、特定出力と特定入力が同じ部分データフローに含まれるかどうかを判定する。本実施形態において、判定部31は、プログラム記憶部21に記憶された部分データフローを利用して判定を行う。
更新部32は、判定部31の判定結果に応じて、選択部30が選択した代替実関数型情報に含まれる実関数型情報で、第2の関数型記憶部24における実関数型情報を置き換える。
保護属性決定部33は、第2の関数型記憶部24に記憶される実関数型情報に基づき、ターゲットプログラム11における各変数の保護属性を決定し、保護属性決定結果12を出力する。具体的には、プログラム記憶部に記憶されたターゲットプログラム中のすべての実セキュリティ関数について、実セキュリティ関数の全入出力変数の保護属性情報と、第2の関数型記憶部に記憶された実セキュリティ関数型情報のいずれか1つに含まれる保護属性情報とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する。
つまり、プログラム記憶部に記憶されたターゲットプログラム中のすべての実セキュリティ関数および実非セキュリティ関数について、前記実セキュリティ関数および実非セキュリティ関数の入出力変数の保護属性情報が、実関数毎関数型情報に記憶された当該実セキュリティ関数および実非セキュリティ関数の実関数型情報のいずれか1つで規定された保護属性情報と一致するような、ターゲットプログラムに含まれる全変数の保護属性情報が存在する場合にはその保護属性情報を出力し、存在しなければエラーを出力する。また、選択部30から保護属性の決定は失敗した旨の通知を受けた場合もエラーを出力する。本実施形態において、例えば、保護属性決定部33は、プログラム記憶部21に記憶された部分データフローを利用して保護属性決定を行う。保護属性決定に成功した場合は、保護属性決定結果12はターゲットプログラムに存在する全ての変数とそれぞれに対する保護属性である。例えば、図4に示したターゲットプログラムに対する保護属性自動決定が成功した場合、図16のように、図4のターゲットプログラムに含まれる全ての変数(図4の2〜11行目で宣言された変数)と、各変数に対する保護属性が出力される。このとき保護属性自動決定55の実行ログを含んでも良い。また、図16の保護属性決定結果には、各関数において、多重定義されたうちのどの関数型情報が選択されたかという情報や、部分データフローあるいは後述する保護属性決定テーブルに含まれる、各実関数の入出力(図15の例で言えば#2211_PhysicalRandom(#1)など)およびその保護属性情報を出力してもよい。一方、保護属性決定に失敗した場合、保護属性決定結果12は保護属性決定失敗を意味する特殊なオブジェクトやエラーメッセージなどでもよく、保護属性決定部33の実行ログなどでもよい。
保護属性決定テーブル記憶部34は、保護属性決定テーブルを記憶する。保護属性決定テーブルは、ターゲットプログラムの部分データフローに、各部分データフローの確定保護属性と、各変数がとりうる保護属性候補を追記したものである。
実関数毎関数型復元部35は、保護属性決定部33の保護属性決定の成功または失敗に応じて、一時記憶部25から取得した実関数型情報で、第2の関数型記憶部24における実関数型情報を置き換える。
本実施形態においては、関数単体のみを考慮して保護属性が定義された関数型だけではプログラム中の変数の保護属性が決定できない場合に、複数の関数の入出力関係(特定処理条件)を考慮した保護属性決定を行うことが可能となる。
(2)動作
次に、本実施の形態にかかる情報処理装置1の行う保護属性決定処理の手順について図17を用いて説明する。この保護属性決定処理では、情報処理装置1は、上述の保護属性の計算ルールや変数の代入ルール、セキュリティ関数及び非セキュリティ関数の入出力変数の関数型、及び特定処理手順の存在を考慮しながら、与えられたプログラムの各変数に対して保護属性を適切に付与する。
まず、プログラム受付部20が、プログラム記憶部21にターゲットプログラム11を取得する(ステップS1)。
次に、関数型抽出部23が、プログラム記憶部21に記憶されたターゲットプログラム11に含まれる実セキュリティ関数毎に、第1の関数型記憶部22に記憶された対応する関数型情報(特許請求の範囲の第1の関数型情報)から実関数型情報(特許請求の範囲の第1の実関数型情報)を抽出し、抽出した実関数型情報を第2の関数型記憶部24および一時記憶部25に記憶させる(ステップS2)。
そして、部分データフロー変換部29が、プログラム記憶部21に記憶されたターゲットプログラムを部分データフローに変換し、プログラム記憶部21に(ターゲットップログラムに加えて)記憶させる(書き込む)(ステップS3)。
例えば、図4のターゲットプログラム、図6の関数型情報を入力とした場合、第2の関数型記憶部24には図10の実関数型情報(特許請求の範囲の第1の実関数型情報)が記憶され、プログラム記憶部21には、図4のターゲットプログラムと、図15で示した部分データフローが記憶される。
続いて、保護属性決定部33が、第2の関数型記憶部24に記憶された実関数型情報を用いて、プログラム記憶部21に記憶されたターゲットプログラム11における各変数の保護属性を(特定処理手順を考慮せずに)決定し(ステップS4:基本保護属性自動決定)、保護属性決定結果12を出力する。
この基本保護属性決定処理において、保護属性の決定に成功した場合(ステップS5:YES)情報処理装置1は処理を終了するが、保護属性の決定に失敗した場合(ステップS5:NO)、本実施の形態に係る特定処理手順を考慮した保護属性決定処理を行う(ステップS6)。この特定処理手順を考慮した保護属性決定処理において、保護属性の決定に成功した場合(ステップS7:YES)、情報処理装置1は処理を正常に終了し、保護属性の決定が失敗した場合(ステップS7:NO)異常であるとして処理を終了する。特定処理手順を考慮した保護属性決定処理の詳細については後述する。
ここで、ステップS4の基本保護属性決定処理について図18を用いて詳細に説明する。まず保護属性決定部33は、ターゲットプログラム11の宣言解析により、プログラム中の変数および定数に付与された初期保護属性情報を取得する(ステップS10)。
次に、保護属性決定部33は、ステップS10で取得した初期保護属性情報、ターゲットプログラム11の部分データフローおよび第2の関数型記憶部24に記憶された実関数型情報から、保護属性決定テーブル記憶部の保護属性決定テーブルを生成(初期化)する(ステップS11)。保護属性決定テーブルは、ターゲットプログラムの部分データフローに、各部分データフローの確定保護属性情報と、各変数がとりうる保護属性候補情報を追記したものである。
例えば、図4のターゲットプログラム、図10の実関数型情報、図15の部分データフローを入力としたときの保護属性決定テーブルは図19のようになる。
左2列は図15の部分データフローとまったく同じである。確定保護属性情報は部分データフロー番号毎の確定した保護属性情報であるが、最初はすべて未決定であるため、すべて空欄の状態で生成される。保護属性候補情報は、関数の入出力部分(関数名が指定されていているもの)には実関数型情報で定義されたその入出力としてとられる変数の保護属性制約が、それ以外の変数部分(関数名が指定されていないもの)にはプログラム中に記載された初期保護属性が(存在すれば)記述される。例えば、部分データフロー番号1の関数入出力#2211_PhysicalRandom(#1)は、図10の実関数型情報より、その保護属性がverifiedまたはconcealedまたはconfidentialと多重定義されているので、それらが書きこまれる(図19における「/」はまたはを表す)。一方、部分データフロー番号5の関数入出力#2214_Sign2(#3)は、図10の実関数型情報の多重定義A、 Bいずれにおいてもconfidentialと定義されているため、confidentialのみが書き込まれる。また、ステップS10で取得した初期保護属性情報より、部分データフロー番号5の変数skAはconfidentialとなっている。保護属性候補情報が空欄となっている部分については制約が無い、すなわち「exposed/fixed/hidden/verified/concealed/confidential」と記録されているのと同じである。
次に保護属性決定部33は、保護属性情報が確定していない(確定保護属性情報が空欄の)部分データフローをひとつ選択する。(ステップS12)
次に保護属性決定部33は、選択した部分データフローの保護属性一致判定が可能かを判定する(ステップS13)。一致判定が可能とは、選択した部分データフローに含まれる変数のうち、保護属性候補情報としてただ1つの保護属性情報が記録されたものが存在するかということである。図19の例で言えば、保護属性候補情報としてただ1つの保護属性情報が記録された変数は #2401_Input(#1)、 #2401_Input(#2)、 skA、 #2214_Sign2(#3)である。
もし判定結果がYESならば、保護属性決定部33は、選択した部分データフローの保護属性を確定できるかを判定する(ステップS14)。具体的には、選択した部分データフローに含まれる変数のうち、(ステップS13で存在を確認した)保護属性候補情報としてただ1つの保護属性情報が記録された変数を1つ選択し、その変数の保護属性候補情報である(ただ1つの)保護属性情報 att が、選択した部分データフローに含まれる全ての変数の保護属性候補情報に含まれるかを調べる(ステップS14)。含まれる場合は、全ての変数の保護属性を att に確定することができると判定される(ステップS14:YES)。 確定できない場合は(ステップS14:NO)、制約を満たすような保護属性の割り当てができないということになるため、失敗として保護属性決定処理を終了する。
保護属性の確定ができる場合(ステップS14:YES)、保護属性決定部33は、選択した部分データフローの確定保護属性情報として、前ステップで確定した保護属性(ステップS14の説明における保護属性情報 att)を保護属性決定テーブルの確定保護属性情報として書き込む(ステップS15)。
次に保護属性決定部33は、確定保護属性情報の影響を保護属性決定テーブルの保護属性候補情報に反映させる(ステップS16)。具体的には、選択した部分データフローに含まれ各実セキュリティ関数または非セキュリティ関数について、多重定義された実関数型情報のうち、選択した部分データフローに含まれる変数が選択した部分データフローの確定保護属性をとるものだけを選択し、選択した関数型により、保護属性決定テーブルにおける同セキュリティ関数または非セキュリティ関数の変数の保護属性候補情報を更新する。
例えば、図19において仮に部分データフロー番号1の確定保護属性がverifiedとなったとき、#2402_Output(#1)は verified に確定する。ここで図10の実関数型情報を見てみると、#2402_Output の多重定義において、第1変数(#2402_Output(#1))の保護属性は、多重定義Aでは exposed、多重定義Bでは verified となっているため、多重定義Bしかとりえないことになる。すると、多重定義Bより、第2変数(#2402_Output(#2))の保護属性は verified しかとりえないことになる。これにより、図19の保護属性決定テーブルにおける部分データフロー番号2の#2402_Output(#2) の保護属性候補情報は、exposed / verified から verified に更新される。同様に、 #2211_PhysicalRandom(#1) 、#2214_Sign2(#1) の保護属性 が verified に確定することから、#2211_PhysicalRandom は多重定義C、 #2214_Sign2(#1)は多重定義Bが選択され、それに応じて#2214_Sign2(#2)、 #2214_Sign2(#4) の保護属性候補情報はそれぞれ#2214_Sign2の多重定義Bから verified、 verified に更新される。
その後、保護属性決定部33は、保護属性決定テーブルに保護属性が未確定の(確定保護属性が空欄の)部分データフローが存在するか否かを判定する(ステップS17)。保護属性が未確定の部分データフローが存在しない場合(ステップS17:NO)、保護属性の決定は成功となり、情報処理装置1は、保護属性決定テーブルから全ての変数と確定保護属性情報の組を抜き出して保護属性決定結果12を生成し、それを出力して(ステップS18)、処理を終了する。この場合、図17では、ステップS5の判定結果が肯定的となり、情報処理装置1は処理を正常に終了する。一方、保護属性が未確定の部分データフローが存在する場合(ステップS17:YES)、ステップS12に戻り、情報処理装置1は上述の処理を繰り返す。このとき、過去にステップS12で選択されステップS13で一致判定不可能と判定された部分データフローであっても、ステップS16において保護属性候補が絞られることにより、再度ステップS12で選択された時にはステップS13で一致判定可能となる場合がある。このような処理を繰り返すにつれ、保護属性決定テーブルにおける保護属性候補が順次絞られ、保護属性が確定していく。
前述した部分データフローの分割の仕方により、セキュリティ関数以外の操作は、それぞれ分割された部分データフローに対応する(入出力変数が同じ部分データフローに属する)。上述の検査を行うことにより、セキュリティ関数以外では異なる保護属性が付与された変数の計算が行われないことが保証できるため、機密情報の攻撃者に対する間接的な漏れや、攻撃者により改変された情報によって保護対象の情報が汚染されることが防止できる。
ステップS4で説明した基本保護属性決定処理では、多くのプログラムでその保護属性を自動で決定することが可能であるが、保護属性を自動で決定できない例も存在する。実際、図19の保護属性決定テーブルでは部分データフロー番号「3」の部分データフローにおいて、入力関数「Input」の第1変数「#2401_Input(#1)」の保護属性候補情報は「exposed」である。しかし、「#2214_Sign2(#2)」の保護属性候補情報は「verified」または「confidential」である。よって、保護属性の一致が不可能である。
本実施の形態では、特定処理手順を考慮することにより、このような事例に対して1つの解決策を与えている。図17に示すように、ステップS4の基本保護属性決定処理で保護属性の決定に失敗した場合、情報処理装置1は、ステップS6で、特定処理手順を考慮した保護属性決定処理を行う。
ここで、特定処理手順を考慮した保護属性の決定処理の詳細について図20を用いて説明する。図20は保護属性の決定処理のフローの例を示す図である。
まず、代替関数型抽出部27が、プログラム記憶部21に記憶されたターゲットプログラムに含まれる実セキュリティ関数毎に、特定処理手順と実関数型の組からなる代替実関数型情報を第2の代替関数型記憶部28に抽出する(ステップS30)。
例えばターゲットプログラムが図4、第1の代替関数型記憶部26に記憶された代替関数型情報が図11のとき、抽出される代替実関数型情報は図13のようになる。
次に、選択部30が、第2の代替関数型記憶部28に記憶された代替実関数型情報のうち、未選択のものを1つ選択取得する(ステップS31)。選択できた場合(ステップS32:YES)、ステップS33に進むが、選択できない場合(すべて選択したことがある、あるいは選択できるものがもともとない)(ステップS32:NO)、保護属性の決定は失敗する。ここでの失敗は、特定処理手順を考慮しても、セキュリティの観点から安全でないデータフローが存在するということを意味している。この場合、図17のステップS7が否定的となり、異常であるとして情報処理装置1は処理を終了する。
ステップS32が真となった場合、判定部31が、選択部30が選択した代替実関数型情報における特定処理手順がプログラム記憶部21に記憶された部分データフローに存在するかを判定する(ステップS33)。具体的には、選択された特定処理手順に含まれる各始点実セキュリティ関数の特定出力と終点実セキュリティ関数の特定入力の組について、特定出力と特定入力が同じ部分データフローに含まれるかどうかを判定する。判定結果が真のとき(ステップS33:YES)は、ステップS34に進み、判定結果が偽のとき(ステップ33:NO)は、ステップ31に戻る。
例えば部分データフローが図15、代替実関数型情報が図13のとき、ステップS31で選択部30は図13の番号1、または2を選択する。ステップS31で番号1が選択された場合、特定処理手順で示された「#2211_PhysicalRandom(#1)」と「#2214_Sign2(#1)」は共に図15の部分データフローにおける部分データフロー「1」に含まれる。この特定処理手順には始点実セキュリティ関数の特定出力と終点実セキュリティ関数の特定入力の組が1つしかないため、ステップS33での判定結果はYESとなる。また、ステップS31で番号2が選択された場合、「#2211_PhysicalRandom(#1)」と「#2214_Sign2(#2)」が図15において異なる部分データフローグラフに含まれているため、ステップS33での判定結果はNOとなる。
なお、図11の3〜6番目のように始点関数の特定出力と終点関数の特定入力の組が複数存在する場合は、複数存在する組のそれぞれがいずれかの部分データフローグラフに含まれるかどうかを調べることになる(全ての組が同一の部分データフローに含まれる必要はない)。
ステップS33の判定結果が真のときは、更新部32が、判定部31が選択した実セキュリティ関数の代替実関数型情報に対応付けられた実関数型情報で、第2の関数型記憶部24における同実セキュリティ関数の実関数型情報を置き換える(ステップS34)。例えば上記の例で、ステップS31で選択部30が図13の番号1を選択し、ステップS33でYESと判定された場合、更新部32は、図13の番号1で指定される実関数型情報で、図10の#2214_Sign2の実関数型情報を置き換えるため、結果は図21のようになる。
次いで、保護属性決定部33が、ステップS33で更新した第2の関数型記憶部24に記憶された実関数型情報を用いて、プログラム記憶部21に記憶されたターゲットプログラム11における(特定処理手順を考慮した)各変数の保護属性決定を行い(ステップS35)、保護属性決定結果12を出力する。この基本保護属性決定処理において、保護属性の決定に成功した場合(ステップS36:YES)情報処理装置1は処理を終了する。保護属性の決定に失敗した場合(ステップS36:NO)、更新部32は、ステップS34で置き換えた実関数型情報を更新前の状態にもどす(ステップS37)。具体的には、復元部35が、一時記憶部25から取得した実セキュリティ関数の実関数型情報で、第2の関数型記憶部24における実関数型情報(実セキュリティ関数型情報)を置き換える。その後ステップS31に戻る。
例えば上記の例において、図21のように更新された実関数型情報を使ってステップS35の基本保護属性決定を行うと、初期状態(図18におけるステップS11終了後)の保護属性決定テーブルは図22のようになり、部分データフロー番号3の保護属性候補情報が exposed で一致可能であることがわかる。実際この保護属性決定テーブルを用いて保護属性自動決定を行ったときの保護属性候補情報の変化は図23のようになる。実際は保護属性決定テーブルの保護属性候補情報を随時更新していくが、この図では保護属性候補が絞られていく様子がわかるように、保護属性候補情報の変化の過程を示している。網掛けの部分は、その部分データフローがステップS12で選択され、候補が複数あった変数の保護属性が太字の保護属性に確定したことを意味している。また、それ以外の部分データフローにおける太字は、選択された部分データフローの保護属性が確定したことにより、保護属性候補情報がステップS16において派生的に限定されたことを示している。例えばフェーズ1では部分データフロー番号3の保護属性がexposedに確定し、#2214_Sign2(#2)の保護属性が verified に確定したことによって、#2214_Sign2(#1)、 #2214_Sign2(#4)の保護属性も(図21の #2214_Sign2 の多重定義がBに決定することより)それぞれ verified となっている。最終的に、すべての保護属性が決定し、保護属性決定部33は、図16に示す保護属性決定結果12を出力する。
以上のように、本実施形態においては、特定処理手順を考慮して、各変数に付与すべき保護属性情報を決定する。例えば、図4に示すターゲットプログラムの例の場合では、乱数生成関数の出力から署名生成関数の入力(の一方)への経路が存在する場合に限り、署名生成関数の入力(のもう一方)に完全性がない値が入力されたときの署名生成を許可するというルールを適用することで、各変数に適切な保護属性情報を付与することができる。
また、保護属性自動決定では、セキュリティプロトコルの記述で用いる各変数に完全性や機密性に関する保護属性を付与し、非セキュリティ関数および代入などの演算による計算は同一の保護属性の変数間に限定する。これにより、保護データと非保護データとが分離される。更に、暗号化処理による保護属性の変換に対応するため、異なる保護属性間での計算を、セキュリティ関数によるものに限定し、計算の種別ごとに入力及び出力の保護属性を関数型情報により制限する。例えば、公開鍵暗号文復号関数においては、秘密鍵は機密性と完全性との両方が要求される。また、入力される暗号文は非保護データであるのに対して、復号された結果である出力は、機密性を有する保護データとなる。これにより、保護属性の変換が安全な計算のみに限定され、例えば特許文献1の技術のように保護データを誤って外部に出力してしまう恐れを排除して、保護属性の変換誤りを低減することができる。
以上のように本実施の形態においては、(R1)異なる保護属性の計算を禁止する、(R2)一方向性計算での保護属性の変換及び入力及び出力の保護属性を限定する、という2つのルールをベースとし、更に、(R3) 特定処理手順を考慮して保護属性を決定することにより、各変数に対して保護属性を適切に付与することができる。従来技術では、特定処理手順に応じて関数型情報を動的に変化させることはできず、適切な保護属性を付与することができない。本実施の形態においては、特定処理手順に注目することで、保護属性を適切に付与することができる。このようなプロトコルには、例えば、インターネットにおける標準的なプロトコルである SSL/TLSや、映像コンテンツのコピープロテクト規格であるAACSにおけるドライブ認証プロトコルがあり、これらのプロトコルに本実施の形態の構成を適用することは有用である。
以上のことから、保護メモリ領域及び非保護メモリ領域の2種類のメモリ領域にアクセス可能なプログラミングモデルにおいて、保護メモリ領域を活用した一般的なセキュリティプロトコルの安全な実装の支援することができる。つまり、本実施の形態においては、このようなプログラミングモデル上で、一般的なセキュリティプロトコルにおいて保護メモリ領域に記憶すべき保護データと非保護メモリ領域に記憶すべき非保護データとの分離を適切に行うために、データの流れ(データフロー)だけではなく、途中で行われる暗号化処理などの各処理およびその処理手順(処理経路)に注目して、各変数に対する保護属性を適切に決定している。この結果、これらの変数を保護属性に応じて保護メモリ領域又は非保護メモリ領域に適切に記憶させることができ、非保護メモリ領域を利用した外部からの入出力と内部に保持すべき変数に対する保護メモリ領域における保護とを両立させることができる。
図24は、本実施形態の発明をスマートグリッドに適用した例について示す図である。
本実施の形態にかかるセキュリティプロトコルに従ったプログラムモジュールが実行されるターゲットシステム101として、スマートグリッド(次世代電力網)におけるスマートメータが考えられる。スマートグリッドとは、大規模発電や分散型発電などの電力の供給側と、住宅やオフィスなどの電力の需要側を結ぶ、電力と通信のネットワーク、あるいはこれを含んだシステム全体のことを指す。通信技術を利用した制御技術により、消費者の電力需要をリアルタイムで把握・予測しながら需要に応じて太陽光発電や蓄電池から電力を供給したり、家庭やビルで使用している機器の電源を制御したりすることで、電力の需要と供給のバランスを取ることが可能になり、電源と負荷双方を制御することが可能となる。また、スマートメータとは、通信機能つきの電力量計のこと、あるいはこれを含んだシステム全体の事を指す。以下では、スマートメータという言葉は前者をあらわすものとする。スマートグリッドおよびスマートメータの概念図を図24の下部に示す。スマートメータ701は、住宅702あるいはオフィスなどにおいて家電703あるいはその他の電力を使用する機械等より使用された電気使用量などのデータを記録する。スマートメータ701は、電力網(スマートグリッド)704を介して、電力事業者705、制御・検針端末706、発電所707などとの双方向通信が可能である。スマートメータ701は、電力事業者705、制御・検針端末706、発電所707からのリクエストに応じて記録したデータを送信したり、家電703の制御を行ったりする。逆に、スマートメータ701から送信されたデータに従い、発電所707における電力供給量を制御するといったことも考えられる。
スマートメータ701は、スマートグリッド704を介して、電力使用量などのプライバシー情報(機密情報)をスマートグリッド704経由で転送したり、制御・検針端末706あるいは他のスマートメータとの認証を行ったりするため、機密情報を扱うことになる。一方で、スマートグリッド704を介した外部との通信も必須である。そのため、スマートメータ701のファームウェアにおいて、セキュリティプロトコルを実行する必要があり、プロトコルに含まれる各データを適切に保護する必要がある。
図24の上部は、スマートメータ701の詳細について、図1に対応させて説明した図である。スマートメータ701(図1の101に対応)のファームウェア実行装置708(図1の201に対応)は、保護メモリ領域215、非保護メモリ領域214を持つ。例えば、プロセッサ内部のオンチップメモリと、プロセッサ外部のオフチップメモリをそれぞれ保護メモリ領域215と非保護メモリ領域214とみなすことができる。このとき、本実施の形態における情報処理装置1を利用することにより、スマートメータ701で実行されるセキュリティプロトコルを実現するファームウェア(プログラム)における(機密情報などを含む)変数の保護属性を適切に決定し、変数の値を適切に保護することが可能となる。特に、認証などにおいては、チャレンジアンドレスポンスプロトコルがよく利用されるため、本実施の形態における特定処理手順を考慮した保護属性自動決定により、従来の手法では判定ができなかったチャレンジアンドレスポンスプロトコルを実現するプログラムに対しても、各変数に対して適切な保護属性を決定することが可能となる。
尚、上述の実施の形態においては、ステップS31で唯1組の代替実関数型情報を選択しているため、実関数型情報の更新は唯1の代替実関数型情報を用いて行われる。これに限らず、一度に複数の代替実関数型情報を選択する、複数の特定処理手順を考慮した保護属性自動決定についても、上記の実施の形態から容易に類推できる。
例えば、図20において、ステップS31で第2の代替関数型記憶部28に記録された代替実関数型情報全体からなる集合の部分集合を1つ選択し、ステップS33で当該部分集合に含まれるすべての代替実関数型情報に対応付けられた特定処理手順がプログラムに存在するかを判定し、ステップS34で同部分集合に含まれる全ての代替実関数型情報(特許請求の範囲の第2の代替関数型情報に対応)に対応付けられた実関数型情報で、第2の関数型記憶部の実関数型情報(特許請求の範囲の第1の実関数型情報に対応)の更新を行い、ステップS36で基本保護属性自動決定を行うことで、複数の特定処理手順を考慮した保護属性自動決定を行うことができる。また、これに限らず、実関数型情報の更新を再帰的に行ったり、必要な情報を管理しながら処理を繰り返し実行したりすることによっても、複数の特定処理手順を考慮した保護属性自動決定を行うことができる。
本実施の形態によれば、セキュリティプロトコルに従ったプログラムの各変数に対して保護属性を適切に決定することが可能になる。
上述の実施の形態においては、部分データフローを用いてステップS33の特定処理手順の検出とステップS35(あるいはステップS4)の保護属性自動決定を行ったが、必ずしも部分データフローを用いる必要はない。
特定処理手順の検出は、特定処理手順を表すグラフ(例えば図12のようなデータフロー)がターゲットプログラムのグラフ(例えば図14のようなデータフロー)に存在するかどうかを、グラフマッチングなどのアルゴリズムを用いて行ってもよい。あるいは、ターゲットプログラムを直接解析して、特定処理手順における始点実セキュリティ関数の特定出力と、終点実セキュリティ関数の特定入力に共通に使われている変数があるかどうかを調べてもよい。
保護属性自動決定について、上述の実施の形態では、代入や演算子による演算を部分データフローの端点とせず、それらの入出力を同じ部分データフローに所属させることで、それらの入出力保護属性が同じでなければならないという条件を定義していた。その代替として、代入や演算子を用いた命令についても、それらの呼び出し毎に、入出力が同じ保護属性をとらなければならないという実関数型情報を第2の関数型記憶部に記憶し、各実関数および代入や演算子による演算について、その入出力変数の保護属性が、対応する実関数型情報のいずれか1つで規定された保護属性と一致するようなターゲットプログラムに含まれる全変数の保護属性を決定してもよい。この決定は、(実関数型情報による)制約条件をみたす解(各変数の保護属性情報)を求める問題と考えられるため、一般的に知られる制約問題を解くアルゴリズムを用いてもよい。例えば、全変数の保護属性を適当に仮決定し、それが実関数型情報による制約条件を満たすかどうかを順次判定していってもよいし、バックトラックなどを用いて全変数の保護属性候補の選択を効率的に行ってもよい。
(第2の実施形態)
次に、情報処理装置、プログラム開発システム、プログラム検証方法及びプログラムの第2の実施の形態について説明する。なお、上述の第1の実施の形態と共通する部分については、同一の符号を使用して説明したり、説明を省略したりする。
本実施の形態における構成では、第1の実施の形態における構成に加え、前記保護属性決定手段が出力した保護属性を前記ターゲットプログラムにおける変数に定義する保護属性付与部と、当該ターゲットプログラムから、前記各変数の保護属性に応じて当該変数が格納されるメモリ領域を決定し、これらのメモリ領域を反映したコンピュータで実行可能な実行可能形式プログラムを生成するコンパイル部とを備える。
本実施の形態においては、機械語プログラムの生成と開発とを行うシステムについて説明する。上述の第1の実施の形態における保護属性決定処理においては、ターゲットプログラムのプログラムリストを解析し、各変数に対して適切な保護属性を決定して付与した。しかし、この決定が適切に行われるためには、ターゲットプログラムのプログラムリストの記述において、セキュリティプロトコルにかかるデータフローが正しく記述されていることが前提である。当然セキュリティプロトコルの仕様自体が機密情報を不用意に漏らしてしまうような欠陥を持たないこともこれ以前の前提として含まれるが、セキュリティプロトコルの仕様自体の安全性検証についてはいくつかの手法が既に知られており、本実施の形態においては実装対象のセキュリティプロトコルが安全性について予め検証済みであることを前提とする。このような技術の例として、以下の参考文献「Reasoning About Belief in Cryptographic Protocols”Li Gong、Roger Needham、Raphael Yahalom 1990 IEEE Symposium on Security and Privacy、1990」に形式的手法を用いたプロトコル検証の例が開示されている。本実施の形態では実装対象のセキュリティプロトコルの仕様はこの参考文献の手法に限定せず、なんらかの安全性検証が予め行われていることを前提とする。
さて、セキュリティプロトコルにかかるデータフローが正しく実装されているかを検証する場合、通常、ターゲットプログラムを実行して入力及び出力が仕様に正しく従うかを判定するいわゆる機能検証が用いられる。一方、本実施の形態においては、変数の保護属性を自動で決定することができるが、適切に保護属性が決定されるためには、プロトコルのデータフローが正しく実装されていることが前提である。よって、プログラマはまず第1段階でデータフローの誤りを排除し、第2段階で、本実施の形態にかかる情報処理装置1により保護属性を自動で決定する。
図25は、本実施の形態にかかる保護属性決定処理を適用したプログラム開発フローである。開発フローは大きく2つに分かれている。1つは、プログラマがデータフローの誤りを排除して機能検証を行うフェーズ1100であり、当該データフローの各変数に対して情報処理装置1が保護属性を自動で決定して実行可能な形式のプログラムを自動的に生成するフェーズ1200とである。フェーズ1100では、プログラマは、セキュリティプロトコルにかかるプログラムの開発を開始して、データフローの正しさに注意してプログラムのプログラムリストを記述する(ステップS1101)。この段階では、プログラマは変数に対して保護属性を付与しないでプログラムのプログラムリストを記述する。ただし、プログラマはデータフローの実装において基本的な変数、例えば、自身の秘密鍵のような信頼の基点(Root of Trust)となる変数については、この時点で適切な保護属性を把握しておくことが一般的であると考えられる。
次にプログラマはコンパイラで当該プログラムの実行形式を生成し(ステップS1102)、それを実行して、機能試験用の入力データに対して所望の出力データが得られるかの機能試験を行う(ステップS1103)。この機能試験に失敗した場合(ステップS1104:NO)、プログラマはデータフローの誤りを修正し(ステップS1151)、ステップS1102〜S1103でコンパイル及び機能試験を再度行い、機能試験の結果が正しくなるまで(ステップS1104:YES)ステップS1151、S1102〜S1103を繰り返す。機能試験用の適切な入力データが与えられていれば、この機能試験の結果が正しくなった段階ではデータフローの誤りは排除されているはずである。次にプログラマは、情報処理装置1に当該プログラムをターゲットプログラムとして入力して、上述の第1の実施の形態で説明した基本保護属性自動決定および特定処理手順を考慮した保護属性決定処理(図17)を情報処理装置1に行わせる。情報処理装置1への入力として、プログラマがステップS1101の段階において把握している上述のRoot of Trustの保護属性をターゲットプログラム中の変数の初期値として与えることもある。そして、保護属性決定処理の結果、保護属性の決定に失敗した場合は(ステップS1202:NO)、セキュリティプロトコルの仕様に従ってデータフローが正しく記述されていても、プログラマが余分な変数やデータフローを実装のために付加してしまったため、機密情報を外部に出力したり漏洩したりしている、あるいは保護すべき変数を信用できない入力で汚染してしまうようなプログラムとなっていると考えられる。
一方、保護属性の決定に成功した場合は(ステップS1202:YES)、情報処理装置1における保護属性付与部が、ターゲットプログラムのプログラムリストを書き換える。具体的には、保護属性付与部は、プログラムリストの各変数に対して自動で決定した保護属性をプログラムリストに付加する(ステップS1203)。図26は、図4に示したターゲットプログラムに対してステップS1201の保護属性自動決定を行ったとき、出力される図16の保護属性決定結果に従ってターゲットプログラムを書き換えた例を示す図である。同図においては、4、5行目のパラメータ(変数)、及び7〜11行目の変数に保護属性が付加されていることが示されている。最後に、情報処理装置1におけるコンパイル部が、ステップS1203でプログラムリストを書き換えたプログラムをコンパイルする(ステップS1204)。この結果、保護属性に応じて変数の値を保護メモリ領域又は非保護メモリ領域に適切に記憶させることができる実行可能な形式のプログラムが生成される。
以上のような構成によれば、セキュリティに詳しくないプログラマがセキュリティプロトコルにかかるプログラムを開発したとしても、情報処理装置1が各変数に対して適切な保護属性を自動で付与し、保護属性に応じて変数の値が適切なメモリに記憶される実行可能形式のプログラムを開発することが可能である。このため、セキュリティプロトコルにかかるプログラムの開発環境を向上させることができる。
例えば、第1の実施の形態において図24で示したスマートメータ701上で実行されるセキュリティプロトコルを実現するファームウェア(プログラム)において、本実施の形態によれば、プログラム中の変数の値を、スマートメータにおけるプロセッサ内部のオンチップメモリ(保護メモリ215)と、プロセッサ外部のオフチップメモリ(非保護メモリ214)に適切に格納して実行するファームウェア(プログラム)を生成することができる。
上記までの実施形態にかかる発明は、例えば以下のような場面での適用が考えられる。
近年、PC(Personal Computer)等の情報機器の普及に伴い、コンピュータセキュリティに対する意識が高まっている。このため、個人情報など、コンピュータ内部に保護すべきデータ(保護データ)をもつようなソフトウェアを安全に実行するためには、ソフトウェア内の保護データを外部に出力しないように、機密性を有する保護データと、外部に入出力するための非保護データとを分離して扱う必要がある。例えば、コンピュータ内に保護すべきデータがある場合、OS(Operating System)の特権モードと、通常モードとでユーザがアクセスできる領域を切り分けることで、不必要にデータが読み出されることを防止している。また、従来技術では、モードの切り替えによりメモリを保護するのではなく、セキュアメモリ空間のデータや命令を外部に読み出すことをできなくすることで、保護データの悪用を回避している。即ち、プロセッサがアクセスするメモリ空間にはセキュア空間と非セキュア空間とがあり、セキュア空間からレジスタに読み込んだ情報にはセキュアであることを示す一種のセキュリティタグが付与され、当該データを非セキュア空間へ書き出すことができない機構を設ける。このような機構により、セキュア空間の情報が非セキュア空間に漏れ出ることを防止する。
セキュア空間と呼ばれているメモリ領域(保護メモリ領域)の実現方法としては、アクセス制御のみによるもののほか、従来技術の暗号機能とチップ内メモリのアクセス制御の組み合わせにより実現されるものもある。暗号機能との組み合わせにより保護が実現される場合、保護の概念は権限を持つ人だけが情報にアクセスでき、権限のない人が読み取れないという性質である機密性の保護と、情報が完全・正確であり、不慮の事故による欠落や攻撃者による改ざんがないという性質である完全性の保護との2種類に分離され、どちらか片方の保護のみが提供される場合がある。もちろん機密性と完全性との両方の保護を提供することも可能である。
従来技術における方法は保護データと非保護データとを分離するためのメモリ領域をハードウェア的に提供するものであるが、これらを用いてセキュリティプロトコルを実装する場合を考えると、関数による計算において保護データと非保護データとの混在が必然となる。例えば、暗号化を行う関数の場合、保護データである秘密にやり取りしたいメッセージを秘密鍵で暗号化し、外部に出力可能な暗号文にしてから出力する。外部に出力可能にするとは、非保護データにする、すなわちそれを出力しても保護データや秘密鍵の情報が漏れない状態にするということである。
従来技術における方法ではこのような場合例外的にセキュリティタグを解除し、保護データと非保護データとの混在を可能にする機構を前提としている。しかし、この機構の誤用を防止できない恐れがある。即ち、セキュリティタグを誤って解除してしまうことで、保護データを誤って外部に出力してしまうような可能性がある。
従来技術では、プログラム内部に保護レベルの異なるデータとプログラムの部分とが存在するとき、Information Flow Analysisと呼ばれる方法により、高レベルのデータの情報が低レベルの部分に漏れ出すことを防止しながら、セキュリティレベルの異なるプログラム部分間のデータ交換を行うものである。具体的には、セキュリティレベル間のデータ移動における型検査と、高レベルのデータを低レベルに落とす際プログラマに特殊操作を明示的に強制もしくは暗号化操作を適用している。尚、低レベルから高レベルへの変換は無条件で可能である。この方法では、暗号化操作によるセキュリティレベルの変換を用いることで、暗号化処理における保護データと非保護データとの混在を可能としている。しかし、従来技術では、保護データを出力するための暗号鍵はプログラムが静的に保持するもの及び静的に保持するものの派生値に限定される。そのため、外部から送信された値もしくは外部と共有した値を暗号鍵として利用することは禁止されている。このような暗号鍵の利用方法はセキュリティプロトコルではよくあるため、従来技術の技術をセキュリティプロトコル一般に適用することは困難である。従って、セキュリティプロトコルの安全な実装のために、プログラムの各変数に対してデータの保護の要否を適切に決定することが望まれていた。
このような課題に対して、従来技術では、セキュリティプロトコルに含まれる暗号、署名、ハッシュ関数等のセキュリティ関数に注目した保護属性決定方式がある。従来技術では、各セキュリティ関数について、計算量的一方向性と完全性の保証との有無に基づいて変数の値を保護されたメモリ領域又は非保護のメモリ領域に記憶させることを要求する保護属性が定義されており、この条件からプログラムの各変数の保護属性を決定する。従来技術では、外部から送信された値もしくは外部と共有した値を暗号鍵として利用するようなセキュリティプロトコルについて、保護属性を適切に決定する方法があった。
従来技術では、関数ごとに定義された入出力保護属性条件を比較しながら保護属性を決定するが、変数の値がどの関数から出力され(いくつかの処理を経て)どの関数に入力されたかという処理手順(経路)情報は考慮していない。
例えば、ある変数の保護属性を決定する場合、その変数の経路情報に注目しないと、保護属性が適切に決定できない場合が存在する。例えば、SSL(Secure Socket Layer)等に含まれ、認証プロトコルで頻繁に用いられるチャレンジアンドレスポンスプロトコルでは、完全性のある乱数と完全性のない外部入力に対して署名をつけるといった処理が行われる。このとき、前者の入力は完全性を持つだけでは不十分であり「乱数」である必要がある。従来技術では、完全性がある乱数と完全性がある定数は同様に扱われてしまうため、乱数のときに署名を許可し、定数の時に許可しないといった保護属性の決定を行うことができない。
同様に、別のチャレンジアンドレスポンスプロトコルでは、完全性のある乱数と完全性のない外部入力をハッシュ関数に通した値に署名をするようなものも存在する。この場合も、ハッシュ値に完全性のある「乱数」が含まれることが署名許可の条件と考えられるが、従来技術の方式では、ハッシュ値に完全性のある乱数が含まれるかどうかという情報を用いることができないため、適切な保護属性自動決定を行うことができない。
本発明の一観点は、上述に鑑みてなされたものであって、セキュリティプロトコルに従ったプログラムの各変数に対して保護属性を適切に決定することが可能になる。
尚、フェーズ1200のうち、ステップS1201〜S1202を情報処理装置1が行い、ステップS1203以降の処理についてはプログラマが行うようにしても良い。
なお、本発明は前記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、前記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示す全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
なお、上記各実施形態に記載した手法は、コンピュータに実行させることのできるプログラムとして、磁気ディスク(フロッピー(登録商標)ディスク、ハードディスクなど)、光ディスク(CD−ROM、DVDなど)、光磁気ディスク(MO)、半導体メモリなどの記憶媒体に格納して頒布することもできる。
また、この記憶媒体としては、プログラムを記憶でき、かつコンピュータが読み取り可能な記憶媒体であれば、その記憶形式は何れの形態であっても良い。
また、記憶媒体からコンピュータにインストールされたプログラムの指示に基づきコンピュータ上で稼働しているOS(オペレーティングシステム)や、データベース管理ソフト、ネットワークソフト等のMW(ミドルウェア)等が本実施形態を実現するための各処理の一部を実行しても良い。
さらに、本発明における記憶媒体は、コンピュータと独立した媒体に限らず、LANやインターネット等により伝送されたプログラムをダウンロードして記憶または一時記憶した記憶媒体も含まれる。
また、記憶媒体は1つに限らず、複数の媒体から本実施形態における処理が実行される場合も本発明における記憶媒体に含まれ、媒体構成は何れの構成であっても良い。
尚、本発明におけるコンピュータは、記憶媒体に記憶されたプログラムに基づき、本実施形態における各処理を実行するものであって、パソコン等の1つからなる装置、複数の装置がネットワーク接続されたシステム等の何れの構成であっても良い。
また、本発明におけるコンピュータとは、パソコンに限らず、情報処理機器に含まれる演算処理装置、マイコン等も含み、プログラムによって本発明の機能を実現することが可能な機器、装置を総称している。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。