■Windows Vistaの新機能を紹介する短期集中連載の第3回。今回はセキュリティに関連した3つの新機能「User Account Protection」「User Interface Privilege Isolation」「ファイルとレジストリの仮想化」の仕組みを解説する。

 本特集では,動作検証に米国で9月に開催された開発者向け会議PDC(Professional Developers Conference)2005で配布されたWindows Vista CTP(Community Technology Preview)英語版を使用した。


 米Microsoftがこの数年,最も重視してきたのがセキュリティの強化である。Windows XP Service Pack 2で「DEP(データ実行防止)」をはじめとする様々なセキュリティ強化機能が搭載されたのはまだ記憶に新しい。

 Windows Vistaではさらに,Windows NT以来のセキュリティ・モデルの変更を含む,大掛かりなセキュリティ機能の強化を施す予定である。以下では,Windows Vistaが搭載するセキュリティ関連の新機能の中から,特に重要な「User Account Protection(UAP)」「User Interface Privilege Isolation(UIPI)」「ファイルとレジストリの仮想化」——の3つを取り上げてその仕組みを解説する。

管理者であっても権限を制限
 プログラムに必要最小限の権限しか与えなければ,仮にプログラムが乗っ取られたりしても,カーネル・モードで動作する悪意あるプログラムをインストールされたり,システムの設定を変更されたりすることはない。そのためには,ワープロ・ソフトで文書を作成するといった日常業務は制限ユーザーとして実行し,本当に必要なときだけ管理者などの高い権限を持つユーザーとして実行すればよい。だが現実には,ログオンし直すのが面倒であるし,RunAsコマンドや[別のユーザーとして実行]メニューによって一時的にログオン・ユーザーを切り替えると,プログラムを正常に実行できないこともある。

 そこでWindows Vistaでは,「User Account Protection(UAP)」という仕組みを新たに搭載することになった。たとえ管理者やPower Usersアカウントなどでログオンしていても,通常は制限ユーザーと同等の権限でアプリケーションを実行し,必要なときだけ権限を昇格させる。

 ユーザー・アカウント自体を切り替えることなく権限だけをコントロールするというのはWindows NT以来のセキュリティの仕組みを変えるものだ。

2つのトークンを使い分ける


△ 図をクリックすると拡大されます
図10●User Account Protection(UAP)の仕組み
 UAPが動作する仕組みを図10に示す。Windows XPやWindows Server 2003は,ユーザーがログオンしたときに「アクセス・トークン」を作成し,ユーザーがアプリケーションを起動するたびにそれをアプリケーションに付与する。アクセス・トークンとは,ユーザーと所属するグループのSID(セキュリティID),ユーザーが持つ特権などの情報をまとめたデータ構造体である。アプリケーションがファイルやレジストリなどにアクセスしようとすると,Windowsはこのアクセス・トークンの情報を基にアクセスを許可するかどうかを判断する。

 一方,Windows VistaでUAPを有効にした場合,Vistaはログオン時に特権などのすべての情報を含むトークン(以下「完全なトークン」と呼ぶ)に加え,特権などを省略し,制限ユーザーとほぼ同じ権限しか持たないトークン(以下「UAPトークン」と呼ぶ)を作成する。

 そして,ユーザーが通常のアプリケーションを起動した場合には権限の低いUAPトークンを付与し,高い権限を必要とするアプリケーションを起動した場合だけ完全なトークンを付与するのである。

 アプリケーションが管理者権限を必要とするかどうかの判断は,実行ファイルに埋め込まれた「マニフェスト」の情報や,Windows Vistaが管理する「アプリケーション互換性データベース」を使用する。マニフェストは,.NETアプリケーションが標準で備えているデータで,ネイティブ・アプリケーションでもリソースとして埋め込むことができる。ただし,現時点で管理者権限が必要かどうかの情報がマニフェストに埋め込まれたアプリケーションはほとんどない。そこで,あらかじめ主なプログラムの情報を登録したアプリケーション互換性データベースを用意して判断している。あとからユーザーが登録することも可能だ。

 高い権限が必要なプログラムを起動しようとした場合,Windows Vistaはまず起動してよいかどうかを確認するダイアログを表示する。そして,ユーザーが同意した場合にだけ,完全なトークンを付与してプログラムを起動する。このため,ユーザーが知らないうちに悪意あるプログラムが管理者権限で起動することはない。確認用のダイアログには,単にYes/Noだけを尋ねるものと,ユーザーのログオン・パスワードを再度入力させるものの2種類があり,どちらを表示するかをセキュリティ・ポリシーで設定できる。セキュリティの観点からはあまり勧められないが,ダイアログを表示することなく起動するようにしたり,UAP自体をオフにする設定も用意している。


