フォティーンフォティ技術研究所 先端技術研究部長
村上 純一

 2008年8月,BlackHatブリーフィングスで米国の研究者が「SMM Rootkit」という新しいタイプのルートキットを発表した。SMMとはx86プロセッサが備える動作モードの一種で,OSの管轄外でコードを実行できる。「SMM Rootkit」を開発・発表したのはShawn Embleton氏とSherri Sparks氏である。

 セキュリティ上のSMM悪用の可能性は,2006年にLoic Duflot氏らによって既に指摘されていた。Embleton氏とSparks氏が開発した「SMM Rootkit」は,Duflot氏の研究をベースとした具体的な攻撃シナリオの一例だと言える。両氏はSMMの特性に着目し,SMM時に実行される正規のコードを悪意のコードに置き換えることで,OSやアプリケーションに変更を加えることなくキーロガーを実装できることを実証した。

 本稿では,このSMMの基本的な仕組みとDuflot氏によって指摘された攻撃の可能性について紹介する。

SMMの基本的な仕組み

 x86プロセッサは,リアル・モード,プロテクト・モード,仮想8086モード,システム管理モードという4種類の動作モードを備えている。

 コンピュータが起動した際,プロセッサはリアル・モードで動作し,システムの初期化の過程でプロテクト・モードに移行する。第3回で紹介したリング0からリング3という特権レベルは,プロテクト・モードに含まれる概念である。プロテクト・モードでは特権レベルや第6回で紹介したセグメンテーションなどによる様々なシステム・プロセスの保護が有効になる。仮想8086モードは,仮想的に複数の8086プロセッサを実行するモード。詳細は割愛するが,MS-DOS互換アプリケーションを実行する際などに利用されている。

 問題のシステム管理モードは,システムの電源管理やハードウエア制御を行うための専用モードで,Intel 386 SLプロセッサ以降で導入された。SMMは基本的にBIOS,ファームウエアによって使用され,OSやアプリケーションからは透過的に実行される。一般的なSMMにおけるコード実行の流れは以下の通りである(図1)。

図1●SMMにおけるコード実行の流れ

1.システムに接続されているハードウエアが,何らかの理由によりSMI(システム管理割り込み)を発生させる。SMIは外部割り込みの一種で,専用ボタン(例えばノートPCによく見られる音量コントロール)の押下などにより発生する。ベンダーは独自の温度センサー,電力制御などのイベントの通知にSMIを利用している。

2.プロセッサはSMIを受信すると動作モードをSMMに遷移させる。この際,SMM遷移以前のコンテキストがSMRAM領域に保存される。SMRAMは,SMM以前のコンテキストを保存したり,SMIを処理するSMIハンドラを格納したりするための専用のメモリー領域であり,他の動作モードからはアクセスできない。

3.SMRAMに配置されているSMIハンドラが実行される。SMIハンドラを含むSMRAMは,コンピュータの起動時にBIOSによってメモリー上に展開される。

4.SMIハンドラ中に含まれるrsm命令によってSMM遷移前の状態に復帰する。この際,SMM遷移時に保存されたコンテキストが復元される。

 上記のように,SMMへの遷移・復帰に伴って自動的にコンテキストが保存・復元される。このため,プロテクト・モードで実行されているOSやアプリケーションから見ると,知らないうちにSMIハンドラが実行され,その後も実行の有無に気付くことはない。この点だけを見ると,SMMによるSMIハンドラの実行は,第9回で紹介した仮想化技術によく似ている。

SMM経由でOS/アプリに透過的な攻撃を実現

 このようにSMMはOSやアプリケーションに対して透過的に実行されるため,マルウエア開発者にとっては攻撃コードを潜ませる絶好のポイントになる。SMMを利用した攻撃手順は次の通りである。

