Code Access Security

初めてCode Access Security(以降CAS)の説明を見たとき、全くピンと来ませんでした。CASを知らなくてもプログラムが動くので、特別意識しないのが理由の1つではないでしょうか。*1

ここに、ファイルを開いて閉じるだけの単純なコードがあります。

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

static class Program {
    static void Main (string[] args) {
        Console.WriteLine ("Hello, World");
        FileStream fs = File.OpenRead (@"c:\home\projects\security.txt");
        fs.Close ();
    }
}

実行すると、

Hello, World

と表示して終了します。つまらないコードですが、これがもし悪意のあるプログラムだとしたらどうでしょうか? ひょっとしたら、ローカルディスクから重要な情報を読み取られる可能性もあります。
通常使われている権限は、管理者やパワーユーザなど人に対して権限を与え、「コイツはコンピュータに詳しいからミスって怪しげなプログラムを実行しないだろう」という考えに基づいています。しかし、実行しようとするプログラムがこっそりとファイルアクセスやネット接続をしていないかどうかなんて分からなかったりします。なので、「このプログラムは特定のディレクトリだけしかアクセスを許さない」、「ネットへの接続はさせない」といった指定が出来ると便利です。CASはこれを実現するモノで、大ざっぱに言うと人ではなくコードに権限を与えるのです。

疑問:さっきのサンプルプログラムはファイルアクセスしていたじゃないか。普段はCASは無効になっているの?

回答:いいえ、有効です。権限設定はアプリケーション毎に指定するのは大変なので、グループ(コードグループと呼ばれる)毎に設定します。デフォルトのグループから3つばかり列挙してみます。

  • My_Computer_Zone : FullTrust(何でも出来る)
  • LocalIntranet_Zone : LocalIntranet(ファイル、レジストリへのアクセスなどは出来ない)
  • Internet_Zone : Internet_Zone(環境変数へのアクセス、リフレクションなどは出来ない)

My_Computer_Zoneはローカルで実行した場合。LocalInternet_ZoneはUNC名でのアクセス。Internet_Zoneはインターネット実行した場合。と、実行した場所によって各グループが適応されます。例えば、先ほどのプログラムも共有フォルダとして公開してUNC名で実行したら例外が発生します。このようにCASは有効になっているのですが、普段はFullTrust権限で動いているので気づかないんですね。


デフォルト以外のコードグループの作成方法や、CASを意識したコーディングについては、また次回・・・の予定。(^^;

*1:ぶっちゃけ分かりやすい資料が少ない所為だ