説明

システム管理モードの特権レベルを保護するコンピュータ

【課題】コンピュータのSMM特権を保護する。
【解決手段】メイン・メモリのSMRAM領域にSMMコードをロードし、一般領域にビデオBIOSとシステムBIOSをロードする。あらかじめビデオBIOSのハッシュ値を計算し、INT10hのベクタ・アドレスを取得してSMRAMに格納しておく。SMIがアサートされて認証コードが実行され、認証コードがINT10h命令でビデオBIOSを呼び出す際には事前にハッシュ値を計算して正当性を検証し、さらに、ベクタ・テーブルをあらかじめ取得しておいたベクタ・アドレスで書き換えて、INT10h命令で正当なビデオBIOSが実行されるようにする。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータ・システムの動作モードであるシステム管理モードの特権レベルを保護する技術に関する。
【背景技術】
【0002】
インテル(登録商標)では、同社のプロセッサとチップ・セットを使用してコンピュータを不正プログラムから保護するために、セキュリティ機能を強化するTXT(Intel Trusted Execution Technology)という保護メカニズムを提供している。TXTでは、同社のX86シリーズのプロセッサにおいて、システム管理モード(SMM)という動作モードを採用している。SMMは、コンピュータの電源、温度およびその他の制御のために、オペレーティング・システム(OS)から独立した動作環境を提供することを目的にしている。
【0003】
OS動作環境におけるプロテクト・モードでは、カーネル・コードの実行を許可するリング0からユーザ・プログラムの実行を許可するリング3までの4つの特権レベルを提供する。これに対しSMMは、システム管理割り込み(SMI)がアサートされたときに専用の保護されたメモリ領域にロードされたコードが実行される動作モードでOS動作環境におけるプロテクト・モードのリング0の特権レベルに類似する特権レベルを提供する。したがって、SMMの特権レベル(以下、SMM特権という。)を不正プログラムが取得すると、コンピュータの枢要なコードが書き換えられてしまい、かつ、OSはSMM特権をどのプログラムが利用しているのか認識できないのでシステムの安全上大きな脅威になる。近年、非特許文献1のような論文がSMMの脆弱性を発表している。
【0004】
特許文献1は、認証されていないBIOSイメージでフラッシュBIOSが書き換えられることを防止する技術を開示する。同文献の発明では書き換え前にBIOSイメージを認証するSMIハンドラが、システム管理メモリ部分に格納される。BIOSイメージのSMIハンドラによってのみ知られたオフセットに秘密のチェック・サムを埋め込んでおくことで、SMIハンドラは、適切なBIOSイメージであることを確認する。特許文献2は、プログラムからの通知に基づいてSMMに移行し、メモリの保護領域でセキュリティ処理を行うことで機密情報を扱う通信の秘匿性を確保する技術を開示する。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2001−75828号公報
【特許文献2】特開2008−500655公報
【非特許文献】
【0006】
【非特許文献1】Attacking Intel Trusted Execution Technology ( http://invisiblethingslab.com/itl/Resources.html )
【発明の概要】
【発明が解決しようとする課題】
【0007】
OS動作環境におけるプロテクト・モードで実行されるプログラムは、SMIをアサートしてSMMに移行することができる。しかし、SMIがアサートされたときにはメイン・メモリの一部に確保されたシステム管理RAM(SMRAM)という領域にロードされたSMMコードが実行されるようにハードウエアが構成されているため、不正プログラムはSMIをアサートできてもSMMコードを書き換えることができない。また、SMMコードはBIOS_ROMにセキュアに格納されているため、SMMコードの正当性は一貫して保証される。よって、SMMでSMRAM領域にロードされたコードだけが実行される場合は、不正プログラムがSMM特権を支配することはない。
【0008】
しかし、SMMではSMRAM領域にロードされたコードだけでなく、ハードウエアで保護されない一般領域にロードされたコードをSMMコードが呼び出す場合もある。そして一般領域にロードされたコードはコンピュータがOS動作環境におけるプロテクト・モードで動作している間に不正プログラムにより書き換えられる可能性がある。不正プログラムにより書き換えられた汚染コードもSMMコードから呼び出されてSMMで動作することがあるため、SMM特権が不正プログラムにより支配されてしまう可能性がある。図6は、SMM特権が不正プログラムで支配される様子を説明する図である。ここでは、SMMコードであるパスワードの認証コードがメイン・メモリのSMRAM領域にロードされ、ベクタ・テーブル、ビデオBIOSおよびシステムBIOSが一般領域にロードされている。そして、一般領域のコードやデータは不正プログラムによる書き換えが可能であると想定する。
【0009】
SMMで動作する認証コードは、パスワード入力のためのプロンプトを画面に表示するために、ビデオBIOSを呼び出す必要がある。このときINT10命令でベクタ・テーブルからベクタ・アドレスを取得するが、ベクタ・アドレスが不正プログラムにより不正コードのアドレスに書き換えられることが予想される。また、ビデオBIOSが、システムが保有する情報を取得するためにさらにINT15命令でベクタ・アドレスを取得して、システムBIOSを呼び出す場合も、ベクタ・アドレスが不正プログラムにより書き換えられることが予想される。SMMで動作するコードは、すべてのI/Oポートに何ら制約を受けることなくアクセスすることができる。そしてSMMで動作した不正プログラムにより、SMM特権を利用してシステムに攻撃が加えられる。OSは不正プログラムによるメイン・メモリにロードされたプログラムやコードの改変を監視する機能も備えているが、OSはCPUがSMMで動作していることを認識できないのでその機能を利用することができない。
【0010】
これを防ぐには、一般領域にロードされるコードのなかで、SMMで動作する間に呼び出される可能性があるすべてのコードのハッシュ値を毎回計算して汚染されていないときのハッシュ値と比較することが考えられる。しかし、ハッシュ値の計算には時間がかかるため、オーバヘッドが大きくなって好ましくない。また、一般領域にロードされるコードをすべてSMRAM領域にロードすることも考えられる。しかし一般領域にロードされるコードもプロテクト・モードで動作するOSに対してサービスを提供する必要がある一方で、OSはSMIをアサートするインタフェースを備えていないので、一般領域にも同じコードをロードしておく必要がありメイン・メモリを無駄に消費したり更新が煩雑になったりする。
【0011】
そこで本発明の目的は、SMM特権を保護することができるコンピュータ・プログラムを提供することにある。さらに本発明の目的は、SMM特権を小さなオーバヘッドで保護することができるコンピュータ・プログラムを提供することにある。さらに本発明の目的は、SMM特権を保護することができるコンピュータを提供することにある。
【課題を解決するための手段】
【0012】
本発明では、プロセッサがSMMで動作する間にSMRAM領域以外の一般領域にロードされている汚染されたプログラムが実行されてSMM特権が支配されることを防ぐコンピュータ・プログラムを提供する。本発明の原理は、SMMにおいてSMMプログラムが一般領域にロードされた第1のプログラムを呼び出して、または第1のプログラムを経由して第2のプログラムを呼び出して実行するときに、SMMプログラムがそれらのプログラムの正当性を検証してから、または安全性を確保してから呼び出す点にある。そして本発明はそのような正当性の検証または安全性の確保を小さなオーバヘッドで行うことができる。
【0013】
SMMプログラム、第1のプログラム、第2のプログラムおよびベクタ・テーブルは、メイン・メモリにロードされる前は正当性が保証されている。メイン・メモリのSMRAM領域にはSMMプログラムがロードされ、一般領域には第1のプログラム、第2のプログラムおよびベクタ・テーブルがロードされる。SMMプログラムは正当性が保証された状態でロードされている第1のプログラムの基準ハッシュ値を計算する。基準ハッシュ値はオペレーティング・システムの環境で動作する不正プログラムにより第1のプログラムが汚染されていないことを検証するために計算する。コンピュータの電源が起動してからBIOSだけが動作している間は、BIOSの正当性が保証されている限り不正プログラムからの攻撃はないので、基準ハッシュ値の計算は安全な環境であるブートの完了前に行うことができる。
【0014】
コンピュータがオペレーティング・システムの環境で動作すると、一般領域にロードされた第1のプログラム、第2のプログラムおよびベクタ・テーブルが不正プログラムで汚染される可能性がでてくる。したがって、SMMプログラムは第1のプログラムを呼び出すときには、事前にそれらの正当性および安全性を検証する必要がある。本発明ではSMMプログラムが、コンピュータがオペレーティング・システムの環境で動作したあとに計算した第1のプログラムのハッシュ値と基準ハッシュ値を比較する。そして計算したハッシュ値と基準ハッシュ値が一致した場合にSMMプログラムが第1のプログラムを呼び出す。
【0015】
第1のプログラムの正当性が検証できたとしても、不正プログラムによりベクタ・アドレスが書き換えられてSMMプログラムが第1のプログラムをINT命令などで呼び出したときに、不正プログラムを呼び出す可能性がある。それを防ぐためにまず、オペレーティング・システムが動作する前にベクタ・テーブルから取得した第1のプログラムを呼び出す割り込みタイプに対応する信頼できるベクタ・アドレスをあらかじめSMMプログラムがSMRAM領域に記憶しておく。ここで、オペレーティング・システムが動作する前とは、メイン・メモリにロードされたプログラムが不正プログラムにより汚染される環境で動作する前という意味であり、メイン・メモリにロードされたプログラムの記憶が維持された状態でオペレーティング・システムの動作環境から他の動作環境に移行し、さらにオペレーティング・システムの動作環境に戻る場合における他の動作環境は含まない。
【0016】
そして、第1のプログラムを呼び出す前に第1のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスをSMMプログラムがSMRAM領域に記憶しておいたベクタ・アドレスで書き換えることで、SMMプログラムが安全に第1のプログラムを呼び出せるようにすることができる。よって、SMMプログラムは、第1のプログラムを呼び出すことでSMM特権が不正プログラムにより支配されることを防ぐことができる。第1のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスは、SMMプログラムが第1のプログラムを呼び出す前に正当なプログラムにより書き換えられている可能性がある。したがって、第1のプログラムを呼び出したあとには、第1のプログラムを呼び出す割り込みタイプに対応する書き換えられたベクタ・アドレスをベクタ・テーブルに戻しておくことが望ましい。
【0017】
またSMMにおいてINT命令などで呼び出された第1のプログラムが第2のプログラムをINT命令などで呼び出す場合がある。このとき第2のプログラムを呼び出す命令の実行によりSMM特権が不正プログラムにより支配されないようにする必要がある。第2のプログラムは、SMMで動作する間に第1のプログラムから呼び出されるときには、必ずしもその時点で第1のプログラムの要求に応える必要がないプログラムである。しかし、第1のプログラムはOS動作環境におけるプロテクト・モードで第2のプログラムを呼び出すときは第2のプログラムの実行が必要なので第1のプログラムから第2のプログラムを呼び出す命令コードを削除することはできない。本発明では、SMMで第1のプログラムから第2のプログラムを呼び出す命令が実行されたときには、第2のプログラムが実質的な命令コードを実行しないでIRET命令などのような第1のプログラムに戻る命令だけを実行するようにベクタ・アドレスおよび第1のプログラムに戻る命令コードまたはそれらのいずれか一方を書き換えることができる。
【0018】
その結果、第2のプログラムおよびベクタ・テーブルまたはいずれか一方が汚染されていても、第2のプログラムを呼び出したときに汚染コードを実行することなく第1のプログラムに戻ることがSMMプログラムにより保証されるので、第1のプログラムから第2のプログラムを呼び出す命令を実行してもSMM特権が不正プログラムにより支配されることはない。第2のプログラムは、コンピュータがオペレーティング・システムの動作環境であるプロテクト・モードで動作するときにさまざまなプログラムから呼び出される。したがって、第1のプログラムが第2のプログラムを呼び出す命令を実行したあとには、書き換えたベクタ・アドレスおよび第1のプログラムに戻る命令コードまたはそれらのいずれか一方を書き換える前の状態に戻しておくことが望ましい。
【0019】
SMMプログラムはパスワード認証を行うプログラムとすることができる。また、SMMプログラムによる第1のプログラムのハッシュ値の計算と第1のプログラムの呼び出しは、コンピュータがサスペンドからレジュームする間に行うことができる。
【発明の効果】
【0020】
本発明により、SMM特権を保護することができるコンピュータ・プログラムを提供することができた。さらに本発明により、SMM特権を小さなオーバヘッドで保護することができるコンピュータ・プログラムを提供することができた。さらに本発明により、SMM特権を保護することができるコンピュータを提供することができた。
【図面の簡単な説明】
【0021】
【図1】本実施の形態にかかるコンピュータの主要な構成を示すブロック図である。
【図2】メイン・メモリに本実施の形態の説明に必要なプログラムがロードされた様子を示す図である。
【図3】SMM特権を保護する手順を示すフローチャートである。
【図4】SMM特権を保護する手順を示すフローチャートである。
【図5】メイン・メモリの状態を示す図である。
【図6】SMM特権に対して予想される攻撃シナリオを説明する図である。
【発明を実施するための形態】
【0022】
[ノートPCの構成]
図1は、本実施の形態にかかるコンピュータ10の主要な構成を示すブロック図である。図1(A)は全体の構成を示し、図1(B)はCPUとSMIに関連する部分的な構成を示す。本明細書の全体に渡って、同一の要素には同一の参照番号を付与する。CPU11は、インテル(登録商標)のX86シリーズのアーキテクチャで構成され、プロテクト・モードに加えてSMMで動作することができる。メモリ・コントローラ・ハブ(MCH)13は、メイン・メモリ15へのアクセス動作を制御するためのメモリ・コントローラ機能、およびCPU11と他のデバイスとの間のデータ転送速度の差を吸収するためのデータ・バッファ機能を含むチップ・セットである。MCHはSMIの発生要因を設定するSMIレジスタ14を含む。
【0023】
CPU11がプログラムを実行したり、マザーボードに実装されたハードウエアが温度や電源に関するイベントを生成したりしてSMIレジスタ14を設定することでMCH13はSMI信号をCPU11のSMIピンに送りCPU11をSMMで動作させる。MCH13はCPU11がSMMで動作していることをSMIACTピンを通じて受け取ることで、メイン・メモリ15に対するアクセスをハードウエアにより制御してSMM環境を構築する。MCH13は、CPU11がSMMで動作している間は、SMRAM領域(図2)にロードされたコードがOSやアプリケーション・プログラムにより書き換えられないように保護する。MCH13にはCPU11、メイン・メモリ15、グラフィック・プロセッシング・ユニット(GPU)17、およびアイオー・コントローラ・ハブ(ICH)23が接続されている。
【0024】
メイン・メモリ15は、CPU11が実行するプログラムの読み込み領域、処理データを書き込む作業領域として利用される揮発性のRAMである。メイン・メモリ15には、一般領域に加えてCPU11がSMMで動作するときに実行するコードをロードするための領域であるSMRAM領域が定義されている。GPU17には、ビデオ・メモリ(VRAM)21およびLCD19が接続されている。GPU17は、CPU11から受け取った描画命令に基づいてVRAM21にイメージを書き込み、所定のタイミングでLCD19に画像イメージのデータを送るための専用プロセッサで、グラフィックス・アクセラレータともいう。ICH23は周辺入出力デバイスに関するデータ転送を処理する。
【0025】
ICH23は、USB(Universal Serial Bus)、シリアルATA(AT Attachment)、SPI (Serial Peripheral Interface)バス、 PCI(Peripheral Component Interconnect)バス、PCI−Expressバス、およびLPC(Low Pin Count)などのポートを備え、ハードディスク・ドライブ(HDD)25、26、USBコントローラ、およびLPCバス29などが接続されている。HDD25はブートディスクで、コンピュータ10が起動するときのブート・イメージを格納している。HDD26はセカンダリのドライブで、コンピュータ10は動作している間にHDD26を接続するいわゆるホットアタッチ機能をサポートする。
【0026】
LPCバス29には、エンベデッド・コントローラ31およびBIOS_ROM33などの高速なデータ転送を要求しないデバイスが接続される。BIOS_ROM33は不揮発性で記憶内容の電気的な書き替えが可能なメモリであり、入出力デバイスを制御するためのデバイス・ドライバ、ACPI(Advanced Configuration and Power Interface)の規格に適合し電源およびシステム筐体内の温度などを管理するシステムBIOS、ベクタ・テーブル、コンピュータ10の起動時にハードウエアの試験や初期化を行うPOST(Power-On Self Test)コード、およびパスワード認証を行うための認証コードなどを格納する。
【0027】
システムBIOSは、コンピュータ10の設定情報や固有情報を保有しており、他のプログラムから呼び出されたときに、保有する情報を提供するサービスを行う。システムBIOSの一部は、電源起動からのブートやサスペンドからのレジュームのタイミングのようにOSおよびビデオ・ドライバが実行されないときにLCD19に画像を表示するためのビデオBIOSで構成されている。BIOS_ROM33には周知の方法でハードウエアおよびソフトウエア上の保護が施され、そこに格納されているコードは正当性が保証されている。
【0028】
[メイン・メモリのデータ構造]
図2は、メイン・メモリ15に本実施の形態の説明に必要なプログラムおよびベクタ・テーブルがロードされた様子を示す図である。メイン・メモリ15には、一般領域とSMRAM領域が定義されている。一般領域101には、BIOS_ROM33に格納されたプログラムおよびHDD25に格納されたオペレーティング・システム(OS)、デバイス・ドライバ、およびアプリケーション・プログラムなどがロードされる。BIOS_ROM33に格納されたプログラムがロードされるメイン・メモリ15の領域に対しては、通常MCH13により書き込み保護が施されているが、本実施の形態では不正プログラムにより書き込み保護が無効にされてプログラムが汚染されたり不正コードが埋め込まれたりする可能性があると想定する。
【0029】
SMRAM領域103には、SMIハンドラ113と認証コード115がロードされ、さらにSSM(State Save Map)という領域が確保される。ベクタ・テーブル105は、それぞれセグメント・アドレスとオフセット・アドレスの4バイトで構成される256個のベクタ・アドレスを格納する。システムBIOS109は、INT命令で中断された元のルーチンに戻るためのIRET命令111を含む。IRET命令111は、ビデオBIOS107やPOSTコード108も含んでいるが、本実施の形態の説明に必要がないので図2からは省略している。
【0030】
SMIハンドラ113は、SMIがアサートされたときに常に最初に実行されるコードある。SMIがアサートされたときにSMIハンドラ113は、MCH13のSMIレジスタ14を参照してSMIの発生要因を認識し、SMRAM領域103にロードされているプログラムまたは一般領域101にロードされているプログラムを呼び出してCPU11に実行させる。認証コード115は、コンピュータの起動時、サスペンド状態またはハイバネーション状態からの復帰時にパワーオン・パスワードまたはハードディスク・パスワードによる認証を処理するプログラムである。SSMは、CPU11がSMMに移行する直前のレジスタやポインタなどのコンテキストを格納する領域である。
【0031】
BIOS_ROM33に格納されたコードは正当性が保証されている。したがって、コンピュータ10の電源が起動されてメイン・メモリ15にロードされOSに制御が移る前までは、正当性のあるプログラムだけが動作するので、図6で説明したような方法で不正プログラムがSMM特権を支配することはできない。しかし、OSが動作している間は、ネットワークや外部記録媒体を通じたりして、コンピュータ10に不正プログラムが進入し、一般領域101にロードされたプログラムを書き換えたり不正なコードを埋め込んだりしてSMM特権を支配する可能性が存在する。
【0032】
[SMM特権を保護する手順]
SMM特権を保護する手順を図3および図4のフローチャートおよび図5のメイン・メモリの状態図に基づいて説明する。ブロック201でコンピュータ10の電源が投入されると、ブロック203でCPU11は、最初にBIOS_ROM33の所定のアドレスにアクセスしてPOSTコード108を実行しブートを開始する。POSTコード108はプロテクト・モードで実行されるが、ブート中に必要に応じてSMIをアサートしてCPU11をSMMで動作させる。POSTコード108は初期の段階でCPU11のレジスタ、MCH13、メイン・メモリ15などの検査と初期化を行い、メイン・メモリ15が利用可能な状態になるとブロック205でBIOS_ROM33のプログラムおよびベクタ・テーブル105を図2に示したようにメイン・メモリ15にロードする。
【0033】
ブロック207でビデオBIOS107は、GPU17、VRAM21およびLCD19の検査と初期化を行う。ビデオBIOS107による検査と初期化の間にビデオBIOS107は初期化に使用したデータを削除したり、新たなデータを保有したりしてロードされたときの状態からコードの内容が変化するが、一旦初期化が完了するとそれ以降コードの内容が変化することはないので、ハッシュ値を計算して正当性の検証をすることができる。
【0034】
ブロック209では、認証コード115を実行するためにPOSTコード108がSMIをアサートしてCPU11の動作をSMMに移行させる。POSTコード108が、MCH13のSMIレジスタ14を設定すると、MCH13はCPU11にSMI信号を送る。SMIがアサートされるとCPU11は、その時点でのレジスタやポインタの内容であるコンテキストをメイン・メモリ15のSSM117に格納して、MCH13に対してSMACTピンを通じてSMMで動作したことを通知する。CPU11がSMMで動作している間、MCH13はSMRAM領域のアドレスに対するアクセスは許容するが、SMMで動作していないときはSMRAM領域のアドレスに対するアクセスは、メイン・メモリ15の他のアドレスへのアクセスとして処理する。
【0035】
CPU11は、SMMに移行すると最初に必ずSMIハンドラ113を実行する。SMIハンドラ113は、MCH13のSMIレジスタ14を参照してSMIの発生要因を調べ、POSTコード108により認証コード115の実行が要求されていることを知ると、認証コード115を実行する。ブロック211で認証コード115は、初期化の完了したビデオBIOS107のハッシュ値を計算してSMRAM領域103に格納する。この時点まではビデオBIOS107は不正プログラムで汚染される可能性がないため正当性が保証されている。ここで計算したビデオBIOS107のハッシュ値を基準ハッシュ値ということにする。
【0036】
さらに認証コード115は、ベクタ・テーブル105からINT10hの割り込みタイプに対応するベクタ・アドレスを取得してSMRAM領域103に格納する。ビデオBIOS107は初期化が完了すると、自らコード内容を変更したり、正当なプログラムによりコード内容が変更されたりすることはない。したがってこれ以後のさまざまな段階で、ビデオBIOS107のハッシュ値を計算して基準ハッシュ値と比較することで、それぞれの段階でビデオBIOS107が不正プログラムにより汚染されているか否かを判断することができる。
【0037】
ハッシュ値とベクタ・アドレスの格納が終わった認証コード115は、パワーオン・パスワード、ハードディスク・パスワード、ログオン・パスワードなどのパスワード認証を行う。ベクタ・テーブル105、ビデオBIOS107およびシステムBIOS109は不正プログラムで汚染されていないので、認証コードがINT10h命令を実行してビデオBIOS107を本来のエントリ・ポイントから実行し、ビデオBIOS107がINT15h命令を実行してシステムBIOS109を本来のエントリ・ポイントから実行することでパスワード認証をする。この時点では不正プログラムによりSMM特権が支配されることはない。
【0038】
ブロック213で認証コード115はRSM(Return from System Management instruction)命令を実行して、MCH13がSMIをネゲートするようにSMIレジスタ14に設定する。認証コード115はSSM117に格納しておいたCPU11のコンテキストをCPU11に戻してCPU11をSMMからプロテクト・モードに移行させる。プロテクト・モードに移行したCPU11はSMMで動作する直前の状態からPOSTコード108の実行を再会する。図5(A)は、プロテクト・モードに移行する直前のメイン・メモリの状態を示している。その後残りのPOSTコード108が実行されてブートが完了する。
【0039】
ブロック215ではOS、デバイス・ドライバおよびアプリケーション・プログラムのロードも含めてブートが完了し、コンピュータ10はプロテクト・モードで動作してOSの動作環境が構築される。ブロック217ではコンピュータ10がOSの動作環境で動作する間に、ベクタ・テーブル105、ビデオBIOS107、およびシステムBIOS109のすべてまたはいずれかが不正プログラムで汚染されることを想定する。汚染の形態には、不正プログラムがベクタ・テーブル105をフックしてINT命令による割り込み先を不正コードに誘導したり、ビデオBIOS107またはシステムBIOS109に不正コードを埋め込んだりすることが想定される。この様子を図5(B)に示す。
【0040】
この状態でCPU11がSMMで動作するときに認証コード115がINT10h命令でビデオBIOS107を呼び出したり、ビデオBIOS107がINT15h命令でシステムBIOS109を呼び出したりすると、SMM特権が不正コードにより支配されてしまう。ブロック219では、コンピュータ10にセカンダリHDD26がホットアタッチされコンピュータ10の通常の動作として、一旦サスペンド状態に移行したあとただちに復帰動作(レジューム)が行われる。コンピュータ10は、レジュームのときにHDDパスワードの認証をすることになっているので、認証コード115はビデオBIOS107を呼び出す必要がある。サスペンド状態に移行するときにはBIOS_ROM33に格納された電源管理用のコードがMCH13に移行前の状態を設定する。
【0041】
サスペンド状態からレジュームするときは、メイン・メモリ15にロードされていた図2に示すプログラムおよびベクタ・テーブル105は記憶が保持されているので、ブロック217での汚染が維持されている可能性がある。また、サスペンド状態ではGPU17、LCD19およびVRAM21の電源は停止するので、レジュームするときはPOSTコード108がそれらの検査および初期化を行う。CPU11はMCH13に設定された移行前の状態に応じて所定の位置からPOSTコード108の実行を開始する。
【0042】
ブロック221でPOSTコード108はHDDパスワードの認証をするために、MCH13のSMIレジスタ14を設定してSMIをアサートする。SMI信号を受け取ったCPU11は、コンテキストをSSM117に格納するとSMIACK信号をMCH13に送ってSMMで動作していることを通知する。SMIハンドラ113は、SMIレジスタ14の内容を参照してSMIの発生要因を認識し認証コード115を実行する。
【0043】
ブロック217で説明したように、コンピュータ10がOS環境で動作する間は、ベクタ・テーブル105およびビデオBIOS107は不正なプログラムで書き換えられることがある。認証コード115はLCD19にパスワードを要求するためのプロンプトを表示するためにビデオBIOS107を呼び出す必要があるが、SMM特権を保護するためには呼び出す前にビデオBIOS107とビデオBIOS107を呼び出すベクタ・アドレスの安全性を維持しておく必要がある。
【0044】
ブロック223で認証コード115は、ベクタ・テーブル105のINT10hの割り込みタイプに対応するベクタ・アドレスが、ブロック211でSMRAM領域103に格納しておいたブート時のベクタ・アドレスと一致するか否かを検証し、一致していない場合は格納しておいたベクタ・アドレスに書き換える。なお、一致するか否かの検証を省いて、常に格納しておいたINT10hの割り込みタイプに対応するベクタ・アドレスをベクタ・テーブル105に書き込むようにしてもよい。そして、書き換える前のベクタ・アドレスをSMRAM領域103に格納する。認証コード115は、さらにビデオBIOS107のハッシュ値を計算する。
【0045】
ブロック225で認証コード115は、ブロック223で計算したハッシュ値とブロック211でSMRAM領域103に格納しておいた基準ハッシュ値を比較して一致するか否かを判断する。ブロック225でハッシュ値が一致しないと判断した場合は、認証コード115はブロック227に移行してINT10h命令の実行を中止する。その結果、LCD19には、HDDパスワードの認証のためのプロンプトが表示されずセカンダリHDD26はコンピュータ10によって認識されない。その後認証コード115はブロック243でRSM命令を実行してCPU11をプロテクト・モードに移行させ、SSM117に格納したコンテキストをCPU11に設定してPOSTコード108を実行しサスペンド状態からのレジュームを完了する。
【0046】
ブロック225でハッシュ値が一致すると判断した場合は、ビデオBIOS107は基準ハッシュ値を格納したときの状態から変更されていないことになるので認証コード115はビデオBIOS107の正当性を検証でき、かつINT10h命令を実行したときにビデオBIOS107の正しいエントリ・ポイントを呼ぶことも確保している。ただし認証コード115は、ビデオBIOS107がさらにINT15h命令で呼び出すシステムBIOS109の正当性を検証していないので、この時点ではまだINT10h命令を実行しない。
【0047】
認証コード115はあらかじめメイン・メモリ15上でシステムBIOS109のIRET命令コード111が書き込まれているアドレスを知っている。また、システムBIOS109は、メイン・メモリ15にロードされている間に正当なプログラムまたは不正なプログラムにより、IRET命令コードのメイン・メモリ15上でのアドレスが変更される場合がある。認証コード115はブロック229で、ブロック229であらかじめ知っているIRET命令コード111が書き込まれているメイン・メモリ15上のアドレスに実際にIRET命令コード111が存在するか否かを検査する。
【0048】
認証コード115はブロック231で、IRET命令111が既知のアドレスに存在すると判断した場合は、ブロック235に移動する。認証コードはブロック231で既知のアドレスにIRET命令コード111が存在しないと判断した場合は、ブロック233に移行してIRET命令コード111を既知のアドレスに書き込む。また、ベクタ・テーブル105のINT15hの割り込みタイプに対応するベクタ・アドレスがIRET命令コード111の既知のアドレスでない場合は、既知のアドレスになるようにベクタ・テーブル105を書き換えてブロック235に移行する。不正プログラムによりIRET命令111の既知のアドレスにジャンプ命令が埋め込まれていたり、INT15hの割り込みタイプに対応するベクタ・アドレスが不正コードのエントリ・ポイントにフックされていたりしても、この段階でINT15hのベクタ・アドレスが正当性のある認証コード115によりIRET命令コード111のアドレスになるように変更される。
【0049】
なお、認証コード115はビデオBIOS107がINT15h命令を実行したときに、IRET命令コード111のアドレスがエントリ・ポイントになるようにベクタ・アドレス105およびIRET命令111またはそのいずれかを書き換えればよいので、認証コード115は自らが選択した任意のベクタ・アドレスとIRET命令コード111を書き込んでもよい。また、認証コード115は、ベクタ・アドレスおよびIRET命令コード111またはそのいずれかを書き換えた場合は、書き換える前の内容をSMRAM領域103に格納しておく。この手順ではシステムBIOS109が不正プログラムにより汚染されているか否かを検証することはできないが、ビデオBIOS107がINT15h命令を実行したときには、認証コード115によりIRET命令111だけが実行されることは保証される。したがって、INT15h命令の実行によりSMM特権が不正プログラムにより支配されることはなくなる。このときの様子を図5(C)に示す。
【0050】
ブロック235では、認証コード115はLCD19にHDDパスワードの認証に必要なプロンプトを表示するために、INT10h命令を実行してビデオBIOS107の呼び出しを行う。その際認証コード115は、CPU11のその時点でのFLAGレジスタの値、CSレジスタの値、およびIPレジスタの値をメイン・メモリ15に確保されたスタック・セグメントにプッシュし、ベクタ・テーブル105のINT10hの割り込みタイプが示すアドレスに格納されているオフセット値とセグメント値をCPU11のIPレジスタとCSレジスタに設定すると、CPU11はビデオBIOS107を実行する。
【0051】
ビデオBIOS107は、プロンプトの表示を行う作業を行う間にシステムBIOS109からシステムの設定情報やシステムの固有情報を取得することがある。たとえば、サスペンド状態からレジュームする際にはGPU17を再度設定する必要があるが、ビデオBIOS107はシステムの設定情報をシステムBIOS109から取得するために、INT15h命令を実行してシステムBIOS19を呼び出す。ビデオBIOS107は、CPU11のその時点でのFLAGレジスタの値、CSレジスタの値およびIPレジスタの値をメイン・メモリ15上のスタック・セグメントにプッシュし、ベクタ・テーブル105のINT15hが示すアドレスに格納されているオフセット値とセグメント値をCPU11のIPレジスタとCSレジスタに設定する。
【0052】
INT15hの割り込みタイプに対応するベクタ・アドレスはブロック229〜ブロック233でIRET命令コード111のアドレスとなるように設定されているので、ブロック237ではINT15h命令が実行される。IRET命令111が実行されるとスタック・セグメントにプッシュされていたFLAGレジスタの値、CSレジスタの値およびIPレジスタの値がポップされCPU11はシステムBIOS109の実質的な命令コードを実行することなくビデオBIOS107の実行を再開する。
【0053】
したがって、システムBIOS109やベクタ・テーブル105が不正プログラムで書き換えられても、ビデオBIOS107を実行する過程では不正プログラムの影響を排除することができる。ここでビデオBIOS107は、INT15h命令を実行してもシステムBIOS107から所定の情報を受け取ることはできないが、ビデオBIOS107はシステムBIOS109が保有する情報を受け取る必要がある場合はあらかじめ保有しているディフォルト値を使用することができる。ディフォルト値は、ビデオBIOS107がSMMにおける作業に必要な最低限の情報という意味もある。
【0054】
本実施の形態は、ビデオBIOS107が呼び出すシステムBIOS109が、本来のエントリ・ポイントが指定されたときの命令コードをしないでもビデオBIOS107が認証コード115の要求に応えられる場合にだけ適用することができる。ここでの認証コード115からの要求はSMMで動作するときの要求である。プロテクト・モードで動作するときには、いずれかのプログラムがINT10h命令またはINT15h命令を実行したときにビデオBIOS107またはシステムBIOS109はそれぞれ本来のエントリ・ポイントから実行される必要がある。
【0055】
ブロック239ではビデオBIOS107がIRET命令111を実行して認証コード115にCPU11の制御を移し、認証コード115はブロック223でSMRAM領域103に格納しておいたINT10hの割り込みタイプに対応する書き換えられたベクタ・アドレスを復元し、ブロック233でSMRAM領域103に格納しておいたINT15hの割り込みタイプに対応する書き換えられたIRET命令コード111およびベクタ・アドレスまたはいずれか一方を復元する。このときのメイン・メモリ15の状態を図5(D)に示す。
【0056】
たとえば、OSが動作している間にユーザがプライマリのディスプレイを内部ディスプレイから外部ディスプレイに変更したときに、その設定情報をシステムBIOS107が保有しているような場合は、ビデオBIOS107がブロック237で設定情報としてディフォルト値を使用すると外部ディスプレイにはプロンプトが表示されない場合がある。プロンプトが外部ディスプレイに表示されるように設定する必要がある場合は、ブロック241で認証コード115は再度INT10h命令を実行してビデオBIOS107を実行する。このときのINT10h命令は、プロンプトを表示するディスプレイの選択といったような限定的なものであるため、ビデオBIOS107はシステムBIOS109を呼び出さないようにしたり、あるいは、ブロック233のようにIRET命令またはベクタ・アドレスを書き換えたりする。そして、CPU11のレジスタにプロンプトを表示するディスプレイを選択するためのファンクションを設定してINT10h命令を実行する。
【0057】
ブロック243では、認証コード115がRSM命令を実行してSMIをネゲートしてSSM117に格納しておいたCPU11のコンテキストを元に戻すと、CPU11はブロック221でSMMに移行した直前の状態の動作をプロテクト・モードで再会する。CPU11は、ブロック221でSMIがアサートされブロック243でSMIがネゲートされるまでSMMで動作するが、この間にOSが動作するプロテクト・モードで不正プログラムにより汚染されうる一般領域101にロードされたビデオBIOS107が実行されても認証コード115によりそれらの正当性および安全性が確保されるのでSMM特権の剥奪の問題は生じない。ブロック243では、OSが動作するプロテクト・モードにおいて、OSやアプリケーションによって、ビデオBIOS107が実行されることがある。このとき、ビデオBIOS107やシステムBIOS109は、図5(D)に示すように不正プログラムで汚染されている可能性はあるが、OS動作環境におけるプロテクト・モードで実行されるので、SMM特権が不正プログラムにより支配されることはない。ブロック245では、いずれかのプログラムから他の理由でSMIアサートがありSMMで動作する間にビデオBIOS107を呼び出すことがある場合は、ブロック221に移行する。
【0058】
SMM特権を保護する他の方法として、ビデオBIOS107だけでなくシステムBIOS109の基準ハッシュ値も計算して、ビデオBIOS109をコールする都度計算したシステムBIOS109のハッシュ値と基準ハッシュ値を比較する方法が考えられる。しかし、システムBIOS109のハッシュ値は、ブート時にだけ動作するコードだけでなくOSが動作している間に提供するランタイム・サービスのために動作するコードまで含めて計算する必要があるので時間がかかる。これに対して本発明では、システムBIOS109に対してINT15h命令で呼び出すときの安全性を確保するためのオーバヘッドは必要がない。
【0059】
さらに、システムBIOS109はOSが動作している間に、自身のメイン・メモリ上での記憶領域にシステムの設定情報を記憶する場合がある。この場合には、ビデオBIOS107のようにハッシュ値による正当性の検証をすることはできないので、IRET命令によるSMM特権の保護は有効である。
【0060】
上記の手順では、ビデオBIOSがINT15h命令を実行したときにシステムBIOS109のIRET命令111だけが実行されてビデオBIOS107にCPU11の制御が戻るようにしているが、本発明はIRET命令だけが実行される場合に限定するものではない。たとえば認証コード115は、みずから書き込んだベクタ・アドレスのエントリ・ポイントにジャンプ命令を書き込み、システムBIOS109が実質的な命令コードを実行しないでIRET命令を実行してビデオBIOSに制御が戻るようにすることもできる。
【0061】
ビデオBIOS109が認証コード115の要求に応えるために、システムBIOS109のサービスが必要ないとすれば、認証コード115がINT10h命令を実行したときにはINT15h命令を実行しないようにビデオBIOS115のコードを作成することも考えられる。しかし、ビデオBIOS115は、プロテクト・モードで動作する他のプログラムからINT10h命令が実行されたときは、INT15h命令を実行してシステムBIOS109のサービスを利用する必要がある。そしてビデオBIOS115はINT10h命令がSMMで実行されたのかプロテクト・モードで実行されたのかを認識することはできないので、この方法の実現は困難である。
【0062】
本発明は、SMMで動作する間に呼び出されるSMRAM領域以外の領域にロードされるコードは、ビデオBIOSに限定するものではなく、他のデバイス・コントローラを制御するコードに適用することが可能である。たとえば、SMMのコードがディスクのコントローラを制御するオプションROMのコードをコールし、オプションROMのコードがシステムBIOSをコールするような場合にも適用することができる。またIRET命令は、割り込みルーチンが元のルーチンに戻るときに実行するアセンブラ言語の命令コードであるが、BIOSのコードを他の言語で作成するときは同じ機能を果たす他の命令コードであってもよい。
【0063】
これまで本発明について図面に示した特定の実施の形態をもって説明してきたが、本発明は図面に示した実施の形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができることはいうまでもないことである。
【符号の説明】
【0064】
15…メイン・メモリ
101…一般領域
103…SMRAM領域
105…ベクタ・テーブル
107…ビデオBIOS
109…システムBIOS
115…認証コード

【特許請求の範囲】
【請求項1】
システム管理モードで動作することが可能なプロセッサと、一般領域と前記システム管理モードで使用するSMRAM領域とが定義されたメイン・メモリを有するコンピュータに、
前記SMRAM領域にSMMプログラムをロードし、前記一般領域に第1のプログラムと第2のプログラムとベクタ・テーブルをロードするステップと、
前記SMMプログラムが前記第1のプログラムの基準ハッシュ値を計算して前記SMRAM領域に記憶するステップと、
前記コンピュータがオペレーティング・システムの動作環境で動作したあとに前記SMMプログラムが前記第1のプログラムのハッシュ値を計算して前記基準ハッシュ値と比較するステップと、
前記計算したハッシュ値と前記基準ハッシュ値が一致した場合に前記SMMプログラムが前記第1のプログラムを呼び出すステップと
を有する処理を実行させるコンピュータ・プログラム。
【請求項2】
前記基準ハッシュ値を計算するステップを、前記コンピュータのブートが完了する前に行う請求項1に記載のコンピュータ・プログラム。
【請求項3】
前記オペレーティング・システムが動作する前に前記ベクタ・テーブルから取得した前記第1のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスを前記SMMプログラムが前記SMRAM領域に記憶するステップと、
前記第1のプログラムを呼び出すステップを実行する前に前記第1のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスを前記SMMプログラムが前記SMRAM領域に記憶したベクタ・アドレスで書き換えるステップと
を有する請求項1または請求項2に記載のコンピュータ・プログラム。
【請求項4】
前記第1のプログラムを呼び出すステップを実行したあとに、前記第1のプログラムを呼び出す割り込みタイプに対応する前記書き換えられたベクタ・アドレスを前記ベクタ・テーブルに戻すステップを有する請求項3に記載のコンピュータ・プログラム。
【請求項5】
前記第1のプログラムが前記システム管理モードにおいて前記第2のプログラムを呼び出す命令を実行したときに前記第2のプログラムが実質的な命令コードを実行しないで前記第1のプログラムに戻る命令コードを実行するように前記第2のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスおよび前記第1のプログラムに戻る命令コードまたはそれらのいずれか一方を前記SMMプログラムが書き換えるステップと、
前記書き換えるステップを実行したあとに前記第1のプログラムが前記システム管理モードにおいて前記第2のプログラムを呼び出すステップと
を有する請求項1から請求項4のいずれかに記載のコンピュータ・プログラム。
【請求項6】
前記第1のプログラムに戻る命令コードがIRET命令コードである請求項5に記載のコンピュータ・プログラム。
【請求項7】
前記第2のプログラムを呼び出すステップのあとに書き換えられた前記第2のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスおよび前記第1のプログラムに戻る命令コードまたはそれらのいずれか一方を書き換える前の状態に戻すステップを有する請求項5または請求項6に記載のコンピュータ・プログラム。
【請求項8】
前記SMMプログラムがパスワード認証を行うプログラムであり、前記第1のプログラムがビデオ・チップを制御するビデオBIOSであり前記第2のプログラムがシステム情報を提供するシステムBIOSである請求項1から請求項7のいずれかに記載のコンピュータ・プログラム。
【請求項9】
前記基準ハッシュ値と比較するステップおよび前記第1のプログラムを呼び出すステップを、前記コンピュータがサスペンドからレジュームする間に行う請求項1から請求項8のいずれかに記載のコンピュータ・プログラム。
【請求項10】
システム管理モードで動作することが可能なプロセッサと、
前記プロセッサをシステム管理モードで動作させるためにSMIをアサートするチップ・セットと、
前記SMMプログラムがロードされるSMRAM領域と第1のプログラム、第2のプログラムおよびベクタ・テーブルがロードされる一般領域とが定義されたメイン・メモリとを有し、
前記SMMプログラムは前記コンピュータに、前記第1のプログラムの基準ハッシュ値を計算させ、前記コンピュータがオペレーティング・システムの動作環境で動作したあとで前記チップ・セットが前記SMIをアサートしている間に、前記第1のプログラムのハッシュ値を計算し、該計算したハッシュ値と前記基準ハッシュ値とを比較してから前記システム管理モードで前記第1のプログラムを呼び出す処理を実行させるコンピュータ。
【請求項11】
前記SMMプログラムは前記コンピュータに、前記オペレーティング・システムが動作する前にベクタ・テーブルから取得した前記第1のプログラムを呼び出す割り込みタイプに対応するベクタ・アドレスを前記SMRAM領域に記憶させ、前記第1のプログラムを呼び出す前に前記SMRAM領域に記憶したベクタ・アドレスを使って前記第1のプログラムを呼び出したときに前記第1のプログラムが呼び出されるように前記ベクタ・テーブルを構成する処理を実行させる請求項10に記載のコンピュータ。
【請求項12】
前記SMMプログラムは前記コンピュータに、前記第1のプログラムが前記システム管理モードにおいて前記第2のプログラムを呼び出したときに前記第2のプログラムを実質的に実行しないで前記第1のプログラムに戻るように前記第2のプログラムのコードおよびベクタ・アドレスまたはいずれか一方を書き換える処理を実行させる請求項10または請求項11に記載のコンピュータ。
【請求項13】
前記第1のプログラムが前記SMMプログラムからINT10h命令で呼び出されるビデオBIOSで前記第2のプログラムが前記ビデオBIOSからINT15h命令で呼び出されるシステムBIOSで、前記第2のプログラムのコードがIRET命令コードである請求項12に記載のコンピュータ。
【請求項14】
前記チップ・セットは前記コンピュータがサスペンド状態からレジュームする際に前記SMIをアサートする請求項13に記載のコンピュータ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2011−76134(P2011−76134A)
【公開日】平成23年4月14日(2011.4.14)
【国際特許分類】
【出願番号】特願2009−223662(P2009−223662)
【出願日】平成21年9月29日(2009.9.29)
【出願人】(505205731)レノボ・シンガポール・プライベート・リミテッド (292)
【復代理人】
【識別番号】100106699
【弁理士】
【氏名又は名称】渡部 弘道
【復代理人】
【識別番号】100077584
【弁理士】
【氏名又は名称】守谷 一雄
【Fターム(参考)】