.NET Framework には、「コードアクセスセキュリティ」という、安全にコードを実行させられるためのセキュリティシステムが導入されています。これにより、システムにダメージを与える可能性がある機能が実行されることを防ぐことが出来ます。阻害される機能の一部と、考えられる「不都合なこと」を列挙します。
- ファイル制御
- 任意の場所に書き込むことだけでなく、参照することも出来なくなります。しかし、アプリケーションのデータを保存したり、読み込んだりすることはしたいですね。その場合、OpenFileDialog.OpenFile メソッドを使って、ユーザがダイアログで指定したファイルストリームを使用します。プログラムはファイル名にアクセスできないため、どの様なフォルダにデータを保存しようとしたかも、知ることができません。
- レジストリ制御
- ファイルが制御されるのですから、レジストリも制御されます。
- プリンタ制御
- コンピュータの中の任意の情報や、今見ているウェブページなどを、他のコンピュータが共有しているプリンタ、つまり悪意のある人の横にあるプリンタに出力できると、困ると思いませんか?また、要りもしない広告を、あなたの横にあるプリンタが印刷しだしても、困りますよね。そういう制御をさせません。
- リモートアクセス
- あなたがコンピュータに対して行ったすべての動作が、どこかにあるコンピュータのデータベースに送信されていたら、どう思いますか?データベース、通信、Web アクセスを、遮断することが出来ます。
このように、コンピュータを使っている人を守るための、セキュリティシステムが導入されています。が、ただ導入されているだけならネタにしません。実はこの機能が、有効に働いていないとしたら、どうでしょう?
このような制御は、「エビデンス」と呼ばれる、アセンブリ(exe ファイルや dll ファイル)の情報を元に行われます。「エビデンス」にはいくつかの種類がありますが、デフォルト(インストールしたまま)の状態で有効に働くのは、そのコードがどこにあるか、ということだけです。この「どこにあるか」というのは、「ローカルにインストールされているかどうか」と置き換えてもかまいません。
インターネットエクスプローラの、セキュリティというオプション設定画面に、「インターネット」、「イントラネット」、「信頼済みサイト」、「制限付きサイト」という、4つのゾーンがあります。このゾーンに、「ローカルコンピュータ」を加えた5つが、.NET Framework の初期状態における、場所に関する区分です。このうち、ローカルコンピュータは、インターネットからダウンロードしたものであっても、ローカルコンピュータに物理的につながった記憶装置にあるアセンブリのエビデンスとして使われます。つまり、いったんダウンロードしてしまえば、せっかくのセキュリティ機能も(デフォルトでは)役に立たないということです。ただし、F: や G: などのドライブ名を割り当ててあっても、ネットワーク共有しているドライブにあるアセンブリについては、インターネットなどが使われます。
インターネットエクスプローラを使用されている方は、「ダウンロードしたファイルをダブルクリックすると、『本当に実行しますか?』と聞いてくるけど?」と思われるかもしれません。しかし、これは Windows XP ServicePack 2 が導入されており、インターネットエクスプローラで NTFS のドライブにダウンロードしたものだけが対象になります。
クリックすると拡大します
いったい、誰のためのセキュリティ機能なのでしょう?
しかし、ユーザ、つまりソフトウェアを使う人のことですが、ユーザの利便性を考えると、あるいは制限できないとも言えます。例えば、ファイルの使用が制限されていれば、アプリケーションのデータを保存することが出来ません。保存するためには、インストールの時に1回だけですが、.NET Configuration を起動し、コンピュータ、またはユーザのポリシーとして、該当するソフトウェアのセキュリティ制限を緩める処理をしなければなりません。しかし、この操作は、簡単とは言えません。また、表示される文章も、わかりやすいとは言えません。プログラムから行うことも出来ますが、どの様な設定が行われたのかを確認できなければ、認証する意味はないでしょう。
また、もうひとつの問題が「証明書」です。エビデンスには、「URL」、「サイト」、「ゾーン(インターネットエクスプローラのセキュリティゾーンと同じ)」、「アプリケーションのベースディレクトリ」、「配布者/発行者」、「厳密名」、「ハッシュ値」があります。このうち、「URL」の一部、「配布者/発行者」、「厳密名」のエビデンスを利用するためには、ベリサインなどの機関による証明書が必要になります。また、.NET Framework には、自身の改変をチェックする機構がありますが、これは厳密名が付けられている場合のみ有効です。その為、厳密名が付けられていないアセンブリは、改変されていてもわからない可能性があります。ところが、この「証明書」は、発行を受けるのにそれなりの費用がかかり、また発行してもらうための手続きも煩雑です。さらに、きちんとしたところは個人には発行してくれません。こうしたことから、「オレオレ証明書」ですませる人もいます。どちらにしても、有効に機能しているとは言えないでしょう。
また、このアクセス制限は、プログラムから書き換えることも出来ます。しかし、「アクセス制限を書き換えるよ」という警告は、一切表示されません。良心的なアプリケーションビルダであれば、もしかしたら取扱説明書か何かに書いていてくれるかもしれません。しかし、そこに書かれている内容だけが行われるのかどうか、それを知る術はありません。
The security for whom is it? いったい、誰のためのセキュリティ機能なのでしょう?
なお、ここで問題にしたのはローカルにインストールした場合です。ノータッチデプロイメントの場合は、好ましくない動作は制限されます。また、アクセス制限を変更することも出来ません。
投稿日時 : 2006年2月16日 22:29