Code Access Securityその4

今回は解説ではなく、個人的な疑問について。(^^;

[assembly: FileIOPermission (SecurityAction.RequestMinimum, Read=@"c:\home")]

FileIOPermission及びReadはC:\homeに対する読み取り権限を、RequestMinimumはそれが必要条件であることを意味しています。ところで、次のようなコードがあったとします。

using System;
using System.IO;
using System.Security;
using System.Security.Permissions;

[assembly: FileIOPermission (SecurityAction.RequestMinimum, Read=@"c:\home")]

class Program {
    static void Main () {
        string path = null;
        FileStream fs = null;

        path = @"c:\home\security.txt";
        Console.WriteLine ("Read:" + path);
        fs = File.OpenRead (path);
        fs.Close ();
        path = @"c:\windows\win.ini";
        Console.WriteLine ("Read:" + path);
        fs = File.OpenRead (path);
        fs.Close ();
    }
}

c:\home\security.txtとc:\windows\win.iniの読み取りを行っていますが、これは勿論、問題なく実行出来てしまいます(RequestMinimumは最低限、この権限を要求するというだけで、c:\全体に対して権限を持っていても制限はしない)。すると、RequestMinimumにはどんな意味があるのでしょうか。わざわざ属性を付けなくても権限がなければFile.OpenReadで失敗するでしょうし。思いつくとすれば、セキュリティチェックをアセンブリのロード時に行うためってくらいでしょうか?


次にRequestOptionalについて。上記サンプルの属性を次のように変えてみます。

[assembly: FileIOPermission (SecurityAction.RequestOptional, Read=@"c:\home")]

今度はwin.iniの読み込みで例外が発生します。RequestOptionalのネーミングからすると、「指定した権限はオプション(無くても良い)」って思いたくなるのですが、実際は違います。要求する権限は確かにオプションなんですが、それ以外の副作用があるんですよね。何故か指定した権限(FileIOPermission)以外を無効にしてしまいます。つまり、c:\homeの読み取りしか出来ず、それ以外のネットワーク関連やレジストリ、印刷・・・などなどの全てが出来なくなります。RequestMinimumとRequestOptionalの関係が美しくない気がしますね。*1

*1:Essential.NETではRequestMinimumも他の権限を打ち消すように書かれている。仕様変更したのか?