△ 図をクリックすると拡大されます
図11●UAPの有無がユーザーの権限にどのように影響を与えるかを調べた
 UAPの有効/無効がユーザーの権限にどのような影響を与えるかをWindows Vista CTP版で調べてみたのが図11である。ここでは,管理者(Administratorsグループに属するユーザー)としてログオンし,ユーザーの情報を表示するwhoamiコマンドを実行した。UAPが有効な場合には,Administratorsグループの横に,「Group used for deny only」と表示されていること,および特権が3つしか付与されていないことが分かる。

 なお,UAPが無効な場合に特権の多くが「Disabled」と表示されているのは,whoamiコマンドがこれらの特権を必要としないためで,特権自体はアクセス・トークンに含まれている。

ウインドウから情報が盗まれている
 悪意あるプログラムがパスワードなどを盗む方法には,カーネル・モード・ドライバとして動作するキー・ロガーを組み込む以外にもいくつかの手口がある。その1つが,ウインドウ・メッセージを利用してユーザー入力を不正に取得する方法だ。

 ウインドウ・メッセージは,アプリケーションやWindowsが,ウインドウを制御したり,情報をやり取りしたりする手段である。例えば,ユーザーがキーボードを操作すると,Windowsはウインドウ・メッセージをアクティブなウインドウに送る。アプリケーションが,ウインドウのサイズを変更したり,表示する文字列を取得/設定したりする際にもウインドウ・メッセージを使う。

 Windows XPやWindows Server 2003などのこれまでのWindowsでは,アプリケーション間の連携のために,プログラムが別のプログラムのウインドウにメッセージを送信することを許している。しかし,これを悪用すれば,ユーザーがウインドウ上で入力したパスワードなどの文字列をほかのプログラムが不正に取得できてしまう。逆に,管理ツールなどの入力欄に文字列を送信すれば,自分自身はレジストリなどへの書き込み権限がなくても,設定変更が可能になる。

アプリ間のメッセージ改変を防止


△ 図をクリックすると拡大されます
図12●User Interface Privilege Isolation(UIPI)の仕組み
 こうした攻撃の可能性を低減するために,Windows Vistaは「User Interface Privilege Isolation(UIPI)」という仕組みを新たに搭載する(図12)。Windows VistaのPDC CTP(Community Technology Preview)版では既定でUIPIが無効になっているが,UAPをオンにした上でレジストリのHKEY_LOCAL_MACHINE\SOFTWARE
\Microsoft\Windows\CurrentVersion
\Policies\System\enablemicを1に設定すると有効になる。

 UIPIが有効な状態では,自分と同じ,もしくは自分よりも権限の低いアプリケーションに対しては従来通りウインドウ・メッセージを送信してウインドウを操作できる。しかし,自分よりも権限が高いアプリケーションにウインドウ・メッセージを送信した場合は,エラーにはならないものの無視され,ウインドウを制御することも情報を取得することもできない。これにより,UAPによって制限ユーザーの権限で動作する悪意あるプログラムが,管理者権限やシステム権限で動作するプログラムから情報を盗むのを防げる。このほか,悪意あるプログラムがフック・プロシージャを利用して,権限の高いアプリケーションが受け取るメッセージを監視したり,メッセージを横取りして一部を改変したりすることも防止する。


