Windows NT 4.0の時代だから6~7年前のことになるが,日常業務に管理者アカウントを使うべきかどうかを,先輩記者と議論したことがある。学生時代に使っていたUNIXの思想が曲がりなりにも身についていた筆者は,必要なときだけ管理者アカウントでログオンすべきだと主張した。しかし,先輩記者はそんな面倒なことはやってられないという。

 確かに,suコマンドを使って必要なときだけ管理者権限でプログラムを起動できるUNIXと違い,NTでは何か設定を変更するたびにログオンし直さなくてはならない。実は筆者もプログラミングのためという大義名分のもとに,自宅のWindows NTには常時管理者でログオンしていたので,結局引き下がってしまった。最近,筆者が担当する日経WindowsプロでWindowsのセキュリティについての特集を執筆した際に,再びこの点を考える機会があったので少し書いてみたい。

管理者権限を奪われると被害は甚大

 セキュリティを論じるに当たって最初にはっきりさせておきたいのは,バッファ・オーバーフローなどの実装上の問題によるぜい弱性が,決してゼロにはならないことである。こうした実装上の問題によるぜい弱性は,結局のところ「バグ」だからだ。バグが決してなくならないように,ぜい弱性もなくならないのである。

 ぜい弱性がなくならないことを前提にするなら,仮にそこを突かれても被害を受けないような仕組みを別に用意する必要がある。そもそもセキュリティ向上のためには,2重3重に防御策を講じておくのが原則だ。そのための方策の1つが,管理者アカウントやLocalSystemアカウントなどの権限の高いアカウントで悪意あるプログラムが動作しないようにすることである。権限の低いアカウントであれば,少なくともカーネル・モードで動作するキー・ストローク・ロガーをインストールされたり,システム・ファイルを置き換えられたりすることはない。仮に感染/侵入されても,被害を最小限にとどめることができる。

 いったん管理者/LocalSystemの権限を悪意あるプログラムに奪取されてしまうと,もはやそのパソコンは全く信用できなくなってしまう。Windowsのコンポーネントを書き換えて自分自身が発見されないようにしたり,様々なセキュリティ機能を無効にしたりと,やりたい放題される可能性があるからだ。ウイルス対策ソフトについても,書き換えなどの危険性がある点は同様である。

 さらに,仮に何らかの理由で感染/侵入された形跡に気づいたとしても,バックアップをリストアすることすら怖くてできなくなる。感染/侵入された時期を特定しない限り,どの時点のバックアップをリストアすれば安全かが分からないからだ。結局,Windowsの再インストールから始める,ということになってしまう。

 バッファ・オーバーフロー発生時に悪意あるコードの実行を防ぐDEP(データ実行防止)のような強力なセキュリティ機能が一般的になるに従って,LocalSystemアカウントで動作するサービスを乗っ取って悪意あるプログラムを実行するのは難しくなる。現在増えているのは,ソーシャル・エンジニアリングによってユーザーをだまして悪意あるプログラムをインストール/実行させる手法だ。今後もこうした傾向は続くだろう。

 Windowsのセキュリティ機能がいくら進歩しても,このような攻撃を完全に防ぐことは難しい。ユーザーがインストール/実行しようとするプログラムが悪意あるものかどうかをWindowsが判断することは不可能だからだ。プログラムに電子署名を付加するのが一般的になればこの状況も変わるだろうが,今の時点でこれに頼ることはできない。現在のWindowsは電子署名のないドライバをインストールする際に警告を発する機能を備えているものの,悪意あるプログラムが管理者権限で動作するなら,事前に無効にされる可能性がある。

 またウイルス対策ソフトについても,定義ファイルと突き合わせて判別する限り,既に発見されているものしか検出できないという制限がある。結局現時点では,管理者アカウントでログオンしないことしか,こうした攻撃の被害を減らす方法がないのである。

MSの取り組みは不十分,UAPに期待

 ところが,マイクロソフトはWindows NTの時代からこうしたアカウントの問題(最小権限の原則)をないがしろにしてきたように思える。1つはサービスが動作するアカウントの問題だ。データベース管理システムやWebサーバー・プログラムといった常時動作するプログラム(Windowsではサービス,UNIXではデーモンと呼ぶ)は,本来そのプログラムに必要な権限だけを備えた専用のアカウントで実行すべきものである。データベース管理システムなら,データベース・ファイルを配置したディレクトリだけにファイル・アクセスを許可したアカウントで実行するといった具合だ。そうすることで,仮にデータベース管理システムが何らかの理由で乗っ取られても,データベース・ファイルに被害が及ぶだけでOSのシステム・ファイルが置き換えられるようなことはない。