特許第6204555号(P6204555)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ レノボ・シンガポール・プライベート・リミテッドの特許一覧

特許6204555不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ
<>
  • 特許6204555-不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ 図000002
  • 特許6204555-不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ 図000003
  • 特許6204555-不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ 図000004
  • 特許6204555-不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ 図000005
  • 特許6204555-不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ 図000006
  • 特許6204555-不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ 図000007
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B1)
(11)【特許番号】6204555
(24)【登録日】2017年9月8日
(45)【発行日】2017年9月27日
(54)【発明の名称】不揮発性メモリに格納した変数を保護する方法、システム・ファームウェアおよびコンピュータ
(51)【国際特許分類】
   G06F 9/445 20060101AFI20170914BHJP
【FI】
   G06F9/06 610J
【請求項の数】17
【全頁数】16
(21)【出願番号】特願2016-183556(P2016-183556)
(22)【出願日】2016年9月21日
【審査請求日】2016年9月21日
(73)【特許権者】
【識別番号】505205731
【氏名又は名称】レノボ・シンガポール・プライベート・リミテッド
(74)【代理人】
【識別番号】100106699
【弁理士】
【氏名又は名称】渡部 弘道
(72)【発明者】
【氏名】佐々木 健
(72)【発明者】
【氏名】森重 勇作
(72)【発明者】
【氏名】内田 宏幸
(72)【発明者】
【氏名】荒木 直幸
【審査官】 石川 亮
(56)【参考文献】
【文献】 特開2015−222474(JP,A)
【文献】 特開2015−153198(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/445
(57)【特許請求の範囲】
【請求項1】
オペレーティング・システムが改変することが可能な変数を格納した不揮発性メモリを実装するコンピュータに、
前記変数を参照してプリブートを実行する機能と、
前記変数を保護対象変数と非保護対象変数のいずれかとして認識する機能と、
前記保護対象変数を代替メモリにコピーする機能と、
前記変数にアクセスするためのリクエストがあったときに、該リクエストが前記プリブートの終了前に発生したことの認識に応じて前記リクエストのアクセス先を前記不揮発性メモリと判断する機能と
を実現させるためのシステム・ファームウェア。
【請求項2】
前記保護対象変数は前記システム・ファームウェアがブートルーチンを実行するために前記プリブートで参照する変数である請求項1に記載のシステム・ファームウェア。
【請求項3】
前記保護対象変数は前記オペレーティング・システムがロードするブート・イメージの格納場所を指定する変数である請求項1に記載のシステム・ファームウェア。
【請求項4】
前記リクエストが前記変数の書き込みである請求項1に記載のシステム・ファームウェア。
【請求項5】
前記認識する機能が、前記保護対象変数の識別子を登録したリストを参照する請求項1に記載のシステム・ファームウェア。
【請求項6】
前記代替メモリが、揮発性のメモリである請求項1に記載のシステム・ファームウェア。
【請求項7】
前記コピーする機能を、前記不揮発性メモリがライト・ロックされるまでの間に実行する請求項1に記載のシステム・ファームウェア。
【請求項8】
オペレーティング・システムが改変することが可能な変数を格納した不揮発性メモリを実装するコンピュータに、
前記変数を参照してプリブートを実行する機能と、
前記変数を保護対象変数と非保護対象変数のいずれかとして認識する機能と、
前記保護対象変数を代替メモリにコピーする機能と、
前記変数にアクセスするためのリクエストがあったときに、前記システム・ファームウェアのセット・アップ画面を通じて前記変数の保護がディスエーブルに設定されていることの認識に応じて前記リクエストのアクセス先を前記不揮発性メモリと判断する機能と
を実現させるためのシステム・ファームウェア。
【請求項9】
オペレーティング・システムが改変することが可能な変数を格納した不揮発性メモリを実装するコンピュータに、
前記変数を参照してプリブートを実行する機能と、
前記変数を保護対象変数と非保護対象変数のいずれかとして認識する機能と、
前記保護対象変数を代替メモリにコピーする機能と、
前記変数にアクセスするためのリクエストがあったときに、該リクエストの対象が前記非保護対象変数であることの認識に応じて前記リクエストのアクセス先を前記不揮発性メモリと判断する機能と
を実現させるためのシステム・ファームウェア。
【請求項10】
オペレーティング・システムが改変することが可能な変数を格納した不揮発性メモリを実装するコンピュータに、
前記変数を参照してプリブートを実行する機能と、
前記変数を保護対象変数と非保護対象変数のいずれかとして認識する機能と、
前記保護対象変数を代替メモリにコピーする機能と、
前記変数にアクセスするためのリクエストがあったときに、該リクエストが前記プリブートの終了後に発生し、かつ、前記リクエストの対象が前記保護対象変数であるとの認識に応じて前記リクエストのアクセス先を前記代替メモリと判断する機能と
を実現させるためのシステム・ファームウェア。
【請求項11】
コンピュータが不揮発性メモリに格納した変数を保護する方法であって、
前記変数を保護対象変数と非保護対象変数に区分するステップと、
前記変数を参照してブートを実行するステップと、
前記保護対象変数を代替メモリにコピーするステップと、
オペレーティング・システムから前記変数を改変するリクエストを受け取るステップと、
前記リクエストの対象が前記保護対象変数のときに前記代替メモリにコピーした保護対象変数を改変するステップと
を有する方法。
【請求項12】
前記リクエストの対象が前記非保護対象変数のときに前記不揮発性メモリに格納した前記非保護対象変数を改変するステップを有する請求項11に記載の方法。
【請求項13】
次回のブートの前に前記代替メモリが記憶する改変された前記保護対象変数を消去するステップを有する請求項11に記載の方法。
【請求項14】
システム・ファームウェアが参照する変数を格納する不揮発性メモリと、
前記変数を保護対象変数と非保護対象変数に区別することが可能な制御リストと、
プリブートが終了する前に前記保護対象変数を代替メモリに退避する退避部と、
前記変数にアクセスするためのリクエストがあったときに、該リクエストが前記プリブートの終了前に発生したことの認識に応じて前記リクエストのアクセス先を前記不揮発性メモリに設定する変数保護部と
を有するコンピュータ。
【請求項15】
システム・ファームウェアが参照する変数を格納する不揮発性メモリと、
前記変数を保護対象変数と非保護対象変数に区別することが可能な制御リストと、
プリブートが終了する前に前記保護対象変数を代替メモリに退避する退避部と、
前記変数にアクセスするためのリクエストがあったときに、前記システム・ファームウェアのセット・アップ画面を通じて前記変数の保護がディスエーブルに設定されていることの認識に応じて前記リクエストのアクセス先を前記不揮発性メモリに設定する変数保護部と
を有するコンピュータ。
【請求項16】
システム・ファームウェアが参照する変数を格納する不揮発性メモリと、
前記変数を保護対象変数と非保護対象変数に区別することが可能な制御リストと、
プリブートが終了する前に前記保護対象変数を代替メモリに退避する退避部と、
前記変数にアクセスするためのリクエストがあったときに、該リクエストの対象が前記非保護対象変数であることの認識に応じて前記リクエストのアクセス先を前記不揮発性メモリに設定する変数保護部と
を有するコンピュータ。
【請求項17】
システム・ファームウェアが参照する変数を格納する不揮発性メモリと、
前記変数を保護対象変数と非保護対象変数に区別することが可能な制御リストと、
プリブートが終了する前に前記保護対象変数を代替メモリに退避する退避部と、
前記変数にアクセスするためのリクエストがあったときに、該リクエストが前記プリブートの終了後に発生し、かつ、前記リクエストの対象が前記保護対象変数であるとの認識に応じて前記リクエストのアクセス先を前記代替メモリに設定する変数保護部と
を有するコンピュータ。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータの動作不良を防止する技術に関し、さらには、UEFI(Unified Extensible Firmware Interface)規格に適合するコンピュータが格納する変数を保護する技術に関する。
【背景技術】
【0002】
コンピュータのファームウェアは、主としてハードウェアとオペレーティング・システム(OS)、デバイス・ドライバまたはアプリケーションなどの上位のプログラムとの間のインターフェースを提供するコードである。ファームウェアは、周辺デバイスを専用に制御するデバイス・ファームウェアとシステム全体の動作にかかわるシステム・ファームウェア(プラットフォーム・ファームウェアともいう。)に分けることができる。
【0003】
システム・ファームウェアは通常マザーボードに取り付けられた不揮発性メモリ(NVRAM)に格納されている。BIOSはこれまで多くのコンピュータ・システムに実装されてきたシステム・ファームウェアで、コンピュータの電源が起動してからOSがロードを開始するまでの間にPOST(Power On Self-Test)およびパスワード処理をしたり、OSがハードウェアにアクセスする為のサービスを提供したりする。
【0004】
しかしBIOSは、近年の進化したハードウェアに対する対応が困難になってきたため、UEFIフォーラムが、従来のBIOSであるレガシーBIOSに代わる新しいシステム・ファームウェアとしてUEFI規格を策定した。UEFI規格では、バリアブル・サービス(Variable Services)を規定している。バリアブル・サービスは、不揮発性のメモリにUEFI規格で定義した変数であるグローバル・バリアブルズ(GV:Global Variables)を格納する。
【0005】
一般にパーソナル・コンピュータ(PC)は、UEFIファームウェアを格納する不揮発性メモリにGVを登録している。UEFI規格ではGVの公開性を規定し、OSやOSアプリケーションが登録されたGVに対する修正、削除、および追加をすることができる。特許文献1はブート時に所定のGVが改変されたと判断したときにあらかじめ登録しておいたデフォルト値で修正する発明を開示する。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2015−153198号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
GVは、UEFIファームウェアがブートルーチンで使用するブート・デバイスまでのパス、ブート・デバイスの選択順位、およびハードウェアの構成に関するデータを含む。このようなGVがOSによって改変されるとUEFIファームウェアは予定するPCの起動処理ができなくなって、システムの起動失敗やハードウェアの動作不良に至ることがある。したがって、UEFIファームウェアがブートルーチンを正しく実行するためには、主要なGVの一貫性を維持する必要がある。
【0008】
しかし、UEFI規格によるGVの公開性により、誤ったパラメータの設定による書き込みやマルウェアによる書き込みによって、GVが改変されることがある。レガシーBIOSでは、GVに相当する変数を書き込んだ不揮発性メモリをOSの実行環境に対してライト・プロテクトすることができたが、公開性が要求される保護対象GVに対してはそのような手法を採用することができない。
【0009】
さらにOSは、所定のGVを改変しないとインストールできないことがある。したがって、UEFI規格で規定する認証サービス(Variable Authentication)を利用して保護対象GVに対して個別にライト・プロテクトすることも、不揮発性メモリをライト・ロックすることもできない。特許文献1の発明では、前回のブートにおいてOSがGVを改変したり消去したりすると今回のブート時にUEFIファームウェアがデフォルト値でGVを書き換えるため、OSに対してGVの書き換えを許容しながらUEFIファームウェアのブートルーチンに支障がでないようにすることができる。
【0010】
しかし、不揮発性メモリの書き換えはブート時間の遅延をもたらす。また、OSは頻繁にGVを改変するためブートごとに書き換えが発生する。不揮発性メモリは消去および書き込み回数が増加すると酸化膜が劣化して記憶保持の信頼性が低下する。本発明はこのような背景のもとに、UEFIファームウェアのようなシステム・ファームウェアが起動時に参照する変数を保護するための諸問題を解決することを目的にする。
【課題を解決するための手段】
【0011】
本発明の一の態様では、不揮発性メモリはオペレーティング・システムが改変することが可能な変数を格納する。システム・ファームウェアはコンピュータに、変数を参照してプリブートを実行する機能と、変数を保護対象変数と非保護対象変数のいずれかとして認識する機能と、保護対象変数を代替メモリにコピーする機能と、変数にアクセスするためのリクエストに応じてアクセス先を判断する機能とを実現させる。変数はUEFI規格で定義するグローバル・バリアブルであってもよい。
【0012】
本発明の他の態様では、コンピュータが不揮発性メモリに格納した変数を保護する。変数を保護対象変数と非保護対象変数に区分するステップと、変数を参照してブートを実行するステップと、保護対象変数を代替メモリにコピーするステップと、オペレーティング・システムから変数を改変するリクエストを受け取るステップと、リクエストの対象が保護対象変数のときに代替メモリにコピーした保護対象変数を改変するステップとを有する。リクエストの対象が非保護対象変数のときは、不揮発性メモリに格納した非保護対象変数を改変することができる
【発明の効果】
【0013】
本発明により、以下のいずれかまたはすべての効果を奏することができた。第1に、システム・ファームウェアがアクセスする変数を保護することができた。第2にOSが正常に動作できるようにしながらそのような変数を保護することができた。さらに、ブートの遅延をもたらさないようにしながらそのような変数を保護することができた。さらに、不揮発性メモリに対する書込回数が増大しないようにしながらそのような変数を保護することができた。
【図面の簡単な説明】
【0014】
図1】PC10の主要なハードウェアの構成を示す概略の機能ブロック図である。
図2】ファームウェアROM100のデータ構造の一例を示す図である。
図3】PC10が実装するソフトウェアの実行状態における階層構造を示す図である。
図4】UEFIファームウェア150が変数領域に対するアクセスを制御する手順の一例を示すフローチャートである。
図5】保護対象GV153をSMRAM領域15aにコピーする手順の一例を示すフローチャートである。
図6】バリアブル・サービスの動作手順の一例を示すフローチャートである。
【発明を実施するための形態】
【0015】
[ハードウェアの概略構成]
図1は、ノートブック型またはラップトップ型のPC10の主要なハードウェアの構成を示す機能ブロック図である。多くのハードウェアの構成は周知であるため、本発明の理解に必要な範囲で説明する。チップセット13はさまざまな規格のインターフェース機能を備えており、CPU11、システム・メモリ(RAM)15、GPU17、HDD21、USBコネクタ23、有線または無線のLANに接続するためのネットワーク・モジュール25、およびキーボード29などが接続されている。GPU17にはLCD19が接続されている。さらにチップセット13が含む、SPI(Serial Peripheral Interface)コントローラ14にはファームウェアROM100が接続されている。
【0016】
システム・メモリ15のメモリ空間には、システムの電源が起動したときにSMRAM領域15aが確保される。SMRAM領域15aは、CPU11がシステム・マネジメント・モード(SMM)で動作するときに実行するコードをロードする領域である。HDD21はブート・デバイスで、UEFI規格に対応するOSのブート・イメージを格納する。
【0017】
HDD21のブート・セクタは、OSのブート・イメージをロードするためのUEFI_OSローダー163(図3)を格納する。USBコネクタ23には、外付けのUSBメモリ、USB_CD、USB_FDD、USB_HDDなどのUSBデバイスを接続することができる。PC10は、USBコネクタ23に接続されたブート・イメージを格納するUSBデバイスからブートすることもできる。PC10は、PXE(Preboot eXecution Environment)などの機能により、ネットワーク・モジュール25を通じてOSのブート・イメージを受け取ってPXEブートすることもできる。
【0018】
[ファームウェアROMのデータ構造]
図2は、ファームウェアROM100のデータ構造を示す図で、図3はシステム・メモリ15にロードされて実行状態にあるソフトウェアの階層構造を示す図である。ファームウェアROM100は、不揮発性で記憶内容の電気的な書き替えが可能なフラッシュ・メモリで、一例としてコード領域101、変数領域103〜109およびデータ領域111からなる記億ブロックに区分している。変数領域103〜109およびデータ領域111の記億ブロックは、ファームウェアROM100とは異なる不揮発性メモリに設けてもよい。
【0019】
コード領域101は、UEFIファームウェア150およびUEFIアプリケーション165のコードを格納する。変数領域103はデフォルトGV151を格納し、変数領域105は保護対象GV153と非保護対象GV155からなるGVを格納する。なお、以下において保護対象GV153と非保護対象GV155を区別しないときは単にGVと称する。変数領域107はConfiguration Variables(CV)157を格納し、変数領域109はUser Variables(UV)159を格納する。データ領域111は制御リスト161を格納する。
【0020】
最初に変数領域103〜109が格納する変数について説明する。デフォルトGV151はUEFIベンダーが書き込んだGVで、システムの動作に異常が発生した場合や何らかの理由で必要がある場合にユーザがシステムを初期化するために利用する。本実施の形態ではデフォルトGV151を、ブートごとに変数領域105のGVを置換するためには利用しない。
【0021】
GVはUEFI規格において定義されており、UEFIファームウェア150、UEFIアプリケーション165、OS167およびOSアプリケーション169(図3)のいずれからもアクセスできることが保証されている。なお、以下においてはOS167と称した場合にOSアプリケーション169も含む場合がある。GVに対するアクセスは、新たなGVの書き込み、変更、削除および読み取りなどに相当する。GVの書き込み、変更および削除は、オリジナル・バリアブル・サービス150bまたは新バリアブル・サービス150fのファンクションを構成するSetVariableという関数を呼び出す。
【0022】
GVの読み取りはオリジナル・バリアブル・サービス150bまたは新バリアブル・サービス150fのファンクションを構成するGetVariableという関数を呼び出す。保護対象GV153は、一例としてBoot####、BootOrder、BootNext、Driver####、DriverOrderといったブート・デバイスの種類とその選択順位、デバイス・ドライバの種類とその選択順位といったようなブートに関連する変数を含む。さらに保護対象GVは、ConIn、ConOutといった入出力デバイスまでのパスのようなハードウェアの構成に関連する変数を含む。
【0023】
保護対象GV153がUEFIファームウェア150以外のプログラムによって書き換えられるとシステムが正常に起動できなくなる可能性がある。GVの問題がある改変は、OS167、UEFIアプリケーション165またはマルウェアがSetVariableを呼び出したときに発生する。保護対象GV153は、問題がある改変から保護する対象となる変数に相当する。
【0024】
ユーザは、UEFIファームウェア150のセット・アップ画面を通じて保護対象GV153を改変することができる。この場合、UEFIファームウェア150が認識しているため問題がある改変には相当しない。GVの保護は、UEFIファームウェア150がブートルーチンを実行するためにアクセスする場所の一例である変数領域105に格納した保護対象GV153が、UEFIファームウェア150以外のプログラムによって改変されないようにすることを意味する。
【0025】
本実施の形態では、図4図7で説明するようにGVを保護しながらOS167が所定の動作のために必要な保護対象GV153にアクセスすることを可能にする。非保護対象GV155は、保護対象GV153以外のGVで、ブートやハードウェアの構成に関係しない変数に相当する。非保護対象GV155は、UEFIファームウェア150がブートルーチンを実行する際に、変数領域105にUEFIファームウェア150以外のプログラムで改変された状態で存在してもよい。
【0026】
CV157は、UEFIファームウェア150が、ブートの際にデバイスの認識や初期化などの処理をするために、変数領域107に書き込んだ変数に相当する。CV157は、UEFIファームウェア150のベンダーが定義する。UEFIファームウェア150は、オリジナル・バリアブル・サービス150bを利用してCV157を書き込むことができる。
【0027】
CV157はUEFIファームウェア150が設定するデバイスの属性情報およびデバイスに設定するパラメータ、セット・アップ画面を呼び出してユーザが設定したデバイスの種類、デバイスの動作モード、およびデバイスの有効/無効などの設定情報、ブート・イメージが格納されているパーティションのパスやロードするOSの種類などの情報を含む。CV157はブートに不可欠な変数を含むが、UEFI規格では公開性が要求されないので変数領域107をライト・ロックしてOS167やマルウェアによる改変から保護することができる。
【0028】
UV159は、OS167、UEFIアプリケーション165が、その実行に際して自らをカスタマイズするための環境変数や、デバッグ・ログまたはエラー・ログのようなダンプ・ファイルをUEFI規格の制約を受けないで自由に書き込む変数に相当する。UEFIファームウェア150は、オリジナル・バリアブル・サービス150bを利用してUV159を書き込むことができる。
【0029】
本実施の形態では、コード領域101、変数領域103、107およびデータ領域109に、チップセット13のSPIコントローラ14においてライト・ロックが可能な記録領域を割り当てている。ライト・ロックが実行された記録領域に対しては、チップセット13がリセットされるまですべてのプログラムの書き込みが禁止される。UEFIファームウェア150は、ブートの際に安全が保証されたコードから、他のコードにCPU11の制御権を渡す前にファームウェアROM100のコード領域101、変数領域103、107およびデータ領域111をライト・ロックすることができる。
【0030】
UEFIファームウェア150は、初期化コード150a、オリジナル・バリアブル・サービス(Variable Services)150b、ブート・マネージャ150c、セット・アップ・コード150d、GV制御コード150e、新バリアブル・サービス150f、およびUEFIドライバ150gを含む。UEFIファームウェア150は一例において、書き換えに伴うリスクを軽減するためにブート・ブロック方式を採用することができる。ブート・ブロック方式では、初期化コード150aを格納する領域をブート・ブロックに設定する。ブート・ブロックに格納されたコードはTPM(Trusted Platform Module)の仕様書に規定するCRTM(Core Root Of Trust Measurement)として扱われ特別な権限がないと書き換えができないようになっている。
【0031】
CRTMは、プラットフォームの初期化コードの中で完全性が保証されている部分として構成され、プラットフォームのリセット時には必ず最初に実行される。CRTMは、PC10がACPIに規定するハイバネーション状態(S4ステート)またはパワー・オフ状態(S5ステート)からパワー・オン状態(S0ステート)に遷移するための動作プロセスであるいわゆるコールド・ブートのときに必ず最初に実行される。
【0032】
初期化コード150aは、PC10がコールド・ブートをする際に、システム・メモリ15にUEFIファームウェア150をロードして実行を開始するために必要なCPU11、システム・メモリ15およびその他の基本的なデバイスの検出、検査および初期化を必要な範囲で行う。初期化コード150aはまた、CPU11がリセットしてから、UEFI_OSローダー163に制御が移行するまでの期間にチップセット13のコントローラや周辺デバイスなどの所定のデバイスを初期化して使用できる状態にする。初期化コード150aは、UEFIファームウェア150のコードのオリジナルからの一貫性または完全性を検査して改竄を発見した場合はブートを停止する。
【0033】
オリジナル・バリアブル・サービス150bは、変数領域105に格納したGVにアクセスするためのGetVariable、 GetNextVariableName、SetVariableなどのファンクションを含む。ブート・マネージャ150cは、ブート処理およびパスワード認証処理などを行う。ブート・マネージャ150cは、UEFIファームウェア150によるブートルーチンが終了すると、UEFIアプリケーション165、およびUEFI_OSローダー163をシステム・メモリ15にロードする。ここに、システムがコールド・ブートしてからUEFIファームウェア150以外のコードにCPU11の制御権が移るまでの動作状態をプリブートという。
【0034】
プリブートは、CRTMにより一貫性が検証されたコードを実行する動作状態ということができる。プリブートはあるいはSPIコントローラ14によりコード領域101がライト・ロックされるまでの動作状態ということもできる。プリブートの間は、安全性が確保されたUEFIファームウェア150だけが変数領域105のGVを改変することができる。ブート・マネージャ150cは、プリブートが終了してUEFIファームウェア150からOS167にCPU11の制御権が移る直前に、UEFI_OSローダー163をシステム・メモリ15に読み出して完全性の検証をすることができる。
【0035】
本明細書でブートとは、電源が起動してからプリブートを経由してOS167のロードが完了した状態になるまでの一連の処理をいう。UEFI_OSローダー163には作成者が計算したハッシュ値を秘密鍵で暗号化した電子署名が付されている。ブート・マネージャ150cは、UEFI_OSローダー163のコードから計算したハッシュ値と、署名データ・ベースから取得した公開鍵で復号して得た電子署名のハッシュ値を比較して、一致していれば完全性が維持されていると判断してUEFI_OSローダー163の実行を許可する。
【0036】
セット・アップ・コード150dは、プリブートの段階でキーボード29の所定のファンクション・キーが押下されたたときに、LCD19にセット・アップ画面を表示する。ユーザはセット・アップ画面を通じて、ブート・デバイスの優先順位の決定、起動方法の設定、使用デバイスの設定、パスワードの設定およびパワー・マネジメントの設定などをすることができる。
【0037】
セット・アップ・コード150dは、セット・アップ画面を通じて入力された設定情報を一例として変数領域107にCVとして書き込む。セット・アップ・コード150dを通じて行われる保護対象GVの改変は、UEFIファームウェア150が認識しているのでブートルーチンに問題を生じさせない。また、UEFIアプリケーション165とOS167は、独自の必要性に基づいてGVを改変することができる。
【0038】
その結果、保護対象GV153の改変がUEFIファームウェア150のブートルーチンに影響を与える場合があるため、本実施の形態では、UEFIアプリケーション165やOS167による改変から変数領域105の保護対象GV153を保護する。他方で、OS167が保護対象GV153を改変しないと意図する動作環境を構築できない場合がある。このような状況に対処するために、セット・アップ画面は、本実施の形態にかかるGVの保護機能に対してイネーブル/ディスエーブルの設定をするメニューを含む。イネーブル/ディスエーブルの設定情報は、ファームウェアROM100の所定の場所に記録される。
【0039】
GV制御コード150eは、図4図7の手順で説明するGVの保護のための処理をする。新バリアブル・サービス150fは図6図7で説明するように、OS167やUEFIアプリケーション165がSMRAM領域15aにコピーした保護対象GV153にアクセスするためのGetVariable、GetNextVariableName、SetVariableなどのファンクションを含む。UEFIアプリケーション165は、UEFIファームウェア150の上層で動作し、UEFIドライバ150gは、UEFIファームウェア150が特定のハードウェアにアクセスするための処理をする。制御リスト161は、保護対象GV153の識別子(VendorGuidおよびVariableName)を記述する。
【0040】
[保護対象GVの改変を禁止する手順]
図4図7は、UEFIファームウェア150がGVを保護する手順の一例を示すフローチャートである。図4のブロック201で、PC10の電源が起動してシステムがコールド・ブートを開始する。このとき図2に示すように、変数領域105には、保護対象GV153と非保護対象GV155が格納され、変数領域107にはCV157が格納され、変数領域109にはUV159が格納され、データ領域111には、制御リスト161が格納されている。図6で詳細に説明するブロック217の手順があるため、変数領域105が格納する保護対象GV153は、前回のブートで改変されていないことが保証されている。
【0041】
パワー・オン・リセットしたチップセット13は、ブロック203でSPIコントローラ14に設定していたファームウェアROM100のコード領域101、変数領域103、107およびデータ領域111に対するライト・ロックを解除する。つづいてブロック205で初期化コード150aがプリブートに必要なデバイスを初期化すると、UEFIファームウェア150がシステム・メモリ15にロードされる。初期化コード150aはつづいて変数領域105が格納する保護対象GV153、および変数領域107が格納するCV157を参照して、必要な範囲でその他のデバイスを初期化する。つづいてUEFIファーウェア150はPOST(Power On Self-Test)を開始する。
【0042】
プリブートの間ブロック207でUEFIファームウェア150は、変数領域105のGVを改変する。UEFIファームウェア150は、初期化コード150aによって一貫性が検証されているか、OSの動作環境ではSPIコントローラ15aのライト・ロックによって保護されているためマルウェアによる汚染の恐れがなく、保護対象GV153が改変されても次回のプリブートに支障をきたすことはない。ブロック208で、ユーザはセット・アップ画面を呼び出してGVの保護機能をイネーブルまたはディスエーブルに設定することができる。
【0043】
ブロック209でGV制御コード150eは、変数領域105が格納するGVのなかで保護対象GV153だけを、システム・メモリ15のSMRAM領域15aのような代替メモリにコピーする。システム・メモリ15は書き込み速度が速いため代替メモリとして望ましいが、退避先をシステム・メモリ15に限定する必要はない。また、代替メモリにコピーする保護対象GV153は次回のプリブートで使用しないため、代替メモリは揮発性メモリでも不揮発性メモリでもよい。保護対象GV153をコピーするタイミングは、UEFIファームウェア150による保護対象GV153の改変が終了してからプリブートが終了するまでの間とすることができる。
【0044】
図5は、図4のブロック209の手順の一例を示すフローチャートである。ブロック213でプリブートの終了のタイミングを認識したGV制御コード150eはブロック233で、オリジナル・バリアブル・サービス150bのGetNextVariableNameを呼び出して変数領域105からGVを読み取る。GetNextVariableNameは、システムにおいて利用可能なGV、CV、UVすべての変数を列挙する関数で、呼び出されたときに保持する変数の次の変数の識別子をGV制御コード150eに戻す。GetNextVariableNameは、GV、CV、UVのすべての識別子を戻したあとにさらに呼び出されたときはエラーを戻す。ブロック235でGV制御コード150eは、オリジナル・バリアブル・サービス150bからエラーを受け取ったときにGV、CV、UVのすべての変数を読み取ったと判断してブロック241で終了する。
【0045】
オリジナル・バリアブル・サービス150bから変数の識別子を受け取ったGV制御コード150eはブロック237で、制御リスト161を参照して読み出したGVが制御リスト161に登録された保護対象GV153であるか否かを判断する。保護対象GV153であると判断したときはブロック239に移行し、非保護対象GV155であると判断したときはブロック233に戻る。ブロック239でGV制御コード150eは、当該保護対象GV153をSMRAM領域15aにコピーしてからブロック233に戻る。
【0046】
GV制御コード150eはブロック233でさらにGetNextVariableNameを呼び出して、次の変数の識別子を取得してブロック237で保護対象GV153であるか否かを判断する。ブロック231〜241の手順を実行すると変数領域105に格納されたGVのなかで、保護対象GV153がすべてSMRAM領域15aにコピーされる。
【0047】
SMRAM領域15aへのコピーは、他の方法でも行うことができる。たとえば、変数領域105を保護対象GV153だけを格納する記憶ブロックと非保護対象GV155だけを格納する記憶ブロックに区分する。コピーの際には、保護対象GV153だけを格納する記憶ブロックのアドレスを指定する。この方法によれば、制御リスト161を利用しないですべての保護対象GV153をコピーすることができる。
【0048】
図4に戻ってブロック211でGV制御コード150eは、プリブートが終了する直前に、コード領域101、変数領域103、107およびデータ領域111をライト・ロックするためにチップセット13のSPIコントローラ14を設定する。ブロック213でプリブートが終了すると、ブロック215で、ブート・マネージャ150cは、コード領域101からシステム・メモリ150にUEFIアプリケーション165をロードし、HDD21の所定のセクタからUEFI_OSローダー163をロードする。
【0049】
やがてOS167がロードされてPC10はOSブート状態に移行する。ブロック217でOS167はGVにアクセスすることができる。ブロック217の手順の詳細は図6を参照して説明する。ブロック219でパワー・オフ状態に遷移したあとに、ブロック201に戻って次回のコールド・ブートをする。このときブロック217の手順で、変数領域103の保護対象GV153が保護されているため次回のプリブートが失敗することはない。
【0050】
図6は、図4のブロック217の手順の一例を示すフローチャートである。ブロック251でUEFIファームウェア150、UEFIアプリケーション165、OS167のいずれかに相当するコーラーがGetVariable、またはSetVariableを呼び出してGVにアクセスする。ブロック253〜256は、GVの保護条件の判断に相当する。ブロック253でGV制御コード150eは、アクセスがプリブート中に行われたと判断したときはブロック261に移行し、プリブートが終了した後に行われたと判断したときはブロック255に移行する。
【0051】
ブロック253からブロック261に移行するときは、保護対象GV153と非保護対象GV155のいずれかがアクセスの対象になっている。プリブートが終了したあとの動作環境で、変数領域105が格納する保護対象GV153の改変を許可すると、次回のブートに問題がでる可能性があるため、GVの保護機能は原則としてイネーブルに設定することが望ましい。しかし、ユーザが保護対象GV153の安全性を考慮した上で、変数領域105の保護対象GV153の改変を許可する必要がある場合もある。
【0052】
たとえば、OS167をローカルのブート・デバイスからブートするように保護対象GV153に設定しているときに、ネットワークを経由してPXEブートをしたい場合がある。このとき、OS167が変数領域105の保護対象GV153のブート・オーダーを改変しないとリモート・ブートは実現できない。また、ウィルス対策ソフトの中には、プリブートの終了後にOSより先にロードして実行するものがある。この場合も、ウィルス対策ソフトによる変数領域153の保護対象GV153の改変を許容する必要がある。
【0053】
OS167が変数領域105の保護対象GV153を改変する必要があるときにユーザはセット・アップ画面を通じてGVの保護機能をディスエーブルに設定する。ブロック255でGV制御コード150eはファームウェアROM100に記録された設定情報からGVの保護機能を判断する。GV制御コード150eは、GVの保護機能がイネーブルに設定されているときはブロック256に移行し、ディスエーブルに設定されているときはブロック261に移行する。
【0054】
ブロック255からブロック261に移行するときは、保護対象GV153と非保護対象GV155のいずれかがアクセスの対象になっている。ブロック256でGV制御コード150eは、制御リスト161を参照して、コーラーがアクセスするGVが保護対象GV153と判断したときはブロック257に移行し、非保護対象GV155と判断したときはブロック261に移行する。ブロック257でGV制御コード150eは、新バリアブル・サービス150fにコーラーから要求されたGVの識別子を渡す。
【0055】
ブロック259で新バリアブル・サービス150fは、SMRAM領域15aにコピーされた保護対象GV153にアクセスしてコーラーに識別子を返す。ブロック261でGV制御コード150eは、オリジナル・バリアブル・サービス150bにコーラーから要求されたGVの識別子を渡す。ブロック263でオリジナル・バリアブル・サービス150bは、変数領域105の非保護対象GV155にアクセスしてコーラーに戻り値を返す。
【0056】
図6の手順では、GVの保護条件が成立したときは、SMRAM領域15aにコピーされた保護対象GV153はOS167によって改変されるが、変数領域105の保護対象GV153は改変されない。OS167はアクセス先をSMRAM領域15aに指定する必要はなく、オリジナル・バリアブル・サービス150bにアクセスするのと同じ手順で保護対象GV153を改変しさらに改変した保護対象GV153を読み取って動作することができる。
【0057】
OS167は、保護対象GV153を改変しないと、インストールができない場合がある。たとえば、変数領域105の保護対象GV153にPXEブートを第1順位として設定した状態でOS167をインストールするときに、OS167は自らをブートの第1順位に設定しないとインストールが失敗することがある。図6の手順によれば、OS167はSMRAM領域15a上でブートの順位を設定してインストールを成功させることができる。しかし変数領域105の保護対象GV153は改変されていないため、UEFIファームウェア105はその後PXEブートをすることができる。
【0058】
OS167は変数領域105に記憶された非保護対象GV155を改変することができるが、非保護対象GV155の改変はシステムの動作に障害をもたらすことはない。図6の手順では、保護対象GV153をSMRAM領域15aにコピーする時間が必要になるが、SMRAM領域15aへのコピーは変数領域105をデフォルトGV151で書き換えるよりも短い時間で終了できるためブート時間の遅延問題は生じない。
【0059】
図4のブロック219でパワー・オフ状態に遷移すると、SMRAM領域15aの保護対象GV153は消去される。OS167は、保護対象GV153を改変したつもりでも変数領域105の保護対象GV153は改変されなかったことになる。しかし、OS167が変数領域105の保護対象GV153を改変したとしても、次回のプリブートでユーザがセット・アップ画面を通じて当該保護対象GV153を改変するかもしれない。
【0060】
OS167は通常、変数領域105に格納された保護対象GV153を前回のブートで書き換えていたとしても、確実にみずからの環境設定をするために今回のブートでも保護対象GV153を改変する処理をする。したがって、OS167はブートごとに同じ改変の手順を繰り返すためSMRAM領域15aの保護対象GV153が消去されても次回のブートで追加的な処理が発生することはない。
【0061】
図4図6の手順では、OS167による変数領域105の保護対象GV153の改変を禁止し、非保護対象GV155の改変を許可した。ここでOS167による変数領域105の非保護対象GV155の改変を禁止することも考えられる。しかし、非保護対象GV155の改変は、UEFIファームウェア150のブートルーチンに支障がなく、むしろ、OS167が意図する動作環境を維持したほうが望ましいため、本実施の形態では、OS167による非保護対象GVの改変を許可している。
【0062】
また、保護対象GV153と非保護対象GV155を一旦SMRAM領域15aにコピーして、いずれに対する改変もSMRAM領域15aで行い、パワー・オフ状態に遷移する際に、改変された非保護対象GV155だけを変数領域105に書き込むようにすることも考えられる。このとき、突然電源が遮断してSMRAM領域15aのデータが消失したときに、改変した非保護対象GV155が消失するが本実施の形態ではそのような事態が生ずることはない。
【0063】
図4図6に示した手順は本発明を説明するための例示であり、すべてが本発明の必須の手順ではない。本発明の必須の手順は特許請求の範囲に記載するとおりである。また、各ブロックの順番も、図4図6に示した順番に限定するものではない。たとえば、図6のブロック253〜256の手順は任意の順番にしてもよい。本発明は、図1に示したハードウェアと図2図3に示したソフトウェアの協働により構成するハードウェア要素で実現したシステムとして捉えることもできる。
【0064】
これまで本発明について図面に示した特定の実施の形態をもって説明してきたが、本発明は図面に示した実施の形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができることはいうまでもないことである。
【符号の説明】
【0065】
10 PC
15 システム・メモリ
15a SMRAM領域
100 ファームウェアROM
101 コード領域
103、105、107、109 変数領域
150 UEFIファームウェア
150b オリジナル・バリアブル・サービス
150f 新バリアブル・サービス
153 保護対象GV
155 非保護対象GV
【要約】
【課題】UEFIファームウェアが参照するGVを保護しながらOSの動作を確保する。
【解決手段】ファームウェアROM100には、UEFIファームウェア150、保護対象GV153および非保護対象GV155が格納されている。保護対象GV153および非保護対象GV155は、UEFIファームウェアがプリブートをするために参照する。OSはプリブートの終了後にみずからの動作環境を構築するために保護対象GVを改変することができる。ファームウェアROMに記録された保護対象GV153は、ブートやシステムの構成に関連するデータを含むためOSにより改変されると次回のプリブートが失敗することがある。UEFIファームウェアは、プリブートが終了する前に保護対象GVをシステム・メモリにコピーする。プリブートの終了後のOSによる保護対象GVに対するアクセスはシステム・メモリ上で処理する。
【選択図】図2
図1
図2
図3
図4
図5
図6