以下に添付図面を参照して、実施形態にかかる情報処理装置を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。
(実施形態)
実施形態にかかる情報処理装置について説明する。情報処理装置は、例えば、自動車の各部を電気的に制御するコントローラ(ECU)や、観測値を無線で送信するセンサノード(スマートメータ)の各部を制御するコントローラに適用され得る。これらのコントローラは小規模化・低コスト化が要求されるため、情報処理装置は、例えば1チップで構成されたマイクロコントローラ(組込みマイコン)として実装される。この情報処理装置は、起動されたシステムプログラムに従って所定の動作を行う。このとき、起動時にシステムプログラムの不正な改ざんを検出・防止するために、情報処理装置は、セキュアブートを実行可能とすべく構成されている。
例えば、さまざまな機能がソフトウェアによって実現され、その範囲は社会インフラや自動車のような誤動作が重大な災害につながる機器の安全機能にまでおよびつつある。また、コンピュータシステムに対してさまざまなサイバー攻撃が行われ、手口の巧妙さが増すとともに電力システムを停止させるなど被害が広がりつつある。セキュアブートは、起動時にシステムプログラムの正当性を確認することにより、コンピュータシステムの信頼の基盤を確認する基本的なサイバー攻撃対策手段である。
一方で、ECUやセンサノード等に適用されることが想定された情報処理装置は、小規模化・低コスト化の要求を満たすためにその処理能力も限定されていることから、セキュアブートの実行頻度を必要最小限に抑えてシステムプログラムの起動処理を高速化する必要がある。すなわち、情報処理装置では、システムプログラムを適正に且つ高速に起動することが望まれる。
例えば、組込みマイコンでは不揮発性フラッシュメモリの内容をDRAMに展開することなく、そのまま実行するXIP (eXecute In Place)方式が用いられる。この場合、セキュアブートがなければ起動後ただちにフラッシュメモリ上のアプリケーションの実行を始められるが、セキュアブートを行う場合にはプログラムイメージの読出しとフィンガープリント計算がそのまま遅延となる。パーソナルコンピュータに実装された大規模で高速なプロセッサと比較して、組込みマイコンでは、メモリおよびフィンガープリント計算のスループットが低く、遅延が大きいため、セキュアブートの実行頻度を必要最小限に抑えてシステムプログラムの起動処理を高速化する必要性が高い。
そこで、本実施形態では、以下の工夫を行いセキュアブートの実行頻度を適切に制御することで、プログラム(システムプログラム)の不正な改ざんを確実に検出・防止しつつプログラムの平均的な起動時間の短縮化を図る。
図1は、情報処理装置1の機能構成を示すブロック図である。情報処理装置1(マイクロコントローラ)は、セキュアブートを実行可能とすべく構成されている。情報処理装置1は、不揮発性メモリ10、不揮発性メモリ20、書換え許可部30、プログラム検証要否判定部40、プログラム検証部50、及び命令実行部60を有する。セキュアブートに関連した機能は、書換え許可部30、プログラム検証要否判定部40、プログラム検証部50により実現可能である。
なお、書換え許可部30、プログラム検証要否判定部40、プログラム検証部50、及び命令実行部60の各機能は、情報処理装置1においてハードウェア的に(例えば、回路として)実装されていてよいし、ソフトウェア的に(例えば、不揮発性メモリ20に格納され一括して又は処理の進行に応じて順次に読み出される機能モジュールとして)実装されていてよい。あるいは、一部の機能が情報処理装置1においてハードウェア的に実装され、残りの機能が情報処理装置1においてソフトウェア的に実装されていてもよい。
不揮発性メモリ20は、情報を不揮発的に且つ書換え不可能に格納するメモリであり、例えば、製造工程で情報が書き込まれるマスクROMである。不揮発性メモリ20は、情報処理装置1におけるプラットフォームとなるシステムプログラムが予め格納されている。システムプログラムは、情報処理装置1の起動時等において、不揮発性メモリ20から命令実行部60へ(例えばバイト単位で)読み出される。
不揮発性メモリ10は、情報を不揮発的に且つ書換え可能に格納するメモリであり、例えば、フラッシュメモリである。命令実行部60がバイト単位で不揮発性メモリ10にアクセスする場合、不揮発性メモリ10を例えばNOR型フラッシュメモリとすることができる。不揮発性メモリ10は、第1の不揮発性メモリ領域11及び第2の不揮発性メモリ領域12を含む。
第1の不揮発性メモリ領域11は、プログラムメモリブロック11aを含む。プログラムメモリブロック11aは、プログラム11a1が不揮発的に格納されている。プログラム11a1は、プログラム検証部50により検証される。プログラム11a1は、システムプログラムの更新部分の機能モジュールであってもよいし、更新後のシステムプログラム自体であってもよい。
第2の不揮発性メモリ領域12は、検証状態フラグ(第1のフラグ)12aが不揮発的に格納されている。検証状態フラグ12aは、第1の値又は第2の値を有する。第1の値は、プログラム11a1が未検証であることを示す(以下、「未検証」又は「×」で表す)。第2の値は、プログラム11a1が検証済であることを示す(以下、「検証済」又は「○」で表す)。検証状態フラグ12aは、冗長化されていてもよく、例えば、未検証/検証済を示す制御ビットと制御ビットの誤り訂正を行うための符号ビットとを含んでいてもよい。
書換え許可部30は、第1の不揮発性メモリ領域11に対する書き込みを許可したり禁止したりする。書換え許可部30は、記憶装置31を含む。記憶装置31は、書換え制御フラグ(第2のフラグ)31aを揮発的に格納する。書換え制御フラグ31aは、第3の値又は第4の値を有する。第3の値は、第1の不揮発性メモリ領域11に対する書換えが禁止であることを示す(以下、「禁止」又は「○」で表す)。第4の値は、第1の不揮発性メモリ領域11に対する書換えが許可であることを示す(以下、「許可」又は「×」で表す)。
書換え許可部30は、書換え制御フラグ31aの値を「禁止」にすることで第1の不揮発性メモリ領域11に対する書き込みを禁止でき、書換え制御フラグ31aの値を「許可」にすることで第1の不揮発性メモリ領域11に対する書き込みを許可することができる。
例えば、書換え許可部30は、書換え許可要求を命令実行部60から受け且つ検証状態フラグ12aが「検証済」である場合、検証状態フラグ12aの値を「検証済」から「未検証」に変更する。書換え許可部30は、検証状態フラグ12aが「未検証」に変更されたことに応じて、書換え制御フラグ31aを「禁止」から「許可」に変更する。これにより、命令実行部60からの第1の不揮発性メモリ領域11への書き込みが許可された状態になる。
プログラム検証要否判定部40は、情報処理装置1の起動時(例えば、再起動処理が行われたとき)に、検証状態フラグ12aの値に応じてプログラム11a1の検証の要否について判定する。プログラム検証要否判定部40は、情報処理装置1の起動時に、検証状態フラグ12aが「未検証」である場合、プログラム11a1の検証が必要であると判定する。プログラム検証要否判定部40は、情報処理装置1の起動時に、検証状態フラグ12aが「検証済」である場合、プログラム11a1の検証が不要であると判定し、正常起動許可通知を命令実行部60へ供給する。
プログラム検証部50は、プログラム11a1に対する検証を行うことができる。
例えば、プログラム検証部50は、検証要求を命令実行部60から受けた場合、書換え制御フラグ31aを「許可」から「禁止」に変更するように書換え許可部30を制御する。あるいは、プログラム検証部50は、プログラム11a1の検証が必要である場合、書換え制御フラグ31aを「許可」から「禁止」に変更するように書換え許可部30を制御する。
この制御に応じて、書換え許可部30は、書換え制御フラグ31aを「許可」から「禁止」に変更する。これにより、命令実行部60からの第1の不揮発性メモリ領域11への書き込みが禁止された状態になる。プログラム検証部50は、この変更に応じて、プログラム11a1に対する検証を行う。プログラム検証部50は、検証に成功すると、検証状態フラグ12aを「未検証」から「検証済」に変更して、検証成功通知を命令実行部60へ供給する。プログラム検証部50は、検証に失敗すると、検証状態フラグ12aを「未検証」のまま変更せず、検証失敗通知を命令実行部60へ供給する。
あるいは、プログラム検証部50は、プログラム11a1の検証が不要である場合、プログラム11a1に対する検証をスキップする。このとき、検証状態フラグ12aは「検証済」になっている。
命令実行部60は、検証に失敗したプログラム11a1を実行しないが、検証に成功したプログラム11a1を実行する。命令実行部60は、プログラム11a1に従って、各部を統括的に制御することができる。例えば、命令実行部60は、外部(上位のコントローラ等)からプログラム11a1の更新コマンドを受けた場合、実行中のプログラム11a1に従い、更新コマンドに応じて書換え許可要求を発行して書換え許可部30に供給する。命令実行部60は、外部からのコマンドに応じて又は自律的な判断に応じてプログラム11a1を起動すべきであると判断し且つ所定の時間内に正常起動許可通知を受けなかった場合、実行中のプログラム11a1に従い、検証要求を発行してプログラム検証部50へ供給する。そして、命令実行部60は、検証成功通知を受けた場合、プログラムメモリブロック11aから読み出された更新後のプログラム11a1の実行を開始する。命令実行部60は、検証失敗通知をプログラム検証部50から受けた場合、プログラム11a1の実行を停止する(更新後のプログラム11a1をプログラムメモリブロック11aから読み出しても実行しない)。あるいは、命令実行部60は、外部からのコマンドに応じて又は自律的な判断に応じてプログラム11a1を起動すべきであると判断し且つ所定の時間内に正常起動許可通知をプログラム検証要否判定部40から受けた場合、検証要求を発行することなく、プログラムメモリブロック11aから読み出された更新後のプログラム11a1の実行を開始する。
図2は、書換え制御フラグ31a及び検証状態フラグ12aの機能を示す図である。情報処理装置1では、不揮発性の検証状態フラグ12aと揮発性の書換え制御フラグ31aとを操作することで、プログラム11a1の検証を行わなくても安全な状態であるか否かを判断できるようにしている。すなわち、書換え許可部30による書換え許可機能により、検証状態フラグ12aが「×」になっている状態で書換え制御フラグ31aが「○」から「×」に変更される。そして、プログラム検証部50による検証機能により、検証状態フラグ12aが「×」になっている状態で書換え制御フラグ31aが「×」から「○」に変更される。これにより、検証状態フラグ12aが「○」になっているときは、書換え制御フラグ31aが「○」になっていることが担保される。このことは、検証状態フラグ12aが第2の不揮発性メモリ領域12に不揮発的に格納されているので、情報処理装置1の再起動処理が行われたときにも担保できる。
これにより、検証状態フラグ12aが「○」であり第1の不揮発性メモリ領域11に対する書換えが行われていない(すなわち、プログラム11a1に対する書換えが行われていない)と予想できる場合に、セキュアブートの実行をスキップさせることができる。この結果、セキュアブートの実行頻度を必要最小限(検証状態フラグ12aが「×」になっている場合)に抑えることができ、プログラム11a1の起動処理を高速化することができる。したがって、プログラム11a1の不正な改ざんを確実に検出・防止できるとともに、プログラム11a1の平均的な起動時間の短縮化を図ることができる。また、セキュアブートの実行頻度を必要最小限に抑えることができるので、情報処理装置1の平均的な消費電力を低減できる。
図3は、情報処理装置1のハードウェア構成を示すブロック図である。図3では、情報処理装置1としてマイクロコントローラチップ101が例示されている。
マイクロコントローラチップ101は、CPUコア102、SRAM103、マスクROM104、バス105、不揮発性メモリ111、書換え許可回路121、プログラム検証回路141、プログラム検証要否判定回路161、及びリセット制御回路106を有する。CPUコア102、SRAM103、マスクROM104、不揮発性メモリ111、書換え許可回路121、プログラム検証回路141、及びプログラム検証要否判定回路161は、バス105を介して互いに接続されている。
CPUコア102及びSRAM103は、機能構成(図1参照)における命令実行部60に対応する。マスクROM104は、書換え不能な不揮発性メモリ20に対応する。不揮発性メモリ111は、書換え可能な不揮発性メモリ10に対応する。書換え許可回路121は、書換え許可部30に対応する。プログラム検証回路141は、プログラム検証部50に対応する。プログラム検証要否判定回路161は、プログラム検証要否判定部40に対応する。
SRAM103は、CPUコア102による作業領域を含む。例えば、CPUコア102は、マスクROM104に格納されたシステムプログラムをワード単位でSRAM103に読み出して実行可能である。
不揮発性メモリ111は、複数の論理ブロックに分割されている。複数の論理ブロックは論理ブロック112,113を含む。論理ブロック112は、第1の不揮発性メモリ領域11に対応する。論理ブロック112は、プログラムメモリブロック11aを含む。プログラムメモリブロック11aには、プログラム11a1が不揮発的に格納されている。論理ブロック113は、第2の不揮発性メモリ領域12に対応する。論理ブロック113は、検証状態フラグ12aが不揮発的に格納されている。
不揮発性メモリ111はバス105に接続されているが、複数の論理ブロックの中で、バス105を経由してCPUコア102から直接アクセス可能な領域は論理ブロック112に限定され、ここにシステムプログラムとしてのプログラム11a1が格納され得る。検証状態フラグ12aは、書換え許可回路121、プログラム検証回路141、プログラム検証要否判定回路161を経由して間接的に参照・更新され、プログラムが直接値を操作することはできない。リセット制御回路106がプログラム検証要否判定回路161に接続されている。
書換え許可回路121は、レジスタ122、未検証状態設定機能123、検証状態読出し機能124、書換え許可設定機能125、及び書込み機能126を有する。レジスタ122は、記憶装置31に対応する。書込み機能126は、書換え制御フラグ31aが「許可」になっている状態ではCPUコア102から制御に従い、プログラムメモリブロック11aに対するプログラム等の情報の書き換えを行ったり、プログラムメモリブロック11aに格納された情報を消去したりする。プログラム検証回路141は、フィンガープリント値計算機能142、フィンガープリント期待値検証機能143、フィンガープリント値照合機能144、及び書換え禁止設定機能145を有する。プログラム検証要否判定回路161は、検証要否判定機能162を有する。
マイクロコントローラチップ101で実行可能であるセキュアブートが想定する脅威は大きく2つある。ひとつは、マイクロコントローラチップ101の外部に接続される汎用メモリや汎用メモリをマイクロコントローラチップ101から外して、もしくは並列にアクセスしてシステムプログラムを不正に書換える外部攻撃(物理攻撃)である。もうひとつは、システムの実行中に外部から侵入した不正プログラムが、正規のプログラム更新のために備えられているメモリまたはストレージ書換え機能を利用して、システムプログラムを不正に書換える内部攻撃である。故障注入などのサイドチャネル攻撃はここでは対象外とする。
オンチップメモリ(不揮発性メモリ111)を持つマイクロコントローラチップ101では、その構成から、基本的には外部攻撃は考慮の対象外としてよいことが有利な点である。すなわち、マイクロコントローラチップ101がシステムオンチップで構成されている場合、マイクロコントローラチップ101は、不揮発性メモリ111へ直接的にアクセス可能な外部端子を有さない仕様とすることができる。図示は省略されているが、初期プログラム書込みのため、マイクロコントローラチップ101は、工場からの出荷前の段階ではJTAG端子などの不揮発性メモリ用の書込み端子を持ってもよい。プログラムを書きこみ後に上記JTAG端子を工場内で無効化後、出荷する。出荷後は上記JTAG端子を通じたプログラム書込みはできない。その後のプログラム更新は、書きこまれた初期プログラムの動作によりネットワーク経由で取得したプログラムをCPUコア102から不揮発メモリ111に書きこむことによって行われる。
本実施形態では、攻撃を内部攻撃に限定できる利点を活用してセキュアブートの安全性を担保しつつ、わずかなハードウェアの追加・変更で起動時間を短縮可能な構成を開示する。主な要求条件は以下の通りである。
(要求1):一度システムプログラム(プログラム11a1)のフィンガープリント検証を行っておけば、検証に成功した場合にマイクロコントローラチップ101内部の不揮発性メモリ111に「検証済」の検証状態フラグ12aを保持することにより、次項の場合を除いて、次回からの起動ではフィンガープリント検証を行わず高速に起動できる。
(要求2):電源断をまたいでも検証状態は保持され高速化の効果が維持される。
(要求3):ただし、システムプログラム(プログラム11a1)が書換えられた場合には再起動時に検証が行われ、検証に成功した場合に「検証済」の検証状態フラグ12aが保持される。次回の起動では書換えがなければフィンガープリント検証を行わず高速に起動できる。
(要求4):次回起動時のシステムプログラム(プログラム11a1)の書換え検出においては、正規の手順による書換えに限定せず、悪意のプログラムを含む任意のプログラム実行によって行われるものを検出可能であること。実際に書換えが行われたかどうかは問わず、書換え途中に電源断が発生して書換えが中断されるようなケースなどの、書換えが行われた可能性がある場合を含めて広く検出可能であること。
(要求5):実現にあたってのハードウェア規模が小さいこと。たとえばプログラムメモリブロック11aへの書込み全てのログをセキュアメモリに保存することは、保存のためのセキュアメモリのコストや消費電力の増加が大きく好ましくない。
(要求6):不揮発性メモリ111への更新プログラムの書き込みは、更新プログラムの配布方式に依存するため、システムプログラム側が行うこと。システムプログラムはネットワーク通信と受信した更新プログラム断片の管理を含む複雑な機能を実行するため、潜在的な脆弱性を持ち、ネットワークからの攻撃を受け一時的に不正プログラムが実行され、さらにフラッシュメモリに当該もしくは別の不正プログラムが書きこまれてしまうおそれがあるが、その際でも検証と再起動を行うことにより不正プログラムの排除が可能であること。
要求1〜要求6を満たすため、マイクロコントローラチップ101には、ハードウェアエンジン(プログラム検証回路141)による検証の完了後に不揮発性メモリ111が一度も書換え可能な状態になっていないことを、電源断をまたいで担保するハードウェアロジックが実装されている。
図4は、情報処理装置1(マイクロコントローラチップ101)の書換え許可要求に応じた動作を示すフローチャートである。
書換え許可回路121は、マイクロコントローラチップ101が起動時等に、書換え制御フラグ31aにデフォルトの値として「禁止」を設定する。システムプログラム(プログラム11a1)は、プログラムメモリブロック11aへの書き込みに先だってCPUコア102で発行させた書換え許可要求を書換え許可回路121に供給させる(S1)。書換え許可回路121は、不揮発性メモリ111上の検証状態フラグ12aの書込み権を取得し(S2)、検証状態フラグ12aに「未検証」の値を書きこむ(S3)。書換え許可回路121は、検証状態フラグ12aに値が適切に書き込まれたか確認するために、検証状態フラグ12aを不揮発性メモリ111から読み出す(S4)。このとき、読み出された情報に符号ビットが含まれていれば誤り訂正を行ってもよい。書換え許可回路121は、読み出された検証状態フラグ12aが「未検証」である場合(S5で「成功」)、書換え制御フラグ31aに「許可」を書きこみ(S6)、検証状態フラグ12aの書込み権を開放する(S7)。例えば、検証状態フラグ12aの「未検証」と書換え制御フラグ31aの「許可」の値を同一値に定義しておくことで、S6の操作を、読みだした検証状態フラグ12aの値を書換え制御フラグ31aに複写する操作として単純化することもできる。なお、書換え許可回路121は、誤り訂正に失敗するなど検証状態フラグ12aの値が適正に読み出されなかった(読出しがエラーになった)場合(S5で「失敗」)、書換え許可設定(S6)を行わずに検証状態フラグ12aの書込み権を開放する(S7)。
ここまでの操作により、書換え許可要求に対応する処理は完了し(S8)、書換え制御フラグ31aに「許可」が設定されることで、プログラムメモリブロック11aへの書き込みが可能となる。書換え制御フラグ31aに「許可」が設定されるのは書換え許可要求に基づく上記の手順だけであるため、書換え制御フラグ31aが「許可」の状態では、検証状態フラグ12aが「未検証」となっていることが担保される。この時点でマイクロコントローラチップ101の再起動処理が行われても次回のリスタート時には検証処理が行われる。
さらに、上記の通常手順に加えてこの手順のどの時点で電源断による中断や検証状態フラグ12aへの書込み失敗があったとしても、書換え許可状態(書換え制御フラグ31aが「許可」の状態)になった場合には、未検証状態(検証状態フラグ12aが「未検証」の状態)が担保される。本実施形態では、プログラムメモリブロック11aへの書込み履歴を保存するのではなく、書換え制御フラグ31aを「許可」に設定する際の前処理として検証状態フラグ12aを「未検証」に設定する。これにより、検証状態フラグ12aが「検証済」の状態であれば、前回の検証完了から、プログラムメモリブロック11aへの書き込みが一切行われていないことが担保できる。
図5は、情報処理装置1(マイクロコントローラチップ101)の動作を示すシーケンス図であり、図4のフローチャートと対応する処理を同じ番号で示している。プログラムメモリブロック11aへの書き込みが許可されると、CPUコア102は、システムプログラム(プログラム11a1としての「Prog1」)に従い、外部サーバ201からネットワーク202およびネットワークインタフェース199を経由して更新プログラムイメージを逐次取得し、プログラムメモリブロック11aに書きこむ。このとき、どのような順序で書込みが行われてもよい。ネットワーク202経由で更新プログラムイメージ(例えば、「Prog2」)を取得する際には、パケット順序の逆転などが発生するが、本実施形態では以下で説明する検証開始の時点で正しいプログラムイメージが書きこまれてさえいれば、それ以前にはどのような順序でプログラムメモリブロック11aに書込みが行われてもよい。もし受信した更新プログラムが不正なものであったとしても後述の検証処理で検出できる。さらにこの更新処理がネットワーク202経由で感染する不正プログラムに乗っ取られてしまい、プログラムメモリブロック11aに不正プログラムが書きこまれてしまったとしても、検証処理で不正プログラムの存在を検出し、次回再起動時にプログラムメモリブロック11a上の不正プログラムが実行されてしまうことを防止できる。
CPUコア102は、プログラムメモリブロック11a上における「Prog1」から「Prog2」への書換えを行う。プログラムメモリブロック11a上において、「Prog1」が存在している状態から「Prog1」と「Prog2」とが混在している状態(Prog1/2」)を経て、「Prog2」が存在している状態に至る。CPUコア102は、「Prog1」から「Prog2」への書換えが完了すると、書換え後の「Prog2」の検証要求を発行する。
図6は、情報処理装置1の検証要求に応じた動作を示すフローチャートである。プログラム検証回路141は、CPUコア102から検証要求を受け(S11)、プログラムメモリブロック11aの内容を検証する。以下、公開鍵署名に基づく検証の説明を記載するが、共通鍵に基づくMAC(Message Authentication Code)なども適用可能である。
プログラムメモリブロック11a内に検証対象プログラム「Prog2」とそれに対する公開鍵署名「Cert」が置かれているものとする。署名「Cert」は、プログラムの配布元が持つ公開鍵系の秘密鍵「Ks」により検証対象プログラムのハッシュ値に署名がなされたものである。プログラム検証回路はKsに対応する公開鍵「Kp」を持つ。
検証要求を受けたプログラム検証回路141は、検証状態フラグ12aの書込み権を取得し(S12)、書換え禁止設定機能145により、書換え制御フラグ31aを「禁止」に設定する(S13)。
次に、プログラム検証回路141は、フィンガープリント値計算機能142により検証対象プログラム「Prog2」のフィンガープリント値を計算し、フィンガープリント期待値検証機能143によりフィンガープリント期待値を取得する(S14)。すなわち、フィンガープリント期待値検証機能143は、第1の検証処理(例えば、署名検証)を行い、第1の検証処理に成功した場合にフィンガープリント期待値を取得でき、第1の検証処理に失敗した場合、フィンガープリント期待値を取得できない。第1の検証処理が成功した場合、プログラム検証回路141は、第2の検証処理(例えば、フィンガープリント検証)を行う。すなわち、プログラム検証回路141は、フィンガープリント値照合機能144によりフィンガープリント値とフィンガープリント期待値(検証期待値)との照合を行う。ここではプログラムのハッシュ値がフィンガープリント値に相当し、公開鍵署名から抽出したハッシュ値がフィンガープリント期待値に相当する。なお、第1の検証処理が失敗した場合、プログラム検証回路141は、第2の検証処理を行わない。
フィンガープリント値とフィンガープリント期待値とが合致しなかった場合(S15で「失敗」)、検証は失敗となり、プログラム検証回路141は、検証状態フラグ12aの書込み権を開放し(S17)、検証を完了させる(S18)。
フィンガープリント値とフィンガープリント期待値とが合致した場合(S15で「成功」)、検証は成功となり、フィンガープリント値照合機能144により、検証状態フラグ12aに「検証済」が設定される(S16)。プログラム検証回路141は、検証状態フラグ12aの書込み権を開放し(S17)、検証を完了させる(S18)。
図7は、検証状態フラグ12aに「検証済」が設定されている状態で再起動処理が行われた場合、情報処理装置1の動作を示すフローチャートである。
マイクロコントローラチップ101の再起動処理(S21)が行われた後に、プログラム検証要否判定回路161は、リセット制御回路106からの起動信号を受信し、起動信号をトリガーとして検証状態フラグ12aを不揮発性メモリ111から読み出す(S22)。検証状態フラグ12aが「検証済」であるため(S23で「検証済」)、プログラム検証要否判定回路161は、検証の実行が不要であると判定し、CPUコア102に正常起動許可を通知する(S26)。これに応じて、CPUコア102は、格納されたプログラム11a1を所定のアドレスから実行する。図8は、情報処理装置1の動作を示すシーケンス図であり、図7のフローチャートと対応する処理を同じ番号で示している。
本実施形態の方式は、書換え許可と検証処理とにおいて、書換え制御フラグ31aと検証状態フラグ12aとの操作を組み合わせることにより、検証が電源断などにより中断したとしても、再起動処理後に検証が行われるようにすることができる。
図7と図9にしたがってそのときの動作を説明する。図9は、情報処理装置1の動作を示すシーケンス図である。検証実行までは図5のシーケンスと同一である。検証計算が未完了もしくは検証計算に基づく検証状態を示す値が検証状態フラグ12aに書きこまれない状態で再起動処理(S21)が発生している。
再起動処理において検証状態フラグ12aは「未検証」となっている。プログラム検証要否判定回路161は、検証状態フラグ12aが「未検証」である(S23で「未検証」)ことに応じて、検証が必要であると判定し、プログラム検証回路141に検証の実行を要求する。プログラム検証回路141は、書換え制御フラグ31aを「禁止」に変更し、検証を行う(S24)。この場合、正しい更新プログラムがプログラムメモリブロック11aに書きこまれているため、プログラム検証回路141は、検証に成功し(S25で「成功」)、検証状態フラグ12aに「検証済」が設定され、検証成功がプログラム検証要否判定回路161に通知される。これをもってプログラム検証要否判定回路161は、CPUコア102に正常起動許可を通知して(S26)、更新されたプログラム11a1が実行される(S27)。
このように、検証動作が中断された場合でも、再起動処理後に検証が行われるようにすることができる。ただし、再起動処理後に検証が行われるため、プログラム11a1の起動時間は長くなる。
次に、不正が検出された場合の動作を説明する。図10は、例えばシステムプログラムの脆弱性を利用するなどの方法により、SRAM103に侵入して実行されている不正プログラムが、プログラムメモリブロック11aに不正プログラムの書き込みを試みた場合のシーケンス図である。図10は、不正プログラムが自発的に検証処理を発行した場合には再起動処理時に再び検証が行われて不正プログラムが起動しない例である。
SRAM103上の不正プログラムは、正規のプログラム書込みと同じように書換え許可要求を発行し、プログラムメモリブロック11aに書込みを行い、検証要求を発行する。違うのは書きこまれるのが不正プログラムである点である。この場合においても、検証処理(S14)が実行され、検証に失敗し(S15で「失敗」)、検証が完了しても検証状態フラグ12aは「未検証」のままとなる。
不正プログラムは再起動処理(S21)まで動作し続けるが、再起動処理後は、検証状態フラグ12aが「未検証」であるため(S23で「未検証」)、検証処理(S24)が実行され、検証結果は失敗(S25で「失敗」)となるため、CPUコア102には停止指示が発行されCPUコア102に通知される(S28)。したがって、不正プログラムは実行されない(S27)。SRAM103上の不正プログラムも電源が切られれば消失する。
なお、SRAM103上で実行される不正プログラムと、プログラムメモリブロック11aに書きこまれる不正プログラムとは、同じプログラムである必要はない。
図11に、プログラムメモリブロック11aに不正プログラムが書きまれた後に検証要求を発行しない場合のシーケンスを示す。検証要求を発行しないため、検証状態フラグ12aは「未検証」のままであり、図5の場合と同様に再起動での検証に失敗するため不正プログラムは実行されない。
図12に、書換え許可要求に応じた処理の途中に電源断等による処理中断と再起動処理とが発生した場合のシーケンスを示す。
CPUコア102による書換え許可要求の発行後、検証状態フラグ12aが「未検証」に書換えられたものの、その結果が書換え制御フラグ31aに反映される前に電源断により処理が中断し再起動している。電源断までの間、書換え制御フラグ31aは「禁止」の状態を維持しているため、CPUコア102以外のDMAC107なども含めてプログラムメモリブック11aに対していかなる書込みも行われることはない。
再起動処理(S21)後は、検証状態フラグ12aが「未検証」に設定されているため、再度検証(S24)が行われるが、プログラムメモリブロック11aは書換えられていないため検証に成功し(S25で「成功」)、CPUコア102に正常起動許可が通知され(S26)、プログラム11a1が実行される。
ここで、仮に、書換え許可の操作において、ふたつの状態フラグ操作の順序を入れ替えた場合を考える。この場合、CPUコア102により書換え許可要求が発行されると、書換え制御フラグ31aが「許可」に設定された後に、検証状態フラグ12aが「未検証」に設定されることになる。
このとき、書換え制御フラグ31aが「許可」に設定された直後からプログラムメモリブロック11aへの書き込みが可能になる。そして、不揮発性の検証状態フラグ12aへの「未検証」の書きこみ完了前に再起動が発生した場合、プログラムメモリブロック11aの書換えが発生したにもかかわらず、検証状態フラグ12aは「検証済」であるため、再起動処理後の検証はスキップされてしまう。この書込みで不正プログラムが書きこまれている場合、不正プログラムの実行が成功してしまう。
それに対して、図12の例では検証状態フラグ12aの変更後に電源断が発生しているため、再起動処理後に検証が行われている。検証状態フラグ12aの変更前に電源断が発生した場合は、検証状態フラグ12aは「検証済」のままであるため、再起動処理後に検証は行われない。このとき、書換え制御フラグ31aの設定が検証状態フラグ12aの後に行われるため、この場合でもプログラムメモリブロック11aへの書き込みは行われないことが担保されており、再起動処理後に検証を行わなくても検証済みのプログラム11a1が書換えられてしまう可能性を排除できるため安全である。
すなわち、本実施形態では、検証状態を示す検証状態フラグ12aと、実行中の不揮発性メモリへの書き込みを制御する書換え制御フラグ31aとで、非同期の電源断を含む検証状態管理を安全に行うことができる。また、本実施形態では、既存のマイクロコントローラチップに対する回路の増加はわずかであり野外に配置されるフィールド機器やセンサ機器などセキュリティと低価格との両方が求められる機器に適している。
なお、本実施形態では、システムプログラムが書込み許可要求と検証要求とを個別に発行することを想定している。この理由は、組込みマイクロコントローラのメモリ構成と書換え手順を想定したものである。この手順の他に、書込み許可要求と書込み、そして検証要求を一体としてハードウェア処理する構成も論理的には考えられるが、組込みマイクロコントローラには適していない。この手順の場合、書込み先のプログラムメモリが書込み可能となる以前に、検証対象のプログラム11a1がすべて別のバッファメモリに格納されている必要がある。バッファメモリとしてもっとも一般的なのはSRAMだがSRAMはフラッシュメモリよりビット単価が高いため、一般に容量はフラッシュメモリより小さい。したがってフラッシュメモリの書込みと検証を複数回に分割して行う必要が生じてしまう。これは、ハードウェア側の検証機能を複雑化することになる。
たとえば、更新プログラムが分割して配信される場合でも、それがメモリ上の配列にそった順序で受信されるとは限らない。プログラムを分割してピアツーピアにより配送する方式が知られているが、このような場合、分割した断片の受信順序がばらばらになるのがふつうである。
本実施形態では、システムプログラムが書込み許可要求と検証要求とを個別に発行することで、システムプログラムがプログラムメモリブロック11aに更新プログラムを任意の順序で書込み、全ての更新プログラムがそろった段階でシステムプログラムが検証要求を発行する手順とすることで、更新プログラム配信の自由度を高めると同時に検証機能のハードウェアを単純化できる。
以上のように、実施形態では、情報処理装置1において、書換え許可要求が発行され且つ検証状態フラグ12aが「検証済」である場合、「未検証」に変更され、検証状態フラグ12aの変更に応じて書換え制御フラグ31aが「禁止」から「許可」に変更される。また、検証要求が発行された場合、又は、検証状態フラグ12aが「未検証」でプログラム11a1の検証が必要である場合、書換え制御フラグ31aが「禁止」に変更され、書換え制御フラグ31aの変更に応じてプログラム11a1に対する検証が行われる。そして、検証状態フラグ12aは、検証に成功すれば「検証済」に設定され、検証に失敗すれば「未検証」のままに維持される。これにより、検証状態フラグ12aが「検証済」であり第1の不揮発性メモリ領域11に対する書換えが行われていないと予想できる場合に、セキュアブートの実行をスキップさせることができる。この結果、セキュアブートの実行頻度を必要最小限(検証状態フラグ12aが「未検証」になっている場合)に抑えることができる。したがって、プログラム11a1の不正な改ざんを確実に検出・防止できるとともに、プログラム11a1の平均的な起動時間の短縮化を図ることができる。また、情報処理装置1の平均的な消費電力を低減できる。
なお、上記の実施形態では、検証状態フラグ12aと書換え制御フラグ31aとから検証の成功・失敗に関して直接的に推定することが困難である。そのため、不揮発の検証成否フラグを追加で設けて、検証成否フラグを参照することで検証に成功したのか失敗したのかを把握できるようにしてもよい。
上記の実施形態では、書換え禁止を書換え制御フラグ31aにより制御している。論理回路による実現の場合、書換え禁止の状態では、メモリに対する書込み制御信号を有効にしない回路を設けることで書換えを禁止する。これに加えて、フラッシュメモリのように、消去、書込みに論理回路とは異なる高電圧を必要とする場合は、それらの電源電圧供給を停止することで書換え禁止の担保をより厳格にできる。
また、上述のように検証状態フラグ12a及び書換え制御フラグ31aは電源断などの中断に対して安全に動作するが、ノイズによるビット反転についてはこのかぎりではない。これらフラグについては、誤り訂正もしくは多数決論理を用いて冗長化してもよい。
上記の実施形態では、検証失敗した場合は停止するとされている。これに代わって、暗号鍵や重要入出力へのアクセスを禁止した条件で未検証のプログラム11a1を実行することもできる。目的として、不正プログラム以外のメモリ故障などによる検証失敗が発生した場合に、原因を記録・通知することなどが期待できる。
また、書換え許可回路121とプログラム検証回路141との間で検証状態フラグ12aの書換え競合を防止するため、適切な書込み権取得管理を例えばCPUコア102等が行うことができる。
また、図13は、実施形態の第1の変形例として、情報処理装置1(マイクロコントローラチップ101)のハードウェア構成を示すブロック図である。図13に示すように、プログラム検証回路141で取得されたフィンガープリント期待値は、論理ブロック(第3の不揮発性メモリ領域)114に不揮発に記憶されてもよい。
上記の実施形態との構成上の差異は、フィンガープリント期待値メモリ114aが論理ブロック114に設けられている点である。最初のプログラム11a1の検証時、もしくは別途設けられたフィンガープリント期待値設定手順において、検証された期待値がフィンガープリント期待値メモリ114aに書きこまれる。
例えば図14に示すように、書換え許可要求に応じた処理において、検証状態フラグ12aに「未検証」が設定される際にフィンガープリント期待値メモリ114aがクリアされ(S43)、確認のために検証状態フラグ12aの値が読み出される際にフィンガープリント期待値が適正にクリアされているか確認される(S44)。また、図15に示すように、検証要求に応じた処理において、書換え制御フラグ31aに「禁止」が設定(S13)された後に、プログラム検証回路141は、フィンガープリント期待値メモリ114aを参照して、フィンガープリント期待値がクリアされていれば(S54aで「クリア状態」)、フィンガープリント値の計算とフィンガープリント期待値の取得とをそれぞれ行った後に、両者の照合を行う(S54c)。プログラム検証回路141は、フィンガープリント期待値メモリ114aにフィンガープリント期待値が格納されていれば(S54aで「設定済み」)、フィンガープリント期待値の取得をスキップして、フィンガープリント値の計算の後に両者の照合を行う(S54b)。したがって、フィンガープリント期待値が設定済みである場合に、プログラム11a1の検証処理の時間を短縮できる。
上記の実施形態ではフィンガープリント期待値は、第3者による偽造防止のため秘密鍵に基づいて作られた署名又はMACの形で与えられている。秘密鍵に基づかないハッシュ値では第3者が偽造可能なため、上記の実施形態には適用できない。
第1の変形例では、フィンガープリント期待値を一般のプログラムによるアクセスから保護された不揮発性メモリ111に保持するため、フィンガープリント期待値をハッシュ値とすることもできる。その場合、フィンガープリント期待値検証機能143は、CPUコア102内で実行されるプログラムもしくは装置外との通信において認証された通信路を経由してハッシュ値を受信し、フィンガープリント期待値メモリ114aに書きこむことができる。例えば、TCG(Trusted Computing Group)の仕様に基づくセキュアブートでは安全なストレージに保存されたハッシュ値との比較が行われるため、第1の変形例の使用が適している。
また、上記の実施形態は、セキュアブートにおいて起動時の応答悪化と電力消費を増やす検証処理を省略できる点で、無線センサや無線カードなどに特に適している。無線センサは間歇的に動作することが多いが、その都度大きな電力を消費するセキュアブートを実施することは、電池駆動の端末では電池交換の頻度が増えてしまう。無線給電の無線カードなどでは、大電力を供給できないことにより起動時間はさらに長くなる。
これらの端末は同時に低コストが求められるが、実施形態及び第1の変形例では、ハードウェアを前提とした構成を示している。ハードウェアで実現した場合、チップ面積の増加はコスト増に直結する。特にセキュアブート機能はセンサ信号処理などと比較して使用頻度が低いため、これを汎用CPUのソフトで実現することはチップ面積の縮小に直結し利点となる。これらの機能は基本的にはソフトウェアとしても処理時間がかかることを除けば、ソフトウェアでも同様の処理を実現可能である。ただし、端末に不正プログラムが侵入することを前提として考えると、書換え許可機能、プログラム検証機能、そして起動時のプログラム検証要否判定機能は不正プログラムの干渉を受けてはならない機能である。
以下では、実施形態の第2の変形例として、検証機能および起動時の検証要否判定機能についてソフトウェア処理とし、不正プログラムが端末に侵入した状態でもその影響を排除して安全にこれら機能を実行する手順を説明する。
第2の変形例では、実施形態においてハードウェアで実現されていたプログラム検証機能及びプログラム検証要否判定機能を、書換え不能なマスクROM104上の機能モジュールであるプログラム検証モジュール141a、検証要否判定モジュール161aで代替する。図16は、第2の変形例における情報処理装置1のハードウェア構成を示すブロック図である。プログラム検証モジュール141a、検証要否判定モジュール161aは、予めマスクROM104に格納されている。このとき、フラグをCPUコア102上の命令発行によって直接操作する。そのためにフラグ操作機能を担うフラグ操作回路181が設けられている。不正プログラムによるフラグ操作機能の利用を防ぐため、命令発行によるフラグ操作が可能な期間を、CPUコア102の再起動処理からマスクROM104上の機能モジュールの実行後、マスクROM104上の機能モジュールがフラグアクセスを無効化するまでの期間に限定する。このためにフラグアクセス有効化/無効化機能を担うフラグアクセス設定回路191を設ける。マスクROM104上のプログラムは検証なしで実行され得ることになるが、これはハードウェア的に改変不能であるため検証を省略しても差し支えない。
フラグ操作回路181は、フラグアクセス制御機能182、検証状態フラグ操作機能183、検証状態フラグ操作機能184、及び書換え制御フラグ操作機能185を有する。フラグアクセス設定回路191は、フラグアクセス有効化機能192及びフラグアクセス無効化機能193を有する。
これらの機能は、書換え制御フラグ31aおよび検証状態フラグ12a、そしてフラグアクセス機能に対するインタフェースと許可を制御するだけであり、検証計算を実行するハードウェアと比較して非常に小規模の回路で実現可能である。
汎用CPUによるハッシュ値や署名などの暗号演算は専用ハードウェアと比較して一般に長い時間がかかり、消費電力効率も悪い。しかしながら、第2の変形例ではセキュアブートの検証処理はプログラムメモリブロック11aの書換えがない限り発生しないため、通常の運用では電力効率に与える影響はほとんどない。
図17は、第2の変形例における再起動処理に応じた情報処理装置1の動作を示すフローチャートである。再起動処理(S21)後、フラグアクセス設定回路191によりフラグアクセスを有効化、すなわちフラグ操作回路181によるフラグ操作機能が有効(S61)になった状態でマスクROM104上のプログラム検証モジュール141a及びプログラム検証要否判定モジュール161aを実行する(S62)。同機能モジュールはフラグ操作回路181を通じて検証状態フラグ12aを読出し(S22)、「検証済」であれば(S23で「検証済」)、フラグアクセスを無効化して(S65)、検証済みプログラム11a1を実行する(S66)。「未検証」の場合は(S23で「未検証」)、ソフトウェアによるプログラムメモリブロック11aの検証処理(S64)を行い、検証に成功(S25で「成功」)した場合はやはりフラグアクセスを無効化して(S65)、検証済みプログラム11a1を実行する(S66)。検証に失敗した場合は(S25で「失敗」)、フラグアクセスを無効化して(S67)、プログラム11a1の起動を停止する(S68)。
また、あるリスクが人命や資産に損害を与える可能性を、機械や装置の働きによって低減する機能安全と呼ばれる手法が知られている。複雑なシステムの構成要素が故障した場合にリスクを軽減する機能の実現にはソフトウェアが広く用いられる。機能安全ではソフトウェアが正しいものであることが、その性質上極めて重要である。セキュアブートは、機能安全の基盤となるソフトウェアの正しさを、悪意の攻撃から保護する手段ともなりえる。セキュアブートをこのように位置付けた場合、セキュアブート機構の故障による誤動作、特にセキュアブートの要否判断が誤動作すると、改ざんされたプログラムの実行を許容してしまうことにつながってしまう。したがって、セキュアブートスキップ機構についても機能安全に置いて一般的に用いられる故障検出の手法により事前に排除しておくことが望ましい。
たとえば、本実施形態においては、検証状態フラグが検証済みとなっていないにも関わらず書換えが可能な状態になってしまう誤動作が上記にあたるため、書換え制御フラグの禁止状態がプログラムメモリブロックの書込み禁止に正しく反映されることを確認するためのBIST(Built In Self Test)機能により担保しておくことが挙げられる。なお、検証状態フラグを格納する不揮発性メモリのうち、フラッシュメモリは書込みを繰り返すと書込み・読出しが不安定になる劣化が発生することが知られている。本実施形態では、検証状態フラグにいったん書きこんだ値を読み出してその正しさを検証、もしくは書換え制御フラグにコピーしている。そのため、仮にフラッシュメモリの劣化により書込みに失敗したとしても、書換え制御フラグの値も書込み許可の状態とならないため、本実施形態の機構自体が機能安全に必要な機能の一部を提供することができる。
また、上記の実施形態において検証対象を一つのプログラムとした例を示したが、書換え制御フラグおよび検証状態フラグを備えることにより複数のプログラムを検証対象とすることも可能である。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。