マイクロソフト
セキュリティ レスポンス マネージャ
小野寺 匠

 今回は,Windows Vistaの「Service Hardening」という機能を取りあげる。OS内部にある隠れた防壁だ。

 Vistaに含まれている各種のサービスは,ユーザーを支援し,OSの根幹を支える役割を持っており,ユーザーの操作とは関係なく常に活動している。そのため,犯罪者が狙う攻撃ポイントの一つになっている。もちろん標準の状態で攻撃が可能なわけではない。ただ,設定ミス,あるいはぜい弱性など将来発生する可能性があるリスクには備えておく必要がある。そこでVistaには,サービスが持つ権限や操作可能なリソースを制限するService Hardeningという機能が実装されている。サービスが悪用された場合でも最終的に攻撃を成立させない,または被害を最小限に抑えるための仕組みである。

 Windowsにはセッションと呼ぶ考え方がある。ここで言うセッションは,いわゆるログオン・セッションではなく,ターミナル・サービス・セッションのことである。セッションン0と呼ばれるセッションがあり,このセッションは,OS起動中のプロセス,サービス,コンソールにログオンしたユーザーのプロセスなどが実行される。しかし,このようにサービスとユーザーのプロセスがセッションを共有している状態では,サービスとユーザーのプロセス間通信を制限し,サービスからの攻撃を抑制することが難しい。

 このため,Windows Vistaでは,セッション0を基本的にサービスのためのセッションとし,コンソールへのログオンはセッション1以降を使用することにした。セッションをまたいだプロセス間通信やメッセージの表示は大きく制限されているため,サービスを悪用してユーザー・プロセスに影響を与えたり,ユーザーを欺くためのメッセージを表示したりすることはできない。

 こう書くとWindows XPが非常に無防備に見えてしまうが,Windows XPでも「デスクトップとの対話をサービスに許可」という特別な設定を施さない限り問題は生じない。ただ,この設定を施している場合は防御のすべがなく,それに対処するためにWindows Vistaではサービスを隔離するようになった。

 例えばWindows XPでは,メッセージ・ダイアログを表示するとデスクトップにそのまま表示される。しかしWindows Vistaでは,セッション0からのメッセージがあることがまずユーザーに通知され,ユーザーが許可した場合にのみメッセージが表示される。これにより,OSや著名なアプリケーションのメッセージを模してユーザーをだます行為は実現しづらくなっている。

サービスは高い権限で動作から狙われる

 次にサービスが動作する権限について考えよう。サービスが攻撃の標的にされると危険なのは,それが比較的高い権限で動作しているからだ。サービスはOSの根幹を支えるような処理を実行し,かつ複数のユーザーに機能を提供しなければならない。このためOSと同等の権限,あるいは通常のユーザーは持っていない権限が必要になる。

 当然,サービスの権限を悪用されると,影響範囲が大きくなる。サービスが使用する権限は小さければ小さいほどいい。だから,Windows XPでもWindows 2000に比べて大きく制限された。Windows Vistaではさらに徹底して権限が制限されている。図1を見て分かる通り,Windows Vistaでは多くのサービスがLocal System(OSと同等の権限)から,Network ServiceやLocal Serviceに切り替えられている。

図1 Windows XPとWindows Vistaの権限比較

[画像のクリックで拡大表示]

 ただ,SDLにしたがってWindows Vistaの脅威分析をした際,Windows XPのような,サービスを起動するアカウントだけに頼った権限の管理では粒度が粗すぎると判断された。より細かく権限を管理するために,必要な権限 (RequiredPrivilege)と呼ばれる情報を各サービスで持つことにした。この結果,サービスごと(厳密にはサービスをホストするsvchost.exeの単位)に,起動アカウントと権限を制御できるようになった。Local Systemで起動しても,その中で使用しない権限がある場合には起動と同時にその権限(特権)を破棄し,制限付きのLocal Systemアカウントで実際のサービスが実行される。各サービスがどのような特権を要求しているかを確認するには,sc qprivsコマンドを使う(sc qprivs <サービス名>を実行)。「管理者として実行」などで使用されるSecondly Logonサービスの必要としている特権を実際に確認すると図2のようになる。