1.SMRAM上に配置されている正規のSMIハンドラを悪意のコードで上書きする。
2.SMIを発生させ,上記のコードを実行させる。

 こう書くと簡単な操作に見えるかもしれないが,1,2の操作はどちらにも制約がある。

 まず,SMRAMはプロセッサの動作モードがSMMのときにしかアクセスできない専用のメモリー領域であるため,通常モードで動作しているときにはSMIハンドラは上書きできない。もう少し具体的に言うと,SMRAMが展開されるメモリー上のアドレスの範囲(レンジ)は0xA00000-0xBFFFFで,VGAのメモリー領域と競合している。このため,通常はチップセットに含まれるMCH(メモリー・コントローラ・ハブ)が当該アドレス・レンジへのメモリー・アクセスをVGAメモリーへと転送している。プロセッサの動作モードがSMMの場合にだけ,MCHの設定が切り替わり,転送先がSMRAMになる仕組みである。

 次に,SMIは前述の通りシステムに接続されたハードウエアが生成する外部割り込みであり,基本的にソフトウエアからは生成できない。

 Duflot氏は,これらの制約の回避手法を調査・検証し,「Using CPU System Management Mode to Circumvent Operating System Security Functions」の中で紹介している。一つ目のSMRAMへのアクセスについては,MCH上に存在するSMRAM制御レジスタの値をある内容に設定変更することで,非SMMの状態でもメモリー・アクセスの転送先をSMRAMに変えられる。SMRAM制御レジスタの読み書きは,in/out命令によるポート・マップドI/Oを利用して実行できる。SMRAM制御レジスタのアドレス,設定すべき値は,チップセットに依存する。ここでは一例として,[Intel 845 Chipset MCH]のスペックを重要な項目だけ抜粋して紹介しよう。SMRAM制御レジスタは8ビット幅のフラグ・レジスタとなっており,下記のビット・フラグを含んでいる(表1)。攻撃者は,SMRAM制御レジスタ中のD_OPENビットをセットすることで,非SMMの状態でもSMRAMに読み書きアクセスできるようになる(図2)。

表1●SRAM制御レジスタ
図2●SMRAM制御レジスタの内容によっては非SMMの状態でもSMRAMに読み書きできる

 二つ目のSMIの発生については,チップセット上のICH(I/Oコントローラ・ハブ)に存在するレジスタの設定を変更する。APM(advanced power management)制御ポート・レジスタに任意の値を書き込むことでソフトウエアからSMIを生成可能になることを突き止めた。APM制御ポート・レジスタは,OSとSMIハンドラ間でAPMのコマンドをやり取りするために用意されているインタフェースである。詳細については[インテルが公開しているチップセット(ICH)のデータシート]を参照して頂きたい(リンク先は,Intel 845 Chipsetに搭載さているICH2のデータシートである)。

SMM悪用には制限あり,背後で進む回避技術の研究

 Duflot氏は入念な調査の結果,SMRAMに悪意のコードを配置し,自身でSMIを発生させることでSMMを経由した攻撃が可能であることを実証した。しかし,こうしたSMMを悪用した攻撃にはいくつか無視できない制限が存在する。

●D_LCKビット
 表1に示したようにD_OPENビットがセットされていた場合,非SMMの状態でもSMRAMへのアクセスが可能になる。ただ,システムを起動してから一度でもD_LCKビットがセットされていると,D_OPENビットをセットしてもSMRAMにはアクセスできない。近年のコンピュータでは,BIOSがシステム起動時にD_LCKビットをセットする傾向にあり,SMMを悪用した攻撃は困難になってきていると言える(実はこの制限の回避手法についても既に研究が行われており,コンセプト・レベルでの手法が報告されているが,これについては回を改めて紹介する)。

●攻撃コードの機種依存性
 SMMを悪用した攻撃を成功させるには,対象システムのチップセットの仕様を調査し,それに合った攻撃コードを作成する必要がある。攻撃対象を限定すれば済む話ではあるが,既存のWindows上で動作するボットやトロイの木馬といったマルウエアに比べると,汎用的な攻撃コードを作成することは困難である。

 SMMの悪用は,これまでに紹介してきたルートキット技術に比べると,より低レイヤーのハードウエアに密着した技術領域に含まれる。この研究を契機に,「SMM Rootkit」のようにより実践的,またD_LCKビット制限の回避などの先進的な研究が近年行われている。次回以降,それらについて順に紹介していきたい。

村上純一(むらかみ・じゅんいち)
国内大手セキュリティ・コンサルティング会社を経て,2008年より現職。マルウエア解析,ソフトウエア脆弱性分析などの業務に従事。仮想化技術,ルートキットなどについての研究を行っており,研究成果を国内外のカンファレンスで発表している。