EternalWindows
セキュリティコンテキスト / トークンとプロセス

Windowsにおける全てのプロセス(ときにはスレッド)は、何らかのユーザーとしてコードを実行しています。 このユーザーというのは、ときに標準ユーザーであったり、 Administratorsグループに属する管理者、あるいはSYSTEMなど様々であり、 プロセスが行えるセキュリティ操作に大きく影響を及ぼします。 このようなセキュリティ操作を行える程度はセキュリティコンテキストと呼ばれ、 高低の表現と共によく使われます。 たとえば、管理者やSYSTEMは行えるセキュリティ操作が多いため、 高い(昇格した)セキュリティコンテキストでコードを実行していると言われたりします。

システムはプロセスのセキュリティコンテキストを、 アクセストークン(以下、トークン)と呼ばれるカーネルオブジェクトで識別しています。 トークンにはそれ自身の属性に加え、現在ログオンしている1人のユーザーと、 そのユーザーがメンバとなっているグループに関する情報を含んでいます。 たとえば、Administratorsグループに属するユーザーがログオンすると、 作成されるトークンにはAdministratorsのSIDが含まれることになります。

ログオン時に実行されるwinlogon.exeはlsass.exeを通じてトークンを作成し、 そのトークンをシェルプロセス(一般にはexplorer.exe)に割り当てます。 以後、プロセスが起動する他のプロセスは、起動したプロセスのトークンの コピーが割り当てられることになります。 これはつまり、Administratorsグループに属するユーザーがログオンしたならば、 各プロセスは管理者として動作することを意味しますが、 これは常に望むべきことでしょうか。 利用者がAdministratorsグループに属するユーザーとしてログオンしたのは、 時としてセキュリティ操作が必要になる場合があるからであり、 そうした状況にならない限りは、管理者としてコードを実行する必要はないはずです。

実を言うと、プロセスのセキュリティコンテキストは、実行時に降格させることができます。 セキュリティコンテキストは1つのトークンによって表されているわけですから、 たとえば、このトークンに設定されたAdministratorsグループを無効化するような処理を行えば、 プロセスはAdministratorsグループのユーザーとしてコードを実行していることにはなりません。 また、制限されたユーザーを表すトークンを作成し、 それをプロセスのセキュリティコンテキストとして採用すれば、 プロセスが行えるセキュリティ操作は制限されることになります。 こうした事からも分るように、セキュリティ操作を行う予定のないプロセスは、 実行時にセキュリティコンテキストを降格させる処理を行うべきといえます。 そうすることにより、プロセスが何らかの問題あるコードを実行したとしても、 アクセス拒否として扱われることが多くなります。

Windows Vistaから登場したUAC(User Account Control)は、 上記のような降格処理を追求した結果と言えるかもしれません。 この機能は、システムにログオンするユーザーがAdministratorsなどの昇格した特権を持つグループ のメンバである場合でも、制限されたユーザーとしてログオンさせるというものであり、 この制限されたトークンがシェルに割り当てられます。 多くのプロセスはシェルから起動されることになりますから、 各プロセスのセキュリティコンテキストは、最初から降格されていることになります。 つまり、UACというのは、各プロセスに明示的な降格処理を求めるのではなく、 デフォルトとして各プロセスを降格させておき、 セキュリティ操作が必要なプロセスだけ個別に昇格させるという手段を取っているのです。 次の図は、UACにおける昇格の例を示しています。

UACが有効である場合、AIS(Application Information Service)は実行されようとしている実行ファイルを調べます。 このファイルのリソースにマニフェストファイルが含まれており、 そこに昇格を希望する旨が記述されている場合は、上記のようなダイアログが表示されることになります。 また、実行ファイルの名前やリソースに、"install"や"setup"、"update"などの文字列が含まれる場合も、 ダイアログが表示されることになっています。 これは、インストーラ検出と呼ばれる機能であり、インストール操作に失敗しないための配慮です。 表示されたダイアログで「続行」を選択することにより、プロセスは昇格された状態で実行することになります。


戻る