図2 Secondly Logon Service が必要としている特権

[画像のクリックで拡大表示]

 Serverサービスなども見てみると,特に必要な特権がリストされない。これらのサービスは指定されたアカウントの持つ全権限を使うため,特に必要とする権限を指定していない。また,Local Serviceは特権だけではなくネットーワークを通じた通信を行えなくなっている。Local Systemを持つサービスの一部はファイアウォールとの連携により通信が制限されている。

 では,サービスとファイアウォールの連携とは具体的にどんなものか。それを説明する前に,Windows XPのファイアウォールについて触れておこう。

 Windows XPのWindows Firewallでは,フィルタリング・ルールは特定のプロセス,またはすべてのプロセスを対象に設定する。つまり,サービスの通信を制限するには,サービスが独自の実行ファイルによる完全に独立したサービスである必要がある。Svchost.exeなどでホストされているサービスに対しては,個々に制限を行うことはできない。

 これに対してWindows Vistaでは,サービス名を使ってサービスを特定し,個々のサービスごとにルールを設定できるようになっている。これにより,高い権限を持つサービスのうち外部からのネットワーク・アクセスが不要なものは,ファイルウォールでアクセスを制限されている。ファイアウォールの詳細なルールは[セキュリティが強化されたWindowsファイアウォール]で確認することができるが,Windows標準のサービスについては個々には列挙されておらず,別途レジストリで管理されている(図3)。

図3 Windows標準サービスに対するファイアウォールの設定

[画像のクリックで拡大表示]

 独自にサービス向けのファイアウォールのルールを作成する場合は,まず,[セキュリティが強化されたWindowsファイアウォール]でルールを追加する(図4)。次にルールのプロパティから,ファイアウォールのルールを特定のサービスと関連付ける(図5)。外向けの通信(out-bound)を制限しておくと,サービスが悪用された場合でも,別の不正なプロスグラムを仕込まれない限り,他のパソコンへの攻撃は止められる。

図4 セキュリティが強化されたWindowsファイアウォール

[画像のクリックで拡大表示]
図5 サービス設定のカスタマイズ

[画像のクリックで拡大表示]

ローカル・リソースを守るための改善も

 ここまでは主にサービスの悪用を防ぐ方法を解説したが,Vistaではサービスが悪用された際のローカル・リソースを守るための改善も施されている。主にファイルやレジストリである。ファイルやレジストリのアクセス制限は,ACL(アクセス・コントロール・リスト)に基づいて実行する。ACLの設定は基本的にユーザーやグループ単位に行うが,XPではサービスを選択することはできなかった。このACLにサービスを追加するには,ユーザーと同様にサービスにも識別のためのSIDを持たせる必要があり,S-1-5-80-{サービス名のSHA1}が与えられている。実際のSIDはsc showsid <サービス名>で確認することができる(図6)。SIDにはNone, Restricted, UnRestrictedの三つのタイプがあるが,タイプはsc qsidtype <サービス名>で確認できる(表1)。

図6 サービスのSID

[画像のクリックで拡大表示]
表1 SID Typeの違い

[画像のクリックで拡大表示]

 Restrictedに設定した場合は,明示的にServiceのSIDに書き込み許可を与えないとファイルなどへの書き込みが制限される。実際にMpsSvc(Windows Firewall)は,SID TypeがRestrictedに設定されている。これにより,もしWindows Firewallにぜい弱性があり,不正なコードが実行されたとしても,レジストリや他のファイルを変更することはできない。例外としてログ・ファイルだけはNT Service\MpsSvcに明示的にアクセス権が与えられており,サービスから書き込みができる(図7)。

図7 Restrictedに対する例外(MpsSvc)

[画像のクリックで拡大表示]

 Windows Vistaのサービスは,基本的にService Hardeningが施されている。しかし,攻撃等の傾向がOSからアプリケーションに移っている現状を考えると,OS標準ではない,各社が作成するサービスについても,適切な制限が行われることを期待したい。