△ 図をクリックすると拡大されます
図13●UIPIが効いてWindows Vistaではパスワードを不正に取得できない
 実際にPDC CTP版でUIPIの効果を確認してみたのが図13である。ここでは,Visual Studio .NET 2003に付属するウインドウ・メッセージ監視ツールSpy++を利用して,ユーザーがキーを押したときにテキスト・ボックスが受け取るメッセージ(WM_KEYDOWNメッセージ)を監視した。Windows XPで[別のユーザーとして実行]メニューを選択したときに表示されるパスワード入力ダイアログの場合,入力した文字ごとにメッセージが表示され,パスワードが丸見えになっていることが分かる。一方,Windows VistaのUAPのパスワード入力ダイアログでは,メッセージを1つも取得できていない。この点は,「別のユーザーとして実行」の後継であるWindows Vistaの「Run Elevated」メニューで表示されるダイアログの場合も同様だ。

 UIPIで注意が必要なのは,高い権限で動作するアプリケーションしか保護されないことである。Webブラウザをはじめ,通常の権限で動作するアプリケーションから情報が盗まれるのは防げない。Webブラウザや業務アプリケーションでパスワードを入力する際には,これまで同様の注意が必要だ。

制限ユーザーで使えるソフトが増える
 3つ目に紹介するファイルとレジストリの仮想化は,制限ユーザーの権限で実行したときに不具合が生じるアプリケーションを正常に実行できるようにする仕組みである。Windowsアプリケーションが設定情報を保存する際,「最近使ったファイル」などのユーザーごとに異なる情報はレジストリのHKEY_CURRENT_USER\SOFTWARE以下に保存し,インストール・パスなどすべてのユーザーに共通の情報はHKEY_LOCAL_MACHINE\SOFTWARE以下に保存するのが原則だ。

 しかし,アプリケーションの中には,すべての設定情報をレジストリのHKEY_LOCAL_MACHINE以下に保存したり,Windowsフォルダやアプリケーションのインストール・フォルダ(通常はProgram Files\<ベンダー名>\<アプリケーション名>)にある.iniファイルに書き込んだりするものが少なからずある。こうした“行儀の悪い”アプリケーションを制限ユーザーの権限で実行すると,エラーが発生したり,設定した内容が次回起動時に反映されなかったりといった不具合が発生する。制限ユーザーはこれらのレジストリやフォルダへの書き込み権限を持たないからだ。

行儀の悪いソフトに仮想化で対処


△ 図をクリックすると拡大されます
図14●ファイルの仮想化の仕組み
 ファイルとレジストリの仮想化の仕組みを図14に示す。制限ユーザーが起動したアプリケーションがProgram FilesフォルダやWindowsフォルダに書き込もうとすると,Windows Vistaは\Virtual Store\<ユーザーのSID>以下にWindowsやProgram Filesというフォルダを作成してそこに書き込むようにする。同様に,制限ユーザーが起動したアプリケーションがレジストリのHKEY_LOCAL_MACHINE\SOFTWARE以下に書き込もうとした場合は,HKEY_CLASSES_ROOT\VirtualStore以下にリダイレクトする。これらの処理はOS内部で透過的に実行されるので,アプリケーションからは本来の場所に正常に書き込めたように見える。従ってアプリケーション側でエラーが発生することはない。

 また,アプリケーションが設定ファイルやレジストリを読み出そうとした場合には,Virtual Store以下に同名のファイルやキーがあればそれを優先して読み出す。このため,設定した内容が次回起動時に反映されないということもない。設定ファイルとレジストリ・キーは実行するユーザーごとに作成されるので,1台のコンピュータを複数のユーザーで使用する場合にも正常に機能する。

 このほかWindows Vistaは,制限ユーザーがアプリケーションをインストールできるようにする仕組みも搭載する予定だ。具体的にどこまでの操作を制限ユーザーに許可するかはグループ・ポリシーなどで設定する。インストール自体は管理者権限が必要なものの,アップデートは制限ユーザーでも実行できる,といった設定も可能になるという。


第4回につづく