以下、添付図面を参照して、本発明に係る情報処理装置、方法及びプログラムの最良な実施形態を詳細に説明する。なお、以下では本発明に係る情報処理装置、方法及びプログラムを、コンピュータが実行可能なプログラムの開発を行うプログラム開発装置300に適用した例について説明するが、この例に限らないものとする。
まず、図1を参照して、プログラム開発装置300で開発したプログラムが実行される、ターゲットシステム100の仕様について説明する。図1は、ターゲットシステム100のソフトウェア構成を示したブロック図である。図1に示したように、ターゲットシステム100は、プログラムの実行主体であるプログラム実行モジュール11と、OS14とを備えている。
プログラム実行モジュール11は、命令実行部12と、データ格納用メモリ領域13とを有している。ここで、命令実行部12は、プログラムの実行主体となるCPU(Central Processing Unit)等の制御部であって、プログラム実行時に一時的にデータを格納するためのレジスタ121を有している。命令実行部12は、データの入出力をデータ格納用メモリ領域13へのデータ読み書きを通じて行う。
データ格納用メモリ領域13は、非保護メモリ領域131と、保護メモリ領域132とを有している。非保護メモリ領域131は、アクセスに対して何等制限を設けていない非セキュアな記憶領域である。一方、保護メモリ領域132は、特定のプログラムやプロセス等からのアクセスに対してアクセス制限を設けたセキュアな記憶領域である。なお、非保護メモリ領域131と保護メモリ領域132とは、同一の記憶媒体に形成されている態様としてもよいし、個別の記憶媒体で形成される態様としてもよい。また、このような特定のプログラムやプロセスに対する排他的なアクセス制御の実現は、公知の技術を用いることが可能である。
OS14は、命令実行部15と、OS専用データ格納領域16とを有している。ここで、命令実行部15は、ターゲットシステム100の基本ソフトウェアの実行主体となるCPU等の制御部であって、基本ソフトウェア実行時に一時的にデータを格納するためのレジスタ151を有している。また、OS専用データ格納領域16は、命令実行部15専用の記憶領域である。
OS14は、データ格納用メモリ領域13にアクセスを行い、入力データ(例えば、外部装置200からネットワークNを通じて入力されたデータ)の書き込みと、出力データ(例えば、ネットワークNを通じ外部装置200に出力するデータ)の読み出しを行う。ここで、OS14は、データ格納用メモリ領域13のうち、非保護メモリ領域131には任意のタイミング読み書きが可能であるが、保護メモリ領域132に対しては上述したアクセス制御により読み書きが禁止されているものとする。なお、データ格納用メモリ領域13(非保護メモリ領域131)へのアクセスはOS14に限定されるものではなく、OS14管理下の周辺装置によるDMA(Direct Memory Access)転送等によるものも含まれるものとする。
なお、プログラム実行モジュール11の命令実行部12と、OS14の命令実行部15とを同一の制御部としてもよいし、夫々の用途に特化した個別の制御部としてもよい。また、非保護メモリ領域131と、保護メモリ領域132と、OS専用データ格納領域16とを同一の記憶デバイス内に設けた態様としてもよいし、夫々を個別の記憶デバイスに設けた態様としてもよい。以下、図2、図3を参照して、ターゲットシステム100のハードウェア構成例について説明する。
図2は、ターゲットシステム100のハードウェア構成の一例を模式的に示した図である。この構成では、単一のCPU41と、単一の記憶デバイスであるメモリ42とを備えており、各部はバス43により接続されている。ここで、CPU41は、上述した命令実行部12及び命令実行部15の機能を担う制御部であって、保護メモリ領域132へのアクセス制御機能を有するものとする。また、メモリ42には、非保護メモリ領域131、保護メモリ領域132及びOS専用データ格納領域16の夫々に応じた記憶領域が予め確保されている。この構成において、保護メモリ領域132への読み書きをCPU41のアクセス制御機能により管理することで、図1に示したターゲットシステム100の仕様を実現することができる。
また、図3は、ターゲットシステム100のハードウェア構成の他の例を模式的に示した図である。この構成では、二つのCPU51(CPU1)、52(CPU2)と、単一の記憶デバイスであるメモリ53とを備えており、各部はバス54により接続されている。ここで、CPU51は、命令実行部12の機能を担う制御部であって、内蔵する内部メモリに保護メモリ領域132が確保されている。CPU52は、上述した命令実行部15の機能、即ち基本ソフトウェアの実行を担う制御部であって、内蔵する内部メモリにOS専用データ格納領域16が確保されている。また、メモリ53には、非保護メモリ領域131が確保されている。この構成において、保護メモリ領域132への読み書きをCPU51のアクセス制御機能により管理することで、図1に示したターゲットシステム100の仕様を実現することができる。
上述した図1の仕様では、外部装置200のユーザからOS14を介して、非保護メモリ領域131に格納されたデータの盗聴や改ざん等(以下、これらを総称して「攻撃」という)が行われる可能性がある。そのため、本実施形態では、保護すべきデータが非保護メモリ領域131に格納されることがないよう、プログラム作成時に検証を行うことで、不用意にデータが非保護メモリ領域131に格納されてしまうことを防止することが可能なプログラム開発装置300について説明する。以下、プログラム開発装置300について説明する。
図4は、プログラム開発装置300のハードウェア構成を示した図である。ここで、プログラム開発装置300は、ターゲットシステム100で実行されるプログラム(実行可能形式プログラム)の開発を行う開発装置であって、PC等の情報処理装置である。
図4に示したように、プログラム開発装置300は、CPU31と、操作部32と、表示部33と、ROM(Read Only Memory)34と、RAM(Random Access Memory)35と、記憶部36とを備え、各部はバス37により接続されている。
CPU31は、RAM35の所定領域を作業領域として、ROM34又は記憶部36に予め記憶された各種制御プログラムとの協働により各種処理を実行し、プログラム開発装置300を構成する各部の動作を統括的に制御する。
また、CPU31は、ROM34又は記憶部36に予め記憶された所定のプログラムとの協働により、後述する各機能部の機能を実現させる。なお、各機能部の動作については後述する。
操作部32は、キーボードやマウス等の入力デバイスを備え、ユーザから操作入力された情報を指示信号として受け付け、その指示信号をCPU31に出力する。
表示部33は、LCD(Liquid Crystal Display)等の表示デバイスにより構成され、CPU31からの表示信号に基づいて、各種情報を表示する。なお、表示部33は、操作部32と一体的にタッチパネルを構成する態様としてもよい。
ROM34は、プログラム開発装置300の制御にかかるプログラムや各種設定情報等を書き換え不可能に記憶する。
RAM35は、プログラム開発装置300の主記憶装置であって、CPU31の作業エリアとして機能し、バッファ等の役割を果たす。
記憶部36は、磁気的又は光学的に記録可能な記憶媒体を有し、プログラム開発装置300の制御にかかるプログラムや各種設定情報等を書き換え可能に記憶する。また、記憶部36は、後述する代入時変換ルール(図7参照)やセキュリティ関数リスト(図8参照)、非セキュリティ関数リスト(図10−1、10−2参照)等を記憶している。
次に、プログラム開発装置300で開発するプログラムの実装環境について説明しながら、記憶部36に記憶される各種の情報について説明する。まず、以下の実装環境説明で用いられるセキュリティ処理の表記を説明する。E_Kx[Content]は、鍵KxによりContentを暗号化した結果の暗号文を意味する。暗号化には公開鍵方式、共通鍵方式の種別があるが、鍵Kxの種別によって定まる。また、cert[Text]は、署名対象Textに対して生成された署名を意味する。||記号はビット連接を意味する。
図5は、プログラム開発装置300で開発するプログラムの具体的な実装環境の一例を示した図である。同図では、実装環境の一例として、プログラム実行モジュール110とシステム210との間でハイブリッド暗号を利用したセキュリティプロトコルにより、メッセージ転送を行う態様を示している。なお、実際にはプログラム実行モジュール110にて実行されるプログラム(実行可能形式プログラム)の生成を、プログラム開発装置300にて行う。
図5において、プログラム実行モジュール110は、図1に示したターゲットシステム100のプログラム実行モジュール11に対応するものである。また、システム210は、図1で示した外部装置200に対応するものである。CA220は、プログラム実行モジュール110とシステム210との間の認証で必要な、公開鍵(KpCA)と鍵証明書を発行する認証局(Certificate Authority)である。
なお、CA220から、プログラム実行モジュール110、システム210の夫々にCA220の公開鍵KpCAが予め配布されているものとし、この公開鍵KpCAの正当性(完全性)は予め保証されているものとする。また、CA220は、CA220自身の秘密鍵を用いて、システム210の公開鍵KpAについての公開鍵証明書KpA||cert[KpA]を事前に発行し、これをシステム210に予め配布しているものとする。なお、公開鍵証明書KpA||cert[KpA]には、システム210の公開鍵KpAが含まれているものとする。
また、プログラム実行モジュール110は、プログラム実行モジュール110自身の秘密鍵KsBと、転送対象となるメッセージMsgと、CA220から配布された公開鍵KpCAとを保持しているものとする。KpCAをプログラム実行モジュールが保持する手段として、命令実行部12に示したレジスタ121または図示しない記憶デバイスのような手段を用いることができる。また、システム210は、システム210自身の秘密鍵KsAと、自身の公開鍵KpAと、CA220により発行された公開鍵証明書KpA||cert[KpA]と、CA220から配布された公開鍵KpCAとを、図示しない記憶デバイスに保持しているものとする。
以下、図5に示した実装環境について説明する。なお、以下の説明では、プログラムの実装対象となるプログラム実行モジュール110の動作に注目した説明を行い、システム210の動作の説明は適宜省略する。
まず、システム210から、システム210自身の公開鍵照明書 KpA||cert[KpA] が送付されると(D1)、プログラム実行モジュール110では、CA220の公開鍵KpCAにより公開鍵照明書KpA||cert[KpA]を検証し、公開鍵照明書KpA||cert[KpA]に含まれたシステム210の公開鍵KpAの完全性を確認する(D2)。
また、システム210では、メッセージ転送用の一時鍵(共通鍵)Kcを生成すると、自身の秘密鍵KsAによる署名Sig(=cert[Kc])を生成し、これをプログラム実行モジュール110の公開鍵KpBで暗号化したデータE_KpB[Sig]をプログラム実行モジュール110に送付する(D3)。この際、プログラム実行モジュール110の公開鍵KpBについて、公開鍵KpAと同様の検証処理が予め行われているものとするが、その説明は省略する。
一方、プログラム実行モジュール110は、データE_KpB[Sig]を受信すると、自身の秘密鍵KsBにより公開鍵アルゴリズムによる復号を行う(D4)。次に、プログラム実行モジュール110は、D2の公開鍵署名検証で完全性を確認した公開鍵KpAにより署名検証を行うことで(D5)、共通鍵Kcを取得する。ここで、共通鍵Kcは、プログラム実行モジュール110自身の秘密鍵による復号及び正当性が確認された公開鍵KpAによる署名検証により、機密性、完全性が裏付けられているため、ネットワークを通じてメッセージMsgをシステム210に送付するための共通鍵暗号の鍵として用いることができる。
続いて、プログラム実行モジュール110は、メッセージMsgを共通鍵Kcにより共通鍵暗号化を行い(D6)、生成された暗号文をシステム210に送付する(D7)。この暗号文を受信したシステム210では、保持していた共通鍵Kcにより暗号文が復号され、元のメッセージMsgが取り出される(D8)。
図6は、図5の実装環境に基づいて定義された、プログラム作成時に用いられる変数及び関数引数(以下、総称して「変数」という)の保護属性の一覧を示した図である。図6に示したように、本実施形態では、保護の仕方を表す保護レベルに応じて6種類の属性(保護属性)が与えられる。各保護属性は、完全性と機密性というセキュリティ要件について、夫々メモリ領域における保護手段の有無と、意味上の確認の有無という直行する2種類の性質を有している。
ここで「完全性(Integrity)」とは、情報の正確さ及び完全さを保護する特性を意味し、外部からの改ざんを保護することを要件とするものである。また、「機密性(confidentiality)」とは、認可されていないエンティティ又はプロセスに対して、情報を使用不可又は非公開にする特性を意味し、特定のエンティティ又はプロセスに対してのみアクセスを許可することを要件とするものである。
メモリ領域の保護手段については、ターゲットシステムが備えるアクセス制御や暗号化・改ざん検証等の保護手段に依存して、達成される項目が異なる場合がある。例えば、プログラム実行モジュール110以外からのアクセスを完全に禁止するアクセス制御機構を備えたメモリ領域(例えば、図1の保護メモリ領域132)では、完全性、機密性とも保護されることになる。但し、全てのメモリ領域についてプログラム実行モジュール110以外からのアクセスが禁止されてしまった場合、OSが提供する入出力サービスが一切利用できない。そのため、入出力の為に完全性及び機密性の保護機能が設けられないメモリ領域(非保護メモリ領域131)が必ず用意されなければならない。
なお、メモリ領域の保護がメモリアクセス時のハードウェアによる暗号化によって行われる場合には、機密性のみが保護されたメモリ領域となり得る。また、完全性についてもそれがハードウェアによる検証機構で行われれば、完全性のみが保護されたメモリ領域となり得る。もちろん、両者を組み合わせればアクセス制御と同様に、完全性と機密性の両方を備えた保護機構が実現可能である。
意味上の確認とは、その変数に格納される値について、完全性、機密性の何れか或いは両方の確認の有無を表す。例えば、ある変数を格納する保護メモリ領域に完全性・機密性の保護がなされていたとしても、その変数に非保護のメモリ領域から取得した値が代入されるとすれば、その変数に格納される値そのものは、保護メモリ領域に格納される以前のいずれかの時点で改ざんや盗聴がなされている虞がある。そのため、たとえ保護メモリ領域に割り当てられた変数であっても、その値を完全性・機密性が保証されたものとみなすことはできない。つまり、代入先の値自体は完全性が保証されたものであったとしても、代入元の変数Xの格納領域が完全性保護がなされていなければ、再度Xを参照したとき、その値が別の値に書き換えられてしまっている可能性があるため、当然完全性が保証されたものとして扱うことはできない。
つまり、ある変数の値について完全性・機密性が保証されるには、適切な保護メモリ領域への格納領域割り当てと意味上の確認の両方がなされている必要がある。図6に示した6種類の保護属性は、このような考えに基づいて設計されており、非保護メモリ領域131に格納されることを要求する保護属性(exposed)と、保護メモリ領域132に格納されることを要求する保護属性(fixed、verified、hidden、concealed、confidential)とに大別される。以下、各保護属性について説明する。
「exposed」属性は、入出力変数のために設けられたものであって、完全性・機密性ともに保護されていないメモリ領域に保持される変数に対して付与される保護属性である。つまり、「exposed」属性は完全性・機密性ともに保護されていないメモリ領域(非保護メモリ領域131)に保持される変数に与えられるものであるため、OS等の外部エンティティは「exposed」属性の変数を自由に読み書きできる。
「exposed」属性が付与された変数を保持するメモリ領域には保護機能がないため、意味上においてもその値の機密性・完全性はまったく保証されない。仮にそれまで秘匿保護された領域に保持された機密値があったとしても、いったんそれが「exposed」属性の変数にコピーされた瞬間に、コピー元の変数に格納されている値も含めてその機密性が損なわれてしまうからである。なお、以下の説明では他の保護変数との差異を明確にするため、セキュリティの向上に直接関係しない「exposed」属性を明示しているが、既存プログラムとの互換性を維持し記述の煩雑さを避けるためプログラム記述においては「exposed」属性を省略することとしてもよい。
「fixed」属性は、改ざん防止されたメモリ領域に格納されるが、意味上の完全性・機密性は確認されていない値を保持する変数に対して付与される保護属性である。「fixed」属性の変数は、例外的に「exposed」属性の変数と相互に変換が可能であるものとする。例えば、「exposed」属性をもつ複数ワードにまたがるデータ構造を参照するとき、参照途中に改ざん攻撃を受けてしまう可能性がある。特に値の完全性検証中にこのような攻撃が行われると検証の意味がなくなってしまう。このような危険を排除したい場合、一度それらのデータ構造全体を「fixed」属性の変数にコピーしたうえで検証を行うことにより検証途中のデータの改ざんを防止することができる。
より具体的には、次の3つの変数宣言と検証関数PublicVerifyRSAの呼び出しにおいて、上記脆弱性の潜在的な例を見ることができる。
verified PubCert_RSA Cert_Accept_A
const verified PubKey_RSA PubKey_CA
exposed PubCert_RSA Cand_Input
PublicVerifyRSA(Cand_Input,PubKey_Ca,Cert_Accept_A)
上記の例では、PublicVerifyRSAの第1引数Cand_Inputには、「exposed」属性が与えられている。したがって、Cand_Inputの値は、プログラム外部から任意のタイミングで書き換えられてしまう可能性がある。
ここで、関数の第1引数Cand_Inputを構成する各ワードの読み込みが、関数の処理においてただ一度だけ行われるのであれば、書き換えがあったとしてもそれはプログラムの処理外、例えば、ネットワークにおけるメッセージ改ざんと等価と見なせるので検証処理の安全性には影響しない。しかし、Cand_Inputの値が、関数内で繰り返し参照されるとき、プログラムの動作タイミングを知ることのできる攻撃者が繰り返し参照が行われる度に異なる値が読み込まれるよう改ざんを行った場合、これはネットワーク上のメッセージ改ざんと等価とみなすことはできない。これは、暗号処理にとって「故障攻撃(fault attack)」と呼ばれる、より対策が困難な攻撃となる。
そのため、変数の値が繰り返し参照される場合には、「exposed」属性をもつ変数の値を一度「fixed」属性を持つ変数にコピーしておけば、複数回の参照があったとしても外部から値が書き換えられる可能性を排除することができる。
「verified」属性は、改ざん防止されたメモリ領域に格納され、意味上の値の完全性保証があって機密性のない変数に対して付与される保護属性である。「verified」属性を持つ変数への代入は同一属性の変数の演算結果に限定されるが、「verified」属性を持つ変数の値を「exposed」属性や「fixed」属性の変数に代入することは常に許可されるものとする。当該変数を介した出力処理を行わない場合、メモリ領域には秘匿保護がなされていてもよい。
「hidden」属性は、機密保護された領域に格納され、且つ、意味上の機密性・完全性が不十分な変数に対して付与される保護属性である。「fixed」属性との違いは、「hidden」属性を持つ変数は「exposed」属性、「fixed」属性との間の代入が禁止される点と入出力は行わない点にある。
「concealed」属性は、機密保護された領域に格納され、且つ、意味上の機密性はあるが完全性がない変数に対して付与される保護属性である。
また、「confidential」属性は機密保護、且つ、改ざん保護された領域に格納され、意味上の機密性、完全性がともに確認された変数に対して付与される保護属性である。
なお、図6において、各保護属性に対応付けた「改ざん防止(メモリ上)」列の「−」は、その保護属性の変数が格納されるメモリ領域に改ざん防止機能が不要であることを意味しており、「+」は、その保護属性の変数が格納されるメモリ領域に改ざん防止機能が必須であることを意味しており、「±」は、メモリ領域の改ざん防止機能の有無は任意であることを意味している。
また、図6において、各保護属性に対応付けた「秘匿(メモリ上)」列の「−」は、その保護属性の変数が格納されるメモリ領域に秘匿機能が不要であることを意味している。また、「+」は、その保護属性の変数が格納されるメモリ領域に秘匿機能が必須であることを意味しており、「±」は、メモリ領域の秘匿機能の有無は任意であることを意味している。
また、図6において、各保護属性に対応付けた「完全性確認(意味上)」列の「×」は、その保護属性の変数の完全性確認が必須であることを意味しており、「○」は、その保護属性の変数の完全性確認が不要であることを意味している。
さらに、図6において、各保護属性に対応付けた「機密性(意味上)」列の「×」は、その保護属性の変数の機密性確認が必須であることを意味しており、「○」は、その保護属性の変数の機密性確認が不要であることを意味している。
以上、説明した6種類の保護属性のうち、本質的に重要な保護属性は「exposed」、「verified」、「concealed」、「confidential」で、「fixed」、「hidden」は補助的な保護属性となっている。
上記した保護属性は、言語における変数の型とほぼ同じといってよいが、一般の言語において型はフィールドの数や長さといったデータ型を意味する場合が多い。以下の例では保護属性の型については厳密な一致を要求するが、データ型については説明を簡単にするため厳密な制約を設けていない。本実施形態では、データ型の整合性は副次的なため、セキュリティ向上に係る属性に関しては保護属性という用語を用いている。なお、保護属性をデータ型にまとめた態様としてもよい。
図7は、上述した各保護変数を持つ変数間の代入の可否を示した図である。同図に示したように、機密性を持つ「hidden」属性、「concealed」属性、「confidential」属性を持つ変数は、同じ保護属性を持つ変数以外の相互変換・代入は一切許可されない。また、完全性についてメモリ保護と意味上の確認の両方を持つ「verified」属性を持つ変数は、その値を「exposed」属性、「fixed」属性の変数に代入することは許されるが、これら変数からの代入は許可されていない。また、「fixed」属性、「exposed」属性の変数間の代入は自由に行うことができる。なお、図7に示した代入時変換ルールは、記憶部36に予め記憶されているものとする。
次に、プログラム開発装置300でのプログラム作成時に用いられるセキュリティ関数について説明する。ここで、「セキュリティ関数」とは、暗号化や復号、署名検証といった計算量的一方向性の性質を備えた、所謂セキュリティプリミティブを実現する関数を意味している。
図8は、図5に示した実装環境に応じて定義されたセキュリティ関数の型の一覧を示した図である。同図に示したように、セキュリティ関数は、公開鍵暗号(暗号化、復号)用と、公開鍵署名(生成、検証)用と、共通鍵暗号(暗号化、復号)用と、共通鍵署名(生成、検証)用と、乱数発生用との5種類に大別される。ここで、乱数発生用を除いたセキュリティ関数については、中分類として、暗号化と復号、又は、署名生成と検証のように対となる操作(メソッド)が定義されており、この操作毎にセキュリティ関数(セキュリティ関数名)が定義されている。なお、乱数発生用については中分類として物理乱数が定義されており、この物理乱数については補助分類として三つのセキュリティ関数(物理乱数A、B、C)が定義されている。
例えば、公開鍵暗号化については、後述する入力・出力の保護属性が異なる二つのセキュリティ関数(PublicEncryptXXX)が定義されている。ここで、補助分類には、これらのセキュリティ関数を一意に識別するための名称が夫々定義されている。なお、セキュリティ関数名の末尾3桁(XXX又はYYY)には任意の文字列(例えば、暗号復号方式名称)を設定することが可能であるものとする。また、セキュリティ関数名は図8の例に限定されず、任意の関数名を与えることが可能である。また、図8では、同一の操作内容に対応するセキュリティ関数全てを同名とした例を示したが、互いに異なる名称を付与する態様としてもよい。この場合、後述する多重定義は発生しないことになる。
図8において「入力」の列には、各セキュリティ関数に引数として入力されるデータの「種別」と、そのデータの「保護属性」とが定義されている。例えば、公開鍵暗号化に係るセキュリティ関数に平文が入力される場合には、その平文が「confidential」属性又は「concealed」属性であることが定義されている。
また、図8において「鍵値(特殊入力)」の列には、各セキュリティ関数に引数として入力されるデータの特例として、そのデータの「種別」が公開鍵又は秘密鍵である場合の「保護属性」が定義されている。例えば、公開鍵暗号化に係るセキュリティ関数に公開鍵が入力される場合には、その公開鍵が「verified」属性であることが定義されている。
また、図8において「出力」の列には、各セキュリティ関数によるデータ処理の結果として出力されるデータの「種別」と、そのデータの「保護属性」とが定義されている。例えば、公開鍵暗号化に係るセキュリティ関数から出力される暗号文は、「verified」属性又は「exposed」属性であることが定義されている。
ここで、公開鍵、共通鍵に関するセキュリティ関数に着目すると、同一操作内容であっても、入力されるデータ及び/又は出力されるデータの保護属性に応じて、同名のセキュリティ関数が多重に定義(多重定義)されていることが分かる。
さらに、図8において「補助出力」の列には、セキュリティ関数によるデータ処理の結果として補助的に出力されるデータの「種別」と、そのデータの「保護属性」とが定義されている。具体的には、公開鍵による署名の検証結果、共通鍵による署名の検証結果に要求される保護属性が定義されている。
なお、物理乱数に対応するセキュリティ関数(PseudoRandom)については、データの入力が行われることなく、乱数を出力(生成)することを示しており、その乱数の保護属性が「confidencial」属性、「concealed」属性又は「verified」属性の何れかであることが定義されている。
本実施形態では、データの入出力に際して保護属性が異なるセキュリティ関数は、必ず暗号化、復号や署名生成、検証のような計算に際して一方向性を持つセキュリティプリミティブの機能を有するもの、即ち一方向性関数に限定する。ここで、「データの入出力に際して保護属性が異なるセキュリティ関数」とは、入力と出力で保護属性が異なるセキュリティ関数を意味しており、例えば、平文の入力として「confidential」属性と、公開鍵の入力として「verified」属性とが与えられた場合、出力が「verified」属性となるようなセキュリティ関数である。機密保護された変数の演算結果が非保護の変数に代入され、非保護変数が外部出力されたとき、元の機密保護された変数の情報が漏れてしまう場合がある。このような演算を無制限に行わせず、暗号化などの処理に限定することがこの仕組みの目的である。
また、本実施形態において、ある関数の入出力引数がすべて同じ保護属性の場合には、その関数はセキュリティ関数でないものと見なす。具体的には、たとえ演算内容が暗号演算であっても、入出力間で保護属性の異なる変数がひとつもなければ、その関数はセキュリティ関数ではないと定義する。さらに、関数が多重定義されていても夫々の定義において全ての引数の保護属性が一致した場合、この関数はセキュリティ関数ではないものと見なす。この場合、計算量的一方向性を持つ必要はない。なお、セキュリティ関数は必ず計算量的一方向性を持つ必要があるが、一方向性関数を必ずセキュリティ関数として定義する必要はない。
図9は、上述したセキュリティ関数の一つである、公開鍵署名検証関数を説明するための図である。なお、ここでは、RSA署名方式の公開鍵署名検証関数(後述するPublicVerifyRSA)を前提として説明するが、この署名方式に限らないものとする。
一般に署名検証では、署名検証鍵により署名から復号化したハッシュ値と、検証前メッセージオブジェクトから計算したハッシュ値とを比較し、この結果が一致したか否かを示す情報(0/1)だけが出力される。これに対し、図9で示した公開鍵署名検証関数では、出力となる検証済みメッセージオブジェクトの保護属性(verified/confidential)に応じたメモリ領域上に変数領域が確保されようになっている。ここで、両ハッシュ値が一致した場合のみ検証対象の変数からコピーされた値(検証前メッセージオブジェクト)が、保護属性に応じて新しく確保された変数に出力されることになる。なお、両ハッシュ値が一致しない場合には、コピーした検証前メッセージオブジェクトを破棄するものとしている。
これは、検証前の変数が非保護メモリ領域131に確保されている場合、即ち、「exposed」属性の場合、攻撃者が検証中または検証後すぐに検証前の変数を書き換えることが可能であるため、予め検証対象の値を保護メモリ領域132にコピーして書き換えが行われることを防止することを意図したものである。また、検証前の変数と検証後の変数とは同じ値を保持するため、誤って使用すると機能上プログラムは動作してしまうという脆弱性を抱えているが、検証後の出力は検証前の入力とは異なる保護属性が与えているため、検証後に誤って検証前の変数を使用してしまうことを防止することができる。このように、セキュリティ関数での演算時において、保護属性に応じたメモリ領域を確保することで、データのセキュリティを向上させることができる。
次に、プログラム開発装置300でのプログラム開発時に用いる上述したセキュリティ関数以外の非セキュリティ関数について説明する。
図10−1、10−2は、非セキュリティ関数の一例を示した図である。図10−1に示したように、OSを介した入出力を扱う非セキュリティ関数として入出力に係る「Input」、「Output」が用意されている。ここで、「Input」は、OSによる書き込みがあるため、入力変数は「exposed」属性のみに限定される。また、「Output」の出力引数はOSによる書き込み操作が不要なため、「exposed」、「verified」の両方の保護属性が多重定義される。この他、OSと双方向のデータのやりとりを行ういわゆるサービス関数は全て「exposed」属性のみを扱うものとする。
また、図10−2に示したように、データ形式変換用の非セキュリティ関数として「Extract」、「Concat」が用意されている。これらの関数はソフトウェアモジュール内に閉じたデータ形式の変換や演算を行うだけでOSを介したデータ入出力は行わない。このような非セキュリティ関数は、全ての入出力引数の保護属性が同一であるという条件の下で引数に保護変数をとることができる。ただしセキュリティ関数のように入出力に異なる保護属性を持つ変数が混在することは許されず、ひとつの関数内では全ての引数についてただひとつの保護属性をとるものとする。例えば、「Extract」と同じ機能をもつ関数をverified用、concealed用、confidential用とそれぞれ異なる名前で定義してもよいし、上述のように関数多重定義(overload)によりそれぞれの保護属性に対応する機能を提供してもよい。
以下、図7に示した代入時変換ルール、図8に示したセキュリティ関数の一覧、図10−1、10−2に示した非セキュリティ関数の一覧を総称して「セキュリティ関数セット」という。
次に、図11を参照して、セキュリティ関数及び非セキュリティ関数を用いて上記セキュリティプロトコルにおける、プログラム実行モジュール110側での処理内容を記述したプログラムリストの一例(以下、疑似プログラムリストという)を示す。なお、疑似プログラムリストは、RAM35や記憶部36に記憶される等、CPU31が参照可能な記憶領域に保持されているものとする。
同図において、2〜4行目は、初期値が与えられた変数宣言を表している。また、6〜11行目は、データ形式変換用のパラメータを表しており、14〜25行目は作業変数の変数宣言を表している。この変数宣言及びパラメータ宣言で保護属性が定義されている。
29〜52行目には、セキュリティプロトコルにおける、プログラム実行モジュール110側での具体的な処理の内容が記述されている。ここで注意が必要なのは暗号化された出力データがプログラム実行モジュール110外に開示されるタイミングである。直感的には52行目のOutput関数が呼ばれたタイミングでOSに出力データが開示されたように感じられるが、この行の処理では出力データの存在とバッファ上のアドレスとがOSに通知されているにすぎない。もし、出力用の非保護メモリ領域を定期的に監視している攻撃者がいた場合、その攻撃者が出力データを観測できるようになるのは保護領域に格納された暗号化データEncTxtが非保護領域にコピーされた時点、即ち50行目のConcat関数が呼ばれた時点と考えるのが安全側に立った考え方である。
なお、以下に説明する実施形態では、図11に示した疑似プログラムに基づいて説明を行うが、変数宣言や処理の内容はこの例に限らないものとする。また、疑似プログラムの作成はプログラム開発装置300で行われるものとしてもよいし、他の装置で行われるものとしてもよい。
[第1の実施形態]
次に、第1の実施形態に係るプログラム開発装置300の機能的構成について説明する。図12は、第1の実施形態に係るプログラム開発装置300の機能的構成を示したブロック図である。同図に示したように、本実施形態のプログラム開発装置300は、CPU31と、ROM34又は記憶部36に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部311と、プログラムリスト解析部312と、処理内容分割部313と、属性定義検証部314とを備えている。
関数セット読出部311は、記憶部36に記憶されたセキュリティ関数セット(代入時変換ルール、セキュリティ関数リスト及び非セキュリティ関数リスト)の読み出しを行う。
プログラムリスト解析部312は、記憶部36等に保持された検証対象のプログラムリストを参照し、当該プログラムリストに記述された宣言部分を解析することで、変数やパラメータに与えられた保護属性を取得する。
処理内容分割部313は、記憶部36等に保持された検証対象のプログラムリストを参照し、当該プログラムリストに記述された一連の処理(例えば、図11の29〜52行目)を分割し、複数の部分処理を生成する。ここで、分割の単位は任意に設定することが可能であるものとする。例えば、分割の単位を最も小さくした場合、個別の数式論理演算や代入、関数呼び出し単位となるが、複数の演算や代入が含まれる式を単位としてもよい。
なお、分割において分割単位毎にデータフロー上関係のある処理のみが含まれものとし、データフロー上関係のない複数の処理が同一の部分処理として分割されることはないものとする。例えば、A=B;C=Dといった操作をまとめて一つの分割単位とすることは不適切で、A=BとC=Dとで夫々分割されることになる。これにより、セキュリティ関数及び多重定義された関数の夫々を後述する検証対象として取り扱うことができる。
属性定義検証部314は、処理内容分割部313で分割された各部分処理を検証対象とし、この検証対象での実引数の保護属性が、セキュリティ関数セットに定義された保護属性と一致するか否かを判定し、判定結果が不一致の場合、その不一致となった箇所を指示するエラー情報を出力する。
以下、本実施形態に係るプログラム開発装置300の動作について説明する。なお、以下では図10−1、10−2に示した非セキュリティ関数の定義に加え、図13に示したセキュリティ関数の定義をセキュリティ関数セットとして用いるものとする。
ここで、図13に示したセキュリティ関数について説明する。図13は、図8と同様セキュリティ関数の型を示したものであって、図11の疑似プログラムリストに記載された各セキュリティ関数の型を定義するものとなっている。ここで「PublicDecryptRSA」は、RSA方式の公開鍵復号を行う公開鍵復号関数であって、同関数名の「PublicDecryptRSA」が二つ定義されている。これら二つの「PublicDecryptRSA」は、入出力にかかる保護属性は異なっているが、関数名が同名称であることから互いに多重定義の関係にある。なお、両関数の関数名が異なる場合には、多重定義とならないことは上述した通りである。また、保護属性が同じであったとしても、関数名が異なる場合には多重定義とならない。
「PublicVerifyRSA」は、RSA方式の公開鍵署名検証を行う公開鍵署名検証関数であって、同関数名の「PublicVerifyRSA」が二つ定義されている。これら二つの「PublicVerifyRSA」は、入出力にかかる保護属性は異なっているが、関数名が同名称であることから互いに多重定義の関係にある。また、「CommonEncryptAES」は、AES方式の共通鍵暗号化を行う共通鍵暗号化関数であって、同関数名の「CommonEncryptAES」が二つ定義されている。これら二つの「PublicVerifyRSA」は、上述した「PublicDecryptRSA」、「PublicVerifyRSA」と同様、入出力にかかる保護属性は異なっているが、関数名が同名称であることから互いに多重定義の関係にある。
以下、図13に示したセキュリティ関数の定義を用いて説明を行うが、適用においてはこの例に限らず、他のセキュリティ関数が追加されたものを用いることとしてもよい。但し、上述したようにセキュリティ関数は一方向性演算に基づいたものであることが好ましく、この制約を満たさない任意の演算がセキュリティ関数として定義されることはないものとする。
図14は、プログラムリストの検証に係る処理の概略手順を示したフローチャートである。なお、本手順は、プログラムリストの検証にかかる基本的な処理の手順を示したものであって、セキュリティ関数が多重定義されていない場合には、本手順をそのまま適用することができる。なお、セキュリティ関数が多重定義された場合の処理の手順については後述する。
まず、関数セット読出部311は、記憶部36に記憶されたセキュリティ関数セットを読み出す(ステップS11)。
続いて、属性定義検証部314は、検証対象のプログラムリスト中に含まれる変数間の演算・代入や関数呼び出しにおける実引数の保護属性において、セキュリティ関数セットで定義された各セキュリティ関数での引数の保護属性と一致しない部分を検出する(ステップS12)。
具体的に、属性定義検証部314は、各変数に定義された保護属性に基づいて、セキュリティ関数の入出力に係る実引数の保護属性や非セキュリティ関数の入出力に係る実引数の保護属性を特定する。また、セキュリティ関数の入出力に係る実引数の保護属性が、当該セキュリティ関数名に対応するセキュリティ関数リストでのセキュリティ関数の型の引数の保護属性と一致するか否かを判定する。なお、非セキュリティ関数における保護属性の変換が、代入時変換ルールで規定された保護属性の変換則に適合するか否か判定を併せて行う態様としてもよい。
ステップS12において、属性定義検証部314が、保護属性は全て一致と判定した場合(ステップS13;Yes)、本処理を終了する。一方、属性定義検証部314が、不一致部分を検出した場合(ステップS13;No)、この保護属性が不一致の箇所を報知するエラー情報を出力した後(ステップS14)、本処理を終了する。
変数間の直接演算における保護属性の一致検査は、単純な一致比較により実現できるが、多重定義を含む場合には少し複雑な手順が必要となる。つまり、プログラムリスト中に記述されたセキュリティ関数が多重定義されている場合、何れの関数に準じたものかを入出力に係る引数の保護属性の組み合わせから特定する必要がある。
図15に、多重定義を考慮した保護属性検証処理の手順を示した詳細なフローチャートを示す。まず、関数セット読出部311は、記憶部36に記憶されたセキュリティ関数セットを読み出す(ステップS21)。
次いで、プログラムリスト解析部312は、検証対象のプログラムリストを参照し、当該プログラムリスト中に記述された宣言部分を解析することで変数やパラメータに与えられた保護属性を取得する(ステップS22)。
続いて、処理内容分割部313は、検証対象のプログラムリストを参照し、当該プログラムリストに記述された一連の処理を所定の単位で分割する(ステップS23)。属性定義検証部314は、ステップS23で分割された複数の部分処理から、検証対象として一つの部分処理を選択すると(ステップS24)、この検証対象とステップS21で読み出されたセキュリティ関数リストの各セキュリティ関数名と比較することで、検証対象がセキュリティ関数か否かを判定する(ステップS25)。
ステップS25において、検証対象をセキュリティ関数と判定した場合(ステップS25;Yes)、属性定義検証部314は、各変数に定義された保護属性に基づいて、セキュリティ関数の入出力に係る実引数の保護属性、非セキュリティ関数の入出力に係る実引数の保護属性を特定した後、この実引数の保護属性に対応するセキュリティ関数を、当該関数について多重定義されたセキュリティ関数の型から特定する(ステップS26)。
ここで、ステップS26の処理について例を参照しながら説明する。図13に示したセキュリティ関数の定義では、公開鍵署名検証にセキュリティ関数が多重定義(公開鍵暗号化A、B)されている。ここで、署名入力と出力文の保護属性は2つの場合で異なるが、検証用公開鍵の保護属性は何れの場合も「verified」属性となっている。
一方、図11に示した疑似プログラム32行目の公開鍵検証用のセキュリティ関数(PublicVerifyRSA)において、実引数となる「PubKey_CA」の保護属性は「verified」属性となっており(2行目で宣言)、仮引数と一致している。また、多重定義に依存する署名入力と出力文とにあたる実引数「Cand_Input」、「Cert_Accept」の保護属性は夫々「exposed」属性、「verified」属性となっている(18、19行目で宣言)。属性定義検証部314は、これら入出力にかかる保護属性から、疑似プログラム32行目のセキュリティ関数が図13に示したセキュリティ関数の定義における公開鍵署名検証Bの定義に一致すると判断し、公開鍵署名検証Bと特定する。
このように、属性定義検証部314は、ステップS26において、プログラムリストの宣言部分に定義された各変数の属性に基づいて、当該プログラムリストに含まれたセキュリティ関数に係る引数の保護属性が、セキュリティ関数リストに含まれたセキュリティ関数の型の何れかの定義と一致するか否かを判定する。
ステップS26の処理の結果、属性定義検証部314が、検証対象のセキュリティ関数がセキュリティ関数セットに定義されたセキュリティ関数の型と一致すると判定した場合には(ステップS28;Yes)、ステップS29の処理に移行する。また、ステップS26の処理の結果、属性定義検証部314が、検証対象のセキュリティ関数がセキュリティ関数セットに定義されたセキュリティ関数の型と一致しないと判定した場合には(ステップS28;No)、ステップS30の処理に移行する。
一方、ステップS25において、検証対象が演算式や非セキュリティ関数等のセキュリティ関数以外と判定した場合(ステップS25;No)、属性定義検証部314は、この検証対象に係る全ての演算、非セキュリティ関数呼び出しの実引数が、セキュリティ関数セット(代入時変換ルール、非セキュリティ関数リスト)に定義されたとおり、同一の保護属性を有するか否かを判定する(ステップS27)。
ステップS27の処理の結果、属性定義検証部314が、検証対象に含まれる全ての演算に関わる変数および定数と、非セキュリティ関数呼び出しの実引数が同一の保護属性を有すると判定した場合(ステップS28;Yes)、ステップS29の処理に移行する。また、ステップS27の処理の結果、属性定義検証部314が、検証対象に含まれる全ての演算に関わる変数および定数と、非セキュリティ関数呼び出しの実引数が同一の保護属性を有さないと判定した場合には(ステップS28;No)、ステップS30の処理に移行する。
ステップS29では、属性定義検証部314が、ステップS23で分割された全ての部分処理を検証対象としたか否かを判定し、未処理の部分処理が存在すると判定した場合(ステップS29;No)、ステップS24に再び戻り、未処理の部分処理を検証対象として選択する。また、ステップS29において、全ての部分処理を処理対象としたと判定した場合には(ステップS29;Yes)、本処理を終了する。
また、ステップS30では、属性定義検証部314が、ステップS28で保護属性が不一致と判定された箇所を報知するエラー情報を出力した後(ステップS30)、本処理を終了する。
ここで、保護属性検証処理による誤り検出の効果を確認するため、プログラマが秘密鍵「PrvKey_B」に誤った保護属性を与えた場合を考える。仮に秘密鍵に「exposed」属性を与えた場合、その変数は非保護メモリ領域に配置されるためメモリを参照できる攻撃者は自由にその内容を閲覧、改ざんできてしまう。また、「verified」属性、「concealed」属性であっても、保護メモリ領域が「verified」属性用で且つ完全性保護に用いられる場合や「concealed」属性用で且つ機密性保護に用いられる場合には、機密性又は完全性が損なわれる虞がある。
保護属性検証処理により保護属性の誤りが検出可能であることを、図11の擬似プログラムリストから作成した図16の表を用いて説明する。ここで、図16は、図15の保護属性検証処理を用いて導出された保護属性と誤り検出結果とを示した図である。同図において、各行が疑似プログラムリスト中に定義された変数またはパラメータに対応しており、「定義」の列はその変数又はパラメータが定義されたプログラム行(L2は2行目を表す)を示している。続く列において「変数名」、「備考」、「保護属性」、「意味」を夫々示している。
さらに、続く列にはプログラムリスト中において、「定義」及び「変数名」に示した行の変数又はパラメータの「保護属性」を夫々「exposed」属性、「verified」属性、「concealed」属性、「confidential」属性に書き換えた場合での保護属性検証処理の検査結果を示している。なお、「fixed」、「hidden」の2属性については本プログラムで使用していないため省略している。
同図から明らかなように、例えばプログラムリスト中の3行目で定義された「PrvKey_B」の保護属性を夫々「exposed」属性、「verified」属性、「concealed」属性としたときは検査結果がエラーとなり、正規の「confidential」としたときのみ検査に成功することを意味している。続く「エラー行」の列には、検査失敗が検出されたプログラム行、即ち、ステップS31の処理で保護属性の不一致箇所が報知されるエラー情報が示されている。
「PrvKey_B」以外の変数でも同様の結果が得られており、各変数に与える保護属性がプロトコルの検討により正しく与えられていれば、1個の変数の保護属性を誤って与えたとしても、その誤りを検出することが可能である。もし秘密鍵に「exposed」属性が誤って与えられ、その誤りが見逃された場合、秘密鍵が非保護のメモリ領域に配置されることになるため、機密情報が漏洩する原因となる。しかしながら、上記した保護属性検証処理の適用により、プログラマが単純ミスにより一つの変数の保護属性を誤って記述してしまったとしても、その誤りを未然に検出して情報漏洩等の不具合を回避することができる。
以上のように、本実施形態のプログラム開発装置300によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性を検証することができる。
なお、上述した保護属性検証処理の手順はバッファオーバーフロー等の脆弱性を排除することが目的ではないため、適用にあたっては既存の脆弱性を排除するための技術を併用することが好ましい。特に、未初期化の変数の使用はプロトコルの健全性にとって危険であるが、上記手順には含まれないため別途対策を行うことが好ましい。
[第2の実施形態]
第1の実施形態では、プログラムリストに記述された一連の処理をセキュリティ関数に基づいて分割した部分処理単位で行う態様を説明したが、他の方法で行うことも可能である。第2の実施形態では、プログラムリスト中のデータの流れを表すデータフロー図をセキュリティ関数に基づいて分割し、これら分割した部分データフロー単位で保護属性の誤り解析を行う態様を説明する。なお、第1の実施形態のプログラム開発装置と同様の要素については、同じ符号を付与しその説明を省略する。
図17は、第2の実施形態に係るプログラム開発装置300の機能的構成を示したブロック図である。同図に示したように、本実施形態のプログラム開発装置300は、CPU31と、ROM34又は記憶部36に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部311と、プログラムリスト解析部312と、データフロー生成部315と、データフロー分割部316と、属性定義検証部317とを備えている。
データフロー生成部315は、プログラムリスト解析部312による解析結果に基づいて、プログラムリストに記述された各処理でのデータの流れを表したデータフロー図を生成する。
図18は、データフロー生成部315により生成されたデータフローグラフの一例を示した図であって、図11に示した疑似プログラムリストで実行される処理のデータフローを表している。同図において、Input及びOutputの非セキュリティ関数により行われる外部入力・出力は、図中左側D11、D13、D17で表されている。これらは、図5に示したD1、D3、D7の動作に夫々対応するものである。
Input及びOutput以外の非セキュリティ関数は、図中6角形(亀甲型)のシンボルで表されている。また、セキュリティに関連した定数(機密値)及びビットフィールドやサイズを示すパラメータは、四角形(矩形)のシンボルで表されている。なお、図中「KpCA」、「KsB」、「Msg(SecretMessage)」は、図5に示した同名のデータと対応するものである。
セキュリティ関数のうち、公開鍵署名に係るD12、D15は6角形(矢尻型)のシンボルで表されており、公開鍵復号および共通鍵暗号化に係るD14、D16は5角形のシンボルで表されている。なお、D12、D14、D15、D16は、図5に示したD2、D4、D5、D6に夫々対応するものである。
図17に戻り、データフロー分割部316は、データフロー生成部315により生成されたデータフローグラフをセキュリティ関数の入出力単位で分割し、複数の部分データフローを生成すると、これら各部分データフローを構成する要素(構成要素)を対応する属性情報とともにデータフローテーブルに登録する。また、データフロー分割部316は、後述する保護属性検証処理において逐次決定される実引数を保持するための関数多重定義テーブルを生成する。
以下、図18、19を参照して、データフロー分割部316の動作について説明する。図18に示した一繋がりのフローグラフをセキュリティ関数の入出力単位で分割した場合、図19の表(データフローテーブル)に示した10個の部分フローグラフに分割することができる。ここで、各部分フローグラフの端点は、入力、出力、初期値(非保護、保護)、セキュリティ関数の引数の5項目のうち必ず何れかとなっている。
図19では、図18に示した入出力、セキュリティ関数、入出力関数についてはその符号を「#符号_変数名」の形で表している。特に、関数の場合「#符号_変数名(#引数の符号)」として引数を表記している。これは各引数の保護属性の違いを明確化するためである。また、入出力関数も引数の符号を同様に記載しているが、これもどの変数がプログラムに対する明示的な入力であり、どの変数が出力であるかを明示するためである。変数レベルでプログラムの入出力を見たとき、単なる入力だけの操作であっても、OS14に対して入力バッファのサイズやパラメータなどの暗黙の出力がなければ操作は行えない。入力の関数であっても一部の変数については出力操作が行われており、引数の明示はこの区別を厳密に行うためのものである。
一方、ビットフィールド操作関数の「Extract」、「Concat」関数は、OSシステムコールを呼ばない当該プログラム内部に閉じた操作のため、図19では引数を省略して記載している。本プログラムでは使用されていないが、演算子形式で記述される演算についても同様に扱うことができる。
分割された部分データフローについて具体的に説明する。図19において、部分データフロー番号1では、Input関数D11の第1引数からはじまり、入力操作の実行により変数bufに代入されたParam1が、非セキュリティ関数Extractに入力される。定数Param1により指定されたビットフィールドが取り出され、変数Cand_Inputに代入される。続いてCand_Inputは、Public_Verify_RSA(#1)で表されるPublicVerifyRSA関数D12の第1引数として入力される。PublicVerifyRSA関数D12はセキュリティ関数なので、ここで区切られている。
また、部分データフロー番号2では、初期値である公開鍵KpCAがそのまま#D12_PublicVerifyRSA(#2)の引数として代入されており、構成要素が2個の部分データフローとなっている。
部分データフロー番号3では、PublicVerifyRSA関数D12の出力である第3引数が、変数Cert_Accept_Aに代入され、定数Param2に基づいてExtract関数により所定のビットフィールドが取り出され、PubKey_Aに代入され、PublicVerifyRSA関数D15の第2引数として入力される。
このように、データフロー分割部316は、データフロー生成部315により生成されたデータフローグラフをセキュリティ関数の入出力関係に基づいて分割し、複数の部分フローグラフを生成する。
属性定義検証部317は、データフロー分割部316で分割された各部分データフローを順次検証対象とし、この検証対象での実引数の保護属性が、セキュリティ関数セットに定義された保護属性と一致するか否かを判定し、一致しないと判定した場合、その不一致となった箇所を指示するエラー情報を出力する。
以下、図20、21を参照して、第2の実施形態に係るプログラム開発装置の動作について説明する。はじめに、図20のフローチャートを用いて、セキュリティ関数が多重定義をもたないものとした場合の概略手順を説明した後、図21のフローチャートを用いて、セキュリティ関数が多重定義を有する場合の手順を詳細に説明する。
図20は、本実施形態に係る保護属性検証処理の概略手順を示したフローチャートである。まず、関数セット読出部311は、記憶部36に記憶されたセキュリティ関数セットを読み出す(ステップS41)。次いで、プログラムリスト解析部312は、検証対象のプログラムリストを参照し、当該プログラムリスト中に記述された宣言部分を解析することで変数やパラメータに与えられた保護属性を取得する(ステップS42)。
続いて、データフロー生成部315は、検証対象のプログラムリストを参照し、当該プログラムリストに記述された処理のデータフローグラフを生成する(ステップS43)。次いで、データフロー分割部316は、このデータフローグラフをセキュリティ関数の入出力関係に基づいて分割すると(ステップS44)、分割した各部分データフローをデータフローテーブルに登録するとともに、ステップS42で取得された保護属性に基づいて、各部分データフローの構成要素に保護属性を対応付けて登録する(ステップS45)。
属性定義検証部317は、データフローテーブルに登録された一の部分データフローを検証対象とすると(ステップS46)、検証対象を構成する構成要素の保護属性がセキュリティ関数セットに定義された保護属性に一致するか否かを判定する(ステップS47)。なお、ステップS47での保護属性の一致判定は、上述した属性定義検証部314での動作と同様であるため説明は省略する。
具体的に、属性定義検証部317は、構成要素として含まれた各変数に定義された保護属性に基づいて、セキュリティ関数の入出力に係る実引数の保護属性や非セキュリティ関数の入出力に係る実引数の保護属性を特定する。また、セキュリティ関数の入出力に係る実引数の保護属性が、当該セキュリティ関数名に対応するセキュリティ関数リストでのセキュリティ関数の型の引数の保護属性と一致するか否かを判定する。なお、非セキュリティ関数における保護属性の変換が、図7に示した代入時変換ルールで規定された保護属性の変換則に適合するか否かの判定を併せて行う態様としてもよい。
ステップS47の処理の結果、全ての構成要素の保護属性がセキュリティ関数セットに定義された保護属性と一致すると判定した場合には(ステップS48;Yes)、属性定義検証部317は、データフローテーブルから検証対象の部分データフローを削除した後(ステップS49)、当該データフローテーブルが空か否かを判定する(ステップS50)。
ステップS50において、データフローテーブルが空でないと判定した場合(ステップS50;No)、属性定義検証部317は、ステップS46の処理へと再び戻り、データフローテーブルに登録された一の部分データフローを検証対象に決定する。また、ステップS50において、データフローテーブルが空と判定した場合には(ステップS50;Yes)、本処理は終了する。
一方、ステップS47の処理の結果、セキュリティ関数セットで定義された保護属性と一致しない構成要素が存在すると判定した場合には(ステップS48;No)、属性定義検証部317は、この保護属性が不一致の箇所を報知するエラー情報を出力した後(ステップS51)、本処理を終了する。
なお、上記の処理では、セキュリティ関数以外についての保護属性の検証は、夫々分割された部分データフローで行われることになる。これにより、セキュリティ関数以外では異なる保護属性を持つ変数・定数間の演算が行われないことを確認することができるため、機密データの漏洩や攻撃者により改変されたデータによって保護対象のデータが汚染されることを防止することができる。
例えば、AND演算によりビットフィールドをマスクした後シフトしてフォーマット変換を行うビットフィールド演算において、パラメータを攻撃者が自由に操作できる場合を考える。当該プログラム内で既に検証済みのデジタル証明書から公開鍵を取り出すときにこのような攻撃が行われてしまうと、本来の公開鍵以外のフィールドを公開鍵として利用させることが可能となる。これが有効な攻撃になるかどうかは証明書の形式等、個々のプロトコルに依存するが、一般にプロトコル設計において検証処理完了後に上記のような攻撃が行われることが想定されていない以上、攻撃の排除がプログラムの実装レベルにおいて行われなければならない。上述した保護属性検証処理は、このような攻撃の排除をプログラムの実装レベルにおいて行うものであって、プログラマの負荷を軽減しつつその実現手段を提供するものである。
次に、図21のフローチャートを参照して、セキュリティ関数が多重定義を有する場合の保護属性検証処理の手順について説明する。なお、本処理において、ステップS61〜S65の処理は、図20のステップS41〜S45の処理と同様であるため、その説明は省略する。
ステップS66において、データフロー分割部316は、検証対象のプログラムリスト中に含まれた各関数のうち、多重定義を持つ関数の呼び出し毎に、後述する処理で決定した実引数の保護属性を保持するための関数多重定義テーブルを生成する(ステップS66)。ここで、注意すべき点は、関数多重定義テーブルへのエントリは、多重定義関数の各々の呼び出し毎に登録されることであり、多重定義関数の種別毎に登録されるのではないことである。例えば、図11に示した疑似プログラムリストでは、32行目と43行目で「PublicVerifyRSA」関数が2回呼び出されているが、この場合、この呼び出し数に対応して関数多重定義テーブルに2個登録されることになる。
初期状態ではデータフローテーブルは上述と同様、全ての部分データフローが格納される。関数多重定義テーブルには、D12、D14、D15、D16の各セキュリティ関数と、入出力関数を除く非セキュリティ関数が格納される。セキュリティ関数の引数の保護属性は、引数毎に異なるが、非セキュリティ関数では全て同一の保護属性をとる。セキュリティ関数の実引数には鍵値のように保護属性があらかじめ決定されているものとそうでないものとがある。入出力関数の保護属性は必ず「exposed」、「fixed」、「verified」の何れかに限定される。
続くステップS67において、属性定義検証部317は、データフローテーブルに登録された部分データフローの一つを検証対象とすると(ステップS67)、セキュリティ関数セットに定義された保護属性に基づいて、検証対象を構成する構成要素(セキュリティ関数)の保護属性の一致判定が可能か否かを判定する(ステップS68)。
以下、ステップS68の処理について説明する。図18に示したデータフローグラフでは、関数に渡される引数は全て明示的に保護属性が宣言された変数が使われている。この場合には、他の構成要素と変数の保護属性が一致するか否かを判定することが可能である。
例えば、図19のデータフローテーブルにおいて、部分データフロー番号1ではセキュリティ関数の仮引数#D12_PublicVerifyRSA(#1)は、多重定義を持つため保護属性は一意に決まらない。だが、明示的に保護属性「exposed」が宣言された変数Cand_Inputが実引数として仮引数に代入されているため、上記変数の保護属性「exposed」との一致を調べることで当該部分データフロー内の保護属性が一致しているか否かの判定が可能となる。上記にあてはまらない多重定義を持つ関数のみで構成されている等、部分データフロー内で上記判定が不可能、即ち、保護属性が一致するか否かを判定することが不可能な場合については後述する。
ステップS68において、検証対象を構成する構成要素の保護属性の一致判定が可能と判定した場合(ステップS68;Yes)、属性定義検証部317は、検証対象を構成する構成要素のうち、一意決定済みの構成要素について保護属性がセキュリティ関数リスト中の定義に一致するか否かを判定する(ステップS69)。ここで「一意決定済みの構成要素」とは、明示的に保護属性が与えられた変数か、他の部分データフローの解析における関数の多重定義解決により、保護属性が決定された仮引数を意味する。なお、ステップS69の判定処理は、上述したステップS26の判定処理と同様であるため、説明は省略する。
部分データフローに未決定の多重定義関数の引数が存在する場合は、他の部分データフローの処理等より既に決定済みの保護属性が、未決定の多重定義関数の引数の保護属性候補と一致するか否かが判定される。このようにして部分データフロー中の全ての構成要素について保護属性が一意決定される。以下、このように決定された保護属性を当該部分データフローの確定保護属性という。
例えば、上記の#D12_PublicVerifyRSA(#1)の場合、PublicVerifyRSA関数D12の第1引数に「exposed」属性が定義されており、部分データフローには他の未決定な多重定義関数引数がないため、セキュリティ関数リスト中の定義との一致判定を行うことが可能である。
ステップS69の処理の結果、何れか一つでも不一致があった場合(ステップS70;No)、属性定義検証部317は、この保護属性が不一致の箇所を報知するエラー情報を出力した後(ステップS71)、本処理を終了する。
一方、ステップS69の処理の結果、全ての構成要素で保護属性が一致した場合(ステップS70;Yes)、属性定義検証部317は、検証対象の部分データフローに含まれた未決定の多重定義関数の引数について、多重定義関数テーブルの対応フィールドに確定保護属性を登録する(ステップS72)。ここで、一つの引数の保護属性が一意決定されたことで、その関数の多重定義に基づいて他の引数の保護属性が派生的に一意決定できるような場合(これは、部分データフローの確定保護属性とは必ずしも一致しない場合がある)には、その引数に対応するデータフローテーブルのフィールドに、派生的に一意決定した保護属性を登録するものとする。
例えば、図19の部分データフロー番号1の場合、確定保護属性の登録として、関数多重定義テーブルの#D12_PublicVerifyRSA(#1)に対応するフィールドに「exposed」属性が登録される。また、PublicVerifyRSA関数D12の多重定義から、#3引数の保護属性が「verified」に一意決定され、#D12_PublicVerifyRSA(#3)に対応するフィールドに登録されることで、この引数の保護属性が一意決定済みとなる。
続く、ステップS72において、属性定義検証部317は、データフローテーブルから検証対象の部分データフローを削除した後(ステップS73)、当該データフローテーブルが空か否かを判定することで、全ての部分データフローを検証対象としたか否かを判定する(ステップS74)。
ステップS74において、データフローテーブルが空でないと判定した場合(ステップS74;No)、属性定義検証部317は、ステップS66の処理へと再び戻り、データフローテーブルに登録された一の部分データフローを検証対象に決定する。また、ステップS74において、データフローテーブルが空と判定した場合には(ステップS74;Yes)、本処理は終了する。
なお、ステップS68において、検証対象を構成する構成要素の保護属性の一致判定が不可能と判定した場合(ステップS68;No)、属性定義検証部317は、ステップS67の処理へと再び戻り、データフローテーブルに登録された他の部分データフローを検証対象とする。その後、他の部分データフローについてステップS69以下の処理が順次行われ、その処理結果に伴い関数多重定義テーブルが更新されて行くことで、関連する関数の引数の保護属性が一意決定されることになる。つまり、処理が進むにつれ関数多重定義テーブルの未決定状態の引数のフィールドは一意決定済みのものが増加し、全ての部分データフローの検査が完了するまでに全てのフィールドが一意決定済みとなる。
なお、図11の疑似プログラムリストでは上記のケースは発生しないが、図22に示したプログラムリストの断片では決定不可能な部分データフローが存在する。以下、図22を参照して、保護属性の一致判定が不可能な場合について説明する。
図22は、属性定義検証部317の動作を説明するための図であって、所定のプログラムリストの一部分を示している。同図において、PhysicalRandom関数は引数をとらない乱数発生関数であり、「confidential」、「concealed」、「verified」の3種類の戻り値が多重定義されているものとする。
CommonKeyEncrypt関数の第1引数として、PhysicalRandom関数が直接呼び出されており、このプログラム片を分割した部分データフローには、PhysicalRandom関数の戻り値と、CommonKeyEncrypt関数の第1引数とが構成要素として含まれる。これらはどちらも多重定義されているため、単独での一致判定は不可能である。
そこで、CommonKeyEncryptの第3引数を含む部分データフローを解析すると、変数Omsgが「exposed」属性と定義されているため、CommonKeyEncryptの第1引数の保護属性は、図13におけるCommonEncryptAESの型から、「consealed」に一意決定される。その結果、PhysicalRandom関数の戻り値の保護属性は、「concealed」に一意決定することができる。
以上のように、本実施形態のプログラム開発装置300によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性を検証することができる。
なお、関数戻り値の多重定義は、C++やJavaのような既存言語には存在しないが、HASKELのような一部の言語に含まれる仕様である。本実施形態では、図11に示したような擬似的な言語仕様に適用した場合を説明したが、これに限らず、言語仕様に応じて保護属性を拡張することで、広い範囲の言語仕様に適用させることが可能である。
[第3の実施形態]
第3の実施形態では、上述した属性定義検証をプログラムリストのコンパイラ動作時に実行する態様について説明する。なお、第1、第2の実施形態のプログラム開発装置と同様の要素については、同じ符号を付与しその説明を省略する。
図23は、第3の実施形態に係るプログラム開発装置300の機能的構成を示したブロック図である。同図に示したように、本実施形態のプログラム開発装置300は、CPU31と、ROM34又は記憶部36に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部311と、プログラムリスト解析部312と、処理内容分割部313と、属性定義検証部314と、コンパイラ部318とを備えている。
コンパイラ部318は、プログラムリストのコンパイルを行い、コンピュータが実行することが可能なプログラム(以下、実行可能形式プログラムという)を生成するコンパイラである。なお、コンパイラ部318は、ユーザから操作部32等を介して入力される選択指示に応じ、機能検証モード又は保護属性検証モードに切り替えてコンパイルを実行するものとする。
ここで、「機能検証モード」とは、保護属性を無視してコンパイルを実行することを意味する。機能検証モードが選択された場合、コンパイラ部318は、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行い、実行可能形式プログラムを生成する。また、「保護属性検証モード」とは、プログラムリストに対し上述した属性検証処理を行った後、コンパイルを実行することを意味する。保護属性検証モードが選択された場合、コンパイラ部318は、プログラムリスト中の保護属性の整合性を確認した後、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行い、実行可能形式プログラムを生成する。
以下、図24を参照して、第3の実施形態に係るプログラム開発装置の動作について説明する。まず、コンパイラ部318は、コンパイルの実行モードが機能検証モード、保護属性検証モードの何れが選択されたかを判定する(ステップS81)。ここで、機能検証モードが選択されたと判定した場合(ステップS81;No)、コンパイラ部318は、プログラムリストに対し保護属性を無視したコンパイルを行うことで機械語命令列を生成し(ステップS82)、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行うことで、実行可能形式プログラムを生成する(ステップS89)。
一方、ステップS81において、保護属性検証モードが選択されたと判定した場合(ステップS81;Yes)、関数セット読出部311が、記憶部36に記憶されたセキュリティ関数セットを読み込むと(ステップS83)、プログラムリスト解析部312、処理内容分割部313及び属性定義検証部314はコンパイル対象のプログラムリストに対し、保護属性検証処理を実行する(ステップS84)。なお、ステップS84の保護属性検証処理は、図14で説明したステップS12〜S14の処理又は図15で説明したステップS22〜S30の処理と同様であるため、その説明は省略する。
続いて、コンパイラ部318は、ステップS84の処理により出力されるエラー情報に基づいて、コンパイル対象のプログラムリスト中にふくまれた演算、セキュリティ関数及び非セキュリティ関数呼び出しに係る全ての保護属性が、セキュリティ関数セットに定義された保護属性に一致したか否かを判定する(ステップS85)。
ステップS85において、保護属性の不一致が確認された場合、即ち、ステップS84の処理でエラー情報が出力された場合(ステップS85;No)、コンパイラ部318は、出力されたエラー情報を表示部33等に表示することで出力した後(ステップS86)、本処理を終了する。
一方、ステップS85において、全ての保護属性の一致が確認された場合、即ち、ステップS84の処理でエラー情報が出力されなかった場合(ステップS85;Yes)、コンパイラ部318は、各変数の保護属性に応じてその変数を確保する格納領域(保護メモリ領域又は非保護メモリ領域)を決定する(ステップS87)。
具体的に、変数の保護属性が「exposed」の場合には、その変数の格納領域を非保護メモリ領域131に決定する。また、変数の保護属性が「fixed」、「verified」、「hidden」、「concealed」、「confidential」の場合には、その変数の格納領域を保護メモリ領域132に決定する。なお、ここでは、保護メモリ領域132が、図6に示した4つの保護種別(改ざん防止、秘匿、完全性確認、機密性)の全ての機能を有するものとしている。各保護種別のうち、何れかに特化した格納領域を夫々有するような場合には、保護属性に応じた格納領域に各変数のメモリ領域が確保される態様としてもよい。
続いて、コンパイラ部318は、ステップS87で決定した格納領域を反映した機械語命令列を生成し(ステップS88)、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行うことで、実行可能形式プログラムを生成する(ステップS89)。
以上のように、本実施形態のプログラム開発装置300によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性をコンパイル時に検証することができる。
また、機能検証モードと保護属性検証モードとを切り替えてコンパイルを行えるよう構成することで、データフロー全体に係る検査と、保護属性定義の正当性に係る検査とを切り替えて実行することができるため、開発時の便宜を図ることができる。
上述した第1、第2の実施形態に開示の保護属性の検証手法、および後述する第4の実施形態に開示の保護属性の自動決定手法は、対象とするプログラムが正しくセキュリティプロトコルを実装していることを前提としている。セキュリティプログラムが誤って実装され、誤ったデータフローを対象として検査を行った場合には変数に適切な保護属性が与えられない。したがって、セキュリティプロトコルが正しく実装されていることを検証する有力な手段はそのプログラムを動作させ、テスト入力に対して正しい出力が得られるかを確認する機能検証である。つまり、本実施形態は保護属性の検証に先だって機能検証を容易に行う手段を提供するものである。
なお、本実施形態では、第1の実施形態に基づいた構成としたが、これに限らず、第2の実施形態に基づいた構成としてもよい。具体的には、処理内容分割部313と、属性定義検証部314とに替えて、データフロー生成部315、データフロー分割部316、属性定義検証部317を備え、図20で説明したステップS42〜S51又は図21で説明したステップS62〜S74の処理をステップS84で行うことで適用することができる。
また、上記実施形態では、変数の保護属性は静的に決定されている。このようにして得られた保護属性にしたがって保護領域と非保護領域に適切に変数の格納領域を割り当てることで、安全なプログラムを作ることができるのはこれまでに説明したとおりである。ここで注意が必要なのは、保護属性の決定は静的に行われるが、変数の格納領域割り当ては必ずしも静的に行われる必要はないことである。
保護属性にもとづく変数領域の割り当てを実現するとき、もっとも簡単な方法はコンパイル時に静的にメモリアドレスを決定してしまうことだが、この方法ではプログラム実行の柔軟さが損なわれメモリ利用効率が悪化する場合がある。C++のようにクラスに対してコンストラクタが定義され、そこでメモリ確保が行われるようなプログラムでは、コンストラクタが当該変数の保護属性に基づくメモリ確保を行うことで安全性と柔軟性を両立させることができることを付記する。
[第4の実施形態]
上述した第3の実施形態では、コンパイル時に保護属性の整合性を検証する態様を説明した。この場合、プログラムリスト中に記述される全ての変数の保護属性は、プログラマから明示的に与えられたものとなっている。第4の実施形態では、プログラマから一部の定数にのみ明示的に保護属性が与えられた場合に、他の変数の保護属性を自動的に決定することが可能な態様について説明する。なお、上述した第1、第2の実施形態のプログラム開発装置と同様の要素については、同じ符号を付与しその説明を省略する。
図25は、第4の実施形態に係るプログラム開発装置の機能的構成を示した図である。同図に示したように、本実施形態のプログラム開発装置300は、CPU31と、ROM34又は記憶部36に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部311と、プログラムリスト解析部312と、データフロー生成部315と、データフロー分割部319と、属性定義検証部320とを備えている。
データフロー分割部319は、データフロー分割部316と同様の機能を有するとともに、プログラムリストに含まれた各変数、パラメータについて、一意決定された保護属性を保持するためのオブジェクト保護属性テーブルを生成する。
属性定義検証部320は、属性定義検証部317と同様の機能を有するとともに、後述する保護属性決定処理において逐次決定される各変数、パラメータの保護属性をオブジェクト保護属性テーブルに登録する。
以下、図26を参照して、第4の実施形態に係るプログラム開発装置の動作について説明する。図26は、保護属性決定処理の手順を示したフローチャートである。なお、本処理において、ステップS91〜S95の処理は、図21のステップS61〜S65の処理と同様であるため、その説明は省略する。
ステップS96において、データフロー分割部319は、上述した関数多重定義テーブルを生成するとともに、プログラムリストに含まれた各変数、パラメータについて、一意決定される保護属性を保持するためのオブジェクト保護属性テーブルを生成する(ステップS96)。
次いで、属性定義検証部320は、データフローテーブルに登録された一の部分データフローを検証対象とすると(ステップS97)、セキュリティ関数セットに定義された保護属性に基づいて、検証対象を構成する構成要素の保護属性の一致判定が可能か否かを判定する(ステップS98)。ここで、検証対象を構成する構成要素の保護属性の一致判定が不可能と判定した場合(ステップS98;No)、属性定義検証部320は、ステップS97の処理へと再び戻り、データフローテーブルに登録された他の部分データフローを検証対象とする。
一方、ステップS98において、検証対象を構成する構成要素の保護属性の一致判定が可能と判定した場合(ステップS98;Yes)、属性定義検証部320は、検証対象を構成する構成要素のうち、一意決定済みの構成要素について保護属性がセキュリティ関数リスト中の定義に一致するか否かを判定する(ステップS99)。
ステップS99の処理の結果、何れか一つでも不一致があった場合(ステップS100;No)、属性定義検証部320は、保護属性が不一致となった箇所を表示部33に表示させた後(ステップS101)、本処理を終了する。
一方、ステップS99の処理の結果、全ての構成要素で保護属性が一致した場合(ステップS100;Yes)、属性定義検証部320は、検証対象の部分データフローに含まれた未決定の多重定義関数の引数について、多重定義関数テーブル及びオブジェクト保護属性テーブルの対応フィールドに確定保護属性を登録する(ステップS102)。ここで、一つの引数の保護属性が一意決定されたことで、その関数の多重定義に基づいて他の引数の保護属性が派生的に一意決定できるような場合(これは、部分データフローの確定保護属性とは必ずしも一致しない)には、その引数の対応フィールドに派生的に一意決定した保護属性を登録するものとする。
次いで、属性定義検証部320は、データフローテーブルから検証対象の部分データフローを削除した後(ステップS103)、当該データフローテーブルが空か否かを判定することで、全ての部分データフローを検証対象としたか否かを判定する(ステップS104)。
ステップS104において、データフローテーブルが空でないと判定した場合(ステップS104;No)、属性定義検証部320は、ステップS97の処理へと再び戻り、データフローテーブルに登録された一の部分データフローを検証対象に決定する。また、ステップS104において、データフローテーブルが空と判定した場合には(ステップS104;Yes)、本処理を終了する。
なお、正常に終了した際には(ステップS104;Yes)、多重定義関数テーブル及びオブジェクト保護属性テーブルを出力する態様としてもよい。
以下、上述した保護属性決定処理の動作例について説明する。なお、以下では検証対象のプログラムリストとして、図27の疑似プログラムリストが用いられるものとする。ここで、図27は、図11に示した疑似プログラムリストの6行目〜11行目のパラメータ、14行目から25行目の変数の保護属性を未決定としたものとなっている。
図28−1、図28−2、図28−3は、上述した保護属性決定処理の実行により、図27の疑似プログラムリストに含まれた変数、パラメータの変数属性が逐次決定されていく過程を示した図である。ここで、各行は部分データフロー番号毎に纏められた各初期化定数、変数及び仮引数に対応している。図28−1、図28−2、図28−3において、左の列から「部分データフロー番号」、「初期化定数、変数および仮引数名」、各パラメータ及び変数の初期状態における保護属性を表した「初期保護属性」が夫々示されている。なお、各保護属性において空欄は未決定の状態であることを意味している。
次の列からは自動決定手順の進行、即ち各検証対象に対するステップS97〜S104のループ処理を表している。ここで「決定対象=X」のXは、保護属性の決定を試みた部分データフロー番号、即ち、検証対象の部分データフローを意味している。各手順において「前」と示したものは、検証対象の部分データフロー自身の構成要素の保護属性を決定する段階を意味している。また、「後」と示したものは、検証対象の部分データフローでの保護属性の決定に伴い、他の部分データフローにおいて派生的に保護属性を決定する段階を意味している。なお、保護属性名の右端に示した丸印は、今回の手順により決定された保護属性を明示するものである。
例えば、部分データフロー番号1の場合、「決定対象=1前」において、Input関数の保護属性が「exposed」に限定されている。これは、他の変数の定義と矛盾しないため、他の変数の保護属性は全て「exposed」属性と決定され、この結果がオブジェクト保護属性テーブルに登録されている。また、多重定義された関数#D12_PublicVerifyRSA(#1)も「exposed」属性と決定され、この結果が関数多重定義テーブルに書き込まれる。
「決定対象=1後」では、更新された関数多重定義テーブルに基づき、部分データフロー番号3の#D12_PublicVerifyRSA(#3)の保護属性が「verified」に一意決定されることになるため、この結果がオブジェクト保護属性テーブルに登録されている。また、部分データフロー番号4のbuf変数の保護属性が「exposed」に一意決定されることになるため、この結果がオブジェクト保護属性テーブルに登録されている。以下同様の処理を繰り返すことにより、全ての変数の保護属性を矛盾なく自動決定することができる。この場合、どの部分データフローから自動決定の手順を開始しても同じ結果が得られる。
以上のように、本実施形態のプログラム開発装置によれば、プログラムリストにおいて、一部の初期値に関してのみセキュリティプロトコル仕様に基づいて保護属性を明示的に与えておけば、他の作業変数の保護属性を自動的に決定することができるため、プログラム開発時の負荷を軽減することができるとともに、プログラムの開発を効率化することができる。
なお、本実施形態の構成を上述した第1〜3の実施形態のプログラム開発装置300に適用する態様としてもよい。特に、第3の実施形態のプログラム開発装置300に適用することで、プログラム開発から実行可能形式プログラムまでの一連の工程にかかる負荷を、軽減することができる。
以上、第1〜4の実施形態について説明したが、本発明はこれらに限定されるものではなく、本発明の主旨を逸脱しない範囲での種々の変更、置換、追加などが可能である。
例えば、上記各実施形態の処理にかかるプログラムを、コンピュータで読み取り可能な記憶媒体として提供することも可能である。記憶媒体としては、磁気ディスク、光ディスク(CD−ROM、CD−R、DVD等)、光磁気ディスク(MO等)、半導体メモリ等、プログラムを記憶でき、且つ、コンピュータが読み取り可能な記憶媒体であれば、その記憶形式は何れの形態であってもよい。
また、上記各実施形態の処理にかかるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。