(57)【要約】  一実施の形態によれば、ファームウェア書き換え装置（１）は、メモリ（Ｍ１）に格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定手段（１１）と、メモリ（Ｍ１）の記憶領域のうちプログラムが格納されていない空き領域を特定する空き領域特定手段（１２）と、呼出位置特定手段（１１）によって特定された命令を、頻度調整コード（１３１）の呼び出し命令に書き換えるとともに、頻度調整コード（１３１）の呼び出し頻度に応じた頻度で検査コード（１３２）の呼び出しを行う頻度調整コード（１３１）と、頻度調整コード（１３１）からの呼び出しに応じてプログラムのセキュリティチェックを行う検査コード（１３２）と、を空き領域特定手段（１２）によって特定された空き領域に書き込む、プログラム書き換え手段（１４）と、を備える。
2020188700.tif 000002
【特許請求の範囲】
【請求項１】
メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定手段と、
前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定手段と、
前記呼出位置特定手段によって特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定手段によって特定された前記空き領域に書き込む、プログラム書き換え手段と、
を備えた、ファームウェア書き換え装置。
【請求項２】
前記呼出位置特定手段は、前記コントロールフローを変える命令の全てを、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１に記載のファームウェア書き換え装置。
【請求項３】
前記呼出位置特定手段は、前記コントロールフローを変える命令のうち、割り込みハンドラに記載されている命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１に記載のファームウェア書き換え装置。
【請求項４】
前記呼出位置特定手段は、前記コントロールフローを変える命令のうち、メイン関数に含まれる最も大きなループ構造に含まれる命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１に記載のファームウェア書き換え装置。
【請求項５】
前記頻度調整コードは、前記検査コードの呼び出し後、当該頻度調整コードの呼び出し回数が所定回数に達した場合に、再び前記検査コードを呼び出すように設定されている、
請求項１〜４の何れか一項に記載のファームウェア書き換え装置。
【請求項６】
前記頻度調整コードは、前記検査コードの呼び出し後、所定期間以上の間隔を空けて当該頻度調整コードの呼び出しがあった場合に、再び前記検査コードを呼び出すように設定されている、
請求項１〜４の何れか一項に記載のファームウェア書き換え装置。
【請求項７】
前記頻度調整コードは、当該頻度調整コードの呼び出し頻度と、セキュリティチェックの実行時間と、に基づいて決定された頻度で、前記検査コードを呼び出すように構成されている、
請求項１〜４の何れか一項に記載のファームウェア書き換え装置。
【請求項８】
前記コントロールフローを変える命令は、コール命令及びジャンプ命令を含む分岐命令のうち少なくとも一種類以上の命令である、
請求項１〜７の何れか一項に記載のファームウェア書き換え装置。
【請求項９】
前記空き領域は、前記メモリの記憶領域のうち、複数の０が連続して書き込まれた所定の領域、及び、何れのプログラムからもアクセスのない所定の領域、の少なくとも何れかである、
請求項１〜８の何れか一項に記載のファームウェア書き換え装置。
【請求項１０】
メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定ステップと、
前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定ステップと、
前記呼出位置特定ステップにおいて特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定ステップにおいて特定された前記空き領域に書き込む、プログラム書き換えステップと、
を備えた、ファームウェア書き換え方法。
【請求項１１】
前記呼出位置特定ステップでは、前記コントロールフローを変える命令の全てを、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１０に記載のファームウェア書き換え方法。
【請求項１２】
前記呼出位置特定ステップでは、前記コントロールフローを変える命令のうち、割り込みハンドラに記載されている命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１０に記載のファームウェア書き換え方法。
【請求項１３】
前記呼出位置特定ステップでは、前記コントロールフローを変える命令のうち、メイン関数に含まれる最も大きなループ構造に含まれる命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１０に記載のファームウェア書き換え方法。
【請求項１４】
前記頻度調整コードは、前記検査コードの呼び出し後、当該頻度調整コードの呼び出し回数が所定回数に達した場合に、再び前記検査コードを呼び出すように設定されている、
請求項１０〜１３の何れか一項に記載のファームウェア書き換え方法。
【請求項１５】
前記頻度調整コードは、前記検査コードの呼び出し後、所定期間以上の間隔を空けて当該頻度調整コードの呼び出しがあった場合に、再び前記検査コードを呼び出すように設定されている、
請求項１０〜１３の何れか一項に記載のファームウェア書き換え方法。
【請求項１６】
前記頻度調整コードは、当該頻度調整コードの呼び出し頻度と、セキュリティチェックの実行時間と、に基づいて決定された頻度で、前記検査コードを呼び出すように構成されている、
請求項１０〜１３の何れか一項に記載のファームウェア書き換え方法。
【請求項１７】
前記コントロールフローを変える命令は、コール命令及びジャンプ命令を含む分岐命令のうち少なくとも一種類以上の命令である、
請求項１０〜１６の何れか一項に記載のファームウェア書き換え方法。
【請求項１８】
前記空き領域は、前記メモリの記憶領域のうち、複数の０が連続して書き込まれた所定の領域、及び、何れのプログラムからもアクセスのない所定の領域、の少なくとも何れかである、
請求項１０〜１７の何れか一項に記載のファームウェア書き換え方法。
【請求項１９】
メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定処理と、
前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定処理と、
前記呼出位置特定処理において特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定処理において特定された前記空き領域に書き込む、プログラム書き換え処理と、
をコンピュータに実行させるプログラムが記録された非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、ファームウェア書き換え装置、ファームウェア書き換え方法、及び、プログラムが格納された非一時的なコンピュータ可読媒体に関する。
【背景技術】
【０００２】
組み込み機器のＩｏＴ（Ｉｎｔｅｒｎｅｔ  ｏｆ  Ｔｈｉｎｇｓ）化に伴って、ＩｏＴ化された既存の組み込み機器へのセキュリティチェック（改ざん検知及びポリシ違反チェック等）機能の導入が検討されている。しかしながら、既存の組み込み機器では、ソースコードの変更が困難であり、ファームウェア又は実行形式のバイナリデータの変更に限られるため、セキュリティチェック機能の導入が困難であった。【０００３】
例えば、特許文献１には、セキュリティ対策の一環として、ソフトウェアの脆弱性を利用した攻撃を検知した場合にプログラムの実行を停止させるように当該プログラムを変換する変換装置が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第６３３８７９６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１では、攻撃を検知した場合にプログラムの実行を停止させるに過ぎず、攻撃を受けたかどうか分からない状態でも定期的にセキュリティチェックを行う、ということができないという課題があった。【０００６】
本開示の目的は、このような課題を解決するためになされたものである。即ち、ＩｏＴ化された既存の組み込み機器にセキュリティチェック機能を組み込ませることが可能な、ファームウェア書き換え装置、及び、プログラムが格納された非一時的なコンピュータ可読媒体を提供することである。
【課題を解決するための手段】
【０００７】
本開示にかかるファームウェア書き換え装置は、メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定手段と、前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定手段と、前記呼出位置特定手段によって特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定手段によって特定された前記空き領域に書き込む、プログラム書き換え手段と、を備える。【０００８】
また、本開示にかかるファームウェア書き換え方法は、メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定ステップと、前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定ステップと、前記呼出位置特定ステップにおいて特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定ステップにおいて特定された前記空き領域に書き込む、プログラム書き換えステップと、を備える。【０００９】
また、本開示にかかる非一時的なコンピュータ可読媒体は、メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定処理と、前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定処理と、前記呼出位置特定処理において特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定処理において特定された前記空き領域に書き込む、プログラム書き換え処理と、をコンピュータに実行させるプログラムが記録される。
【発明の効果】
【００１０】
本開示によれば、ＩｏＴ化された既存の組み込み機器にセキュリティチェック機能を組み込ませることが可能なファームウェア書き換え装置、ファームウェア書き換え方法、及び、プログラムが格納された非一時的なコンピュータ可読媒体を提供することができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１にかかるファームウェア書き換え装置の構成例を示すブロック図である。
【図２】図１に示すファームウェア書き換え装置の動作の一例を示すフローチャートである。
【図３】図１に示すファームウェア書き換え装置による書き換え前のファームウェアのプログラムの第１例を示す図である。
【図４】図１に示すファームウェア書き換え装置による書き換え後のファームウェアのプログラムの第１例を示す図である。
【図５】図１に示すファームウェア書き換え装置による書き換え前のファームウェアのプログラムの第２例を示す図である。
【図６】図１に示すファームウェア書き換え装置による書き換え後のファームウェアのプログラムの第２例を示す図である。
【図７】図１に示すファームウェア書き換え装置による書き換え前のファームウェアのプログラムの第３例を示す図である。
【図８】図１に示すファームウェア書き換え装置による書き換え後のファームウェアのプログラムの第３例を示す図である。
【図９】図１に示すファームウェア書き換え装置による、図７に示す書き換え前のファームウェアのプログラムを、図８に示す書き換え後のファームのプログラムに書き換える動作を示すフローチャートである。
【図１０】実施の形態２にかかるファームウェア書き換え装置による書き換え前のファームウェアのプログラムの一例を示す図である。
【図１１】実施の形態２にかかるファームウェア書き換え装置による書き換え後のファームウェアのプログラムの一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照しつつ、実施の形態について説明する。なお、図面は簡略的なものであるから、この図面の記載を根拠として実施の形態の技術的範囲を狭く解釈してはならない。また、同一の要素には、同一の符号を付し、重複する説明は省略する。
【００１３】
以下の実施の形態においては便宜上その必要があるときは、複数のセクションまたは実施の形態に分割して説明する。ただし、特に明示した場合を除き、それらはお互いに無関係なものではなく、一方は他方の一部または全部の変形例、応用例、詳細説明、補足説明等の関係にある。また、以下の実施の形態において、要素の数等（個数、数値、量、範囲等を含む）に言及する場合、特に明示した場合および原理的に明らかに特定の数に限定される場合等を除き、その特定の数に限定されるものではなく、特定の数以上でも以下でもよい。
【００１４】
さらに、以下の実施の形態において、その構成要素（動作ステップ等も含む）は、特に明示した場合および原理的に明らかに必須であると考えられる場合等を除き、必ずしも必須のものではない。同様に、以下の実施の形態において、構成要素等の形状、位置関係等に言及するときは、特に明示した場合および原理的に明らかにそうでないと考えられる場合等を除き、実質的にその形状等に近似または類似するもの等を含むものとする。このことは、上記数等（個数、数値、量、範囲等を含む）についても同様である。
【００１５】
＜実施の形態１＞
図１は、実施の形態１にかかるファームウェア書き換え装置１の構成例を示すブロック図である。また、図２は、ファームウェア書き換え装置１の動作の一例を示すフローチャートである。ファームウェア書き換え装置１は、例えば、ＩｏＴ化された既存の組み込み機器のファームウェアを、定期的にセキュリティチェックを行う機能を持つファームウェアに書き換える。それにより、ファームウェア書き換え装置１は、ＩｏＴ化された既存の組み込み機器に定期的にセキュリティチェックを行う機能を組み込ませることができるため、既存の組み込み機器の信頼性を向上させることができる。以下、具体的に説明する。
【００１６】
図１に示すように、ファームウェア書き換え装置１は、呼出位置特定部（呼出位置特定手段）１１と、空き領域特定部（空き領域特定手段）１２と、コード格納部（コード格納手段）１３と、プログラム書き換え部（プログラム書き換え手段）１４と、を備える。
【００１７】
ファームウェア書き換え装置１には、例えばＩｏＴ化された既存の組み込み機器のメモリＭ１に書き込まれている書き換え前のファームウェア５１ａが読み込まれる（図２のステップＳ１０１）。メモリＭ１は、例えばフラッシュＲＯＭなどである。
【００１８】
呼出位置特定部１１は、書き換え前のファームウェア５１ａのプログラム中に記載された命令のうちコントロールフローを変える命令を、後述する頻度調整コード１３１の呼び出し命令への書き換え対象として特定する（図２のステップＳ１０２）。
【００１９】
なお、コントロールフローを変える命令とは、例えば、ｘ８６アーキテクチャにおけるＣＡＬＬ命令（コール命令）及びＪＭＰ命令（ジャンプ命令）を含む分岐命令のことである。或いは、コントロールフローを変える命令は、ＡＲＭアーキテクチャにおけるＢＬ命令及びＢ命令を含む分岐命令のことである。ＡＲＭアーキテクチャにおけるＢＬ命令及びＢ命令は、それぞれ、ｘ８６アーキテクチャにおけるＣＡＬＬ命令及びＪＭＰ命令に対応する。
【００２０】
ここで、呼出位置特定部１１は、コントロールフローを変える命令の全てを、頻度調整コード１３１の呼び出し命令への書き換え対象として特定しても良い。或いは、呼出位置特定部１１は、コントロールフローを変える命令の一部（例えば、特定の種類の分岐命令）を、頻度調整コード１３１の呼び出し命令への書き換え対象として特定しても良い。
【００２１】
空き領域特定部１２は、書き換え前のファームウェア５１ａ中の空き領域（即ち、メモリＭ１の記憶領域のうちプログラムが格納されていない空き領域）を特定する（図２のステップＳ１０３）。なお、空き領域とは、書き換え前のファームウェア５１ａの動作に影響を与えないメモリＭ１の記憶領域である。空き領域特定部１２は、例えば、メモリＭ１の記憶領域のうち、複数の０が連続して書き込まれた所定の領域を空き領域とみなす。或いは、空き領域特定部１２は、メモリＭ１の記憶領域のうち、何れのプログラムからもアクセスの無い所定の領域とみなす。
【００２２】
プログラム書き換え部１４は、呼出位置特定部１１によって特定された命令を、頻度調整コード１３１の呼び出し命令に書き換える。また、プログラム書き換え部１４は、頻度調整コード１３１の呼び出し命令に対応する頻度調整コード１３１及び検査コード１３２を、空き領域特定部１２によって特定された空き領域に書き込む（図２のステップＳ１０４）。
【００２３】
なお、頻度調整コード１３１は、当該頻度調整コード１３１の呼び出し頻度（周期）に応じた頻度（周期）で検査コード１３２の呼び出しを行うコードである。また、検査コード１３２は、頻度調整コード１３１からの呼び出しに応じてプログラムのセキュリティチェックを行うコードである。頻度調整コード１３１及び検査コード１３２は、何れもコード格納部１３に格納されている。
【００２４】
例えば、頻度調整コード１３１は、検査コード１３２の呼び出し後、頻度調整コード１３１の呼び出し回数が所定回数Ｎに達した場合に、再び検査コード１３２を呼び出すように設定されている。或いは、頻度調整コード１３１は、検査コード１３２の呼び出し後、所定期間Ｔ以上の間隔を空けて頻度調整コード１３１の呼び出しがあった場合に、再び検査コード１３２を呼び出すように設定されている。
【００２５】
ここで、プログラム書き換え部１４は、セキュリティチェックの頻度が所望する頻度と異なっている場合、頻度調整コード１３１の設定値を編集することによって、セキュリティチェックの頻度の調整を行う（ステップＳ１０５）。
【００２６】
例えば、プログラム書き換え部１４は、頻度調整コード１３１の呼び出し頻度が高いためにセキュリティチェックの頻度が所望する頻度よりも高くなっている場合、例えば頻度調整コード１３１に設定されている所定回数Ｎ又は所定期間Ｔの値を大きくする。それにより、セキュリティチェックの頻度は低くなって所望の頻度に近づく。換言すると、セキュリティチェックの周期は長くなって所望の周期に近づく。或いは、プログラム書き換え部１４は、頻度調整コード１３１の呼び出し頻度が低いためにセキュリティチェックの頻度が所望する頻度よりも低くなっている場合、例えば頻度調整コード１３１に設定されている所定回数Ｎ又は所定期間Ｔの値を小さくする。それにより、セキュリティチェックの頻度は高くなって所望の頻度に近づく。換言すると、セキュリティチェックの周期は短くなって所望の周期に近づく。
【００２７】
なお、プログラム書き換え部１４は、頻度調整コード１３１に設定されている所定回数Ｎや所定期間Ｔを、頻度調整コード１３１の呼び出し頻度だけでなく、セキュリティチェックの実行時間に基づいて決定してもよい。例えば、プログラム書き換え部１４は、セキュリティチェックの実行時間が長すぎると判断した場合、所定回数Ｎ又は所定期間Ｔの値を大きくする。それにより、セキュリティチェックの頻度が低減されるため、セキュリティチェックによる動作遅延は抑制される。
【００２８】
本実施の形態では、空き領域特定部１２によって特定された空き領域に頻度調整コード１３１及び検査コード１３２が書き込まれた後、頻度調整コード１３１の設定値（例えば所定回数Ｎ又は所定期間Ｔ）の編集が行われる場合を例に説明したがこれに限られない。実際にプログラムを実行することにより得られる情報（例えば、頻度調整コード１３１の呼び出し頻度の情報）が不要であれば、空き領域に頻度調整コード１３１及び検査コード１３２が書き込まれる前に、頻度調整コード１３１の設定値の編集が行われてもよい。
【００２９】
その後、ファームウェア書き換え装置１は、書き換え後のファームウェア５１ｂを出力する（ステップＳ１０６）。
【００３０】
このように、本実施の形態にかかるファームウェア書き換え装置１は、例えば、ＩｏＴ化された既存の組み込み機器のファームウェアを、定期的にセキュリティチェックを行う機能を持つファームウェアに書き換える。それにより、ファームウェア書き換え装置１は、ＩｏＴ化された既存の組み込み機器に定期的にセキュリティチェックを行う機能を組み込ませることができるため、当該既存の組み込み機器の信頼性を向上させることができる。
【００３１】
＜ファームウェアの書き換え事例＞
続いて、ファームウェアの書き換え事例をいくつか説明する。なお、以下に説明する事例は、ＡＲＭアーキテクチャを想定した事例である。また、以下に説明する事例では、説明の簡略化のため、頻度調整に関する内容については省略されている。
【００３２】
ここで、ＡＲＭアーキテクチャにおける“ＢＬ  ＜ｆｕｎｃ＞”命令及び“ＢＸ  ＬＲ”命令は、それぞれ、ｘ８６アーキテクチャにおける“ＣＡＬＬ  ＜ｆｕｎｃ＞”命令及び“ＲＥＴ”命令に対応する。但し、“ＢＬ  ＜ｆｕｎｃ＞”命令の＜ｆｕｎｃ＞は、ｆｕｎｃ関数の開始アドレス値を示す。また、“ＢＬ  ＜ｃｈｅｃｋ＞”命令の＜ｃｈｅｃｋ＞は、セキュリティチェック（頻度調整含む）を行うコードが記載されたｃｈｅｃｋ関数の開始アドレス値を示す。
【００３３】
≪ファームウェアの書き換え事例（その１）≫
図３及び図４は、それぞれ、ファームウェア書き換え装置１による書き換え前後のファームウェアのプログラムの第１例を示す図である。本例では、ファームウェアのプログラムにおいて、ｍａｉｎ関数と、１個のｆｕｎｃ関数と、が示されている。
【００３４】
まず、図３に示す書き換え前のファームウェアのプログラムでは、ｍａｉｎ関数において、“ＢＬ  ＜ｆｕｎｃ＞”命令が実行されることによりｆｕｎｃ関数が呼び出される。このとき、“ＢＸ  ＬＲ”命令のＬＲ（リンクレジスタ）には、“ＢＬ  ＜ｆｕｎｃ＞”命令のアドレス値の次のアドレス値が戻り先アドレスとして格納される。そのため、ｆｕｎｃ関数の最後に“ＢＸ  ＬＲ”命令が実行されることにより、ｍａｉｎ関数の呼び出し元（ＬＲに格納された戻り先アドレス）に処理が遷移する。
【００３５】
それに対し、図４に示す書き換え後のファームウェアのプログラムでは、分岐命令である“ＢＬ  ＜ｆｕｎｃ＞”命令が“ＢＬ  ＜ｃｈｅｃｋ＞”に書き換えられている。そのため、“ＢＬ  ＜ｃｈｅｃｋ＞”命令が実行されることによりｃｈｅｃｋ関数が呼び出される。なお、ｃｈｅｃｋ関数では、ＰＣ（プログラムカウンタ）にＰＵＳＨされたＬＲ（リンクレジスタ）がＰＯＰされている。それにより、ｃｈｅｃｋ関数では、セキュリティチェックの実行後、ｆｕｎｃ関数を経由した後、ｍａｉｎ関数の呼び出し元に処理が遷移する。
【００３６】
≪ファームウェアの書き換え事例（その２）≫
図５及び図６は、それぞれ、ファームウェア書き換え装置１による書き換え前後のファームウェアのプログラムの第２例を示す図である。本例では、ファームウェアのプログラムにおいて、ｍａｉｎ関数と、ｎ（ｎは２以上の整数；本例ではｎ＝２）個のｆｕｎｃ＿１〜ｆｕｎｃ＿ｎ関数と、が示されている。
【００３７】
まず、図５に示す書き換え前のファームウェアのプログラムでは、ｍａｉｎ関数において、“ＢＬ  ＜ｆｕｎｃ＿１＞”命令が実行されることによりｆｕｎｃ＿１関数が呼び出される。このとき、“ＢＸ  ＬＲ”命令のＬＲ（リンクレジスタ）には、“ＢＬ  ＜ｆｕｎｃ＿１＞”命令のアドレス値の次のアドレス値が戻り先アドレスとして格納される。そのため、ｆｕｎｃ＿１関数の最後に“ＢＸ  ＬＲ”命令が実行されることにより、ｍａｉｎ関数の呼び出し元（ＬＲに格納された戻り先アドレス）に処理が遷移する。同様に、“ＢＬ  ＜ｆｕｎｃ＿２＞”命令が実行されることによりｆｕｎｃ＿２関数が呼び出される。このとき、“ＢＸ  ＬＲ”命令のＬＲ（リンクレジスタ）には、“ＢＬ  ＜ｆｕｎｃ＿２＞”命令のアドレス値の次のアドレス値が戻り先アドレスとして格納される。そのため、ｆｕｎｃ＿２関数の最後に“ＢＸ  ＬＲ”命令が実行されることにより、ｍａｉｎ関数の呼び出し元（ＬＲに格納された戻り先アドレス）に処理が遷移する。
【００３８】
それに対し、図６に示す書き換え後のファームウェアのプログラムでは、分岐命令である“ＢＬ  ＜ｆｕｎｃ＿１＞”命令が“ＢＬ  ＜ｃｈｅｃｋ＿１＞”に書き換えられ、“ＢＬ  ＜ｆｕｎｃ＿２＞”命令が“ＢＬ  ＜ｃｈｅｃｋ＿２＞”に書き換えられている。そのため、“ＢＬ  ＜ｃｈｅｃｋ＿１＞”命令が実行されることによりｃｈｅｃｋ＿１関数が呼び出され、“ＢＬ  ＜ｃｈｅｃｋ＿２＞”命令が実行されることによりｃｈｅｃｋ＿２関数が呼び出される。ｃｈｅｃｋ＿１，ｃｈｅｃｋ＿２関数については、何れも、基本的にはｃｈｅｃｋ関数の場合と同様であるため、その説明を省略する。
【００３９】
このように、本例では、複数の分岐命令“ＢＬ  ＜ｆｕｎｃ＿１＞”，“ＢＬ  ＜ｆｕｎｃ＿２＞”がそれぞれ“ＢＬ  ＜ｃｈｅｃｋ＿１＞”，“ＢＬ  ＜ｃｈｅｃｋ＿２＞”に書き換えられている。そのため、本例では、分岐命令の数に応じた数のセキュリティチェック用の関数ｃｈｅｃｋ＿１，ｃｈｅｃｋ＿２が用いられている。
【００４０】
≪ファームウェアの書き換え事例（その３）≫
図７及び図８は、それぞれ、ファームウェア書き換え装置１による書き換え前後のファームウェアのプログラムの第３例を示す図である。図９は、ファームウェア書き換え装置１による、図７に示す書き換え前のファームウェアのプログラムを、図８に示す書き換え後のファームのプログラムに書き換える動作を示すフローチャートである。
【００４１】
図７に示す書き換え前のファームウェアのプログラムについては、図５に示す書き換え前のファームウェアのプログラムと同じであるため、その説明を省略する。
【００４２】
それに対し、図８に示す書き換え後のファームウェアのプログラムでは、分岐命令である“ＢＬ  ＜ｆｕｎｃ＿１＞”，“ＢＬ  ＜ｆｕｎｃ＿２＞”命令が何れも“ＢＬ  ＜ｃｈｅｃｋ＞”に書き換えられている。さらに、本例では、プログラム中に存在する“ＢＬ  ＜ｃｈｅｃｋ＞”命令の戻り先アドレス（即ち、“ＢＬ  ＜ｃｈｅｃｋ＞”命令の実行によってＬＲに格納される値）と、目的関数の開始アドレス値と、の組み合わせがテーブル（＜ｔａｂｌｅ＞）に登録されている。
【００４３】
例えば、アドレス値０ｘ１０１０の“ＢＬ  ＜ｃｈｅｃｋ＞”命令が実行されることによりｃｈｅｃｋ関数が呼び出される。このとき、ＬＲ（リンクレジスタ）には、“ＢＬ  ＜ｆｕｎｃ＞”命令のアドレス値０ｘ１０１０の次のアドレス値０ｘ１０１０＋４が戻り先アドレスとして格納される（ステップＳ２０１）。その後、ｃｈｅｃｋ関数では、セキュリティチェックが実行される（ステップＳ２０２）。セキュリティチェックの実行後、テーブルに登録された組み合わせの中から、ＬＲに格納されたアドレス値０ｘ１０１０＋４を含む組み合わせが探索される（ステップＳ２０３）。該当する組み合わせがある場合（ステップＳ２０４のＹＥＳ）、ＬＲに格納されたアドレス値０ｘ１０１０＋４に対応する目的関数であるｆｕｎｃ＿１関数の開始アドレス値に処理が遷移する。つまり、ｆｕｎｃ＿１関数の呼び出しが行われる（ステップＳ２０５）。なお、該当する組み合わせが無い場合（ステップＳ２０４のＮＯ）、エラーが出力される（ステップＳ２０７）。ｆｕｎｃ＿１関数が実行された後、ｍａｉｎ関数の呼び出し元（ＬＲに格納されたアドレス値０ｘ１０１０＋４）に処理が遷移する（ステップＳ２０６）。
【００４４】
このように、本例では、複数の分岐命令“ＢＬ  ＜ｆｕｎｃ＿１＞”，“ＢＬ  ＜ｆｕｎｃ＿２＞”が存在する場合でも、テーブルを用いて管理することにより、セキュリティチェック用の関数ｃｈｅｃｋが一個に抑えられる。
【００４５】
＜実施の形態２＞
実施の形態２にかかるファームウェア書き換え装置２について説明する。本実施の形態にかかるファームウェア書き換え装置２では、呼出位置特定部１１が、コントロールフローを変える命令のうち所定の命令を、頻度調整コード１３１の呼び出し命令への書き換え対象として特定する。この場合に、所定の命令は、例えば、コントロールフローを変える命令のうち、呼び出し頻度が少なく、適切にセキュリティチェックが行われる（つまり、一定時間が経過したり、特定機能が実行されたりする場合に呼び出される可能性が高い）と予想される１つ以上の命令の組み合わせである。
【００４６】
例えば、呼出位置特定部１１は、コントロールフローを変える命令（ＣＡＬＬ命令及びＪＭＰ命令を含む分岐命令など）のうち、ベクタテーブルに記載された各割り込みハンドラの中に記載されている命令の一部又は全部を、頻度調整コードの呼び出し命令への書き換え対象として特定する。なお、上記した命令の一部又は全部とは、例えば、全ての命令であっても良いし、最初に実行される命令のみであっても良いし、最初と最後に実行される命令のみであっても良いが、これらには限られない。
【００４７】
或いは、呼出位置特定部１１は、コントロールフローを変える命令のうち、メイン関数に含まれる最も大きなループ構造に含まれる命令を、頻度調整コード１３１の呼び出し命令への書き換え対象として特定する。具体的には、呼出位置特定部１１は、ｍａｉｎ関数のコントロールフロー（プログラム実行の流れ）を解析し、その解析結果の中から最も大きなループ構造を抽出する。そして、呼出位置特定部１１は、コントロールフローを変える命令のうち、最も大きなループ構造に含まれる命令の一部又は全部を、頻度調整コード１３１の呼び出し命令への書き換え対象として特定する。
【００４８】
ファームウェア書き換え装置２のその他の構成及び動作については、ファームウェア書き換え装置１の場合と同様であるため、その説明を省略する。
【００４９】
このように、本実施の形態にかかるファームウェア書き換え装置２では、呼出位置特定部１１が、コントロールフローを変える命令のうち所定の命令を、頻度調整コード１３１の呼び出し命令への書き換え対象として特定する。それにより、ファームウェア書き換え装置２は、頻度調整コード１３１の呼び出し頻度を低減させることができるため、頻度調整コード１３１の実行にかかる負荷を軽減させることができる。
【００５０】
例えば、頻度調整コード１３１の呼び出し頻度が高すぎる場合、頻度調整コード１３１は、例えば１０００回の頻度調整コード１３１の呼び出しに対して１回の検査コード１３２の呼び出しを行うように設定される必要があるとする。この場合、頻度調整コード１３１の実行にかかる負荷は大きくなってしまう。それに対し、頻度調整コード１３１の呼び出し頻度が低減された場合、頻度調整コード１３１は、例えば１０回の頻度調整コード１３１の呼び出しに対して１回の検査コード１３２の呼び出しを行うように設定されていれば良い。この場合、頻度調整コード１３１の実行にかかる負荷は軽減される。
【００５１】
≪ファームウェアの書き換え事例≫
図１０及び図１１は、それぞれ、実施の形態２にかかるファームウェア書き換え装置による書き換え前後のファームウェアのプログラムの一例を示す図である。なお、以下に説明する事例は、ＡＲＭアーキテクチャを想定した事例である。また、以下に説明する事例では、説明の簡略化のため、頻度調整に関する内容については省略されている。
【００５２】
本例では、ファームウェアのプログラムにおいて、割り込みハンドラの関数であるＨａｎｄｌｅｒＡ関数と、１個のｆｕｎｃ関数と、が示されている。
【００５３】
まず、図１０に示す書き換え前のファームウェアのプログラムでは、ＨａｎｄｌｅｒＡ関数において、“ＢＬ  ＜ｆｕｎｃ＞”命令が実行されることによりｆｕｎｃ関数が呼び出される。このとき、“ＢＸ  ＬＲ”命令のＬＲ（リンクレジスタ）には、“ＢＬ  ＜ｆｕｎｃ＞”命令のアドレス値の次のアドレス値が戻り先アドレスとして格納される。そのため、ｆｕｎｃ関数の最後に“ＢＸ  ＬＲ”命令が実行されることにより、ＨａｎｄｌｅｒＡ関数の呼び出し元（ＬＲに格納された戻り先アドレス）に処理が遷移する。
【００５４】
それに対し、図１１に示す書き換え後のファームウェアのプログラムでは、ＨａｎｄｌｅｒＡ関数の中に存在する分岐命令である“ＢＬ  ＜ｆｕｎｃ＞”命令が“ＢＬ  ＜ｃｈｅｃｋ＞”に書き換えられている。そのため、“ＢＬ  ＜ｃｈｅｃｋ＞”命令が実行されることによりｃｈｅｃｋ関数が呼び出される。なお、ｃｈｅｃｋ関数では、ＰＣ（プログラムカウンタ）にＰＵＳＨされたＬＲ（リンクレジスタ）がＰＯＰされている。それにより、ｃｈｅｃｋ関数では、セキュリティチェックの実行後、ｆｕｎｃ関数を経由した後、ＨａｎｄｌｅｒＡ関数の呼び出し元に処理が遷移する。
【００５５】
以上、図面を参照して、本開示の実施の形態について詳しく説明してきたが、具体的な構成は上述のものに限られることはなく、本開示の要旨を逸脱しない範囲内において様々な設計変更等が可能である。たとえば、ファームウェア書き換え装置の動作を実現する機能を、ネットワークで接続された複数の装置で構成しかつ動作するようにしてもよい。
【００５６】
上述の実施の形態では、本開示をハードウェアの構成として説明したが、本開示は、これに限定されるものではない。本開示は、ファームウェア書き換え装置の全部又は一部の処理を、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）にコンピュータプログラムを実行させることにより実現することも可能である。
【００５７】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体は、例えば、磁気記録媒体、光磁気記録媒体、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリを含む。磁気記録媒体は、例えば、フレキシブルディスク、磁気テープ、ハードディスクドライブなどである。光磁気記録媒体は、例えば光り磁気ディスクなどである。半導体メモリは、例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などである。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００５８】
以上、実施の形態を参照して本願発明を説明したが、本願発明は上記によって限定されるものではない。本願発明の構成や詳細には、発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【００５９】
１  ファームウェア書き換え装置
２  ファームウェア書き換え装置
１１  呼出位置特定部
１２  空き領域特定部
１３  コード格納部
１４  プログラム書き換え部
１３１  頻度調整コード
１３２  検査コード
５１ａ  書き換え前のファームウェア
５１ｂ  書き換え後のファームウェア
Ｍ１  メモリ
【図１】
2020188700.tif 000003
【図２】
2020188700.tif 000004
【図３】
2020188700.tif 000005
【図４】
2020188700.tif 000006
【図５】
2020188700.tif 000007
【図６】
2020188700.tif 000008
【図７】
2020188700.tif 000009
【図８】
2020188700.tif 000010
【図９】
2020188700.tif 000011
【図１０】
2020188700.tif 000012
【図１１】
2020188700.tif 000013
【手続補正書】
【提出日】令和3年8月19日(2021.8.19)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定手段と、
前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定手段と、
前記呼出位置特定手段によって特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定手段によって特定された前記空き領域に書き込む、プログラム書き換え手段と、
を備えた、ファームウェア書き換え装置。
【請求項２】
前記呼出位置特定手段は、前記コントロールフローを変える命令の全てを、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１に記載のファームウェア書き換え装置。
【請求項３】
前記呼出位置特定手段は、前記コントロールフローを変える命令のうち、割り込みハンドラに記載されている命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１に記載のファームウェア書き換え装置。
【請求項４】
前記呼出位置特定手段は、前記コントロールフローを変える命令のうち、メイン関数に含まれる最も大きなループ構造に含まれる命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１に記載のファームウェア書き換え装置。
【請求項５】
前記頻度調整コードは、前記検査コードの呼び出し後、当該頻度調整コードの呼び出し回数が所定回数に達した場合に、再び前記検査コードを呼び出すように設定されている、
請求項１〜４の何れか一項に記載のファームウェア書き換え装置。
【請求項６】
前記頻度調整コードは、前記検査コードの呼び出し後、所定期間以上の間隔を空けて当該頻度調整コードの呼び出しがあった場合に、再び前記検査コードを呼び出すように設定されている、
請求項１〜４の何れか一項に記載のファームウェア書き換え装置。
【請求項７】
前記頻度調整コードは、当該頻度調整コードの呼び出し頻度と、セキュリティチェックの実行時間と、に基づいて決定された頻度で、前記検査コードを呼び出すように構成されている、
請求項１〜４の何れか一項に記載のファームウェア書き換え装置。
【請求項８】
前記コントロールフローを変える命令は、コール命令及びジャンプ命令を含む分岐命令のうち少なくとも一種類以上の命令である、
請求項１〜７の何れか一項に記載のファームウェア書き換え装置。
【請求項９】
前記空き領域は、前記メモリの記憶領域のうち、複数の０が連続して書き込まれた所定の領域、及び、何れのプログラムからもアクセスのない所定の領域、の少なくとも何れかである、
請求項１〜８の何れか一項に記載のファームウェア書き換え装置。
【請求項１０】
メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定ステップと、
前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定ステップと、
前記呼出位置特定ステップにおいて特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定ステップにおいて特定された前記空き領域に書き込む、プログラム書き換えステップと、
を備えた、ファームウェア書き換え方法。
【請求項１１】
前記呼出位置特定ステップでは、前記コントロールフローを変える命令の全てを、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１０に記載のファームウェア書き換え方法。
【請求項１２】
前記呼出位置特定ステップでは、前記コントロールフローを変える命令のうち、割り込みハンドラに記載されている命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１０に記載のファームウェア書き換え方法。
【請求項１３】
前記呼出位置特定ステップでは、前記コントロールフローを変える命令のうち、メイン関数に含まれる最も大きなループ構造に含まれる命令の一部又は全部を、前記頻度調整コードの呼び出し命令への書き換え対象として特定する、
請求項１０に記載のファームウェア書き換え方法。
【請求項１４】
前記頻度調整コードは、前記検査コードの呼び出し後、当該頻度調整コードの呼び出し回数が所定回数に達した場合に、再び前記検査コードを呼び出すように設定されている、
請求項１０〜１３の何れか一項に記載のファームウェア書き換え方法。
【請求項１５】
前記頻度調整コードは、前記検査コードの呼び出し後、所定期間以上の間隔を空けて当該頻度調整コードの呼び出しがあった場合に、再び前記検査コードを呼び出すように設定されている、
請求項１０〜１３の何れか一項に記載のファームウェア書き換え方法。
【請求項１６】
前記頻度調整コードは、当該頻度調整コードの呼び出し頻度と、セキュリティチェックの実行時間と、に基づいて決定された頻度で、前記検査コードを呼び出すように構成されている、
請求項１０〜１３の何れか一項に記載のファームウェア書き換え方法。
【請求項１７】
前記コントロールフローを変える命令は、コール命令及びジャンプ命令を含む分岐命令のうち少なくとも一種類以上の命令である、
請求項１０〜１６の何れか一項に記載のファームウェア書き換え方法。
【請求項１８】
前記空き領域は、前記メモリの記憶領域のうち、複数の０が連続して書き込まれた所定の領域、及び、何れのプログラムからもアクセスのない所定の領域、の少なくとも何れかである、
請求項１０〜１７の何れか一項に記載のファームウェア書き換え方法。
【請求項１９】
メモリに格納されたファームウェアのプログラム中に記載された命令のうちコントロールフローを変える命令を特定する呼出位置特定処理と、
前記メモリの記憶領域のうち前記プログラムが格納されていない空き領域を特定する空き領域特定処理と、
前記呼出位置特定処理において特定された前記命令を、頻度調整コードの呼び出し命令に書き換えるとともに、前記頻度調整コードの呼び出し頻度に応じた頻度で検査コードの呼び出しを行う前記頻度調整コードと、前記頻度調整コードからの呼び出しに応じて前記プログラムのセキュリティチェックを行う前記検査コードと、を前記空き領域特定処理において特定された前記空き領域に書き込む、プログラム書き換え処理と、
をコンピュータに実行させる制御プログラム。
【国際調査報告】
2020188700.tif 000014
2020188700.tif 000015
2020188700.tif 000016
2020188700.tif 000017