C#从文件访问中阻止AppDomain程序集的类实例

时间:2014-10-09 20:14:34

标签: c# .net security .net-assembly appdomain

我想加载一个包含一个实现接口的类的程序集。 接口只有一个方法:“Run()”。

我想在完全受限制的AppDomain中加载该类,并阻止该实例进行文件或注册表访问。

这是我的布局:

  • 签名主项目 - 加载程序集,创建实例并执行方法运行()
  • 签名C#库 - 只包含IProvider接口定义
  • 外部C#库 - 在MyProvider类中实现我的接口

这是我用来加载外部库,创建实例和执行接口方法的代码:

        Evidence ev = new Evidence();
        ev.AddHostEvidence(new Zone(SecurityZone.Internet));
        PermissionSet permSet = SecurityManager.GetStandardSandbox(ev);

        StrongName fullTrustAssembly = typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();

        AppDomainSetup adSetup = new AppDomainSetup()
        {
            ApplicationBase = Path.GetFullPath(Environment.CurrentDirectory)
        };

        AppDomain newDomain = AppDomain.CreateDomain("Sandbox", ev, adSetup, permSet, fullTrustAssembly);

        Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes("ExternalLib.dll"));
        var instance = asm.CreateInstance("ExternalLib.MyProvider", true);

        IProvider provider = instance as IProvider;

        //Should not work, because my Assembly is accessing a file/Registry or something else
        string result = provider.Run("Test");

我希望最后一行抛出异常,因为ExternalLib.dll实现了接口,但正在访问我的文件系统或更改注册表等

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:3)

您可以从PermissionSet删除permissions,例如:

permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));

或者您可以创建一个没有权限的PermissionSet,然后按照here概述添加您想要的权限:

PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));