偽装(Impersonate)時の注意点

偽装を乱暴に説明すると、スレッドがユーザになりすます仕組みです。Windowsではスレッドを1つ作成し、権限を落としたトークンを割り当てる事により、セキュリティを確保することができ、アプリケーションサーバなどで良く利用されます。

しかし、偽装(Impersonate)時のユーザ情報の参照には気をつける必要があります。何故なら偽装中のユーザ情報ではなく、別のユーザの情報にアクセスしてしまう可能性があるからです。


1つの例を挙げるとレジストリになります。
HKEY_CURRENT_USERはプロセス開始時にキャッシュされる事になっていて、全てのスレッドはそれを継承します。

問題は、偽装したスレッドからHKEY_CURRENT_USERとアクセスすると、どのユーザ情報か分からなくなる場合が存在するのです。HKEY_CURRENT_USERはプロセスで共有され、他スレッドによる影響を受けます

そもそも偽装という仕組みが出来る前からReg関数はあったわけで、スレッド毎にユーザ情報を持つような仕組みが確立されていない(当然、修正するわけにもいかない)。そこで、正しい対処が追加された関数を使うというものでした。Windows APIでいうならRegOpenCurrentUserです。

ソースコードを変更できるなら良いのですが、間接的にHKEY_CURRENT_USERを参照するようなライブラリを使わなければならない場合へのアドバイスはこうなります。

偽装ではなく、プロセスをもう1つ立ち上げてください。

Windows2000にこの仕組みが出来た時、マイクロソフトですらAPIの追加をしたのです。
劇的に遅くなるでしょうが諦めてください。

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz