(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6054908
(24)【登録日】2016年12月9日
(45)【発行日】2016年12月27日
(54)【発明の名称】変数セットを修復する方法、コンピュータ・プログラムおよびコンピュータ
(51)【国際特許分類】
G06F 9/445 20060101AFI20161219BHJP
【FI】
G06F9/06 610K
【請求項の数】17
【全頁数】18
(21)【出願番号】特願2014-106076(P2014-106076)
(22)【出願日】2014年5月22日
(65)【公開番号】特開2015-222474(P2015-222474A)
(43)【公開日】2015年12月10日
【審査請求日】2015年1月19日
(73)【特許権者】
【識別番号】505205731
【氏名又は名称】レノボ・シンガポール・プライベート・リミテッド
(74)【代理人】
【識別番号】100106699
【弁理士】
【氏名又は名称】渡部 弘道
(74)【代理人】
【識別番号】100132595
【弁理士】
【氏名又は名称】袴田 眞志
(72)【発明者】
【氏名】萩原 幹雄
(72)【発明者】
【氏名】笠松 栄太郎
【審査官】
石川 亮
(56)【参考文献】
【文献】
米国特許出願公開第2005/0039081(US,A1)
【文献】
特開2013−140536(JP,A)
【文献】
特開2002−014818(JP,A)
【文献】
特開2009−015818(JP,A)
【文献】
特開2000−235483(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/445
(57)【特許請求の範囲】
【請求項1】
電源起動後に最初に実行されるシステム・ファームウェアが参照する変数セットをコンピュータが修復する方法であって、
前記システム・ファームウェアの参照領域に変数セットを書き込むステップと、
前記コンピュータが正常にブートしたときに前記変数セットを所定の領域に退避するステップと、
前回のブートの開始後に設定した検出フラグをオペレーティング・システムのロードを開始する直前に解除し、今回のブートで前記検出フラグを確認して前記参照領域の変数セットが改変されたことを前記コンピュータが検出するステップと、
前記検出に応答して前記コンピュータが前記退避した変数セットで前記参照領域の変数セットを置換するステップと
を有する方法。
【請求項2】
前記検出するステップが、前記オペレーティング・システムのロードを開始する前に前記ブートが停止したことを検出するステップを含む請求項1に記載の方法。
【請求項3】
前記検出するステップを、前記システム・ファームウェアが提供するセット・アップ画面を表示できる状態まで前記今回のブートが進行する前に実行する請求項1に記載の方法。
【請求項4】
前記検出フラグの確認を、前記システム・ファームウェアが前記検出フラグを確認するために必要なデバイスの初期化が終了した直後に実行する請求項1に記載の方法。
【請求項5】
前記検出フラグの確認を、前記システム・ファームウェアが前記参照領域に書き込んだ変数セットを参照する前に実行する請求項1に記載の方法。
【請求項6】
前記今回のブートを開始してから前記検出フラグを確認するまで所定の値でデバイスを初期化し、前記検出フラグを確認してから前記変数セットを参照して再度前記デバイスを初期化するステップを有する請求項1に記載の方法。
【請求項7】
前記今回のブートが、
前記検出フラグの確認の直後に前記検出フラグを設定するステップを有する請求項1に記載の方法。
【請求項8】
前記退避するステップを、前記システム・ファームウェアのセット・アップ画面を通じて実行する請求項1に記載の方法。
【請求項9】
前記退避するステップを、各ブートにおいて前記オペレーティング・システムのロードを開始する直前に実行する請求項1に記載の方法。
【請求項10】
前記退避するステップが、前記参照領域に書き込まれたすべての変数セットを退避する請求項1に記載の方法。
【請求項11】
電源起動後に最初に実行されるシステム・ファームウェアが参照する変数セットをコンピュータが修復する方法であって、
前記システム・ファームウェアを格納するファームウェアROMに設定された参照領域に変数セットを書き込むステップと、
前記コンピュータが正常にブートしたときに前記変数セットを前記ファームウェアROMとは異なる不揮発性メモリに退避するステップと、
前記コンピュータのブート中に前記参照領域の変数セットが改変されたことを前記コンピュータが検出するステップと、
前記検出に応答して前記ファームウェアROMとは異なる不揮発性メモリに格納された修復コードが前記コンピュータを前記退避した変数セットで前記参照領域の変数セットを置換するように機能させるステップと
を有する方法。
【請求項12】
前記修復コードのダイジェストを計算するステップと、
前記ダイジェストを前記コンピュータが保有する暗号鍵で暗号化するステップとを有し、
前記置換するように機能させるステップが前記ダイジェストを使って前記修復コードの同一性を検証するステップを含む請求項11に記載の方法。
【請求項13】
前記退避するステップが、
前記退避する変数セットのダイジェストを計算するステップと、
前記ダイジェストを前記コンピュータが保有する暗号鍵で暗号化するステップとを含み、
前記置換するように機能させるステップが前記ダイジェストを使って前記変数セットが前記コンピュータから抽出されたことを検証するステップを含む請求項11に記載の方法。
【請求項14】
前記システム・ファームウェアがUEFIファームウェアである請求項1から請求項13のいずれかに記載の方法。
【請求項15】
コンピュータがブートの失敗から復旧する方法であって、
電源起動後に最初に実行されるシステム・ファームウェアのブートが成功したときに参照領域に書き込まれた変数セットを所定の領域に退避するステップと、
前記コンピュータのブートを開始するステップと、
前回のブートの開始後に設定した検出フラグをオペレーティング・システムのロードを開始する直前に解除し、今回のブートで前記検出フラグを確認して前記前回のブートが停止したことを検出するステップと、
前記検出に応答して前記コンピュータが前記退避した変数セットで前記参照領域の変数セットを置換するステップと
を有する方法。
【請求項16】
UEFIファームウェアがファームウェアROMに書き込まれた変数セットを修復するためにコンピュータに、
前記変数セットを所定の領域に退避するステップと、
前記コンピュータがブートを開始するステップと、
前回のブートの開始後に設定した検出フラグをオペレーティング・システムのロードを開始する直前に解除し、今回のブートで前記検出フラグを確認して前記前回のブートが前記オペレーティング・システムのロードまで到達しなかったことを検出するステップと、
前記検出に応答して前記退避した変数セットで前記ファームウェアROMの変数セットを置換するステップと
を有する処理を実行させるためのコンピュータ・プログラム。
【請求項17】
電源起動後に最初に実行されるシステム・ファームウェアを実装するコンピュータであって、
プロセッサと、
システム・メモリと、
システム・ファームウェアと該システム・ファームウェアが参照する変数セットを格納する不揮発性メモリとを有し、
前記システム・ファームウェアが、前回のブートの開始後に設定した検出フラグをオペレーティング・システムのロードを開始する直前に解除し、今回のブートで前記検出フラグを確認して前記前回のブートが停止したことを検出したときにあらかじめ退避しておいた変数セットで前記不揮発性メモリの変数セットを置換する機能を前記コンピュータに実現させるコンピュータ。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、起動できなくなったコンピュータを回復する技術に関し、さらには、システム・ファームウェアが参照する変数セットを回復する技術に関する。
【背景技術】
【0002】
コンピュータは、ハードウェアとオペレーティング・システム(OS)、デバイス・ドライバまたはアプリケーションなどの上位のプログラムとの間のインターフェースを提供するファームウェアを実装する。ファームウェアは、周辺デバイスを専用に制御するデバイス・ファームウェアとシステム全体の動作にかかわるシステム・ファームウェア(プラットフォーム・ファームウェアともいう。)に分けることができる。
【0003】
システム・ファームウェアは通常マザーボードに取り付けられたファームウェアROMに格納されている。BIOSはこれまで多くのコンピュータ・システムに実装されてきたシステム・ファームウェアで、コンピュータの電源が起動してからOSがロードを開始するまでの間にPOST(Power On Self Test)およびパスワード処理をしたり、上位のプログラムがハードウェアにアクセスする為のサービスを提供したりする。
【0004】
しかしBIOSは、近年の進化したハードウェアへの対応が困難になってきたため、非特許文献1に示すように、UEFI(Unified Extensible Firmware Interface)フォーラムが、従来のBIOSであるレガシーBIOSに代わる新しいシステム・ファームウェアとしてUEFI規格を策定した。UEFIファームウェアは、レガシーBIOSをエミュレートして互換性を保つための仕組みを取り入れており、ハードウェアとソフトウェアは過去数年かけてレガシーBIOSからUEFIファームウェアに対応できるように段階的に発展してきた。2011年4月には非特許文献1に示すUEFI規格が策定され、ハードウェアもほぼ対応できるようになってきたこともあって現在のシステムはUEFIファームウェアへの完全移行段階に入ってきている。
【0005】
UEFIファームウェアを実装するシステムではUEFIネイティブ・モードで動作するUEFI対応のOSと、レガシーBIOS互換モードで動作するUEFI非対応のOSのいずれも動作することができる。Windows(登録商標)7はUEFIネイティブ・モードに対応しているが、UEFIファームウェアの高速ブート、セキュア・ブートなどの機能を利用することはできない。Windows(登録商標)8ではUEFIファームウェアに完全移行してその機能を完全に利用できるようになっている。
【0006】
非特許文献1のUEFI仕様には、7.2項にバリアブル・サービス(Variable Services)を規定している。バリアブル・サービスでは、不揮発性のメモリにUEFI規格で定義した変数であるグローバル・バリアブルズ(GV:Global Variables)を格納することにしている。現在ほとんどのパーソナル・コンピュータ(PC)では、UEFIファームウェアを格納する不揮発性メモリにGVを記録している。UEFI規格では、ベンダーがUEFI規格で定義されたGV用の識別子(VendorGuid)を使って、当該不揮発性メモリにGVを書き込んでもよいとしている。また、OSやアプリケーションがUEFI規格で定義したGVを書き換えることを許容している。特許文献1はUEFIファームウェアが使用する変数をプロテクトして不揮発性メモリに記憶する発明を記載している。
【0007】
特許文献2は、システムを正常に起動させることができなくなったBIOSを正常なBIOSに復旧させる発明を開示する。情報処理装置は、電源が立ち上がるとBIOSを読み出すための命令を出力する。その後、BIOSROMが起動を開始する前に、PCIスロットに装着されたBIOSROMカードに予め記憶されているシステムを初期化する初期化プログラムを読み出し、初期化プログラムによりシステムを初期化する。
【0008】
次に、BIOSROMカードに記憶されているBIOSROM書き換えプログラムを読み出し、読み出した書き込みプログラムに従って、BIOSROMカードに記憶されているBIOS制御コードをBIOSROMに格納する。特許文献3は、BIOS_ROMに格納されたシステム・ファームウェアを更新する際に、BIOS_ROMに旧CRTMの変数の定義と新BIOSの変数の定義が異なる場合に更新できなくなる事態を防ぐ発明を開示する。
【先行技術文献】
【特許文献】
【0009】
【特許文献1】特開2010−73193号公報
【特許文献2】特開2003−345617号公報
【特許文献3】特開2013−156799号公報
【非特許文献】
【0010】
【非特許文献1】Unified Extensible Firmware Interface Specification Version 2.3.1 April 6,2011
【発明の概要】
【発明が解決しようとする課題】
【0011】
ところで、レガシーBIOSやUEFIファームウェアなどのシステム・ファームウェアは、ブートの際にデバイスの認識や初期化などの処理をするために、電源の起動直後にアクセスが可能なファームウェアROMに書き込んだデータを参照する必要がある。以後このようなブートに不可欠なデータ(変数)を、本明細書においてコンフィグレーション・バリアブルズ(CV:Configuration Variables)ということにする。
【0012】
CVはプリブート段階でUEFIがデバイスに設定するデバイスの属性情報およびデバイスに設定するパラメータ、セット・アップ画面を呼び出してユーザが設定したデバイスの種類、デバイスの動作モード、デバイスの有効/無効などの設定情報、ブート・イメージが格納されているパーティションのパス、およびロードするOSの種類などの情報を含む。
【0013】
ここでプリブートとは、システムがACPIに規定するパワー・オフ状態(S5ステート)またはハイバネーション状態(S4ステート)のときに、電源が起動してからOSがロードを開始するまでの間に、システム・ファームウェアが行う処理をいう。また本明細書でブートとは、電源が起動してからプリブートを経由してOSおよびOSアプリケーションのロードが完了した状態になるまでの一連の処理をいうことにする。なお、S5ステートまたはS4ステートからブートすることをコールド・ブートという。
【0014】
CVの多くは、従来、ボタン電池で電源をサポートしているCMOSに記録されていたが、近年はUEFIを格納するファームウェアROMにも書き込むようになってきた。また、OS、UEFIアプリケーション、およびOSアプリケーションはその実行に際して、自らをカスタマイズするための環境変数、デバッグ・ログ、またはエラー・ログのようなダンプ・ファイルをUEFIファームウェアの仕様上の制約を受けないで自由にファームウェアROMに書き込むことができる。このようなOS、UEFIアプリケーション、およびOSアプリケーションが作成したデータを本明細書においてユーザ・バリアブルズ(UV:User Variables)ということにする。
【0015】
ファームウェアROMは、システム・ファームウェアを格納するコード領域と変数を記録する変数領域を含む。いずれのプログラムであっても、バリアブル・サービスを利用して変数領域にデータを書き込むためには、UEFI規格が定義する関数であるSetVariable()を呼び出してパラメータを設定する必要がある。UEFI規格では後述の認証サービスなどを除き変数領域の利用に制限を設けていないため、UEFIネイティブ・モードで動作するOSおよびOSアプリケーションは、バリアブル・サービスを利用して変数領域に自由にUVを書き込むことができる。その結果、変数領域にはUEFIファームウェアが書き込んだCV、GVと、UEFIアプリケーション、OS、OSアプリケーションが書き込んだUV、GVが記録される。
【0016】
システム・ファームウェアの動作環境がレガシーBIOSからUEFIファームウェアに完全に移行して変数領域がOSおよびOSアプリケーションに解放されたことに伴って、最近、ブートに支障がでる場合があることがわかってきた。UVを書き込むOSやOSアプリケーションが、SetVariable()に誤ってCVやGVの変数の名称(VariableName)や識別子(VendorGuid)を設定すると、CVやGVが書き換えられてしまうことがある。
【0017】
また、UEFIファームウェアが誤ってCVやGVを書き込んだり更新したりすることもある。さらに、マルウェアによっても意図的にCVやGVが書き換えられたり消去されたりしてしまう危険性がある。CVはプリブートでハードウェアを構成するために不可欠なデータであり、さらにGVもプリブートに関連するデータを含むためそれらが誤って書き換えられるとシステムをブートできなくなりユーザによる復旧作業が困難になる。
【0018】
UEFI規格では、SetVariable()に設定するパラメータをハッシュして書き込み保護をする認証サービス(Variable Authentication)を提供する。認証サービスを利用すればOSまたはOSアプリケーションによるCVの上書きを防ぐことはできる。しかし、OSまたはUEFIアプリケーションが変数領域にアクセスしているときに電源の瞬断などによって電気的なノイズが発生すると、CVやGVが毀損する可能性がある。
【0019】
またUEFI規格では、OSやOSアプリケーションがGVを書き換えることを許容するため、認証サービスではGVを保護することはできない。GVは、Boot####、BootOrder、Driver####、DriverOrder、Key####などの名称の起動ディスクの種類や優先順位などに関するブート関連データや、Conin、Conoutといった入出力コンソールまでのパスに関するデータを含みUEFI規格で定義している。GVのブート関連データがOSやOSアプリケーションで誤って書き換えられたり、電源ノイズで改変されたりするとブートできなくなることも予想される。
【0020】
UEFIファームウェアを格納するファームウェアROMは、システムの基板に装着されて容易に取り外しできないようになっている。またファームウェアROMは、OSやOSアプリケ−ションにより書き換えができないように、ハードウェアでライト・ロックが施されている。そして、システムは電源が起動した直後だけライト・ロックを解除して、ファームウェアROMを最初に実行するようにして外付けのデバイスからの起動を防止し不正なプログラムによる起動を防止している。したがって、特許文献1のように電源の起動直後にファームウェアROM以外のデバイスが格納するコードを実行して改変されたCV、GVを修復することはできない。
【0021】
また、ファームウェアROMは、CVやGVのデフォルト値を保有しているため、起動直後にF1キー、F3キーなどのファンクション・キーを押下して、セット・アップ画面を表示させることができれば、それらを初期化することができる。しかし、セット・アップ画面を表示できる段階までプリブートが進むためには、UEFIファームウェアが多くの変数を参照する必要があるため、変数が改変されている場合にはセット・アップ画面を表示できないことが多い。さらに、変数を初期化してしまうと、システムの状態が変化するため、できるだけシステムへの影響を少なくして修復できれば都合がよい。
【0022】
本発明は、システム・ファームウェアに関する上述の諸問題を解決することを目的とする。そこで本発明の目的は、電源の起動時に最初に実行するシステム・ファームウェアが参照する変数セットを修復する方法を提供することにある。さらに本発明の目的は、コンピュータをブートの失敗から復旧する方法を提供することにある。さらに、本発明の目的は、ブートが失敗したときに直近の動作環境に復旧する方法を提供することにある。さらに本発明の目的は、そのような方法を実現するコンピュータ・プログラムおよびコンピュータを提供することにある。
【課題を解決するための手段】
【0023】
本発明の一の態様は、電源起動後に最初に実行されるシステム・ファームウェアが参照する変数セットをコンピュータが修復する方法を提供する。システム・ファームウェアの参照領域に変数セットを書き込む。コンピュータが正常にブートしたときの変数セットを所定の領域に退避する。つぎに、コンピュータのブート中に、参照領域の変数セットが改変されたことを検出する。つぎに、検出に応答して退避した変数セットで参照領域の変数セットを置換する。したがって、変数セットをシステム・ファームウェアが誤って改変した場合、システム・ファームウェア以外のプログラムが改変した場合、または電源ノイズにより改変された場合のいずれでも正常にブートしたときの状態に戻すことができる。OSやOSアプリケーションが書き込んだ変数セットも含めて参照領域のすべての変数セットを正常な変数セットで置換すれば、改変前の動作環境からの変化が少なくなるように修復することができる。
【0024】
システム・ファームウェアはUEFIファームウェアとすることができる。改変の検出は、オペレーティング・システムのロードを開始する前にブートが停止したことで検出することができる。セット・アップ画面を表示できる状態までブートが進行するためには、システム・ファームウェアが多くの変数セットを参照するため、変数セットが改変されているときはその段階までブート処理を進めることができない可能性が高いが、本発明では改変の検出を、システム・ファームウェアが提供するセット・アップ画面を表示できる状態までブートが進行する前に実行することができる。
【0025】
変数セットが改変されたことの検出は、前回のブートの開始後に検出フラグを設定し、オペレーティング・システムのロードを開始する直前に検出フラグを解除し、今回のブートで検出フラグを確認することで行うことができる。このとき検出フラグの確認を、システム・ファームウェアの検出フラグを確認するために必要なデバイスの初期化が終了した直後に実行することができる。また検出フラグの確認を、ブートを開始したシステム・ファームウェアが参照領域に書き込まれた変数セットを参照する前に実行することができる。さらに今回のブートを開始してから検出フラグを確認するまで所定の値でデバイスを初期化し、検出フラグを確認してから変数セットを参照して再度初期化することができる。その結果、変数セットが改変された状態でブートを開始したときに、検出フラグの確認ができないような事態を防ぐことができる。
【0026】
今回のブートで、検出フラグを確認するステップの直後に検出フラグを設定することができる。その結果、今回のブートで変数セットが改変されても次回のブートで検出フラグを確認して修復することができる。検出フラグの解除は、オペレーティング・システムのロードを開始する直前に実行することで、システム・ファームウェアによるブート処理が終了したときだけ検出フラグを解除できるため、次回のブートでシステムは検出フラグが解除されているときに、変数セットが改変されていないと判断することができる。
【0027】
正常にブートしたときの変数セットの退避は、システム・ファームウェアのセット・アップ画面を通じて行うことができる。また変数セットの退避は、各ブートにおいてオペレーティング・システムのロードを開始する直前に実行することもできる。この場合は、ブートが成功してから変数セットを退避するまでの間に、システム・ファームウェア以外のプログラムが変数セットを改変する機会を完全になくすことができる。
【0028】
参照領域を、システム・ファームウェアを格納するファームウェアROMに設定し、置換する処理をする修復コードと退避した変数セットをファームウェアROMとは異なる不揮発性メモリに格納することができる。修復コードのダイジェストを計算し、ダイジェストをコンピュータが保有する暗号鍵で暗号化し、置換する際にダイジェストを使って修復コードが改変されていないことを検証することができる。退避する際に、退避する変数セットのダイジェストを計算し、ダイジェストをコンピュータが保有する暗号鍵で暗号化し、置換する際にダイジェストを使って変数セットがコンピュータから抽出されたことを検証することができる。
【発明の効果】
【0029】
本発明により、電源の起動時に最初に実行するシステム・ファームウェアが参照する変数セットを修復する方法を提供することができた。さらに本発明により、コンピュータをブートの失敗から復旧する方法を提供することができた。さらに、本発明により、ブートが失敗したときに直近の動作環境に復旧する方法を提供することができた。さらに本発明により、そのような方法を実現するコンピュータ・プログラムおよびコンピュータを提供することができた。
【図面の簡単な説明】
【0030】
【
図1】PC10の主要なハードウェアの構成を説明するための概略の機能ブロック図である。
【
図2】ファームウェアROM100のデータ構造の一例を説明するための図である。
【
図3】PC10が実装するソフトウェアの実行状態における階層構造を説明するための図である。
【
図4】USBメモリ・キー50またはNVRAM27のデータ構造を説明するための図である。
【
図5】USBメモリ・キー50またはNVRAM27に変数セットを格納する手順を説明するためのフローチャートである。
【
図6】USBメモリ・キー50を利用して変数セットを修復する手順を説明するためのフローチャートである。
【
図7】NVRAM27を利用して変数セットを修復する手順を説明するためのフローチャートである。
【発明を実施するための形態】
【0031】
[ハードウェアの概略構成]
図1は、ノートブック型またはデスクトップ型のパーソナル・コンピュータ(PC)10の主要なハードウェアの構成を示す機能ブロック図である。多くのハードウェアの構成は周知であるため、ここでは本発明の理解に必要な範囲で説明する。チップセット13はさまざまな規格のインターフェース機能を備えており、CPU11、システム・メモリ15、GPU17、HDD21、USBコネクタ23、有線または無線のLANに接続するためのネットワーク・モジュール25、不揮発性メモリ(NVRAM)27およびキーボード29などが接続されている。GPU17にはLCD19が接続されている。チップセット13にはさらに、SPI(Serial Peripheral Interface)コントローラにファームウェアROM100が接続されている。
【0032】
チップセット13は後に説明する変数修復コード150fのダイジェストや変数セット205のダイジェストを暗号化する暗号鍵155を格納する。暗号鍵155は、たとえば、インテル(登録商標)ME・プラット・フォーム・キーや、UEFIファームウェア150(
図2)とPC10を関連付ける識別情報のような、PC10を他のコンピュータから区別することができる固有のデータとすることが望ましい。
【0033】
HDD21は起動ディスクで、PC10の、UEFI規格に対応するOSのブート・イメージを格納する。HDD21は、複数のパーティションにそれぞれUEFI非対応のOSも含めて異なるブート・イメージを格納するようにしてもよい。HDD21のブート・セクタは、OSのブート・イメージをロードするためのOSローダーを格納する。USBコネクタ23には、変数セットの修復に利用するUSBメモリ・キー50を装着することができる。PC10は、USBコネクタ23にOSのブート・イメージを格納したUSBメモリ・キーを装着して、当該ブート・イメージをロードすることはできるが、システム・ファームウェアを格納して電源の起動直後から実行することはできないようにしている。
【0034】
[ファームウェアROMのデータ構造]
図2は、ファームウェアROM100のデータ構造を説明するための図で、
図3はシステム・メモリ15にロードされて実行状態にあるソフトウェアの階層構造を説明するための図である。ファームウェアROM100は、不揮発性で記憶内容の電気的な書き替えが可能なフラッシュ・メモリで、一例としてコード領域101、デフォルト領域103、および変数領域105の3ブロックに区分している。
【0035】
本実施の形態では、コード領域101およびデフォルト領域103には、チップセット13のSPIコントローラでライト・ロックが可能な記録領域を割り当てている。ライト・ロックが実行された記録領域に対しては、チップセット13がリセットされるまで書き込みができない。ただし、変数領域105はUEFI規格でOS167またはOSアプリケーション169(
図3)による書き換えを保証しているGVを記録するためにライト・ロックはできない。UEFIファームウェア150は、チップセット13がリセットされたときに実行が可能な状態になり、OS167にCPU11の制御権を渡す前にライト・ロックをする。
【0036】
本発明は、変数領域105を、CVだけを記憶する領域と、GV、UVを記憶する領域に分割して、前者だけをライト・ロックするようにしてもよい。ライト・ロックをすれば、OS167およびOSアプリケーション169による改変を防止することはできるが、UEFIファームウェア150自体による誤った改変および電源ノイズによる改変の可能性は依然として残る。
【0037】
コード領域101はUEFIファームウェア150、検出フラグ153およびUEFIアプリケーション165を格納し、デフォルト領域103はGVとCVの初期値181を格納する。なお、検出フラグ153は、チップセット13のCMOS領域のような事前に変数セット183を参照しないでアクセスが可能な保管場所に格納することもできる。変数領域105にはUEFIファームウェア150、UEFIアプリケーション165、OS167またはOSアプリケーション169が実行中にCV、GV、UVのいずれかの変数セット183を記録する。デフォルト領域103が格納する変数セットの初期値181は、PC10の出荷前またはUEFIファームウェア150の更新時に書き込まれる。
【0038】
UEFIファームウェア150は、システムの動作環境の変化に応じてCVとGVを更新する。UEFI規格では、GVをUEFIアプリケーション165、OS167、OSアプリケーション169に参照または更新できるように公開することを規定している。したがって、変数領域105が記録するGVおよびCVは当初は初期値であるが、PC10がブートを繰り返す間に書き換えられたり追加されたりする。CVがUEFIファームウェア150によって誤って書き換えられたり、電源のノイズで書き換えられたりすると、システムは次回のプリブートを正常に行うことができなくなる可能性がある。また、GVのブート関連データがOS167やOSアプリケーション169で誤って書き換えられたときも同様にプリブートを行うことができなくなる可能性がある。
【0039】
UEFIファームウェア150は、初期化コード150a、ランタイム・サービス150b、ブート・マネージャ150c、セット・アップ・コード150d、変数修復コード150e、150f、およびレガシーBIOS互換サービス150gを含む。UEFIファームウェア150は署名データ・ベースに、UEFIファームウェアの製造者が発行した公開鍵を保持しており、完全性を検証した後でないと更新できないようになっている。
【0040】
また、システムは電源の起動(コールド・ブート)でリセットされたときにCPU11に、ファームウェアROM100の初期化コード150aを実行するリセット・ベクタを設定する。初期化コード150aは、PC10がコールド・ブートをする際に、システム・メモリ15にUEFIファームウェア150をロードして実行を開始するために必要なCPU11、システム・メモリ15およびチップセット13の主要なコントローラなどの基本的なデバイスの検出、検査および初期化を必要な範囲で行う。
【0041】
初期化コード150aはまた、CPU11がリセットしてから、UEFI_OSローダー163に制御が移行するまでの期間にチップセット13の残りのコントローラや周辺デバイスなどの所定のデバイスを初期化して使用できる状態にする。初期化コード150aは、コード領域101が格納する他のコードの一貫性または完全性を検査して改竄を発見した場合はブートを停止する。
【0042】
ランタイム・サービス150bは、変数セットに関連するバリアブル・サービス、時刻情報のサービス、および仮想メモリ・サービスなどを提供する。ブート・マネージャ150cは、ブート処理およびパスワード認証処理などを行う。ブート・マネージャ150cは、GVを参照してUEFIアプリケーション165、UEFIドライバ150hおよびUEFI_OSローダー163(レガシーOS173をブートするときはレガシーBIOS_OSローダー171)をシステム・メモリ15にロードする。ブート・マネージャ150cは、プリブートが終了してUEFIファームウェア150からOS167にCPU11の制御権が移る直前に、UEFI_OSローダー163をシステム・メモリ15に読み出して完全性の検証をする。
【0043】
ブート・マネージャ150cは、UEFI_OSローダー163のコードから計算したハッシュ値と、署名データ・ベースから取得した公開鍵で復号して得た電子署名のハッシュ値を比較して、一致していれば完全性が維持されていると判断してUEFI_OSローダー163の実行を許可する。セット・アップ・コード150dは、プリブートの段階でキーボード29の所定のファンクション・キーが押下されたたときに、LCD19にセット・アップ画面を表示する。
【0044】
ユーザはセット・アップ画面を通じて、起動ディスクの優先順位の決定、起動方法の設定、使用デバイスの設定、パスワードの設定およびパワー・マネジメントの設定などをすることができる。さらに、ユーザは、前回のブートが成功したときに、今回のブートにおいてセット・アップ画面を表示してUSBメモリ・キー50またはNVRAM27に変数領域105が記録する変数セット183を復旧用の変数として退避することができる。
【0045】
セット・アップ・コード150dはセット・アップ画面を通じて入力された設定情報を変数領域105およびその他の記憶領域に書き込む。ユーザはセット・アップ・コード150dを通じて、変数領域105を初期値181に戻すことができる。ただし、プリブートの処理がセット・アップ画面を表示できる状態に到達するまでには、ほとんどのデバイスを初期化するために初期化コード150aが多くの変数セット183を参照する必要がある。したがって、変数セット183が改変されている場合は、セット・アップ画面を表示できないことが多い。変数修復コード150e、150fは、
図4、
図5の手順で説明するように、USBメモリ・キー50またはNVRAM27に退避した変数セットで、変数領域105を置換するための処理をする。
【0046】
一例において変数修復コード150fは実行に際し、後に説明するようにUSBメモリ・キー50またはNVRAM27に書き込まれる。変数修復コード150e、150fは、デバイスの初期化に必要なパラメータを規定の初期値として保有することで、変数セットを参照しないで修復処理ができるようにコーディングしている。したがって、変数修復コード150e、150fは、変数セット183の改変の影響を受けることはないようにしている。
【0047】
レガシーBIOS互換サービス150gは、UEFI非対応のレガシーOS173に対するレガシーBIOS互換のインターフェースを提供する。レガシーOS173が、レガシーBIOS互換のインターフェースを利用するときは、INT**の割り込みルーチンを呼び出すが、そこにはバリアブル・サービスに関する割り込みルーチンを含まないため、レガシーOS173はバリアブル・サービスを利用することはできない。したがって、レガシーOS173は、変数領域105にUVを書き込むことはできない。
【0048】
[USBメモリ・キー]
図4は、USBメモリ・キー50またはNVRAM27のデータ構造を説明するための図である。両者を代表してUSBメモリ・キー50には、変数修復コード150fが転送された状態の変数修復コード201、変数修復コード150fのダイジェストを暗号鍵155で暗号化した暗号化ダイジェスト203、変数領域105に記録されていた変数セット183が転送された状態の変数セット205、変数セット205のダイジェストを暗号鍵155で暗号化した暗号化ダイジェスト207が格納される。
【0049】
以下においてはファームウェアROM100に格納された状態とUSBメモリ・キー50またはNVRAM27に格納された状態を区別する必要がある場合に、後者の変数修復コードおよび変数セットをそれぞれ参照番号201、205で示すことにする。さらにUSBメモリ・キー50は、変数セット183の修復の際のユーザ認証に使用する修復用パスワード209を格納する。
【0050】
[変数修復の第1の手順]
図5、
図6は、USBメモリ・キー50を使用してUEFIファームウェア150が改変された変数セット183を修復する手順を説明するためのフローチャートである。
図5は、USBメモリ・キー50に
図4に示したデータを格納する手順を示している。
図6は、USBメモリ・キー50が装着されたPC10が変数領域105に記憶する変数セット183を修復する手順を示している。
図5の手順は、NVRAM27にデータを格納する場合にも適用できる。
【0051】
図5のブロック301でPC10にUSBメモリ・キー50を装着し、ブロック303で電源を起動してコールド・ブートを開始する。ユーザは前回のブートが成功してOS167およびOSアプリケーション169が安定して動作していることから、ブートに関連する変数セットは正常であることを確認している。ブロック305でユーザは、電源の投入直後に所定のファンクション・キーを押下してセット・アップ・コード150dを呼び出し、LCD19にセット・アップ画面を表示する。セット・アップ画面には、USBメモリ・キー50にデータを格納するためのメニューが表示される。セット・アップ画面が表示される状態では、ほとんどのデバイスの初期化が終了してUEFIファームウェア150がそれらの利用が可能な状態になっている。
【0052】
ブロック307で、ユーザが変数セット183の退避メニューを選択すると、変数修復コード150eは、変数領域105が記憶する変数セット183のハッシュ値を計算してダイジェストを作成する。さらに変数修復コード150eは、暗号鍵155を使ってダイジェストを暗号化する。ブロック309で変数修復コード150eは、変数セット183とそのダイジェストをそれぞれ変数セット205、暗号化ダイジェスト207としてUSBメモリ50に格納する。
【0053】
ファームウェアROM100に十分なスペースがないときは、OS167の動作環境下でWebサイトから変数修復コード150fをダウンロードして、USBメモリ・キー50に格納することもできる。このときダウンロードした変数修復コード150fには、製造者の秘密鍵で暗号化されたダイジェストが電子署名として付属している。電子署名を復号する公開鍵はUEFIファームウェア150に埋め込まれている。
【0054】
ブロック311でユーザが変数修復コード150fの格納メニューを選択すると、変数修復コード150eは、変数修復コード150fのハッシュ値を計算して作成したダイジェストを、暗号鍵155を使って暗号化する。ブロック313で変数修復コード150eは、変数修復コード150fと暗号化されたダイジェストを変数修復コード201、暗号化ダイジェスト203としてUSBメモリ・キー50に格納する。以後、ユーザはブートが失敗するまでUSBメモリ・キー50を保管するが、変数セット183はPC10がブートを繰り返すたびに変更される可能性があるため、ブロック307、309は適宜実施することが望ましい。ブロック315でユーザがパスワードの登録メニューを選択して、キーボード29からUSBメモリ・キー50に修復用パスワード315を登録する。
【0055】
変数修復コード150eはコールド・ブートの際に、変数セット183のUSBメモリ・キー50への退避を促すプロンプトを経過時間やブート回数などで計算した適当なタイミングで表示することができる。変数領域105を、CVとプリブートに関連するGVだけを記憶する領域と、UVとその他のGVを記録する領域に分けておく場合は、USBメモリ・キー50にはCVとプリブートに関連するGVだけを保存しておくこともできる。このときプリブートに関連するGVは、Boot####、BootOrder、Driver####、DriverOrder、およびKey####とし、それらに対するパラメータは、ロード・オプション(Load options)とすることができる。
【0056】
つぎに
図6を参照して、USBメモリ・キー50を利用してPC10が、改変された変数セットを修復する手順を説明する。ブロック403で電源を起動してコールド・ブートを開始する。ブロック403への移行には、前回のブートが成功して安定した動作をしていたブロック421からのパス、改変された変数セット183が修復されたブロック461からのパス、およびプリブートが失敗したブロック413からのパスを含む。以下の手順で明らかになるように、前回のプリブートが失敗したときは、今回のブートでユーザがUSBメモリ・キー50を装着して電源を起動することを想定している。
【0057】
リセット信号を受け取ったCPU11は、電圧が安定すると内部のキャッシュおよびレジスタを初期化する。チップセット13はCPU11のあらかじめ定められたリセット・ベクタを初期化コード150aのアドレスに切り換える。CPU11はリセット・ベクタ)にアクセスして初期化コード150aのインストラクションをフェッチする。
【0058】
ブロック405でCPU11はコード領域101に格納されたUEFIファームウェア150をキャッシュに読み出して、システム・メモリ15およびチップセット13などの修復に関連するUEFIファームウェア150を実行するのに必要な基本的なデバイスの初期化をする。つづいて、初期化コード150aは、システム・メモリ15が利用できるようになると、UEFIファームウェア150をシステム・メモリ15にロードする。
【0059】
ブロック407で変数修復コード150eが検出フラグ153を確認する。検出フラグ153の設定と解除の論理は正論理と負論理のいずれでもよい。ここまでの動作において実行する初期化コード150aは、変数セット183に依存しないようなコーディングすることができる。たとえば、変数セットを参照しないで一旦既定の値でデバイスを初期化しておき、検出フラグを確認した後で変数セットを参照して再度、初期化を行うようにコーディングすることができる。したがって、前回のブートで変数セット183が改変されていても、今回のブートでは確実にブロック407まで進行することができる。
【0060】
検出フラグ153が設定されているときはブロック450に移行して変数セット183の修復処理をする。検出フラグ153が設定されていないときはブロック409に移行する。ブロック409では、ブロック407の手順の直後に変数修復コード150eが検出フラグ153を設定する。この手順も今回のプリブートの失敗を次回のプリブートで変数修復コード150eが検出できるようにするために、変数修復コード150eが変数セット183に依存しないようにコーディングしておくことが望ましい。ブロック411で初期化コード150aが残りのデバイスを初期化したり、ブート・マネージャ150cがプリブートに必要な処理をしたりする。ブロック411が終了するとセット・アップ・コード150dが実行できる状態になる。ブロック411においては、UEFIファームウェア150が多くの変数セット183を参照する。
【0061】
したがって、変数セット183が正常な状態から改変されていれば、ブロック411の手順を終了することができないためプリブートは停止する。他方でブロック407、409の手順は、ブロック411の前に行うことで前回のブートで変数セット183の改変があってもその影響を受けないで実行することができる。ブロック413では、変数セット183が改変されているとブロック411の手順の途中でプリブートが停止することを示している。ユーザはLCD19の画面を注視することで、OS167のロードが始まらないときにプリブートが停止したと判断することができる。
【0062】
プリブートが停止したと判断したユーザは、ブロック431でUSBメモリ・キー50を装着してブロック403でPC10を再起動する。ブロック413からブロック431を経由してブロック403に移行するパスは、ユーザの操作に依存するため、点線で示している。ブロック421からブロック403までのパスもユーザの操作に依存するため点線で示している。
【0063】
ブロック413でプリブートが正常に終了したときは、ブロック415に移行して変数修復コード150eが検出フラグ153を解除する。検出フラグ153が解除できたことは、プリブートが成功したことを意味しており、変数セット183が改変されてないことに相当する。ブロック417でブート・マネージャ150cが、UEFI_OSローダー163の完全性を検証すると、CPU11の制御権がOS167に移り、OS167およびOSアプリケーション169のロードが開始される。
【0064】
ブロック415の手順は、プリブートが成功してOS167にCPU11の制御権が移る直前の段階で行われるため、プリブートが成功する限り必ず実行される。ブロック419でブートが完了してOS167およびOSアプリケーション169が実行される。OS167またはOSアプリケーション169は、その後の動作でUEFIファームウェア150が書き込んだプリブートに関連する変数セットを誤って書き換える場合がある。また、マルウェアが意図的に書き換える場合もある。本発明ではこれらの問題を、次回のブートで治癒することができる。ブロック421で今回のブートが完了して電源が停止する。
【0065】
ブロック431を経由したブロック403以降の手順では、検出フラグ153が解除されていないため、ブロック407からブロック451に移行する。ブロック450で変数修復コード150eは、USBメモリ・キー50が装着されていないときにビープ音でユーザにUSBメモリ・キー50を装着するように促すことができる。
【0066】
ブロック451で変数修復コード150eは、暗号鍵155で復号した暗号化ダイジェスト203と、変数修復コード201から計算したダイジェストを比較して同一性を検証する。同一性があるときは、変数修復コード150fは、ファームウェアROM100に格納されていた状態から改変されていないことに相当する。変数修復コード201をWebサイトからダウンロードしたときは、暗号化ダイジェスト203をUEFIファームウェア150が保持する公開鍵で復号して同一性を検証する。変数修復コード150fと変数修復コード201の同一性を検証することで、不正な変数修復コードを使って第3者がPC10にアクセスすることを防ぐことができる。ブロック450、451の手順も変数修復コード150eが変数セット183に依存しないで実行できるようにコーディングしておくことが望ましい。
【0067】
変数修復コード201の検証が成功するとブロック453で、CPU11はUSBメモリ・キー50が格納する変数修復コード201を実行する。変数修復コード201は、暗号鍵155を使って変数セットの暗号化ダイジェスト207を復号し、変数セット205から計算したダイジェストと比較する。両者が一致した場合は、変数セット205が暗号鍵155に関連付けられたPC10から抽出したもので、かつ改変されていないことになる。
【0068】
したがって、不正な変数セットを変数領域105に書き込むことはできず、かつ、異なるPC10の変数セットで置換することもできない。変数セット205とPC10のバインディングの検証が成功すると、ブロック455で変数修復コード201は修復用パスワード209でユーザ認証をする。したがって、PC10から抽出した正規の変数セット205であってもUSBメモリ・キー50を使って他人が変数領域105に書き込むことはできない。
【0069】
変数修復コード201は、
図7のブロック503で説明するように各プリブートの終了直前にNVRAM27に格納することもできる。ブロック457では、変数修復コード201がユーザに、任意のタイミングでセット・アップ画面を通じてUSBメモリ・キー50に格納した変数セット205と、前回のプリブートの終了直前に退避して置いた変数セット205のいずれを使用して修復するかを選択させるためのプロンプトを表示することができる。ブロック459で変数修復コード201は、変数領域105に変数セット183をクリアしてから変数セット205を書き込む。
【0070】
ブロック461で変数修復コード201は、検出フラグ153を解除してブロック403でUSBメモリ・キー50を取り外すようにユーザに促したあとに電源を再起動する。これまでUSBメモリ・キー50を利用して変数セット183を修復する例を説明したが、NVRAM27を利用した修復もほぼ同じ手順で行うことができる。この場合は、ブロック413からブロック403にはブロック431を経由しないで自動的に戻る。また、ブロック450の手順は不要になる。
【0071】
[変数修復の第2の手順]
つぎに、
図7のフローチャートを参照して、NVRAM27を使ってUEFIファームウェア150が改変された変数セット183を修復する手順を説明する。
図7において
図6の手順と同一の手順には、同一の参照番号を付して説明を省略し、特徴的なブロック501、503、551の手順だけを説明する。
図6のブロック450、457の手順は
図7から削除している。ブロック501では、修復に必要な変数セット205と修復コード201をNVRAM27に格納している。
【0072】
ブロック503では、毎回、プリブートが成功して検出フラグ153を解除する直前に変数修復コード150eが変数セット183をNVRAM27に退避する。その結果、NVRAM27には、USBメモリ・キー50に格納する場合とは異なり、OS167およびOSアプリケーション169による改変の可能性がない最新の変数セットを格納することができる。
【0073】
ブロック551では、NVRAM27が格納する変数修復コード201がブロック451と同様の手順で検証される。それ以降は、NVRAM27が格納する変数修復コード201が
図6の手順と同様に修復処理をする。
図5〜
図7に示したフローチャートの手順はすべてが必須の手順ではなく、また、手順の前後を限定するものでもない。本発明に必須の手順および手順の前後関係は特許請求の範囲の記載として特定する。
【0074】
これまで本発明について図面に示した特定の実施の形態をもって説明してきたが、本発明は図面に示した実施の形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができることはいうまでもないことである。
【符号の説明】
【0075】
10 PC
27 不揮発性メモリ(NVRAM)
100 ファームウェアROM
101 コード領域
103 デフォルト領域
105 変数領域
183、205 変数セット
150 UEFIファームウェア