(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024151397
(43)【公開日】2024-10-25
(54)【発明の名称】プロセッサシステム
(51)【国際特許分類】
G06F 8/65 20180101AFI20241018BHJP
【FI】
G06F8/65
【審査請求】未請求
【請求項の数】5
【出願形態】OL
(21)【出願番号】P 2023064612
(22)【出願日】2023-04-12
(71)【出願人】
【識別番号】000005234
【氏名又は名称】富士電機株式会社
(74)【代理人】
【識別番号】110004185
【氏名又は名称】インフォート弁理士法人
(74)【代理人】
【識別番号】100121083
【弁理士】
【氏名又は名称】青木 宏義
(74)【代理人】
【識別番号】100138391
【弁理士】
【氏名又は名称】天田 昌行
(74)【代理人】
【識別番号】100132067
【弁理士】
【氏名又は名称】岡田 喜雅
(74)【代理人】
【識別番号】100131521
【弁理士】
【氏名又は名称】堀口 忍
(72)【発明者】
【氏名】高務 健二
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376CA40
5B376FA11
(57)【要約】 (修正有)
【課題】複数のプロセッサを備えるプロセッサシステムにおいて、ファームウェアの検証に際して、検証対象プロセッサ以外のプロセッサの演算リソースの消費を削減する。
【解決手段】複数のプロセッサおよびそれら複数のプロセッサの通信を制御するマスタプロセッサを備えるプロセッサシステムは、疑似データ書込み部および検証部をさらに備える。疑似データ書込み部は、複数のプロセッサのうちの第1のプロセッサのファームウェア格納領域にファームウェアを書き込む際、または、ファームウェア格納領域に格納されているファームウェアを更新する際に、ファームウェア格納領域の空き領域に疑似データを書き込む。検証部は、第1のプロセッサにおいてファームウェア格納領域全体に対する所定の演算により検証用チェックコードが算出されたときに、検証用チェックコードに基づいて、ファームウェア格納領域に書き込まれているファームウェアを検証する。
【選択図】
図7
【特許請求の範囲】
【請求項1】
複数のプロセッサおよび前記複数のプロセッサの通信を制御するマスタプロセッサを備えるプロセッサシステムであって、
前記複数のプロセッサのうちの第1のプロセッサのファームウェア格納領域にファームウェアを書き込む際、または、前記ファームウェア格納領域に格納されているファームウェアを更新する際に、前記ファームウェア格納領域の空き領域に疑似データを書き込む疑似データ書込み部と、
前記第1のプロセッサにおいて前記ファームウェア格納領域全体に対する所定の演算により検証用チェックコードが算出されたときに、前記検証用チェックコードに基づいて、前記ファームウェア格納領域に書き込まれているファームウェアを検証する検証部と、
を備えるプロセッサシステム。
【請求項2】
前記第1のプロセッサのファームウェア格納領域にファームウェアを書き込む際、または、前記ファームウェア格納領域に格納されているファームウェアを更新する際に、
前記検証部は、前記第1のプロセッサに検証用データを与えると共に、前記第1のプロセッサに対して設けられている所定の保存領域に前記検証用データを保存し、
前記検証部は、前記第1のプロセッサにおいて前記検証用データを利用して前記ファームウェア格納領域全体に対する前記所定の演算を実行することで算出される参照用チェックコードを、前記保存領域に保存し、
前記第1のプロセッサのファームウェア格納領域に書き込まれているファームウェアを検証する際に、
前記検証部は、前記保存領域から前記検証用データを取得して前記第1のプロセッサに与え、
前記第1のプロセッサにおいて前記検証用データを利用して前記ファームウェア格納領域全体に対する前記所定の演算を実行することで前記検証用チェックコードが算出されたときに、前記検証部は、前記保存領域に保存されている前記参照用チェックコードと前記検証用チェックコードとを比較することで、前記第1のプロセッサのファームウェア格納領域に書き込まれているファームウェアを検証する
ことを特徴とする請求項1に記載のプロセッサシステム。
【請求項3】
前記マスタプロセッサは、前記第1のプロセッサから前記保存領域へのアクセスを禁止する
ことを特徴とする請求項2に記載のプロセッサシステム。
【請求項4】
前記疑似データ書込み部および前記検証部は、前記マスタプロセッサに実装される
ことを特徴とする請求項1に記載のプロセッサシステム。
【請求項5】
前記疑似データ書込み部および前記検証部は、前記複数のプロセッサのうちの前記第1のプロセッサとは異なる第2のプロセッサに実装される
ことを特徴とする請求項1に記載のプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、各プロセッサにファームウェアが実装されるプロセッサシステムに係わる。
【背景技術】
【0002】
複数のプロセッサが連携して処理を実行するプロセッサシステムにおいて、各プロセッサにファームウェアを実装する構成が実用化されている。この場合、プロセッサシステムは、各プロセッサのファームウェアを更新できるように構成されていることが好ましい。ただし、各プロセッサのファームウェアを更新可能な構成においては、攻撃者により、1または複数のプロセッサに対して不正なファームウェアが書き込まれるおそれがある。このため、不正なファームウェアの書込みに対する対策が提案されている(例えば、特許文献1)。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
上述したように、複数のプロセッサにそれぞれファームウェアが実装される構成において、不正なファームウェアの書込みを監視する方法が提案されている。ただし、複数のプロセッサのうちの1つのプロセッサに書き込まれたファームウェアの検証は、基本的に、他のプロセッサにより行われる。このため、他のプロセッサの演算リソースがファームウェアの検証のために消費されてしまい、本来の処理に影響が及ぶことがある。
【0005】
本発明の1つの側面に係わる目的は、複数のプロセッサを備えるプロセッサシステムにおいて、ファームウェアの検証に際して、検証対象プロセッサ以外のプロセッサの演算リソースの消費を削減することである。
【課題を解決するための手段】
【0006】
本発明の1つの態様のプロセッサシステムは、複数のプロセッサおよび前記複数のプロセッサの通信を制御するマスタプロセッサを備える。このプロセッサシステムは、前記複数のプロセッサのうちの第1のプロセッサのファームウェア格納領域にファームウェアを書き込む際、または、前記ファームウェア格納領域に格納されているファームウェアを更新する際に、前記ファームウェア格納領域の空き領域に疑似データを書き込む疑似データ書込み部と、前記第1のプロセッサにおいて前記ファームウェア格納領域全体に対する所定の演算により検証用チェックコードが算出されたときに、前記検証用チェックコードに基づいて、前記ファームウェア格納領域に書き込まれているファームウェアを検証する検証部と、を備える。
【発明の効果】
【0007】
上述の態様によれば、複数のプロセッサを備えるプロセッサシステムにおいて、ファームウェアの検証に際して、検証対象プロセッサ以外のプロセッサの演算リソースの消費が削減される。
【図面の簡単な説明】
【0008】
【
図1】本発明の実施形態に係わるプロセッサシステムの一例を示す図である。
【
図2】ファームウェアを更新する手順の一例を示す図(その1)である。
【
図3】ファームウェアを更新する手順の一例を示す図(その2)である。
【
図4】ファームウェアを更新する手順の一例を示す図(その3)である。
【
図5】ファームウェアを更新する手順の一例を示す図(その4)である。
【
図6】ファームウェアを検証する手順の一例を示す図(その1)である。
【
図7】ファームウェアを検証する手順の一例を示す図(その2)である。
【
図8】ファームウェアを更新する処理の一例を示すフローチャートである。
【
図9】ファームウェアを検証する処理の一例を示すフローチャートである。
【
図10】他の実施形態においてファームウェアを更新する手順を示す図である。
【
図11】他の実施形態においてファームウェアを検証する手順を示す図である。
【発明を実施するための形態】
【0009】
図1は、本発明の実施形態に係わるプロセッサシステムの一例を示す。本発明の実施形態に係わるプロセッサシステム100は、複数のCPU1(1a~1n)、マスタCPU2、および共通ストレージ3を備える。ただし、プロセッサシステム100は、
図1に示していない他の機能、回路、またはデバイスを備えてもよい。なお、複数のCPU1a~1nは、プロセッサシステム100を構成する「複数のプロセッサ」に相当する。マスタCPU2は、複数のプロセッサの通信を制御する「マスタプロセッサ」に相当する。
【0010】
各CPU1は、プロセッサ素子およびメモリを備える。メモリは、ファームウェアを実装するためのファームウェア格納領域を含む。すなわち、各CPU1のメモリには、ファームウェアが実装され得る。この実施例では、CPU1a~1nに対してそれぞれファームウェアFWa~FWnが実装される。そして、各CPU1は、実装されているファームウェアを実行することで対応する機能を提供する。なお、CPU1a~1nは、同一の装置内に設けられてもよいし、異なる装置に設けられてもよい。
【0011】
マスタCPU2は、CPU1a~1nの通信を制御する。具体的には、マスタCPU2は、プロセッサシステム100内でCPU1a~1n間の通信を制御する。このとき、CPU1a~1nの通信は、マスタCPU2を介して行われる。なお、
図1に示す例では、マスタCPU2と各CPU1a~1nとが直接的に接続されているが、本発明の実施形態はこの構成に限定されるものではない。例えば、マスタCPU2および各CPU1a~1nがバスまたはネットワークに接続される構成であってもよい。ただし、このような構成であっても、CPU1から送信されるパケットは、マスタCPU2によって宛先に転送される。
【0012】
また、マスタCPU2は、プロセッサシステム100の外部に設けられる通信機器とCPU1a~1nとの間の通信を制御する。すなわち、マスタCPU2は、ネットワーク200に接続するためのインタフェースを備える。
【0013】
さらに、マスタCPU2は、同時に複数の通信セッションを設定しない単一セッション方式で、CPU1a~1nの通信を制御する。すなわち、プロセッサシステム100においては、同時に複数の通信セッションが設定されることはない。したがって、例えば、外部の通信機器とCPU1nとの間で通信が行われているときは、マスタCPU2は、他のCPU(即ち、CPU1a、1b等)の通信を許可しない。或いは、CPU1a、1b間で通信が行われているときは、マスタCPU2は、他のCPU(即ち、CPU1n等)の通信を許可しない。
【0014】
なお、「通信セッション」は、この実施例では、通信ノード間で信号を伝送可能な状態を表す。すなわち、「ノードXとノードYとの間に通信セッションを設定する」は、ノードXとノードYとの間で信号を伝送できる状態を構成することを意味し、この場合、ノードX、Y間でネゴシエーション等が行われる必要はない。例えば、「CPU1aとCPU1nとの間に通信セッションを設定する」は、マスタCPU2が、CPU1aとCPU1nとの間で信号を伝送できる状態を構成することを意味する。
【0015】
共通ストレージ3は、CPU1a~1nに実装されるファームウェアFWa~FWnを管理するために、更新データ保存領域31および個別データ保存領域32a~32nを備える。各個別データ保存領域32a~32nには、対応するCPU1に実装されるファームウェアのバックアップおよびそのファームウェアの検証に係わるデータが保存される。例えば、個別データ保存領域32aには、CPU1aに実装されるファームウェアFWaのバックアップおよびCPU1aに実装されているファームウェアの検証に係わるデータが保存される。なお、各個別データ保存領域32a~32nは、この実施例では、対応するCPU1からアクセスされないように構成されている。
【0016】
このように、プロセッサシステム100は、CPU1a~1nおよびマスタCPU2を備え、CPU1a~1nがそれぞれ対応するファームウェアFWa~FWnを実行する。このとき、マスタCPU2がCPU1a~1nの通信を制御する。
【0017】
<ファームウェアの更新>
図2~
図5は、CPU1に実装されるファームウェアを更新する手順の一例を示す。この例では、CPU1nに実装されている不図示のファームウェアが更新される。なお、CPU1に最初にファームウェアが書き込まれる際の手順も、
図2~
図5に示す更新手順と実質的に同じである。
【0018】
CPU1(ここでは、CPU1n)は、メモリ11およびチェックコード算出部12を備える。メモリ11は、ファームウェア格納領域11Fを含む。ファームウェア格納領域11Fは、CPU1nに配布されるファームウェアFWnを格納するための領域である。また、ファームウェア格納領域11Fのサイズおよびメモリアドレスは予め決められている。チェックコード算出部12は、後で詳しく説明するが、ファームウェア格納領域11Fに格納されているファームウェアが正規のファームウェアであるか否かを検証するためのチェックコードを算出する。
【0019】
なお、
図2~
図5においては、ファームウェアから独立してチェックコード算出部12が描かれているが、実際には、例えば、ファームウェアを構成する複数のセクションの中のいずれかにチェックコード算出部12が実装される。この場合、ファームウェアが自身の正当性を証明する機能を含む。
【0020】
マスタCPU2は、乱数生成器21、疑似データ書込み部22、および検証部23を備える。なお、マスタCPU2は、
図2に示していない他の機能を備えてもよい。例えば、マスタCPU2は、CPU1a~1n間の通信セッションを生成および管理する機能を備える。
【0021】
乱数生成器21は、疑似データ書込み部22または検証部23からの要求に応じて、所定長の乱数を生成する。疑似データ書込み部22は、CPU1nのファームウェア格納領域11Fにファームウェアが書き込まれる際に、ファームウェア格納領域11Fの空き領域に疑似データを書き込む。疑似データは、この実施例では、乱数生成器21により生成される乱数である。検証部23は、CPU1nにおいて算出されるチェックコードに基づいて、CPU1nのファームウェア格納領域11Fに書き込まれているファームウェアを検証する。
【0022】
共通ストレージ3は、上述したように、更新データ保存領域31および個別データ保存領域32a~32nを備える。なお、
図2~
図5においては、CPU1n以外のCPU1のための個別データ保存領域は省略されている。
【0023】
CPU1nのファームウェアを更新する際には、
図2に示すように、CPU1nに実装すべきファームウェア(例えば、
図1に示すファームウェアFWn)が共通ストレージ3の更新データ保存領域31に書き込まれる。ファームウェアFWnは、例えば、プロセッサシステム100の運用者または管理書により作成され、マスタCPU2を介して共通ストレージ3の更新データ保存領域31に書き込まれる。また、ファームウェアFWnは、複数のセクションから構成されているものとする。この実施例では、ファームウェアFWnは、セクション1~セクションmから構成されている。
【0024】
続いて、マスタCPU2は、
図3に示すように、更新データ保存領域31からファームウェアFWnを読み出してCPU1nのファームウェア格納領域11Fに書き込む。ここで、ファームウェア格納領域11Fのサイズは、ファームウェアFWnのサイズより大きいものとする。よって、ファームウェア格納領域11FにファームウェアFWnが書き込まれたときに、ファームウェア格納領域11F内に空き領域が残ることになる。なお、ファームウェアFWnが複数のセクションから構成される場合、それら複数のセクションは必ずしも連続して格納される必要はなく、
図3に示すように、セクション1~セクションmが離散的に格納されてもよい。
【0025】
マスタCPU2は、ファームウェア格納領域11F内に空き領域に残らないように、疑似データを生成してファームウェア格納領域11Fに書き込む。ここで、ファームウェア格納領域11Fのサイズは既知であり、また、マスタCPU2はファームウェアFWnのサイズを検出できるものとする。よって、マスタCPU2は、ファームウェア格納領域11FにファームウェアFWnが書き込まれたときのファームウェア格納領域11F内の空き領域のサイズを計算することができる。
【0026】
疑似データ書込み部22は、乱数生成器21から、ファームウェア格納領域11F内の空き領域のサイズに相当するデータ量の乱数を取得する。そして、疑似データ書込み部22は、乱数生成器21から取得した乱数を、疑似データとして、ファームウェア格納領域11F内に空き領域に書き込む。なお、
図3において、ファームウェア格納領域11F内の斜線領域は、疑似データが書き込まれた領域を表している。
【0027】
マスタCPU2は、
図4に示すように、CPU1nに対して、ファームウェアを検証する際に使用するチェックコードの算出を指示する。このとき、検証部23は、検証用チャレンジデータを用意する。検証用チャレンジデータは、乱数生成器21が生成する乱数により実現される。また、検証用チャレンジデータの長さは、CPU1nにおいてチェックコードを算出するための関数に応じて決められているものとする。すなわち、検証部23は、乱数生成器21に所定長の乱数を生成させることで検証用チャレンジデータを取得する。そして、検証部23は、チェックコード算出指示および検証用チャレンジデータをCPU1nに送信する。また、検証部23は、この検証用チャレンジデータを、共通ストレージ3内の個別データ保存領域32nに保存する。なお、CPU1nは、個別データ保存領域32nに保存されている検証用チャレンジデータにアクセスできないものとする。例えば、マスタCPU2は、CPU1nから個別データ保存領域32nへのアクセスを許可しないものとする。
【0028】
CPU1nがマスタCPU2からチェックコード算出指示を受信すると、チェックコード算出部12は、ファームウェアFWnに対するチェックコードを生成する。チェックコードは、この実施例では、メッセージ認証符号(MAC)を利用して算出される。具体的には、チェックコードは、HMAC(Hash-based MAC)関数を利用してMAC値を計算することで得られる。なお、HMAC関数は、その内部で使用するハッシュ関数は特に限定されるものではないが、例えば、SHA-256でもよい。また、HMAC関数に限定されるものではなく、鍵付きハッシュ値を計算可能なものを使用できる。ただし、これらは、セキュリティ上の観点で望ましいとされるものを使用することが好ましい。
【0029】
チェックコード算出部12は、検証用チャレンジデータおよびファームウェア格納領域11F内の全データに対してMAC値を計算する。このとき、HMAC関数には、検証用チャレンジデータが鍵データとして、ファームウェア格納領域11Fに格納されているデータがメッセージとして入力される。そして、チェックコード算出部12は、計算結果を、ファームウェアFWnに対する参照用チェックコードとして出力する。なお、以下の記載では、マスタCPU2によりCPU1nに書き込まれた正規のファームウェアに対して算出された参照チェックコードを「チェックコードC1」と表記することがある。チェックコードC1は、CPU1nのメモリ11に書き込まれたファームウェアを検証する際に、参照データまたは基準データとして使用される。
【0030】
CPU1nは、
図5に示すように、チェックコード算出部12が算出したチェックコードC1をマスタCPU2に送信する。そうすると、マスタCPU2は、CPU1nから受信したチェックコードC1を、CPU1nに対して設けられている個別データ保存領域32nに保存する。さらに、マスタCPU2は、更新データ保存領域31に保存されているファームウェアFWn(即ち、CPU1nに実装されたファームウェアFWn)を、バックアップデータとして、個別データ保存領域32nに保存する。この後、マスタCPU2は、更新データ保存領域31をクリアしてもよい。
【0031】
このように、CPU1nのメモリ11に正規のファームウェアが書き込まれると(或いは、CPU1nのファームウェアが正規の手順で更新されると)、そのファームウェアを検証する際に使用される参照用チェックコードが算出されて共通ストレージ3に保存される。このとき、参照用チェックコードを算出するために使用された検証用チャレンジデータも、共通ストレージ3に保存される。この後、CPU1nは、実装されたファームウェアに従って動作する。
【0032】
<ファームウェアの検証>
上述したように、各CPU1(1a~1n)に実装されているファームウェアは、必要に応じて更新され得る。ただし、プロセッサシステム100がネットワーク200に接続する場合、悪意のある攻撃者によりCPU1a~1nのファームウェアが不正に更新されるリスクがある。このため、プロセッサシステム100は、CPU1a~1nに実装されているファームウェアが正規のファームウェアであるか否かを検証する機能を備える。
【0033】
プロセッサシステム100は、例えば、プロセッサシステム100の外部からあるCPU1にアクセスがあったときに、そのCPU1のファームウェアが不正に更新された可能性があると推定する。そこで、プロセッサシステム100は、プロセッサシステム100の外部からあるCPU1にアクセスがあったときに、そのCPU1のファームウェアを検証してもよい。なお、この実施例では、プロセッサシステム100の外部からCPU1へのアクセスは、常に、マスタCPU2を経由する。したがって、マスタCPU2は、プロセッサシステム100の外部からいずれかのCPU1へのアクセスがあったときに、そのCPU1のファームウェアの検証を開始してもよい。或いは、プロセッサシステム100は、定期的に、各CPU1のファームウェアを検証してもよい。以下の記載では、ファームウェアの検証が実行されるCPU1を「検証対象CPU」と呼ぶことがある。
【0034】
図6および
図7は、CPU1に実装されているファームウェアを検証する手順の一例を示す。この実施例では、
図2~
図5に示す手順により、CPU1nのファームウェアが更新され、対応するチェックコードC1および検証用チャレンジデータが共通ストレージ3内の個別データ保存領域32nに保存されているものとする。そして、プロセッサシステム100は、CPU1nのファームウェアを検証する。すなわち、CPU1nが検証対象CPUである。
【0035】
CPU1nのファームウェアを検証するときは、マスタCPU2は、
図6において、CPU1nにチェックコードの算出を指示する。このとき、マスタCPU2は、共通ストレージ3から検証用チャレンジデータを取得する。この検証用チャレンジデータは、
図4を参照して説明したように、CPU1nのファームウェアが正規に更新されたときにチェックコードを算出するために使用された所定長の乱数である。そして、マスタCPU2は、チェックコードの算出指示と共に、チェックコードを算出するために使用するパラメータとして、共通ストレージ3から取得した検証用チャレンジデータを検証対象CPU(すなわち、CPU1n)に送信する。
【0036】
CPU1nは、チェックコードの算出指示を受け取ると、CPU1nのメモリ11に格納されているファームウェアのチェックコードを算出する。チェックコードの算出は、ファームウェアの更新時の手順と実質的に同じである。すなわち、CPU1nにおいて、チェックコード算出部12は、検証用チャレンジデータおよびファームウェア格納領域11F内の全データをHMAC関数に与えることによりMAC値を計算する。そして、チェックコード算出部12は、計算結果を、ファームウェアFWnに対する検証用チェックコードとして出力する。この後、CPU1nは、
図7に示すように、HMAC関数の計算結果を表す検証用チェックコードをマスタCPU2に送信する。なお、以下の記載では、CPU1nのファームウェアを検証するために算出された検証用チェックコードを「チェックコードC2」と表記することがある。
【0037】
マスタCPU2は、検証対象CPUから検証用チェックコードを受け取ると、検証対象CPUのファームウェアが不正に更新されてないかを検証する。具体的には、検証部23は、共通ストレージ3からチェックコードC1を取得する。チェックコードC1は、CPU1nのファームウェアが正規に更新されたときに、ファームウェア格納領域11F内の全データに対して計算されたMAC値である。つづいて、検証部23は、共通ストレージ3から取得したチェックコードC1とCPU1nから新たに受け取ったチェックコードC2とを比較する。すなわち、参照用チェックコードと検証用チェックコードとが比較される。そして、チェックコードC1およびチェックコードC2が互いに一致していれば、検証部23は、CPU1nのメモリ11に正規のファームウェアが格納されていると判定する。
【0038】
これに対して、チェックコードC1およびチェックコードC2が互いに一致していないときには、検証部23は、CPU1nのファームウェアが不正に更新された可能性があると判定する。この場合、マスタCPU2は、共通ストレージ3内の個別データ保存領域32nに保存されているファームウェアFWnを更新データ保存領域31にコピーし、CPU1nに対してファームウェア更新処理を実行する。これにより、CPU1nのファームウェアが正規のファームウェアに再更新(すなわち、ロールバック)される。なお、検証対象CPUのファームウェアを再更新する際には、
図2~
図5に示す手順が実行されることが好ましい。この場合、新たな検証用チャレンジデータおよび新たな参照用チェックコードが共通ストレージ3に保存される。
【0039】
このように、本発明の実施形態に係わるプロセッサシステム100においては、検証対象CPUのファームウェアの検証は、検証用チェックコードを算出する処理および算出した検証用チェックコードと参照用チェックコードとを比較する処理により実現される。ここで、チェックコードを算出する処理は、使用する関数にも依存するが、演算リソースの負荷が大きい。例えば、HMAC関数を利用してMAC値を計算する処理の演算量は大きい。ところが、チェックコードを算出する処理は、検証対象CPU自身によって実行される。したがって、ファームウェアの検証に際して、検証対象CPU以外のCPUの演算リソースの使用量は小さい。よって、検証対象CPU以外のCPUは、本来の処理を遅延なく実行できる。
【0040】
なお、不正更新の可能性がある検証対象CPUは、自身の担う機能が遅延するリスクがあるが、そのリスクを検証対象CPU内に限定させることができる。これにより、その対策をシステム設計に組み込むことが可能となる。対策としては、以下の例が挙げられる。
(1)検証対象CPUの処理を他のCPUが肩代わりする。
(2)いずれのCPUにおいても外部と通信した直後の一定時間、一時停止または縮退運転を行うなどのシステム設計(制約)を採用し、機器としての遅延を防止/緩和するよう各CPUに機能を割り振る(処理タイミングの制御やスケジューリング)。
(3)遅延が許されない機能はファームウェア更新の対象外とし、保守時のみ通信可能とするなどのシステム設計を採用する。
【0041】
また、本発明の実施形態では、各CPU1のファームウェア格納領域11Fにおいて、ファームウェアが格納されない領域には疑似データが書き込まれる。すなわち、ファームウェア格納領域11F内に未使用領域が存在しない。このため、検知されないようにファームウェアを不正に書き換えることは困難である。
【0042】
例えば、メモリの未使用領域には、通常、既知の値(0xffまたは0x00など)が書き込まれている。この場合、未使用領域の一部に不正な情報を書き込むと共に、ファームウェアの検証時に上述した既知の値をHMAC関数に与えるコマンドを設定すれば、攻撃者は、ファームウェアに不正な動作を行わせることができる。ところが、本発明の実施形態では、ファームウェア格納領域11F内の空き領域には疑似データが書き込まれており、未使用領域は存在しない。そして、検知されないようにファームウェアを不正に書き換えるためには、攻撃者は、疑似データを再生する必要があるので、上述のような攻撃は困難である。
【0043】
なお、ファームウェア格納領域11Fの空き領域に疑似データが書き込まれている場合であっても、ファームウェア格納領域11F内の全てのデータを取得すれば、攻撃者は、検知されないようにファームウェアを不正に書き換えることは可能である。ただし、本発明の実施形態では、検証用チャレンジデータを利用してチェックコードが算出される。そして、この検証用チャレンジデータは、検証対象CPUからアクセスできない領域に保存されている。したがって、攻撃者は、検証用チャレンジデータを容易に取得することはできず、チェックコードを再現できないので、検知されないようにファームウェアを不正に書き換えることはできない。
【0044】
図8は、ファームウェアを更新する処理の一例を示すフローチャートである。このフローチャートの処理は、例えば、共通ストレージ3内の更新データ保存領域31に新たなファームウェアが保存されたときに、マスタCPU2により実行される。なお、以下の記載では、ファームウェアが更新されるCPU1を「更新対象CPU」と呼ぶことがある。また、ファームウェアの「更新」は、メモリにファームウェアを書き込むことを含むものとする。
【0045】
S1において、マスタCPU2は、更新対象CPUのファームウェアを更新する。S2において、疑似データ書込み部22は、更新対象CPUのファームウェア格納領域11Fの空き領域に疑似データを書き込む。
【0046】
S3において、検証部23は、乱数生成器21を用いて、検証用チャレンジデータを生成する。S4において、検証部23は、更新対象CPUに対して、更新後のファームウェアに対応するチェックコードの算出を指示する。このとき、検証部23は、チェックコードを算出するためのパラメータとして、S3で生成した検証用チャレンジデータを更新対象CPUに送信する。なお、更新対象CPUは、算出指示に応じて、検証用チャレンジデータを利用して更新後のファームウェアに対応する参照用チェックコード(即ち、チェックコードC1)を算出する。S5において、検証部23は、S3で生成した検証用チャレンジデータを、共通ストレージ3内の更新対象CPUに対応する個別データ保存領域に保存する。
【0047】
S6において、マスタCPU2は、更新対象CPUにより算出された参照用チェックコードを取得する。そして、S7において、マスタCPU2は、更新対象CPUにより算出された参照用チェックコードを、共通ストレージ3内の更新対象CPUに対応する個別データ保存領域に保存する。
【0048】
図9は、ファームウェアを検証する処理の一例を示すフローチャートである。このフローチャートの処理は、例えば、プロセッサシステム100の外部からあるCPU1にアクセスがあったときに、マスタCPU2により実行される。なお、共通ストレージ3には、
図8に示す手順により、検証用チャレンジデータおよび正規のファームウェアに対応する参照用チェックコード(即ち、チェックコードC1)が保存されているものとする。
【0049】
S11において、検証部23は、共通ストレージ3から検証用チャレンジデータを取得する。S12において、検証部23は、検証対象CPUに対して、チェックコードの算出を指示する。ここで、S12の処理は、
図8を参照して説明したS4と実質的に同じである。すなわち、検証部23は、チェックコードを算出するためのパラメータとして、S11で取得した検証用チャレンジデータを検証対象CPUに送信する。なお、検証対象CPUは、算出指示を受け取ると、検証用チャレンジデータを利用して、ファームウェア格納領域11Fの全データに対応する検証用チェックコード(即ち、チェックコードC2)を算出する。
【0050】
S13において、検証部23は、共通ストレージ3から、正規のファームウェアに対応する参照用チェックコードを取得する。S14において、検証部23は、検証対象CPUから、検証用チェックコードを取得する。そして、検証部23は、S15において、参照用チェックコードと検証用チェックコードとを比較する。
【0051】
この結果、参照用チェックコードと検証用チェックコードとが互いに同じであれば、検証部23は、検証対象CPUに正規のファームウェアが実装されていると判定する。これに対して、参照用チェックコードと検証用チェックコードとが互いに同じでないときは、検証部23は、検証対象CPUに不正なファームウェアが実装されている可能性があると判定する。この場合、マスタCPU2は、検証対象CPUのファームウェアをロールバックする。
【0052】
<他の実施形態>
図2~
図9に示す実施形態では、検証対象CPUがチェックコードを算出し、マスタCPU2がそのチェックコードを利用して検証対象CPUに実装されているファームウェアを検証する。ところが、
図1に示すシステム構成においては、マスタCPU2に障害が発生すると、プロセッサシステム100全体の動作に影響が及ぶことになる。したがって、この問題を考慮すると、マスタCPU2は、CPU1a~1n間の通信を制御する機能等の基本的な機能のみを提供するように構成されていることが好ましい。そこで、本発明の他の実施形態では、CPU1a~1nのうちのいずれかのCPU1がファームウェアを検証する。ただし、この場合であっても、演算量の大きいチェックコード算出処理は、検証対象CPU自体が行う。
【0053】
他の実施形態においては、CPU1a~1nのうちの2以上のCPUに、
図2~
図7に示す疑似データ書込み部22および検証部23が実装される。以下の記載では、少なくともCPU1aに疑似データ書込み部22および検証部23が実装されるものとする。ただし、乱数生成器21は、マスタCPU2に実装される。
【0054】
図10は、他の実施形態においてファームウェアを更新する手順を示す。この実施例では、CPU1aが、ファームウェアの更新処理を実行する作業CPUとして動作する。そして、CPU1n(すなわち、更新対象CPU)のファームウェアが更新される。
【0055】
更新用ファームウェアとしてファームウェアFWnが更新データ保存領域31に保存されると、マスタCPU2は、更新対象CPUのファームウェア格納領域11Fをクリアする。また、マスタCPU2は、更新対象CPUのファームウェアの更新に係わる権限を作業CPUに付与する。さらに、マスタCPU2は、疑似データとして使用される乱数を生成し、共通ストレージ3の所定の領域に保存する。
【0056】
作業CPUは、更新対象CPUのファームウェア格納領域11Fに、ファームウェアFWnおよび疑似データを書き込む。この後、マスタCPU2は、更新対象CPUを再起動する。
【0057】
マスタCPU2は、検証用チャレンジデータとして使用される乱数を生成する。検証用チャレンジデータは、マスタCPU2により、共通ストレージ3において更新対象CPUに対して設けられている個別データ保存領域に保存される。
【0058】
作業CPUは、共通ストレージ3から検証用チャレンジデータを取得する。そして、作業CPUは、チェックコード算出指示および検証用チャレンジデータを更新対象CPUに送信する。
【0059】
更新対象CPUは、チェックコード算出指示に応じて参照用チェックコード(即ち、チェックコードC1)を算出する。参照用チェックコードは、検証用チャレンジデータおよびファームウェア格納領域11F内の全データに対して算出される。そして、更新対象CPUは、算出した参照用チェックコードをマスタCPU2に送信する。そうすると、マスタCPU2は、共通ストレージ3において更新対象CPUに対して設けられている個別データ保存領域に参照用チェックコードを保存する。
【0060】
図11は、他の実施形態においてファームウェアを検証する手順を示す。なお、
図10に示す手順により、検証対象CPUに対して設けられている個別データ保存領域に、検証用チャレンジデータおよび参照用チェックコードが保存されているものとする。
【0061】
マスタCPU2は、検証対象CPUのファームウェアの検証に係わる権限を作業CPUに付与する。そうすると、作業CPUは、検証対象CPUに対して設けられている個別データ保存領域から検証用チャレンジデータを取得する。そして、作業CPUは、チェックコード算出指示および検証用チャレンジデータを検証対象CPUに送信する。
【0062】
検証対象CPUは、チェックコード算出指示に応じて検証用チェックコード(即ち、チェックコードC2)を算出する。検証用チェックコードは、参照用チェックコードと同様に、検証用チャレンジデータおよびファームウェア格納領域11F内の全データに対して算出される。そして、検証対象CPUは、算出した検証用チェックコードを作業CPUに送信する。
【0063】
作業CPUは、検証対象CPUに対して設けられている個別データ保存領域から参照用チェックコードを取得する。そして、作業CPUは、参照用チェックコードと検証用チェックコードとを比較し、その比較結果をマスタCPU2に報告する。このとき、参照用チェックコードと検証用チェックコードとが互いに同じでなければ、作業CPUは、検証対象CPUのファームウェアをロールバックする。
【0064】
このように、他の実施形態においては、CPU1a~1nのうちの検証対象CPU以外のCPU1が、検証対象CPUに実装されているファームウェアを検証する。ただし、この構成においても、チェックコードの算出は、検証対象CPU自身により実行される。したがって、他の実施形態においても、検証対象CPU以外のCPU1は、本来の処理を遅延なく実行できる。なお、ファームウェア格納領域11Fの空き領域に疑似データを書き込むことによる効果、及び、チェックコードの算出において検証用チャレンジデータを使用することの効果は、
図2~
図9に示す実施形態および
図10~
図11に示す他の実施形態において実質的に同じである。
【符号の説明】
【0065】
1(1a~1n) CPU
2 マスタCPU
3 共通ストレージ
11 メモリ
11F ファームウェア格納領域
12 チェックコード算出部
21 乱数生成器
22 疑似データ書込み部
23 検証部
31 更新データ保存領域
32a~32n 個別データ保存領域
100 プロセッサシステム