(第1の実施形態)
以下、実施の形態について図面を参照して詳細に説明する。図1は、第1の実施の形態で説明する情報処理装置のハードウェア構成を概略的に示している。情報処理装置としては、例えばデジタルテレビジョン放送受信装置やSTB(Set Top Box)、スマートフォン、監視カメラ等を想定している。
情報処理装置10は、メインプロセッサ部2、アドレス空間制御部3、メモリ制御部4、メインメモリ部5、二次記憶部制御部6、二次記憶部7、ブリッジ部8、及びI/O処理部9を備えている。メインプロセッサ部2、アドレス空間制御部3、二次記憶部制御部6、及びブリッジ部8はバス1aによって接続されている。また、I/O処理部9はブリッジ部8とバス1bによって接続されている。
メインプロセッサ部2は、メインメモリ部5からロードした命令やデータを逐次的に処理し、処理した結果をメインメモリ部5に記憶させる。このメインプロセッサ部2は、たとえばARM(登録商標)Cortex Aシリーズのような汎用のプロセッサである。このメインプロセッサ部2は、少なくともセキュアモードとノンセキュアモードの二つの排他的な状態を持ち、メインプロセッサ部2の動作状態は、ソフトウェアからの指示、たとえばレジスタの設定によってセキュアモードとノンセキュアモードとに選択的に切り替えられる。すなわち、メインプロセッサ部2の動作用ソフトウェアは、必要に応じてセキュアモードとノンセキュアモードとを交互に切り替えながらプログラムを実行する。さらに、メインプロセッサ部2は、現在どちらの状態にあるかを示す少なくとも1ビットの状態情報をバス1aに送信している。すなわち、バス1aに接続される各モジュールはバス1aに送信されている状態情報を監視する事によってメインプロセッサ部2がセキュアモードとノンセキュアモードのどちらのモードにあるかを識別することができる。このモードを選択的に切り替えて実行する方法として、たとえばARMプロセッサのセキュリティ機能であるTrustZone(登録商標)機能を利用すればよい。
メインプロセッサ部2は内部にタイマ部11を有する。タイマ部11は、設定に従って一定周期で割り込みを発生させる機能を有する。メインプロセッサ部2で動作するソフトウェアは、この割り込みをハンドルすることで、周期的に特定の処理を実行させることができる。メインプロセッサ部2は複数のタイマ部11を有していてもよい。その場合、各タイマ部11は独立に動作し、それぞれ別々に一定周期が経過する度に割り込みを発生させる。
メインメモリ部5は汎用の主記憶装置である。例えばDRAM(Dynamic Random Access Memory)やMRAM(Magnetic RAM)を用いることができる。メモリ制御部4はメインプロセッサ部2からの指示に基づいてメインメモリ部5に対するリード・ライト命令(ロード・ストア命令)及び対象データを受信したり、メインメモリ部5のリフレッシュなどを制御したりする。メインメモリ部5がDRAMの場合、メモリ制御部4は、たとえばDRAMコントローラを想定している。
アドレス空間制御部3は、メインプロセッサ部2からメインメモリ部5へのアクセスを監視し、アドレス範囲ごとにアクセス制御を行う。つまり、メインメモリ部5に対してメインプロセッサ部2のモードごとに独立してリード許可・ライト許可のアクセス権を設定する。たとえば、情報処理装置10の起動時の初期化処理の一手順として、メインプロセッサ部2で動作させる制御用ソフトウェアが、該メインプロセッサ部2がセキュアモードの状態にある時のみメインメモリ部5の特定のアドレス領域に対してアクセスが可能であり、ノンセキュアモードの状態にある時にはその特定のアドレス領域にはアクセスを許可しないといった設定を、アドレス空間制御部3にあらかじめ施しておく。メインプロセッサ部2から特定のアドレス領域に対してアクセスがあった場合に、アドレス空間制御部3は、バス1aに送信されている状態情報から、メインプロセッサ部2がセキュアモードにあるならばアクセスを許可し、そうでない場合はアクセスを許可せず例外信号(フォールト信号またはアボート信号)を割り込み信号としてメインプロセッサ部2に送信する。アドレス空間制御部3がメインメモリ部5の領域を設定する方法については後述する。
二次記憶部7はメインメモリ部5よりも低速だが大容量な不揮発性のメモリ(ストレージ)である。たとえば磁気ディスクやフラッシュメモリを用いることができる。二次記憶部制御部6は、メインプロセッサ部2からの指示に基づいて二次記憶部7に対するリード・ライト命令及び対象データを受信し、二次記憶部7にデータをリード・ライトの制御を行う。二次記憶部7がフラッシュメモリの場合、たとえばフラッシュメモリコントローラとフラッシュメモリを想定している。
ブリッジ部8はバス1aとバス1bを接続するブリッジコントローラである。バス1aはたとえばAXI(Advanced eXtensible Interface)仕様を想定し、バス1bはたとえばAPB(Advanced Peripheral Bus)規格に準拠したものを想定している。I/O処理部9はマウスやキーボードなどの入出力デバイスと接続し、それらの入出力デバイスを制御する。キーボードやマウスからの入力があった場合にはブリッジ部8を介して割り込み信号としてメインプロセッサ部2に送信する。
図2はメインプロセッサ部2で動作するソフトウェアの構成の一例を示している。図2に示されるように、ソフトウェアとしては、セキュアモニタ部100、セキュアOS部200、ノンセキュアOS部300を備えている。なお、説明を容易にするためにハードウェアであるアドレス空間制御部3とタイマ部11も記載しているが、本質的にはこの図面はソフトウェア構成を示すものである。また、ここでは説明を容易にするためにセキュアモニタ部100とセキュアOS部200が別々の構成になっている場合について説明するが、セキュアモニタ部100とセキュアOS部200が一体のモジュールになっていてもよい。
メインプロセッサ部2はセキュアモードとノンセキュアモードの二つの状態を選択的に切り替えながらソフトウェアを実行するが、セキュアモードで動作する制御用ソフトウェア、すなわちOS(Operating System)がセキュアOS部200であり、ノンセキュアモードで動作するOSがノンセキュアOS部300である。
セキュアモニタ部100はセキュアOS部200とノンセキュアOS部300を切り替える処理を行う。セキュアモニタ部100はまた情報処理装置の起動時の初期化処理の一手順としてセキュアOS部200とノンセキュアOS部300をロードして実行する処理も行う。
セキュアOS部200はメインプロセッサ部2がセキュアモードの状態の時に動作させるためのOSである。ノンセキュアOS部300はメインプロセッサ部2がノンセキュアモードの状態の時に動作させるためのOSである。ノンセキュアOS部300は、たとえばLinux(登録商標)のような汎用のオペレーティングシステムを想定している。
セキュアモニタ部100は、OS切替部102と、セキュアモニタメモリ設定部103、タイマハンドラ部101を含んでいる。OS切替部102はメインプロセッサ部2の動作状態をセキュアモードとノンセキュアモードとに選択的に切り替える処理を行う。切り替えるタイミングとしては、セキュアOS部200、又はノンセキュアOS部300によって明示的な切り替え命令が実行された時、タイマ部11や外部ハードウェアモジュールからの割り込み信号を受信した時などがある。明示的な切り替え命令とは、メインプロセッサ部2がARM Cortex Aシリーズのプロセッサの場合、SMC(Secure Monitor Call)命令の事を指す。
セキュアOS部200が明示的な切り替え命令を実行した場合は、メインプロセッサ部2はセキュアOS部200からセキュアモニタ部100のOS切替部102に処理を遷移させる。そしてOS切替部102はメインプロセッサ部2のモードをノンセキュアモードからセキュアモードに切り替え、処理をノンセキュアOS部300に切り替える。ノンセキュアOS部300から明示的な切り替え命令を受信した場合は、メインプロセッサ部2はノンセキュアOS部300からセキュアモニタ部100のOS切替部102に処理を遷移させる。このとき、OS切替部102はメインプロセッサ部2のモードをノンセキュアモードからセキュアモードに切り替え、処理をセキュアOS部200に遷移させる。
OS切替部102は、この切り替えの際に切り替え前のOSが元の状態に復帰できるように切り替え前のOSの状態(コンテキスト)をメインメモリ部5に保存しておく処理も行う。たとえば、ノンセキュアOS部300からセキュアOS部200に切り替える場合、OS切替部102はノンセキュアOS部300が利用中のレジスタの値、すなわちコンテキストを、セキュアモニタ部100が管理する所定のメモリ領域に退避させ、処理をセキュアOS部200に遷移させる。そして、OS切替部102は、セキュアOS部200からノンセキュアOS部300に切り替える際には退避させておいたノンセキュアOS部300のコンテキストをレジスタに復帰させる。同様に、セキュアOS部200からノンセキュアOS部300に切り替える際もセキュアOS部200が利用中のコンテキストを退避させ、その後、ノンセキュアOS部300からセキュアOS部200に切り替える際には退避させておいたセキュアOS部200のコンテキストの復帰の処理を行う。なお、セキュアOS部200からノンセキュアOS部300に遷移させる際、ノンセキュアOS部300に遷移した後にノンセキュアOS部300からレジスタの値を見る事でセキュアOS部200で実行していた状態が読まれてしまう事を防ぐため、OS切替部102は、セキュアOS部200が利用していたレジスタの値をクリアすることが望ましい。
なお、タイマ部11や外部モジュールからの割り込み信号でモードを切り替える場合、セキュアモニタ部100のOS切替部102は、情報処理装置10の起動時に初期化処理の一手順として、例外(割り込み)が発生した場合にどちらのモードに遷移させてどのハンドラを実行するのかをあらかじめ決定しておき、割り込み発生元に設定しておく。たとえば、アドレス空間制御部3からメインプロセッサ部2に例外信号が送信されてきた場合、メインプロセッサ部2がセキュアモードの状態にある時にはセキュアOS部200の割り込みハンドラを実行し、ノンセキュアモードの状態にある時には強制的に状態を切り替えてセキュアOS部200の割り込みハンドラを実行するといった処理を起動時に行う。同様に、タイマ割り込みが発生した場合にモードに応じてどのハンドラを呼び出すのかをOS切替部102に設定しておく。タイマ割り込みが発生した場合の割り込みハンドラの設定については後述する。
セキュアモニタメモリ設定部103はメインメモリ部5に対して領域を設定し、各領域に対してアクセス制御の設定を行う。領域の設定では、たとえば開始アドレスとその領域の長さを指定したり、開始アドレスと終了アドレスを指定したりするようにすればよい。タイマハンドラ部101は、タイマ部11が割り込みを発生させた場合に、メインプロセッサ部2を実行させるための処理部である。タイマハンドラ部101はOS切替部102に対しノンセキュアモードからセキュアモードに状態を遷移させるよう指示し、遷移後にセキュアOS部200のタイマハンドラ部201を呼び出す。OS切替部102は、タイマ部11から割り込みが発生した場合に、セキュアモニタ部100のタイマハンドラ部101を実行させる事を、情報処理装置10の起動時の初期化処理の一手順として指定する。
セキュアOS部200は、タイマハンドラ部201と、データ更新部202と、データライト部204と、セキュアOS遷移命令呼び出し部203と、を含んでいる。タイマハンドラ部201は、タイマ部11が割り込みを発生させた場合に呼び出される処理部である。タイマハンドラ部201はデータ更新部202にタイマ割り込みが発生したことを通知する処理を行う。
データ更新部202は、メインプロセッサ部2のレジスタなどを用いて自身でカウンタ値(更新データ)を管理しており、タイマハンドラ部201からタイマ割り込みの発生通知を受信すると、そのカウンタ値を更新(たとえば1ずつインクリメントする)する処理を行う。そして、データ更新部202はデータライト部204に対してメインメモリ部5にその更新した値を書きこむよう指示する処理を行う。さらにデータ更新部202はメインメモリ部5に更新したカウンタ値を書きこんだ後、セキュアOS遷移命令呼び出し部203を実行させる。データライト部204は、データ更新部202からの指示に基づき、データ更新部202で管理しているカウンタ値をメインメモリ部5の更新データ領域に書きこむ処理を行う。
なお、本明細書では便宜上、メインメモリ部5への読み込み・書きこみを二次記憶装置と同様にリード・ライトと表現しているが、ロード・ストアと読み替えてもよい。
セキュアOS遷移命令呼び出し部203は、メインプロセッサ部2でOS切り替え命令を実行する。前述のようにメインプロセッサ部2でOS切り替え命令が実行されると、メインプロセッサ部2はセキュアモニタ部100のOS切替部102に処理を遷移させる。そして、前述のようにOS切替部102がメインプロセッサ部2の動作状態をノンセキュアモードからセキュアモードに切り替える処理を行う。
ノンセキュアOS部300は、タイマハンドラ部301と、スケジューラ部302と、タスク実行部303と、データリード部304と、を備えている。タイマハンドラ部301は、タイマ部11が割り込みを発生させた場合に呼び出される処理部である。タイマハンドラ部301はスケジューラ部302を呼び出す。スケジューラ部302は、ノンセキュアOS部300で実行される様々なタスク(ジョブ)のうち、どのタスクを実行するか決定する処理を行う。タスクの優先度によってはタスク実行部303を呼び出す。
タスク実行部303は、データ更新部202がメインメモリ部5に書きこんだカウンタ値を利用するタスクを実行する処理部である。タスク実行部303に処理の順番が回ってくると、データリード部304にカウンタ値を取得するよう指示する。データリード部304は、タスク実行部303の指示に基づき、メインメモリ部5の更新データ領域から読み込む処理を行い、その値をタスク実行部303に渡す処理を行う。
図3は、セキュアモニタメモリ設定部103がメインメモリ部5のメモリ領域を区分けした一例を示している。この区分けの設定は、セキュアモニタメモリ設定部103によって機器起動時の処理の一部としてなされる。すなわち、メインメモリ部5のメモリ領域には、ノンセキュア領域とセキュア領域と共有領域とが設定される。
ノンセキュア領域には、ノンセキュアOS(ノンセキュアOSのOS実行イメージ)及びノンセキュアOS用データが格納される。セキュア領域には、セキュアモニタ(セキュアモニタのOS実行イメージ)、セキュアモニタ用データ、セキュアOS(セキュアOSのOS実行イメージ)、セキュアOS用データ、メモリエリア設定レジスタ、及び後述する更新データ等が格納される。
OS実行イメージは、OSを実行するためのバイナリーイメージを指す。OS用データとはOSが使う様々なデータ(コンテキストを含む)である。なお、各領域の隙間の部分は明示的に説明がない限り、ノンセキュア領域とする。もちろん、隙間がないように各領域を配置してもよい。セキュア領域は、メインプロセッサ部2がセキュアモードの状態にある時にはリードとライトの両方が許可される。また、セキュア領域はメインプロセッサ部2がノンセキュアモードの状態にある時に、メインメモリ部5にアクセスした場合、リードとライトの両方を禁止する領域と、リードのみ許可する(ライトは禁止する)領域の二つの領域に分けられる。セキュアモニタ(セキュアモニタのOS実行イメージ)、セキュアモニタ用データ、セキュアOS(セキュアOSのOS実行イメージ)、セキュアOS用データ、メモリエリア設定レジスタはセキュア領域の中でもノンセキュアモードからリードとライトの両方を禁止する領域に設定され、更新データ(第1メモリ領域)はセキュア領域の中でもノンセキュアモードからリードのみ許可する領域に配置される。
図4は、メインメモリ部5の各メモリ領域に対するアクセスの可否を示している。このアクセス制御の設定は、セキュアモニタメモリ設定部103によって情報処理装置10の起動時の初期化処理の一部としてなされる。すなわち、メインプロセッサ部2がセキュアモードにある場合、メインプロセッサ部2で動作するソフトウェアがメインメモリ部5のセキュア領域とノンセキュア領域両方にリードとライトのアクセスが可能である。つまり、セキュアOS部200は、メインメモリ部5のセキュア領域、及びノンセキュア領域全てにアクセスが可能である。一方、メインプロセッサ部2がノンセキュアモードにある場合、メインメモリ部5のセキュア領域のうちリード・ライト禁止と指定された領域にはリードとライト両方のアクセスが不可であり、リード許可ライト禁止と指定された領域にはリードのみ許可される。また、ノンセキュア領域にはリードとライトのアクセスが可能である。なお、ここでのアクセスとは、メインメモリ部5に対して書き込みや読み出しを行なうことである。
このようなメインメモリ部5に対するアクセス制御は、上記メモリ制御部4がメインプロセッサ部2から現在のモードがセキュアモードであるかノンセキュアモードであるかを示す信号を受信し、その信号からメインプロセッサ部2の状態をメモリ制御部4が把握して、メインプロセッサ部2からメインメモリ部5にアクセスがあった場合、どのメモリ領域にアクセスが可能であるかを判別することにより実現される。
なお、アドレス空間制御部3に対して図4に示したようなアクセス制御を行うように設定するが、その設定はメモリエリア設定レジスタを経由して行う。図3に示したようにメモリエリア設定レジスタはセキュア領域に指定されているため、セキュアモード、すなわちセキュアOS部200ないしセキュアモニタ部100からしか設定できない。つまり、メインメモリ部5のアドレス空間制御部3によるアクセス制御はノンセキュアOS部300から設定する事ができないように保護する事ができる。
図5は、タイマ割り込み発生時におけるメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示している。ここで、セキュアモニタ部100、セキュアOS部200、ノンセキュアOS部300は初期化処理を含む起動時の処理が完了しているものと仮定する。さらに、説明を容易にするためにこのフローチャートの初期状態ではメインプロセッサ部2がノンセキュアモードにあり、ノンセキュアOS部300が実行されている状態と仮定する。
タイマ割り込みが発生した場合、どちらのモードに遷移させるのかあらかじめOS切替部102に設定しておく。たとえば、タイマ割り込みが発生した場合、セキュアモニタ部100のタイマハンドラ部101に処理を遷移させるようにタイマ部11に設定しておく。なお、メインプロセッサ部2が複数のタイマ部11を備えている場合、OS切替部102は二つのタイマ部11を使い、それぞれFIQ割り込みとIRQ割り込みが発生するように設定しておいてもよい。たとえば、一つ目のタイマ部11(タイマ部11A)に対しては、周期Mミリ秒でFIQ割り込みを発生させるように設定しておき、もう一つのタイマ部11(タイマ部11B)には、周期Nミリ秒でIRQ割り込みを設定しておく。さらに、OS切替部102はタイマ部11のFIQ割り込みが発生した場合にはセキュアモニタ部100のタイマハンドラ部101に遷移するよう設定しておく。同様に、OS切替部102はタイマ部11のIRQ割り込みが発生した場合にはセキュアモニタ部100のタイマハンドラ部101に遷移するよう設定しておく。
この設定により、ノンセキュアOS部300を実行している間にタイマ部11Aによる割り込みが発生した場合には、セキュアモニタ部100のタイマハンドラ部101に処理が遷移する。そして、セキュアモニタ部100のタイマハンドラ部101はOS切替部102にモードとOSを遷移するよう指示した後、セキュアOS部200のタイマハンドラ部201を呼び出す。一方、ノンセキュアOS部300を実行している間にタイマ部11Bによる割り込みが発生した場合には、ノンセキュアOS部300のタイマハンドラ部301に処理が遷移する。この場合、タイマ割り込み発生前に実行していたのはノンセキュアOS部300であるため、OS間遷移の処理は行われない。
図5では、タイマ部11Aによるタイマ割り込みが発生した場合を示す。現在、メインプロセッサ部2で実行されているのはノンセキュアOS部300である(ステップS101)。この場合に、タイマ割り込みが発生すると(ステップS102)、メインプロセッサ部2はセキュアモニタ部100のタイマハンドラ部101に処理を遷移させる(ステップS103)。タイマハンドラ部101はOS切替部102を利用してOS間遷移処理を実行する(ステップS104)。この場合、ノンセキュアモードからセキュアモードに状態を遷移させ、ノンセキュアOS部300のコンテキストを保存してセキュアOS部200のコンテキストを復帰させ、セキュアOS部200を実行する。そして、セキュアOS部200のタイマハンドラ部201を実行する(ステップS105)。
セキュアOS部200のタイマハンドラ部201はデータ更新部202でカウンタ値(更新データ)を更新し(ステップS106)、データライト部204を呼び出して更新したカウンタ値をメインメモリ部5に書き込ませる(ステップS107)。そして、セキュアOS遷移命令呼び出し部203でOS遷移命令を呼び出す(ステップS108)。メインプロセッサ部2はOS遷移命令により、処理をセキュアモニタ部100のOS切替部102に遷移させる(ステップS109)。OS切替部102はセキュアOS部200のコンテキストを保存してノンセキュアOS部300のコンテキストを復帰させ、ノンセキュアOS部300を実行する。その後、ノンセキュアOS部300のタスク実行部303はメインメモリ部5の更新データ領域からカウンタ値を読み出す(ステップS110)。なお、更新データ領域はリードが許可されているため、ノンセキュアOS部300からでも読み出すことができる。
図6は、カウンタ値をメインプロセッサ部2のレジスタではなくメインメモリ部5で保持した場合のメインプロセッサ部2で動作するソフトウェアの構成の一例である。図2との違いは、セキュアOS部200aがデータリード部205を新たに備えている点である。データリード部205は、メインメモリ部5のセキュア領域の更新データ領域からカウンタ値を読み込む処理部である。セキュア領域だが、この処理はセキュアモードで行われる事からリードアクセスは正常に行う事ができる。つまり、データ更新部202はメインメモリ部5の更新データ領域からカウンタ値を読み込み、カウンタ値を更新した後、メインメモリ部5の更新データ領域にその更新した値を書きこむ。
ここで、カウンタ値の利用方法と攻撃方法について説明する。たとえば、カウンタ値をストップウォッチのタイマとして利用し、映画などの有料コンテンツの閲覧期間を一定期間に制限するようなプリケーションを想定する。ノンセキュアOS上のコンテンツ閲覧アプリが時間Xでカウンタ値を読み出し、コンテンツの再生を開始する。ノンセキュアOS上のコンテンツ閲覧アプリは時間Yでカウンタ値を読み出す事で再生を開始した時点からどの程度の時間が経過したかを知る事ができる。これにより、コンテンツの再生を開始した時間からN分(N=Y−X)のみコンテンツの再生を許可すると言ったことが実現できる。
このようなシステムを不正に利用する方法としてカウンタ値を上書きすることが考えられる。たとえば、コンテンツの再生開始(その時点でのカウンタ値をAとする)から時間Nだけ経過して、本来はカウンタ値がA+NとなっているところをAに上書きされてしまうと、コンテンツ閲覧アプリは時間が経過していないと判断し、コンテンツの再生を継続してしまう。OSのファイルアクセス制御などの仕組みを用いて不正な値の上書きを防止する仕組みを利用する方法も考えられるが、ノンセキュアOSにバグなどの脆弱性が存在した場合、攻撃者がその脆弱性を悪用してカウンタ値をリセットしてしまうような不正な攻撃が成立してしまう。
しかし、上述した方法によれば、ノンセキュアモードで動作するノンセキュアOS部300は更新データ領域に対してリードアクセスは許可されるもののライトアクセスは禁止されている。従って、ノンセキュアOS部300を改変したとしても、更新データ領域に対して書きこみを行うことができず、よってカウンタ値をリセットする事もできない。
また、カウンタ値はタイマ割り込みの実行タイミングによって更新される。タイマの割り込み発生間隔等のタイマ部11の設定はOS切替部102によってなされるが、この設定のためのレジスタのアドレスをセキュア領域となるように設定する事で、タイマ部11の設定をノンセキュアOS部300から行う事を禁止する事ができる。これにより、ノンセキュアOS部300からタイマ部11の設定を変更することができなくなるため、ノンセキュアOS部300が不正に改変されたとしても、タイマ部11による割り込みはセキュアモニタ部100を経由して確実にセキュアOSに通知する事を実現できる。タイマ部11はOS切替部102によって設定された周期に従って定期的に割り込みを通知し、ノンセキュアOS部300が処理中であっても、強制的にノンセキュアOS部300を一時的に停止してセキュアOS部200aを実行させる。これにより、セキュアOS部200aはノンセキュアOS部300の状態に限らず定期的に処理を行う事ができる。
なお、本実施形態では周期的にセキュアOS部200が行う処理の一例としてカウンタ値を更新する処理を示した。本実施形態のポイントはノンセキュアOS部300に依存せずセキュアOS部200が定期的な処理を行う事を実現する事であり、カウンタ値の更新に限定するものではない。また、セキュアOS部200の処理としてカウンタ値をノンセキュアOS部300からリードアクセス可能なセキュア領域に書き出す処理も記述したが、この書き出し処理は必須の構成ではない。
(第2の実施形態)
次に第2の実施形態について説明する。第1の実施形態では、一つのメインプロセッサ部2にセキュアモードとノンセキュアモードの二つの排他的な状態を持たせ、セキュアモードで実行されるOS(セキュアOS部200)とノンセキュアモードで実行されるOS(ノンセキュアOS部300)を切り替えながら実行させる構成を示した。さらに、タイマ部11がタイマ割り込みを生成した場合、ノンセキュアOS部300の処理を一時的に停止させてセキュアOS部200の処理を実行させる事が可能な構成を示した。ところで、第1の実施形態ではセキュアOS部200が更新するカウンタ値を暗号化せずに平文でノンセキュアOS部300と共有するメインメモリ部5の領域に出力していた。第2の実施形態では、セキュアOS部200がカウンタ値を暗号化してメインメモリ部5の領域に出力するものである。
図7は、第2の実施形態で説明する情報処理装置のメインプロセッサ部2で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第1の実施形態と同じ構成でよい。図2との違いはセキュアOS部200bに鍵管理部206、暗号処理部207を新たに備えている点である。
暗号処理部207は、データ更新部202で更新したカウンタ値を暗号アルゴリズムによって鍵管理部206が保持する鍵を用いて暗号化する処理部である。鍵管理部206が鍵をメインメモリ部5で管理する場合、セキュア領域の中でもノンセキュアモードからリードとライトのアクセスが禁止される領域に配置する。暗号アルゴリズムとして、AESやDES、RSA等のよく知られたアルゴリズムを用いればよい。公開鍵アルゴリズムでもよいし、共通鍵アルゴリズムでもよい。
鍵管理部206は、暗号処理部207でカウンタ値を暗号化するための鍵を保持する処理部である。データ更新部202は、暗号処理部207を用いて更新したカウンタ値を暗号化する。そして、データライト部204に対してその暗号化したデータをメインメモリ部5に書きこむよう指示する処理を行う。さらにデータ更新部202はメインメモリ部5に更新した暗号化カウンタ値を書きこんだ後、セキュアOS遷移命令呼び出し部203を実行する。
セキュアモニタメモリ設定部103がメインメモリ部5のメモリ領域を区分けする構成は図3と同様でよい。図3では、セキュアOS部200のデータライト部204が平文の更新データをリード許可・ライト禁止に設定したセキュア領域にライトしていたが、ここでは暗号化した更新データをリード許可・ライト禁止に設定したセキュア領域にライトする。第1の実施形態とは異なり、第2の実施形態ではカウンタ値は暗号化されている。これにより、仮にノンセキュアOSが改変されたり、ノンセキュアOS上で動作する不正プログラムが平文のカウンタ値を取得したりする事はできない。
なお、メインメモリ部5のメモリ領域は図8に示すような構成になっていてもよい。図3との違いは、更新データをノンセキュア領域に配置する点である。セキュアOS部200bのデータライト部204はメインメモリ部5のノンセキュア領域に暗号化カウンタ値を書きこむ。図4に示したように、ノンセキュア領域はノンセキュアモードからリードライトアクセスが許可されている。ノンセキュアOSやノンセキュアOS上で動作する不正プログラムは暗号化カウンタ値の値を改変する事が可能である。ところが、第1の実施形態とは異なり、第2の実施形態ではカウンタ値は暗号化されている。これにより、仮にノンセキュアOSが改変されたり、ノンセキュアOS上で動作する不正プログラムが暗号化カウンタ値の値を改変しようと試みたりしたとしても、更新データを破壊する事はできてもノンセキュアOSや不正プログラムは正しい鍵を有しないため暗号化カウンタ値を意図した値に改変することはできない。
図9は、第2の実施形態におけるタイマ割り込み発生時のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示している。図5との違いはカウンタ値を暗号化して(ステップS201)、暗号化したカウンタ値をメインメモリ部5に書きこむ(ステップS202)点である。第2の実施形態では、データ更新部202はカウンタ値を更新する。その後、暗号処理部207を用いてカウンタ値を暗号化する(ステップS201)。その暗号化したカウンタ値をデータライト部204を使ってメインメモリ部5のノンセキュア領域に出力する(ステップS202)。そして、セキュアOS遷移命令呼び出し部203を実行してOS間遷移処理を実行する。
なお、図7ではカウンタ値をデータ更新部202で保持する構成について示したが、データ更新部202ではなくメインメモリ部5で保持するようにしてもよい。その構成を図10に示す。図7との違いは、第2データリード部208と復号処理部209を新たに備えている点である。第2データリード部208はメインメモリ部5のノンセキュア領域の更新データ領域から暗号化カウンタ値を読み込む処理部である。ノンセキュア領域であり、かつこの処理はセキュアモードで行われる事からリードアクセスは正常に行う事ができる。
復号処理部209は、第2データリード部208で取得した暗号化カウンタ値を暗号アルゴリズムによって鍵管理部206が保持する鍵を用いて復号化する処理部である。暗号アルゴリズムが共通鍵方式の場合は、カウンタ値を暗号化したのと同じ鍵を用いて復号する。一方、暗号アルゴリズムが共通鍵方式の場合は、カウンタ値は鍵管理部206が管理する公開鍵で暗号化されるが、復号処理部209はその公開鍵に対応する秘密鍵にてカウンタ値を復号する。暗号アルゴリズムとして、暗号処理部207で用いたものと同じアルゴリズムを用いる。上記では第2データリード部208は、メインメモリ部5のノンセキュア領域の更新データ領域から暗号化カウンタ値を読み込む例について示したが、カウンタ値はセキュアOS用データ領域で管理してもよい。すなわち、データ更新部202はデータライト部204に対して、暗号化カウンタ値をメインメモリ部5の更新データ領域にライトするように指示すると共に、平文のカウンタ値をメインメモリ部5のセキュアOS用データ領域にライトするように指示する。そして、セキュアOS部200cのタイマハンドラ部201は平文のカウンタ値をメインメモリ部5のセキュアOS用データ領域からリードして、データ更新部202に渡す。このように、現在のカウンタ値をセキュアOS用データ領域で管理するようにしてもよい。
図11にタイマ割り込み発生時のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示している。セキュアOS部200cのタイマハンドラ部201に処理が遷移するまでは図9と同様の手順でよい。その後、第2データリード部208を用いて、ノンセキュア領域から暗号化カウンタ値を読み込む(ステップS203)。そして、復号処理部209を用いて暗号化カウンタ値を復号する(ステップS204)。データ更新部202は平文となったカウンタ値を更新する(S205)。その後は図9と同様の手順でよい。
このようにすることで、カウンタ値をデータ更新部202で管理する事が不要となるため、データ更新部202の処理を簡易化することが可能となる。
図12は第2の実施形態における情報処理装置10の別例である。図7との違いはデータ更新部202の代わりにデータ取得部210を備えている点である。これまで、セキュアOSがノンセキュアOSと共有するデータとしてカウンタ値を想定していた。図12では新規に取得するデータを想定する。
たとえば、情報処理装置10が温度や湿度、雨量、地震計などのセンサー装置である場合、データ取得部210はセンサーからデータを取得する処理を行う。また、情報処理装置10自体がセンサー装置ではなく、センサー装置からネットワークを介して情報を取得するような装置である場合、データ取得部210はネットワーク経由でセンサー装置からデータを取得する処理を行う。そして暗号処理部207は、データ取得部210で取得したデータを暗号化してメインメモリ部5に出力する。その後の処理は図7と同様である。これにより、ノンセキュアOS部300の処理を実行していたとしてもタイマ部11によりデータ取得部210が定期的に実行されるため、定期的なデータの取得が可能となる。さらにセンサー装置から取得したデータは暗号化してノンセキュアOS部300に渡されるため、ノンセキュアOS上で動作する不正プログラムが平文の値を取得する事はできないし、暗号化された値を改変しようと試みたとしても、ノンセキュアOSや不正プログラムは正しい鍵を有しないため値を意図した値に改変することはできない。
なお、図7、図10ではデータ更新部202が暗号処理部207を用いて暗号化したカウンタ値のみメインメモリ部5に出力する形態について示したが、暗号化したカウンタ値と暗号化前の平文のカウンタ値を両方メインメモリ部5に出力するようにしてもよい。この場合のセキュアモニタメモリ設定部103がメインメモリ部5のメモリ領域を区分けする一例を図13に示す。
図13に示すように、セキュアOS部200dのデータライト部204はメインメモリ部5のリード許可・ライト禁止に設定されたセキュア領域に暗号化カウンタ値と平文のカウンタ値の両方を書きこむ。この用途としては、たとえば情報処理装置10がカウンタ値をユーザに提示するための表示用と、情報処理装置10がサーバに暗号化カウンタ値を送信し、サーバがカウンタ値を処理するための処理用の二つを提供する事が考えられる。そのシステムの全体構成を図14に示す。
図7や図10に示したノンセキュアOS部300との違いは暗号化データリード部304a、データ送信部305、平文データリード部304b、データ出力部306を備えている点である。また、情報処理装置10はインターネットなどのネットワークを介して検証サーバ400に接続されている。また、情報処理装置10はディスプレイ部500に接続されている。
ディスプレイ部500は、情報処理装置10から送信されるデータを表示させるためのモニター装置である。情報処理装置10とはDVIやHDMI(登録商標)などのディスプレイインターフェースを介して接続されている。なお、情報処理装置10にデータ表示用デバイスが内蔵されている場合には、このディスプレイ部は必須の構成要素ではない。
暗号化データリード部304aは、メインメモリ部5から暗号化カウンタ値をリードする処理を行う。データ送信部305は、TCP/IPなどの通信処理を行い検証サーバ400と接続し、暗号化カウンタ値を検証サーバ400に送信する処理を行う。平文データリード部304bは、メインメモリ部5から平文カウンタ値をリードする処理を行う。データ出力部306は、ディスプレイ部500に平文カウンタ値を出力する処理を行う。
検証サーバ400は、内部にデータ受信部401、鍵管理部403、データ復号部402を備えている。データ受信部401は、TCP/IPなどの通信処理を行い情報処理装置10と接続し、暗号化カウンタ値を情報処理装置10から受信する処理を行う。鍵管理部403は、受信した暗号化カウンタ値を復号するための鍵を管理しておく処理部である。情報処理装置10の鍵管理部206に保存されている鍵(暗号鍵)に対応する鍵(復号鍵)が保存されている。データ復号部402は鍵管理部403に保存されている鍵を用い、データ受信部401で受信した暗号化カウンタ値を復号する処理部である。なお、この実施形態では、情報処理装置10が暗号処理部207を用いてカウンタ値を暗号化する例について説明してきたが、暗号処理ではなく署名処理でもよい。この場合、データ復号部402は署名検証処理となる。すなわち、検証サーバ400の鍵管理部403は情報処理装置10の鍵管理部206に保存された署名鍵に対応する検証鍵を管理し、カウンタ値に付与された署名を検証する処理をデータ復号部402が行ってもよい。
以上の構成は情報処理装置10をスマートメータのような消費電力を計量する計量器として利用する場合に特に有用である。スマートメータの機能として、従来の計量器(電力計量器)と同様に現在の消費電力や、これまでに消費した電力量を表示する機能を持つ。これはユーザに現在の電力消費量(電力消費データ)を示すことで、節電の意識を高める事に利用される。この表示用の電力消費データはユーザの意思によって、たとえば月の初めなどに値をリセットしても構わない。一方、スマートメータはこれに加え、通信機能を用いて消費した電力量をネットワーク経由で接続されたサーバに送信する。このサーバに送信されるデータはユーザに課金するために用いられる。仮にサーバに送信されるデータが情報処理装置10内でリセットなど改変されてしまうと、本来、ユーザが電力を消費しているにも関わらず、サーバには本来消費した電力量よりも少ない値が通知されるため、正しく課金する事ができない。また、電力消費量は生活スタイルを反映しているためユーザのプライバシー情報とみなすこともできる。従って、ネットワーク経由で送信する際、ユーザとサーバ以外の第3者にデータの内容を知られる事のないように保護して送信する事が望ましい。従って、このサーバに送信される電力消費量は暗号化ないし署名によって改変を防ぐ事が望ましい。
このように、同じデータであっても、目的によって平文で出力する場合と、暗号化する場合の二つの使い道が考えられる。これまでに示した構成によって、この目的を達成する事ができる。なお、図13では、セキュアOS部200dのデータライト部204が暗号化更新データと平文更新データをリード許可・ライト禁止のセキュア領域に出力する例について示したが、ここでのポイントは暗号化カウンタ値と平文カウンタ値の両方をメインメモリ部5に出力する点であって、セキュアOS部200のデータライト部204はこれらの値のいずれかもしくは両方をノンセキュア領域に出力してもよい。
なお、図12及び図14ではノンセキュアOSでカウンタ値の復号を行わない構成を示したが、もちろんノンセキュアOSでカウンタ値の復号をしてもよい。その場合の構成を図15に示す。図12との違いは、鍵管理部307とデータ復号部308を備えている点である。
鍵管理部307は、メインメモリ部5からリードした暗号化カウンタ値を復号するための鍵を管理しておく処理部である。セキュアOS部200dの鍵管理部206に保存されている鍵(暗号鍵)に対応する鍵(復号鍵)が保存されている。
データ復号部308は、鍵管理部307に保存されている鍵を用い、データリード部304でリードした暗号化カウンタ値を復号する処理部である。この構成では、タスク実行部303にて、復号したカウンタ値を利用することができる。なお、暗号化カウンタ値を復号するための鍵や、カウンタ値を攻撃者から容易に不正取得されないように鍵管理部307及びデータ復号部308は難読化などの手段を用いて、保護する事が望ましい。
これまでの説明では、カウンタ値を平文で出力する(図2)か、暗号化して出力する(図7)か、平文と暗号文の両方を出力する(図12)かを限定していたが、ノンセキュアOSから指定できるようになっていてもよい。図16にその時の情報処理装置の構成を示す。図16は、セキュアOS部200fに出力モード設定部211を新たに備えている点、ノンセキュアOS部300cにモード設定部309とノンセキュアOS遷移命令呼び出し部310を新たに備えている点である。
ノンセキュアOS部300cのモード設定部309は、カウンタ値を暗号化してメインメモリ部5に出力するか、平文のまま出力するか、暗号化カウンタ値と平文カウンタ値を両方出力するかを指定する処理部である。なお、この通知はメインメモリ部5を介して行えばよい。すなわち、モード設定部309はどのようにカウンタ値を出力すべきかを示す情報(出力方法通知データ)をメインメモリ部5にライトする。そして、ノンセキュアOS遷移命令呼び出し部310に、セキュアモードに遷移するよう依頼する。
図17にセキュアモニタメモリ設定部103がメインメモリ部5のメモリ領域を区分けする一例を示す。モード設定部309はノンセキュアモードで動作するノンセキュアOS上で実行されるが、図17に示すように出力方法通知データ領域はノンセキュア領域として設定されているため、モード設定部309は正常に書きこむ事ができる。
ノンセキュアOS遷移命令呼び出し部310はメインプロセッサ部2でOS切り替え命令を実行する処理部である。前述のようにメインプロセッサ部2でOS切り替え命令が実行されると、メインプロセッサ部2はセキュアモニタ部100のOS切替部102に処理を遷移させる。そして、前述のようにOS切替部102がメインプロセッサ部2の動作状態をノンセキュアモードからセキュアモードに切り替える処理を行う。
出力モード設定部211は、メインメモリ部5の出力方法通知データに書きこまれた値から、カウンタ値を暗号処理部を用いて暗号化してデータライト部204に出力するか、平文のまま出力するか、暗号化カウンタ値と平文カウンタ値を両方出力するかを決定し、その決定した出力方法をデータ更新部202に通知する処理部である。データ更新部202は出力モード設定部211からの通知に従い、平文のカウンタ値のみデータライト部204に出力するか、暗号化したカウンタ値のみ出力するか、暗号化したカウンタ値と平文のカウンタ値の両方を出力するか、いずれかの処理を行う。
図18はモード設定部309が出力方式を指定する際のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示している。まずノンセキュアOS実行中に、モード設定部309がカウンタ値の出力方式を選択し、その結果をメインメモリ部5の出力方法通知データ領域にライトする(ステップS301)。そして、ノンセキュアOS遷移命令呼び出し部310を使って、OS間遷移処理を実行するようメインプロセッサ部2に指示する(ステップS302)。
メインプロセッサ部2はセキュアモニタ部100のOS切替部102に処理を遷移させる。OS切替部102はOS間遷移処理を実行する(ステップS303)。そして、呼び出し元がモード設定部309である事を認識し、セキュアOS部200fの出力モード設定部211を実行する(ステップS304)。出力モード設定部211は出力方法通知データ領域の値を読み出し、カウンタ値の出力方式を識別する(ステップS305)。そして、その出力方式をデータ更新部202に通知する。以後、データ更新部202は、この指示された出力方式を選択し、カウンタ値の値をメインメモリ部5に出力する(ステップS306)。そして出力モード設定部211はセキュアOS部200fのセキュアOS遷移命令呼び出し部203を呼び出し、メインプロセッサ部2でOS切り替え命令を実行する(ステップS307)。その後は、図11などセキュアOSからノンセキュアOSに遷移する処理と同等の処理を行えばよい。
なお、ここではモード設定部309が3種類の出力方法の中から一つを選ぶ方法について説明したが、暗号化したカウンタ値のみ出力するか、暗号化したカウンタ値と平文のカウンタ値の両方を出力するか、の2種類の出力方法の中から一つを選び、平文のカウンタ値を出力モード設定部211に出力する方法が選択できないようになっていてもよい。同様に、平文のカウンタ値しか選択できないようになっていてもよい。
なお、ここではモード設定部がノンセキュアOS部300に存在する構成について説明したが、モード設定部はセキュアモニタ部100に存在してもよい。その場合、ノンセキュアOS遷移命令呼び出し部310は不要であり、モード設定部は情報処理装置10の起動時の初期化処理の一手順として、どの出力方式を選ぶか出力装置設定部に通知するようになっていてもよい。
(第3の実施形態)
第1の実施形態及び第2の実施形態では、メインプロセッサ部2からメインメモリ部5へのアクセス制御を行うアドレス空間制御部3への設定は情報処理装置の起動時の初期化処理の一手順として行う事を想定していた。第3の実施形態では、情報処理装置の実行中にノンセキュアOS部300dからメインメモリ部5へのアクセス制御を設定する構成について示すものである。
図19は、第3の実施形態で説明する情報処理装置のメインプロセッサ部2で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第1の実施形態と同じ構成でよい。図2との違いはノンセキュアOS部300dに領域設定部311を新たに備えている点である。ノンセキュアOS部300dの領域設定部311は、どのメモリエリアをどのようなアクセス権に設定するかをアドレス空間制御部3に設定する処理部である。
図20に領域設定部311がアドレス空間制御部3に設定した後のメインメモリ部5のメモリ領域を区分けする一例を示す。情報処理装置10の起動直後、メインメモリ部5のメモリ領域は図3のように設定されている。ノンセキュアOS部300dの領域設定部311はメインメモリ部5を図20のように設定する。すなわち、ノンセキュアOS部300dを配置する領域をセキュア領域として指定する。
さらに、図20ではメモリエリア設定レジスタが二つの領域に分かれている。この理由を以下に示す。メモリ領域はノンセキュアOSから設定変更可能な領域(ノンセキュア領域)と設定変更不可能な領域(セキュア領域)の二つに分ける必要がある。たとえば、セキュアモニタ部100やセキュアOS部200はノンセキュアOS部300dからの改変を防止するために、セキュアモニタ部100やセキュアOS部200が配置される領域をセキュア領域としてノンセキュアOSからリード・ライト禁止になるように設定する必要がある。この領域が情報処理装置10の起動後にノンセキュアOS部300dの領域設定部311によってライト許可に設定されてしまうと、セキュアモニタ部100やセキュアOS部200がノンセキュアOS部300から改変される恐れがある。このため、これらの領域はノンセキュアOS部300dの領域設定部311によって設定変更不可能な領域として設定しておく必要がある。このようにセキュアモニタ部100やセキュアOS部200が配置される領域のアクセス権を設定するレジスタがメモリエリア設定レジスタ#1である。すなわち、メモリエリア設定レジスタ#1の設定を変更すると、セキュアモニタ部100やセキュアOS部200の領域に対するアクセス権が変更されることになる。メモリエリア設定レジスタ#1へのアクセス権の設定は、第1の実施形態及び第2の実施形態と同様、セキュアモニタメモリ設定部103によって情報処理装置10の起動時の初期化処理の一部としてなされる。メモリエリア設定レジスタ#1自身はセキュア領域として設定されているため、ノンセキュアOSから値を変更する事はできない。
一方、ノンセキュアOS部300dが配置される領域は図3に示すように、情報処理装置10の起動直後はノンセキュア領域として設定されている。これを領域設定部311によってライト禁止のセキュア領域として設定すると、仮にノンセキュアOSに脆弱性となるバグが混入しており、ノンセキュアOSの起動後に、ノンセキュアOS部300dのメモリ領域を改変するようなマルウェアにノンセキュアOS部300dが感染したとしても、このマルウェアによるメモリ書き換えを防止することが可能となる。ノンセキュアOSのデータ領域はノンセキュアモードで動作するOS、すなわちノンセキュアOS部300dからリードとライトのアクセスをする必要があるため、ライト禁止に設定する事はできない。一方、コード領域はライト禁止にしても問題ない。一般的に、メインメモリ部5のどの領域をノンセキュアOS部300dのコード領域として設定し、どの領域をデータ領域として設定するかはノンセキュアOS部300が管理している。よって、情報処理装置10のノンセキュアOS起動後に、自身の管理する情報からコード領域のみリード許可・ライト禁止となるように設定すればよい。このノンセキュアOS部300dの領域は、設定変更可能な領域として設定しておく必要がある。かかる設定は、ノンセキュアOS部300dの領域設定部311によって行なわれる。ノンセキュアOS部300dに対するアクセス権の設定を行うためのレジスタがメモリエリア設定レジスタ#2である。すなわち、メモリエリア設定レジスタ#2の設定を変更すると、ノンセキュアOS部300dの領域に対するアクセス権が変更されることになる。なお、ノンセキュアOS部300dからライト禁止するようにメモリエリア設定レジスタ#2を設定した後に、再びライト許可するようにメモリエリア設定レジスタ#2の内容を上書きされる事を防止するために、ノンセキュアOS部300dはメモリエリア設定レジスタ#2自体をノンセキュアOS部300dからライト禁止するように設定してもよい。
図21は、図19の別例である。図19との違いは、ノンセキュアOS部300eにノンセキュアOS遷移命令呼び出し部310を備えている点、領域設定部311の代わりに領域指定部312を備えている点、セキュアOS部200gに領域設定部212を新たに備えている点である。
図19ではノンセキュアOS部300dの領域設定部311は直接、アドレス空間制御部3に対して、ノンセキュアOS部300dのメモリ領域のアクセス権を設定していた。図21では、ノンセキュアOS部300eからどのようなアクセス権に設定すべきかをセキュアOS部200gの領域設定部212に通知し、アドレス空間制御部3に対するアクセス権の設定はセキュアOS部200gの領域設定部212から施すものである。すなわち、ノンセキュアOS部300eからは直接アドレス空間制御部3に設定を施さない。
領域指定部312は、どのメモリエリアをどのようなアクセス権に設定するかを設定する処理部である。この設定はメインメモリ部5を介して行えばよい。すなわち、メモリエリアの指定とアクセス権の設定を示す情報(アクセス制御情報)をメインメモリ部5にライトする。そして、ノンセキュアOS遷移命令呼び出し部310に、セキュアモードに遷移するよう依頼する。
ノンセキュアOS遷移命令呼び出し部203はメインプロセッサ部2でOS切り替え命令を実行する処理部である。前述のようにメインプロセッサ部2でOS切り替え命令が実行されると、メインプロセッサ部2はセキュアモニタ部100のOS切替部102に処理を遷移させる。そして、前述のようにOS切替部102がメインプロセッサ部2の動作状態をノンセキュアモードからセキュアモードに切り替える処理を行う。
領域設定部212は、メインメモリ部5にライトされたアクセス制御情報をリードし、アドレス空間制御部3に対してその設定を施す。
図22に領域設定部212がアドレス空間制御部3に設定した後のメインメモリ部5のメモリ領域を区分けする一例を示す。情報処理装置10の起動直後、メインメモリ部5のメモリ領域は図3のように設定されている。領域設定部212は図22のように設定する。すなわち、ノンセキュアOS部300eを配置する領域をリード許可ライト禁止のセキュア領域として指定する点は図20と同様である。この他にアクセス権設定領域がノンセキュア領域として定義されている。セキュアOS部200gの領域設定部212は、このアクセス権設定領域から領域指定部312がライトしたアクセス制御情報をリードし、メモリエリア設定レジスタを経由してアドレス空間制御部3に設定を施す。この際、領域設定部212は、アクセス制御情報をチェックし、アクセス権の変更対象の領域と、新たに設定しようとしているアクセス権を識別し、変更対象の領域がノンセキュアOS部300eの領域もしくはノンセキュア領域であれば設定変更を許可し、セキュアモニタ部100またはセキュアOS部200gの領域であれば設定変更を禁止する。また、アクセス権もチェックし、領域指定部312によってノンセキュアOS領域がノンセキュア領域からライト禁止・リード許可のセキュア領域に変更されたならば、ノンセキュア領域への変更に戻す事を禁止するようにしてもよい。これにより、ノンセキュア領域からセキュア領域に変更された後に、ノンセキュアOS上の不正なプログラムによってセキュア領域を解除してノンセキュア領域に変更しようとする攻撃を防ぐことができる。
図23は領域指定部312がアドレス空間制御部3に設定するアクセス権を指定する際のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示している。領域指定部312はノンセキュアOS部300eを配置する領域をリード許可ライト禁止のセキュア領域として指定するよう、領域とアクセス権を指定するデータをアクセス権設定領域にライトする(ステップS401)。アクセス権設定領域はノンセキュア領域として指定されているため、このライトは正常に実行される。そして、ノンセキュアOS遷移命令呼び出し部310を使って、OS間遷移処理を実行するようメインプロセッサ部2に指示する(ステップS402)。
メインプロセッサ部2はセキュアモニタ部100のOS切替部102に処理を遷移させる。OS切替部102はOS間遷移処理を実行する(ステップS403)。そして、呼び出し元が領域指定部312である事を認識し、セキュアOS部200gの領域設定部212を実行する。領域設定部212はアクセス権を設定する領域と、その領域に対するアクセス権に関する情報をアクセス権設定領域から読み出す(ステップS404)。そして、その設定が許可されたものであるかを判別する(ステップS405)。セキュアOS部200gに対するノンセキュア領域への設定など禁止された設定であれば、以降の処理は行わない。許可された設定であれば、アドレス空間制御部3に対して設定を施す(ステップS406)。このアクセス権の設定はメモリエリア設定レジスタを経由して行われる。領域設定部212はセキュアOS部200gのセキュアOS遷移命令呼び出し部203を呼び出し、メインプロセッサ部2でOS切り替え命令を実行する(ステップS407)。その後は、図11などセキュアOSからノンセキュアOSに遷移する処理と同等の処理を行えばよい。
このように、第3の実施形態ではメインプロセッサ部2からメインメモリ部5へのアクセス制御を行うアクセス権の設定を、情報処理装置の起動後に設定する事を可能とする構成について示した。装置起動前にアクセス権を設定する構成では、メインメモリ部5のどの領域にどのようなプログラム(オペレーティングシステム、セキュアモニタ)を配置するか、あらかじめ把握しておき、その配置に従ってアクセス権を適切に設定する必要があった。特に、ノンセキュアOSはアップデート等によりイメージサイズが変化する可能性があり、アクセス権の領域もアップデートしたイメージサイズに合わせて適切に設定する必要がある。ノンセキュアOSは自身のイメージサイズを把握しており、第3の実施形態では情報処理装置の起動後にノンセキュアOSからアクセス権を設定する事が可能であるため、アクセス権の適切な設定がノンセキュアOSのアップデートにも容易に対応する事が可能となる。
(第4の実施形態)
従来の技術では、メインプロセッサにセキュアモードと、ノンセキュアモードの二つのモードを持たせ、さらにメモリ空間に対するハードウェアのアクセス制御機構により、ノンセキュアモードからセキュアモードの領域を読んだり、改変したりする事を防止する構成について述べられている。また、第1から第3の実施形態では、メインメモリ部5のある特定の領域を情報処理装置10の起動後にノンセキュアモードから書きこみ禁止に設定する方法について述べた。しかしながら、メインメモリ部5に対するアクセス権の設定後にノンセキュアモードで動作するソフトウェア(ノンセキュアOS部300)から書きこみ禁止の領域に書き込みを行った場合や、読み込み禁止の領域に読み込みを行った場合の動作については、その詳細な実現方法が従来技術では明らかになっていない。
本実施形態では、ノンセキュアモードからアクセス禁止と指定されたメモリ領域に対して、ノンセキュアモードでアクセスを行った場合のセキュアOS部200iの動作について述べるものである。ノンセキュアモードからアクセス禁止と指定されたメモリ領域に対してアクセスを行った際に、メインメモリ部5に対するアクセス権違反の原因を調査し、ノンセキュアモードで処理を行う前にセキュアモードでアクションを取る事ができれば、ノンセキュアOS上の誤動作の原因究明に役立てたり、誤動作を引き起こす不正なアプリケーションの実行を中止したりすることが可能となるため有益である。
なお、アクセス違反としては、ノンセキュアモードからリード禁止に設定されている領域にノンセキュアモードで動作するソフトウェア(ノンセキュアOS)からリードした場合と、ライト禁止に設定されている領域にライトした場合の二つがあるが、ここでは説明を簡略化するためにライト禁止に指定されている領域に対し、ノンセキュアモードからメインメモリ部5に対するライトアクセスがあった場合について説明する。
図24にメインプロセッサ部2で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第1の実施形態と同じ構成でよい。図24に示されるように、ソフトウェアとしては、セキュアモニタ部100a、セキュアOS部200i、ノンセキュアOS部300fを備えている。セキュアモニタ部100aはアボートハンドラ部104、OS切替部102、セキュアモニタメモリ設定部103を備えている。OS切替部102、セキュアモニタメモリ設定部103は、図2に説明したものと同じ機能でよい。ノンセキュアOS部300fは、タイマハンドラ部301、スケジューラ部302、タスク実行部303、データリード部304、データライト部313を備えている。タイマハンドラ部301、スケジューラ部302、タスク実行部303、データリード部304は、図2に説明したものと同じ機能でよい。セキュアOS部200iはセキュアOS遷移命令呼び出し部203、データライト部204、アボートハンドラ部213、アボート原因調査部214、ログ生成部215を備えている。セキュアOS遷移命令呼び出し部203、データライト部204は、図2に説明したものと同じ機能でよい。
アドレス空間制御部3は、ノンセキュアモードからアクセス禁止に指定されているメインメモリ部5の領域に対してノンセキュアモードで動作するソフトウェア(ノンセキュアOS)からデータアクセスがあった場合にアボート例外を発生させる処理部である。
セキュアモニタ部100aのアボートハンドラ部104は、ノンセキュアモードからライト禁止に指定されている領域に対し、ノンセキュアモードからデータのライト命令があった時、すなわちデータアボート例外が発生した時にアドレス空間制御部3から呼び出される処理部である。すなわち、メインプロセッサ部2はアドレス空間制御部3からデータアボート例外が発生したことを検出すると、セキュアモニタ部100aのアボートハンドラ部104に処理を遷移させる。
ノンセキュアOS部300fのデータライト部313は、ノンセキュアモードからライト禁止に指定されているメインメモリ部5の領域にデータをライトする処理部である。セキュアOS部200iのアボートハンドラ部213は、セキュアモニタ部100aのアボートハンドラ部104から呼び出される処理部である。
アボート原因調査部214は、データアボート例外が発生した場合、その原因を特定する処理を行い、ログ生成部215にその原因をログとして記録するよう指示する処理部である。ログ生成部215は、アボート原因調査部214からの指示に基づきデータアボート例外の原因をログとして記録するためにメインメモリ部5にログの記録を出力する処理部である。
図25はノンセキュアモードからライト禁止に指定されている領域に対し、ノンセキュアモードからデータのライト命令があった時のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示している。ノンセキュアモードで動作するノンセキュアOSは、ノンセキュアモードからライト禁止に指定されているメインメモリ部5の領域(たとえば図3のセキュアモニタのコードが配置されている領域(セキュアモニタ領域))にデータのライトを試みたとする(ステップS501)。このライトはノンセキュアOSのバグが原因である場合もあるし、ノンセキュアOSが攻撃者によって改変され、セキュアモニタやセキュアOSを改変しようとする不正なライト命令である場合もある。
すると、アドレス空間制御部3がアクセス権違反を検出し、データアボート例外を発生させる。データアボート例外が発生すると、メインプロセッサ部2は処理をセキュアモニタ部100aのアボートハンドラ部104に遷移させる(ステップS502)。なお、セキュアモニタメモリ設定部103はアドレス空間制御部3がアクセス権違反を検出した場合に、セキュアモニタ部100aのアボートハンドラ部104を呼び出すように、あらかじめ設定しておく。この設定は、情報処理装置10の起動時の初期化処理の一手順としてなされる。セキュアモニタ部100aのアボートハンドラ部104はOS切替部102を呼び出し(ステップS503)、メインプロセッサ部2のモードをセキュアモードに切り替え、ノンセキュアOSからセキュアOSに遷移させ、さらにセキュアOS部200iのアボートハンドラ部213を呼び出す(ステップS504)。
アボートハンドラ部213はアボート原因調査部214を呼び出す。アボート原因調査部214は、メインプロセッサ部2のレジスタの値と、アボート例外が発生した領域周辺のメモリ領域を走査し、どの領域でどのような命令によりアボート例外が発生したのかを調査する(ステップS505)。たとえば、メインプロセッサ部2のレジスタの値、たとえばプログラムカウンタの値(メインプロセッサ部2が実行した命令のアドレス)を読み出し、そのアドレスもしくは前後のアドレスからアボート例外の発生原因となった命令を特定し、命令Aによってライト禁止のアドレスXに対するライト命令を実行しようとしたためにアボート例外が発生した事や、命令A’によってリード禁止のアドレスYに対するリード命令を実行しようとしたためにアボート例外が発生したといった事を調査し、その原因となった命令とアクセスしようとしたアドレス、命令に付帯する属性情報に関する情報をログ生成部215に送信する(ステップS506)。ログ生成部215はその情報をメインメモリ部5に出力する(ステップS507)。
そして、データライト部204はセキュアOS部200iのセキュアOS遷移命令呼び出し部203を呼び出し(ステップS508)、メインプロセッサ部2でOS切り替え命令を実行する(ステップS509)。その後は、図11などセキュアOSからノンセキュアOSに遷移する処理と同等の処理を行えばよい。
なお、ノンセキュアモードからアクセスが禁止されている領域に対し、ノンセキュアモードからアクセスがあった時に、セキュアOS部200iはすべてのログ情報をメインメモリ部5に出力する必要は必ずしもない。その場合のメインメモリ部5のメモリ領域を区分けする一例を図26に示す。
この例では、ノンセキュアOS部300fが配置されている領域はセキュアOS部200iのアボートハンドラ部213を呼び出す。一方、更新データ領域やセキュアモニタが格納されている領域及びセキュアOSが格納されている領域にノンセキュアモードからのライト命令があったとしてもセキュアOS部200iのアボートハンドラ部213を呼び出さない。この時のアクセス権の設定を図27に示す。
ノンセキュアモードからメインメモリ部5にアクセスした領域に応じて、セキュアOS部200iのアボートハンドラ部213を呼び出すか否かを判定する際のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを図28に示す。
アドレス空間制御部3がアクセス権違反を検出し、アボート例外を発生させて、アドレス空間制御部3がセキュアモニタ部100aのアボートハンドラ部104を呼び出すまでは図25と同一の処理でよい。セキュアモニタ部100aのアボートハンドラ部104はメインメモリ部5のどの領域でアボート例外が発生したかを調査する(ステップS601)。そして、特定した発生領域によってセキュアOS部200iのアボートハンドラ部213を呼び出すか否かを判定する(ステップS602)。もしも更新データ領域やセキュアモニタ部100aが格納されている領域及びセキュアOSが格納されている領域だった場合には、以後の処理は行わずに、ノンセキュアOS部300fに処理を戻す。一方、ノンセキュアOS部300fが配置されている領域である場合は、OS間遷移処理を行い、図25と同様の処理を行う。
このようにノンセキュアOS部300fへのライトが発生した場合にのみログを生成する構成にした利点として、ノンセキュアOS部300fのデバッグに利用する事ができる。図27に示したとおり、ノンセキュアモードからノンセキュアOS部300fへのライトを禁止しているが、攻撃者による不正なノンセキュアOS部300fの改変でなくても、ノンセキュアOS部300fの正当な機能として、ノンセキュアOS部300fが自己改変型機能を備えていたり、ノンセキュアOSのコード領域を上書きするようなドライバのインストールを許可したりする場合などでは、ノンセキュアOSが自身のコード領域を上書きし、ノンセキュアOSの起動後に処理の内容を動的に変更する場合がある。ノンセキュアOS部300fがそのような構成になっている場合に、開発者が開発段階でメインメモリ部5のアクセス権を図27の構成に設定してノンセキュアOS部300fを実行すると、本来、ノンセキュアOSは自身の管理するメモリ領域を変更(上書き)可能であると想定して処理を行う。このため、この処理に失敗した場合、ノンセキュアOSは予測不能の事態が発生したとして停止してしまう。一方、セキュアOS部200iのログ生成部215により、メインメモリ部5のログデータ領域には、ノンセキュアOSがアクセスを試みたアドレスや命令が記録されているため、ノンセキュアOSの開発者はどのような原因でノンセキュアOSが停止したかを知る事ができる。
同様の仕組みで、ノンセキュアOSに対する不正改変を検出し、その記録を残す事ができる。ノンセキュアOS部300fから自己改変型機能を削除したり、ノンセキュアOSのコード領域を上書きするようなドライバのインストールを禁止したりした場合、ノンセキュアOS部300fへの書きこみは発生せず、アボート例外も発生しない。もしくは、ノンセキュアOS部300fが自己改変型機能を備えていたり、ノンセキュアOSのコード領域を上書きするようなドライバのインストールを許可したりする場合でも、どの領域を上書きするか調査が完了していれば、あらかじめその領域をリードライト許可、すなわちノンセキュア領域に設定しておけばよい。その場合も、アボート例外は発生しない。それにも関わらず、ノンセキュアモードで動作するプログラムから、ノンセキュアモードからライトアクセス禁止に設定したノンセキュアOS部300が格納されている領域に対するライトが発生する場合は、不正なライトとみなすことができる。ノンセキュアOS部300fへのライトが発生した場合にのみログを生成する事で、ノンセキュアOS部300fで不正プログラムが実行された事の記録を残すことができる。
同様に、ノンセキュアモードからライトが禁止されているノンセキュアOS部300fのコード領域へのライトであっても、特定の領域であればライトを許可するように構成してもよい。その際のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを図29に示す。まず、ノンセキュアOS部300fのコード領域へのライトが発生した場合、どの領域へのライト命令ならデータをメインメモリ部5にライトするか、どの領域であればライトしないかをあらかじめセキュアOS部200iのアボート原因調査部214に登録しておく。この設定処理は機器起動時の処理の一部として行う。
次にノンセキュアOS部300fのコード領域へのライトが発生した場合、アボート原因調査部214で、メインプロセッサ部2のレジスタの値と、アボート例外が発生した周辺のメモリ領域を走査し、どのアドレスへのアクセスでどのような命令によりアボート例外が発生したのかを調査する(ステップS505)。もしもアボート原因調査部214があらかじめライトを許可すると設定された領域と判断すれば、セキュアOS部200iのデータライト部204を利用してメインメモリ部5にデータをライトする(ステップS603)。すなわち、実際のデータのライト処理はノンセキュアOS部300fではなく、セキュアOS部200iでなされる事になる。その後の処理は図28と同じである。なお、この場合、必ずしもログ生成部215はログ情報をメインメモリ部5に書きこむ必要はない。
これにより、ノンセキュアOS部300fからは実際にデータが書きこまれたかのように見せかける事ができるため、ノンセキュアOS部300fが自己改変型機能を備えていたり、ノンセキュアOS部300fのコード領域を上書きしたりするようなドライバのインストールを許可する事が実現可能となる。一方で、ノンセキュアOS部300fのコード領域のうち所定の領域以外に対しての上書きは禁止されるため、ノンセキュアOS上で動作する不正なプログラムがノンセキュアOS部300fのコード領域を上書きする攻撃を防止する事が可能となる。
また、アボート原因調査部214の調査結果に応じて、ログ生成部215はログ情報をメインメモリ部5に出力するか否かを判定してもよい。その時のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを図30に示す。アボート原因調査部214はアボート例外が発生した原因を調査し、アボート例外が発生したアドレスと命令をログ生成部215に通知する(ステップS505)。ログ生成部215は通知されたアドレスからログの記憶対象領域か否かを判定し、ログをメインメモリ部5にライトするか否かを決定する(ステップS701)。すなわち、ログ生成部215はすべてのアボート例外をデータライト部204に送信する訳ではなく、フィルタリング処理を行う。
以上のように構成することで、ノンセキュアOSのバグによって本来禁止されている領域にアクセスをしてしまった場合には、ログを収集せず、ノンセキュアOSからの攻撃によるアクセスの場合にはログを記録する事が実現できる。
これまで、アボート原因調査部214が収集した調査結果をログ生成部215が記録する方法について説明してきたが、本実施形態はアボート原因調査部214が収集した調査結果をログとして記録するに留まらず、調査結果を元にノンセキュアOSの動作を変更してもよい。具体的には、アボート例外を発生させたノンセキュアOSのプロセス(アプリケーション)を停止させるような構成にしてもよい。
図31にアボート例外を発生させたノンセキュアOSのプロセスを停止させる際の、メインプロセッサ部2で動作するソフトウェアの構成の一例を示している。図24との違いは、セキュアOS部200jがログ生成部215の代わりにプロセス特定部216を備え、ノンセキュアOS部300fに新たにプロセス停止部314を備えている点である。
プロセス特定部216は、アボート原因調査部214が収集したアボート例外を発生させた命令とアドレスから、ノンセキュアOS部300fで実行していたプロセスのうち、どのプロセスがアボート例外を発生させたのかプロセスを特定する処理部である。プロセス停止部314は、プロセス特定部216が特定したプロセスを停止させる処理部である。
図32にノンセキュアモードからライト禁止に指定されている領域に対し、ノンセキュアモードからデータのライト命令があった時のメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示す。アボート原因調査部214が調査結果を収集するまでは、図25に示した処理と同一でよい。
その後、プロセス特定部216は、アボート原因調査部214が収集した情報に加え、さらにメインメモリ部5からノンセキュアOS部300fのどのプロセスがアボート例外を発生させたのかを調査し、プロセスIDなどのプロセス情報をメインメモリ部5にライトする(ステップS801)。そして、セキュアOS遷移命令呼び出し部203を呼び出し(ステップS802)、OS間遷移処理を実行する(ステップS803)。ノンセキュアOSに遷移後(ステップS804)、ノンセキュアOS部300fのプロセス停止部314は、メインメモリ部5から停止すべきプロセス情報をリードし(ステップS805)、該当プロセスを停止させる(ステップS806)。
なお、図32では、セキュアOS部200jで動作するプロセス特定部216がアボート例外を引き起こしたノンセキュアOS部300fのプロセスを特定する処理を行ったが、この処理をノンセキュアOS部300fで行ってもよい。その場合の構成を図33に示す。
図31との違いは、プロセス特定部315がセキュアOS部200kではなくノンセキュアOS部300gにある点である。この構成では、セキュアOS部200kがプロセスの特定を行わず、アボート例外を引き起こしたアドレスの通知を行い、そのアドレスを元にノンセキュアOS部300gのプロセス特定部315が、そのアドレスを利用しているプロセスを特定し、プロセス停止部314で該当プロセスを停止させる。
この別例として、セキュアOS部200kからノンセキュアOS部300gにOS間遷移を行わずにノンセキュアOS部300gのプロセスを停止させてもよい。その場合の構成を図34に示す。図33との違いは、セキュアモニタ部100bにプロセス特定部実行部105が新たに備わっている点である。
また、図33のプロセス停止部314がアプリケーションプロセスとして実行されていたのに対し、図34ではプロセス停止部314とプロセス特定部315がノンセキュアOS部300gのカーネル内で実行される。プロセス特定部実行部105は、ノンセキュアOS部300gのプロセス特定部315を実行させる処理部である。この際、セキュアOS部200kからノンセキュアOS部300gへのOS間遷移処理は実行されない。ノンセキュアOS部300gのプロセス特定部315とプロセス停止部314は実行されるが、ノンセキュアOSのコンテキストは復帰しないため、ノンセキュアOS自体の処理は実行されない点がポイントである。
図35にこの構成でのメインプロセッサ部2の処理動作の一例をまとめたフローチャートを示す。アボート原因調査部214が調査結果を収集するまでは、図25に示した処理と同一でよい。その後、セキュアOS部200kのアボート原因調査部214は、セキュアモニタ部100bのプロセス特定部実行部105を呼び出す(ステップS901)。
プロセス特定部実行部105は、OS間遷移処理を行うことなく実行され(ステップS902)、ノンセキュアOS部300gのプロセス特定部315とプロセス停止部314を呼び出し、対象プロセスの特定と停止を行う(ステップS903)。この際、ノンセキュアOS自体の処理は実行されない。ノンセキュアOSの停止対象プロセスの特定と、停止処理が完了すると、ノンセキュアOSを実行する事なく、セキュアモニタ部100bのプロセス特定部実行部105に処理を戻す。プロセス特定部実行部105はアボート原因調査部214に処理を戻す。その後、アボート原因調査部214はセキュアOS遷移命令呼び出し部203を実行させる(ステップS904)。その後の処理は、図25と同様でよい。
なお、図24に示した構成では、アボート原因調査部214が収集した調査結果をログ生成部215が記録する方法について説明してきたが、ログとして記録するのではなく、調査結果を元に情報処理装置10を停止ないしは再起動させてもよい。図38にその構成を示す。図24との違いは、ログ生成部215の代わりにリブート部219を備えている点である。リブート部219は、情報処理装置10を再起動する命令を実行する処理部である。アボート原因調査部214は、データアボート例外が発生した場合、その原因を特定する処理を行い、リブート部219に対して情報処理装置10を再起動するよう指示する処理を行う。なお、リブート部219は再起動の代わりにシステムを停止してもよい。
なお、図24に示した構成では、ログ情報を平文としてメインメモリ部5に出力していたが、暗号化して出力してもよい。その場合の構成を図36に示す。図24との違いは、セキュアOS部200lに鍵管理部217とログ暗号化部218を備えている点である。鍵管理部217は、ログ暗号化部218で例外発生原因を暗号化するための鍵を保持する処理部である。ログ暗号化部218は、アボート原因調査部214で調査した例外発生原因を暗号アルゴリズムによって鍵管理部217が保持する鍵を用いて暗号化する処理部である。
以上述べてきたように、本実施形態では、ノンセキュアモードからアクセス禁止と指定されたメモリ領域に対して、アクセスを行った場合のセキュアOS部200の動作について述べた。アボート例外が発生した場合、ノンセキュアOS部300の処理を中断し、セキュアOS部200で処理を行う点が特徴である。
(第5の実施形態)
第3の実施形態では、ノンセキュアOS部300の領域指定部312がアドレス空間制御部3に対して、領域とアクセス権の指定をし、セキュアOS部200の領域設定部212がアドレス空間制御部3に対して領域とアクセス権の設定を行う方法について述べた。第3の実施形態では、また、タイマ部11が生成するタイマ割り込みに応じてセキュアOS部200のデータ更新部202が管理するカウンタ値を更新する例について示したが、第4の実施形態では、ノンセキュアモードからアクセス禁止と指定されたメモリ領域に対して、アクセスを行った場合のセキュアOS部200の動作について述べた。
第5の実施形態では、これら両方の要素を組み合わせた構成について述べる。図37に第5の実施形態で説明する情報処理装置のメインプロセッサ部2で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第1の実施形態と同じ構成でよい。図24との違いは、セキュアOS部200mにデータ更新部202とタイマハンドラ部201が新たに備わっている点と、セキュアモニタ部100cにタイマハンドラ部101が新たに備わっている点である。
(第6の実施形態)
第1の実施形態では、ノンセキュアOS部に依存せずセキュアOS部が定期的な処理を行う事を実現する方法を示した。この実施形態では、ノンセキュアOS部が停止していないことをセキュアOS部が定期的に検査することで、情報処理装置10が停止する時間を短くするものである。ノンセキュアOS部はLinux(登録商標)のような汎用のオペレーティングシステムを想定している。このため、ノンセキュアモードで動作するオペレーティングシステムやドライバ、アプリケーションに含まれるバグや設定ミスなどによってノンセキュアモードで動作するプログラムが停止したり、無限ループに陥って他の処理ができなくなったりする危険性がある。そこで、セキュアOS部が定期的にノンセキュアOS部の状態を検査する。
図39は、第6の実施形態で説明する情報処理装置10のメインプロセッサ部で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第1の実施形態と同じ構成でよい。図6との違いは、ノンセキュアOS部300gがタスク実行部303の代わりに状態通知部318を備えている点、データリード部304の代わりにデータライト部313を備えている点、セキュアOS部200kがデータ更新部202の代わりに状態検査部220を備えている点、リブート部219を備えている点である。
ノンセキュアOS部300gにおいて、スケジューラ部302は、一定周期で状態通知部318を実行させる。状態通知部318はデータライト部313を使い、状態通知部318が実行されたことを示す情報をメインメモリ部5のノンセキュア領域にライトする。この情報としては、カウンタ値でもよいし、乱数でもよい。
リブート部219は、情報処理装置10を再起動する命令を実行する処理部である。タイマ部11のタイマ割り込みにより、セキュアモニタ部100のタイマハンドラ部101は周期的に実行される。すなわち、状態検査部220は、セキュアモニタ部100のタイマハンドラ部101、セキュアOS部200kのタイマハンドラ部201を介して、定期的に実行される。これは第1の実施形態と同様、ノンセキュアOSが処理を行っていたとしても強制的に状態検査部220が定期的に実行される事を意味する。状態検査部220は、タイマハンドラ部201からタイマ割り込みの通知を受けると、データリード部205を使い、メインメモリ部5から状態通知部318がライトした情報をリードして、その情報が更新されているか否かを検査する。この検査は、たとえばカウンタ値であればカウンタ値が更新されているか、乱数であれば前にリードした値と異なる値となっているかを検査すればよい。もし更新されていると判断した場合は、状態検査部220は、セキュアOS遷移命令呼び出し部203を経由して、ノンセキュアOS部300gに処理を遷移させる。もし更新されていない場合は、状態検査部220は、ノンセキュアOS部300gが何らかの異常状態にあると判断し、リブート部219を呼び出し、情報処理装置10を再起動させる。なお、情報処理装置10を再起動させる方法として、情報処理装置10自体を再起動させる方法と、ノンセキュアOS部300gのみ再起動させる方法がある。情報処理装置10自体を再起動させる場合は、メインプロセッサ部2でリセット命令を実行すればよい。ノンセキュアOS部300gのみ再起動させる場合は、セキュアモニタ部100で管理しているノンセキュアOS部300gのコンテキストと、ノンセキュアOS部300g自体が管理するコンテキストをクリアしてノンセキュアOS部300gの起動処理を実行すればよい。
なお、状態通知部318がメインメモリ部5の情報を更新する前に、情報が更新されているかどうかの検査を状態検査部220が行ってしまう事を防ぐために、情報が更新されているか否かを状態検査部220が検査する間隔は、状態通知部318がメインメモリ部5の情報を更新する間隔よりも大きい事が望ましい。
もし、ノンセキュアOS部300g、ノンセキュアOS部300gにインストールされたドライバ、またはノンセキュアOS部300gで動作するアプリケーションに含まれるバグや設定ミスなどによって、ノンセキュアOS部300gが停止したり、無限ループに陥ったりした場合、スケジューラ部302が呼ばれず、結果として状態通知部318も実行されない。従って、ノンセキュアOS部300gが正常な状態にある場合には、定期的にスケジューラ部302が実行され、状態通知部318が情報を更新していると期待できる。本実施形態では、仮にノンセキュアOS部300gが停止した場合でも、セキュアOS部200kが定期的に実行される。このため、状態通知部318が更新する情報を元にノンセキュアOS部300gが正常な状態にあるか停止状態にあるかを判別し、停止状態の場合には情報処理装置10を再起動させる事により、ノンセキュアOS部300gの停止時間を短くすることができる。
(第7の実施形態)
第1の実施形態では、ノンセキュアOS部に依存せずセキュアOS部が定期的な処理を行う事を実現する方法を示した。この実施形態では、ノンセキュアOS部が改ざんされていないことをセキュアOS部が定期的に検査することで、不正なプログラムによるノンセキュアOS部の攻撃を防止するものである。
図40は、第7の実施形態で説明する情報処理装置10のメインプロセッサ部2で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第1の実施形態と同じ構成でよい。図6との違いは、ノンセキュアOS部300hがタスク実行部303の代わりに改ざん検出部316を備えている点、期待値格納部317を備えている点、セキュアOS部200nがデータ更新部202の代わりにメモリ検査部221を備えている点、データライト部204がない点、リブート部219、期待値格納部222を備えている点である。
ノンセキュアOS部300hの期待値格納部317はノンセキュアOSの正規の状態(改ざんされていない状態)のハッシュ値を格納する処理部である。このハッシュ値は情報処理装置の起動に先立ち、あらかじめ計算しておいた値が格納されている。ノンセキュアOS部300hはスケジューラ部302によって一定周期で改ざん検出部316を実行する。改ざん検出部316は、メインメモリ部5のノンセキュアOS部300hが配置された領域、すなわちノンセキュアOS領域が改ざんされていないかを定期的にチェックする。このチェックは、ノンセキュアOS領域のデータを読み込み、期待値格納部317に格納された値と一致するか検査する処理である。もちろん、ノンセキュアOS領域のすべてのデータを一度に読み込んでハッシュ値を計算する必要はなく、中間データを計算してメインメモリ部5に書きこみ、スケジューラ部302によって別の処理を行った後に、中間データをメインメモリ部5からリードして処理を再開するようにしてもよい。この場合、中間データがノンセキュアOS部300hから改ざんされないようにセキュア領域に配置する。
セキュアOS部200nの期待値格納部222はノンセキュアOS部300hの改ざん検出部316の正規の状態(改ざんされていない状態)のハッシュ値を格納する処理部である。このハッシュ値は情報処理装置10の起動に先立ち、あらかじめ計算しておいた値が格納されている。
リブート部219は、情報処理装置10を再起動する命令を実行する処理部である。なお、リブート部219は必須の構成ではない。タイマ部11のタイマ割り込みにより、セキュアモニタ部100のタイマハンドラ部101は周期的に実行される。すなわち、メモリ検査部221は、セキュアモニタ部100のタイマハンドラ部101、セキュアOS部200nのタイマハンドラ部201を介して、定期的に実行される。これは第1の実施形態と同様、ノンセキュアOSが処理を行っていたとしても強制的にメモリ検査部221が定期的に実行される事を意味する。メモリ検査部221は、タイマハンドラ部201からタイマ割り込みの通知を受けると、データリード部205を介して改ざん検出部316が配置されている領域を読み出し、セキュアOS部200nの期待値格納部222に格納された値と一致するか否か検査を行う。
もし一致していれば、改ざん検出部316が改ざんされていないとみなして、セキュアOS遷移命令呼び出し部203が呼び出され、ノンセキュアOS部300hの処理が再開される。一方、もし一致していなければ、改ざん検出部316が改ざんされているととみなしてリブート部219を呼び出し、情報処理装置10を再起動させる。再起動させる他にも、ノンセキュアOS部300hに警告メッセージを送信する処理が考えられる。攻撃者は、改ざん検出部316がノンセキュアOSの改ざん検出処理を行わないように処理を改ざんしたり、常に改ざんされていないと報告するように改ざん検出処理の結果を書き換えたりするかもしれない。第7の実施形態では、ノンセキュアOS部300hの改ざん検出部316が、ノンセキュアOS部300hが改ざんされていない事を確認し、改ざん検出部316が改ざんされていない事をセキュアOS部200nのメモリ検査部221が確認することによって、ノンセキュアOS部300hが改ざんされていない事を検証することができる。これにより、攻撃者によってノンセキュアOSが改ざんされた場合には改ざん検出部316が検出する事が可能である。さらに改ざん検出部316が改ざんされた場合にはメモリ検査部221が改ざんを検出する事ができる。
すべての改ざん検出処理をセキュアOS部200nで行う事も可能であるが、ノンセキュアOS部300hのデータ構造などノンセキュアOS部300hに固有のデータが改ざんされていないかどうかを検出するにはノンセキュアOS部300hの中で行った方が効率的である。従って、本実施形態では、ノンセキュアOS部300hの改ざん検出をノンセキュアOS上で動作するプログラム、すなわちノンセキュアOS部300hのドライバまたはノンセキュアOS部300h上で動作するアプリケーションで行っている。
なお、この発明は上記した実施の形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を種々変形して具体化することができる。また、上記した実施の形態に開示されている複数の構成要素を適宜に組み合わせることにより、種々の発明を形成することができる。例えば、実施の形態に示される全構成要素から幾つかの構成要素を削除しても良いものである。さらに、異なる実施の形態に係る構成要素を適宜組み合わせても良いものである。